From d577f790c8cbcf4f8dce74f9991e4bd62e21f949 Mon Sep 17 00:00:00 2001 From: Tobias Ramforth Date: Fri, 8 Feb 2013 00:00:51 +0100 Subject: Added MS SQL Server support --- lib/db.php | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 177 insertions(+), 3 deletions(-) (limited to 'lib/db.php') diff --git a/lib/db.php b/lib/db.php index 51f7c7679d4..58f46c1171f 100644 --- a/lib/db.php +++ b/lib/db.php @@ -178,6 +178,13 @@ class OC_DB { $dsn = 'oci:dbname=//' . $host . '/' . $name; } break; + case 'mssql': + if ($port) { + $dsn='sqlsrv:Server='.$host.','.$port.';Database='.$name; + } else { + $dsn='sqlsrv:Server='.$host.';Database='.$name; + } + break; default: return false; } @@ -277,6 +284,15 @@ class OC_DB { $dsn['database'] = $user; } break; + case 'mssql': + $dsn = array( + 'phptype' => 'sqlsrv', + 'username' => $user, + 'password' => $pass, + 'hostspec' => $host, + 'database' => $name + ); + break; default: return false; } @@ -540,7 +556,7 @@ class OC_DB { * http://www.sqlite.org/lang_createtable.html * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm */ - if( $CONFIG_DBTYPE == 'pgsql' ) { //mysql support it too but sqlite doesn't + if( $CONFIG_DBTYPE == 'pgsql' || 'mssql') { //mysql support it too but sqlite doesn't $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); } file_put_contents( $file2, $content ); @@ -624,7 +640,7 @@ class OC_DB { } else { return true; } - } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql') { + } elseif( $type == 'pgsql' || $type == 'oci' || $type == 'mysql' || $type == 'mssql') { $query = 'INSERT INTO `' .$table . '` (' . implode(',', array_keys($input)) . ') SELECT \'' . implode('\',\'', array_values($input)) . '\' FROM ' . $table . ' WHERE '; @@ -683,7 +699,15 @@ class OC_DB { }elseif( $type == 'oci' ) { $query = str_replace( '`', '"', $query ); $query = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); - } + }elseif( $type == 'mssql' ) { + $query = preg_replace( "/\`(.*?)`/", "[$1]", $query ); + $query = str_replace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); + $query = str_replace( 'now()', 'CURRENT_TIMESTAMP', $query ); + $query = str_replace( 'LENGTH(', 'LEN(', $query ); + $query = str_replace( 'SUBSTR(', 'SUBSTRING(', $query ); + + $query = self::fixLimitClauseForMSSQL($query); + } // replace table name prefix $query = str_replace( '*PREFIX*', $prefix, $query ); @@ -691,6 +715,60 @@ class OC_DB { return $query; } + private static function fixLimitClauseForMSSQL($query) { + $limitLocation = stripos ($query, "LIMIT"); + + if ( $limitLocation === false ) { + return $query; + } + + // total == 0 means all results - not zero results + // + // First number is either total or offset, locate it by first space + // + $offset = substr ($query, $limitLocation + 5); + $offset = substr ($offset, 0, stripos ($offset, ' ')); + $offset = trim ($offset); + + // check for another parameter + if (stripos ($offset, ',') === false) { + // no more parameters + $offset = 0; + $total = intval ($offset); + } else { + // found another parameter + $offset = intval ($offset); + + $total = substr ($query, $limitLocation + 5); + $total = substr ($total, stripos ($total, ',')); + + $total = substr ($total, 0, stripos ($total, ' ')); + $total = intval ($total); + } + + $query = trim (substr ($query, 0, $limitLocation)); + + if ($offset == 0 && $total !== 0) { + if (strpos($query, "SELECT") === false) { + $query = "TOP {$total} " . $query; + } else { + $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP '.$total, $query); + } + } else if ($offset > 0) { + $query = preg_replace('/SELECT(\s*DISTINCT)?/Dsi', 'SELECT$1 TOP(10000000) ', $query); + $query = 'SELECT * + FROM (SELECT sub2.*, ROW_NUMBER() OVER(ORDER BY sub2.line2) AS line3 + FROM (SELECT 1 AS line2, sub1.* FROM (' . $query . ') AS sub1) as sub2) AS sub3'; + + if ($total > 0) { + $query .= ' WHERE line3 BETWEEN ' . ($offset + 1) . ' AND ' . ($offset + $total); + } else { + $query .= ' WHERE line3 > ' . $offset; + } + } + return $query; + } + /** * @brief drop a table * @param string $tableName the table to drop @@ -844,6 +922,14 @@ class PDOStatementWrapper{ public function execute($input=array()) { $this->lastArguments=$input; if(count($input)>0) { + if (!isset($type)) { + $type = OC_Config::getValue( "dbtype", "sqlite" ); + } + + if ($type == 'mssql') { + $this->tryFixSubstringLastArgumentDataForMSSQL($input); + } + $result=$this->statement->execute($input); }else{ $result=$this->statement->execute(); @@ -855,6 +941,94 @@ class PDOStatementWrapper{ } } + private function tryFixSubstringLastArgumentDataForMSSQL(&$input) { + $query = $this->statement->queryString; + $pos = stripos ($query, 'SUBSTRING'); + + if ( $pos === false) { + return; + } + + try { + $newQuery = ''; + + $cArg = 0; + + $inSubstring = false; + + // Create new query + for ($i = 0; $i < strlen ($query); $i++) { + if ($inSubstring == false) { + // Defines when we should start inserting values + if (substr ($query, $i, 9) == 'SUBSTRING') { + $inSubstring = true; + } + } else { + // Defines when we should stop inserting values + if (substr ($query, $i, 1) == ')') { + $inSubstring = false; + } + } + + if (substr ($query, $i, 1) == '?') { + // We found a question mark + if ($inSubstring) { + $newQuery .= $input[$cArg]; + + // + // Remove from input array + // + array_splice ($input, $cArg, 1); + } else { + $newQuery .= substr ($query, $i, 1); + $cArg++; + } + } else { + $newQuery .= substr ($query, $i, 1); + } + } + + // The global data we need + $name = OC_Config::getValue( "dbname", "owncloud" ); + $host = OC_Config::getValue( "dbhost", "" ); + $user = OC_Config::getValue( "dbuser", "" ); + $pass = OC_Config::getValue( "dbpassword", "" ); + if (strpos($host,':')) { + list($host, $port) = explode(':', $host, 2); + } else { + $port = false; + } + $opts = array(); + + if ($port) { + $dsn = 'sqlsrv:Server='.$host.','.$port.';Database='.$name; + } else { + $dsn = 'sqlsrv:Server='.$host.';Database='.$name; + } + + $PDO = new PDO($dsn, $user, $pass, $opts); + $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $this->statement = $PDO->prepare($newQuery); + + $this->lastArguments = $input; + } catch (PDOException $e){ + $entry = 'PDO DB Error: "'.$e->getMessage().'"
'; + $entry .= 'Offending command was: '.$this->statement->queryString .'
'; + $entry .= 'Input parameters: ' .print_r($input, true).'
'; + $entry .= 'Stack trace: ' .$e->getTraceAsString().'
'; + OC_Log::write('core', $entry, OC_Log::FATAL); + OC_User::setUserId(null); + + // send http status 503 + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + OC_Template::printErrorPage('Failed to connect to database'); + die ($entry); + } + } + /** * provide numRows */ -- cgit v1.2.3 From 41ec976fd74320c379f95d05d3a490310f06402e Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 10 Feb 2013 13:07:59 +0100 Subject: Bugfixes and cleanup MS SQL Server installation --- core/js/setup.js | 4 +- core/setup.php | 2 +- core/templates/installation.php | 2 +- lib/db.php | 36 ++++---- lib/setup.php | 191 ++++++++++++++++++++++++++-------------- 5 files changed, 148 insertions(+), 87 deletions(-) (limited to 'lib/db.php') diff --git a/core/js/setup.js b/core/js/setup.js index fb6e7c5097c..cb8392d0a39 100644 --- a/core/js/setup.js +++ b/core/js/setup.js @@ -5,7 +5,7 @@ $(document).ready(function() { mysql:!!$('#hasMySQL').val(), postgresql:!!$('#hasPostgreSQL').val(), oracle:!!$('#hasOracle').val(), - mssql:!!$('#hasMSSQL').val() + mssql:!!$('#hasMSSQL').val() }; $('#selectDbType').buttonset(); @@ -43,7 +43,7 @@ $(document).ready(function() { $('#dbhostlabel').show(250); }); - $('#mssql').click(function() { + $('#mssql').click(function() { $('#use_other_db').slideDown(250); $('#dbhost').show(250); $('#dbhostlabel').show(250); diff --git a/core/setup.php b/core/setup.php index 0da9b35a35a..6ea16cdcc4e 100644 --- a/core/setup.php +++ b/core/setup.php @@ -27,7 +27,7 @@ $opts = array( 'hasMySQL' => $hasMySQL, 'hasPostgreSQL' => $hasPostgreSQL, 'hasOracle' => $hasOracle, - 'hasMSSQLServer' => $hasMSSQL, + 'hasMSSQL' => $hasMSSQL, 'directory' => $datadir, 'secureRNG' => OC_Util::secureRNG_available(), 'htaccessWorking' => OC_Util::ishtaccessworking(), diff --git a/core/templates/installation.php b/core/templates/installation.php index 6a6370785d3..4a41527c906 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -107,7 +107,7 @@

MS SQL t( 'will be used' ); ?>.

- + /> diff --git a/lib/db.php b/lib/db.php index 58f46c1171f..c3ff481e19e 100644 --- a/lib/db.php +++ b/lib/db.php @@ -284,7 +284,7 @@ class OC_DB { $dsn['database'] = $user; } break; - case 'mssql': + case 'mssql': $dsn = array( 'phptype' => 'sqlsrv', 'username' => $user, @@ -292,7 +292,7 @@ class OC_DB { 'hostspec' => $host, 'database' => $name ); - break; + break; default: return false; } @@ -920,28 +920,30 @@ class PDOStatementWrapper{ * make execute return the result instead of a bool */ public function execute($input=array()) { - $this->lastArguments=$input; - if(count($input)>0) { - if (!isset($type)) { - $type = OC_Config::getValue( "dbtype", "sqlite" ); - } - - if ($type == 'mssql') { - $this->tryFixSubstringLastArgumentDataForMSSQL($input); - } - + $this->lastArguments = $input; + if (count($input) > 0) { + + if (!isset($type)) { + $type = OC_Config::getValue( "dbtype", "sqlite" ); + } + + if ($type == 'mssql') { + $input = $this->tryFixSubstringLastArgumentDataForMSSQL($input); + } + $result=$this->statement->execute($input); - }else{ + } else { $result=$this->statement->execute(); } - if($result) { + + if ($result) { return $this; - }else{ + } else { return false; } } - private function tryFixSubstringLastArgumentDataForMSSQL(&$input) { + private function tryFixSubstringLastArgumentDataForMSSQL($input) { $query = $this->statement->queryString; $pos = stripos ($query, 'SUBSTRING'); @@ -1013,6 +1015,8 @@ class PDOStatementWrapper{ $this->statement = $PDO->prepare($newQuery); $this->lastArguments = $input; + + return $input; } catch (PDOException $e){ $entry = 'PDO DB Error: "'.$e->getMessage().'"
'; $entry .= 'Offending command was: '.$this->statement->queryString .'
'; diff --git a/lib/setup.php b/lib/setup.php index d4ea26354ef..3efad79cfad 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -610,98 +610,155 @@ class OC_Setup { self::mssql_createDatabase($dbname, $masterConnection); - self::mssql_createDBUser($dbuser, $dbpass, $masterConnection); + self::mssql_createDBUser($dbuser, $dbname, $masterConnection); sqlsrv_close($masterConnection); - $connectionInfo = array( "Database" => $dbname, "UID" => $dbuser, "PWD" => $dbpass); - - $connection = @sqlsrv_connect($dbhost, $connectionInfo); - - //fill the database if needed - $query="SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{$dbname}' AND TABLE_NAME = '{$dbtableprefix}users'"; - $result = sqlsrv_query($connection, $query); - if($result) { - $row=sqlsrv_fetch_array($result); - } - - if(!$result or $row[0] == 0) { - OC_DB::createDbFromStructure('db_structure.xml'); - } - - sqlsrv_close($connection); + self::mssql_createDatabaseStructure($dbname, $dbuser, $dbpass); } private static function mssql_createDBLogin($name, $password, $connection) { $query = "SELECT * FROM master.sys.server_principals WHERE name = '".$name."';"; $result = sqlsrv_query($connection, $query); - if ($result) { + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { $row = sqlsrv_fetch_array($result); - } - if (!$result or $row[0] == 0) { - $query = "CREATE LOGIN [".$name."] WITH PASSWORD = '".$password."';"; - $result = sqlsrv_query($connection, $query); - if (!$result or $result === false) { - if ( ($errors = sqlsrv_errors() ) != null) { - $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; - } else { - $entry = ''; - } - $entry.='Offending command was: '.$query.'
'; - echo($entry); - } + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { + if ($row == null) { + $query = "CREATE LOGIN [".$name."] WITH PASSWORD = '".$password."';"; + $result = sqlsrv_query($connection, $query); + if (!$result or $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } + } + } } } private static function mssql_createDBUser($name, $dbname, $connection) { $query = "SELECT * FROM [".$dbname."].sys.database_principals WHERE name = '".$name."';"; $result = sqlsrv_query($connection, $query); - if($result) { - $row=sqlsrv_fetch_array($result); + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { + $row = sqlsrv_fetch_array($result); + + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { + if ($row == null) { + $query = "USE [".$dbname."]; CREATE USER [".$name."] FOR LOGIN [".$name."];"; + $result = sqlsrv_query($connection, $query); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry = 'DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } + } + + $query = "USE [".$dbname."]; EXEC sp_addrolemember 'db_owner', '".$name."';"; + $result = sqlsrv_query($connection, $query); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } + } } - - if (!$result or $row[0] == 0) { - $query = "USE [".$dbname."]; CREATE USER [".$name."] FOR LOGIN [".$name."];"; - $result = sqlsrv_query($connection, $query); - if (!$result or $result === false) { - if ( ($errors = sqlsrv_errors() ) != null) { - $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; - } else { - $entry = ''; - } - $entry.='Offending command was: '.$query.'
'; - echo($entry); - } - } - - $query = "USE [".$dbname."]; EXEC sp_addrolemember 'db_owner', '".$name."';"; - $result = sqlsrv_query($connection, $query); - if (!$result or $result === false) { - if ( ($errors = sqlsrv_errors() ) != null) { - $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; - } else { - $entry = ''; - } - $entry.='Offending command was: '.$query.'
'; - echo($entry); - } } private static function mssql_createDatabase($dbname, $connection) { $query = "CREATE DATABASE [".$dbname."];"; $result = sqlsrv_query($connection, $query); - if (!$result or $result === false) { - if ( ($errors = sqlsrv_errors() ) != null) { - $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; - } else { - $entry = ''; - } - $entry.='Offending command was: '.$query.'
'; - echo($entry); + if (!$result || $result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); } } + private static function mssql_createDatabaseStructure($dbname, $dbuser, $dbpass) { + $connectionInfo = array( "Database" => $dbname, "UID" => $dbuser, "PWD" => $dbpass); + + $connection = @sqlsrv_connect($dbhost, $connectionInfo); + + //fill the database if needed + $query = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{$dbname}' AND TABLE_NAME = '{$dbtableprefix}users'"; + $result = sqlsrv_query($connection, $query); + if ($result === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { + $row = sqlsrv_fetch_array($result); + + if ($row === false) { + if ( ($errors = sqlsrv_errors() ) != null) { + $entry='DB Error: "'.print_r(sqlsrv_errors()).'"
'; + } else { + $entry = ''; + } + $entry.='Offending command was: '.$query.'
'; + echo($entry); + } else { + if ($row == null) { + OC_DB::createDbFromStructure('db_structure.xml'); + } + } + } + + sqlsrv_close($connection); + } /** * create .htaccess files for apache hosts -- cgit v1.2.3 From 4e5a3fbcafcaa0cdaba351dfb307b0000179c832 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 10 Feb 2013 14:08:00 +0100 Subject: - Fixed indentations. - Fixed a bug in legacy.php: there was an error that was not checked for if the table 'fscache' did not exist in the database. --- lib/db.php | 154 ++++++++++++++++++++++----------------------- lib/files/cache/legacy.php | 6 ++ 2 files changed, 83 insertions(+), 77 deletions(-) (limited to 'lib/db.php') diff --git a/lib/db.php b/lib/db.php index c3ff481e19e..3ccd51737ae 100644 --- a/lib/db.php +++ b/lib/db.php @@ -943,95 +943,95 @@ class PDOStatementWrapper{ } } - private function tryFixSubstringLastArgumentDataForMSSQL($input) { - $query = $this->statement->queryString; - $pos = stripos ($query, 'SUBSTRING'); - - if ( $pos === false) { - return; - } - - try { - $newQuery = ''; - - $cArg = 0; - - $inSubstring = false; - - // Create new query - for ($i = 0; $i < strlen ($query); $i++) { - if ($inSubstring == false) { - // Defines when we should start inserting values - if (substr ($query, $i, 9) == 'SUBSTRING') { - $inSubstring = true; - } - } else { - // Defines when we should stop inserting values - if (substr ($query, $i, 1) == ')') { - $inSubstring = false; - } - } - - if (substr ($query, $i, 1) == '?') { - // We found a question mark - if ($inSubstring) { - $newQuery .= $input[$cArg]; - - // - // Remove from input array - // - array_splice ($input, $cArg, 1); - } else { - $newQuery .= substr ($query, $i, 1); - $cArg++; - } - } else { - $newQuery .= substr ($query, $i, 1); - } - } + private function tryFixSubstringLastArgumentDataForMSSQL($input) { + $query = $this->statement->queryString; + $pos = stripos ($query, 'SUBSTRING'); - // The global data we need - $name = OC_Config::getValue( "dbname", "owncloud" ); - $host = OC_Config::getValue( "dbhost", "" ); - $user = OC_Config::getValue( "dbuser", "" ); - $pass = OC_Config::getValue( "dbpassword", "" ); - if (strpos($host,':')) { - list($host, $port) = explode(':', $host, 2); - } else { - $port = false; - } - $opts = array(); + if ( $pos === false) { + return; + } - if ($port) { - $dsn = 'sqlsrv:Server='.$host.','.$port.';Database='.$name; - } else { - $dsn = 'sqlsrv:Server='.$host.';Database='.$name; - } + try { + $newQuery = ''; - $PDO = new PDO($dsn, $user, $pass, $opts); - $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); - $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $cArg = 0; - $this->statement = $PDO->prepare($newQuery); + $inSubstring = false; - $this->lastArguments = $input; - - return $input; - } catch (PDOException $e){ + // Create new query + for ($i = 0; $i < strlen ($query); $i++) { + if ($inSubstring == false) { + // Defines when we should start inserting values + if (substr ($query, $i, 9) == 'SUBSTRING') { + $inSubstring = true; + } + } else { + // Defines when we should stop inserting values + if (substr ($query, $i, 1) == ')') { + $inSubstring = false; + } + } + + if (substr ($query, $i, 1) == '?') { + // We found a question mark + if ($inSubstring) { + $newQuery .= $input[$cArg]; + + // + // Remove from input array + // + array_splice ($input, $cArg, 1); + } else { + $newQuery .= substr ($query, $i, 1); + $cArg++; + } + } else { + $newQuery .= substr ($query, $i, 1); + } + } + + // The global data we need + $name = OC_Config::getValue( "dbname", "owncloud" ); + $host = OC_Config::getValue( "dbhost", "" ); + $user = OC_Config::getValue( "dbuser", "" ); + $pass = OC_Config::getValue( "dbpassword", "" ); + if (strpos($host,':')) { + list($host, $port) = explode(':', $host, 2); + } else { + $port = false; + } + $opts = array(); + + if ($port) { + $dsn = 'sqlsrv:Server='.$host.','.$port.';Database='.$name; + } else { + $dsn = 'sqlsrv:Server='.$host.';Database='.$name; + } + + $PDO = new PDO($dsn, $user, $pass, $opts); + $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $this->statement = $PDO->prepare($newQuery); + + $this->lastArguments = $input; + + return $input; + } catch (PDOException $e){ $entry = 'PDO DB Error: "'.$e->getMessage().'"
'; $entry .= 'Offending command was: '.$this->statement->queryString .'
'; $entry .= 'Input parameters: ' .print_r($input, true).'
'; $entry .= 'Stack trace: ' .$e->getTraceAsString().'
'; OC_Log::write('core', $entry, OC_Log::FATAL); - OC_User::setUserId(null); + OC_User::setUserId(null); - // send http status 503 - header('HTTP/1.1 503 Service Temporarily Unavailable'); - header('Status: 503 Service Temporarily Unavailable'); - OC_Template::printErrorPage('Failed to connect to database'); - die ($entry); + // send http status 503 + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + OC_Template::printErrorPage('Failed to connect to database'); + die ($entry); } - } + } /** * provide numRows diff --git a/lib/files/cache/legacy.php b/lib/files/cache/legacy.php index 33d4b8e7c9f..bdc3cbf00b2 100644 --- a/lib/files/cache/legacy.php +++ b/lib/files/cache/legacy.php @@ -51,6 +51,12 @@ class Legacy { $this->cacheHasItems = false; return false; } + + if ($result === false || property_exists($result, 'error_message_prefix')) { + $this->cacheHasItems = false; + return false; + } + $this->cacheHasItems = (bool)$result->fetchRow(); return $this->cacheHasItems; } -- cgit v1.2.3 From 78a3625ddfc67e7e6743a2ff6fd31e1566b174c8 Mon Sep 17 00:00:00 2001 From: Thomas Mueller Date: Thu, 14 Feb 2013 21:59:24 +0100 Subject: final adoptions for mssql connectivity --- lib/db.php | 7 +++++++ lib/files/cache/cache.php | 6 +++--- tests/lib/dbschema.php | 12 +++++++++--- 3 files changed, 19 insertions(+), 6 deletions(-) (limited to 'lib/db.php') diff --git a/lib/db.php b/lib/db.php index 3ccd51737ae..903f76c8c04 100644 --- a/lib/db.php +++ b/lib/db.php @@ -404,6 +404,13 @@ class OC_DB { $query = self::prepare('SELECT lastval() AS id'); $row = $query->execute()->fetchRow(); return $row['id']; + } + if( $type == 'mssql' ) { + if($table !== null) { + $prefix = OC_Config::getValue( "dbtableprefix", "oc_" ); + $table = str_replace( '*PREFIX*', $prefix, $table ); + } + return self::$connection->lastInsertId($table); }else{ if($table !== null) { $prefix = OC_Config::getValue( "dbtableprefix", "oc_" ); diff --git a/lib/files/cache/cache.php b/lib/files/cache/cache.php index dcb6e8fd39a..b61f1de4483 100644 --- a/lib/files/cache/cache.php +++ b/lib/files/cache/cache.php @@ -56,7 +56,7 @@ class Cache { } else { $query = \OC_DB::prepare('INSERT INTO `*PREFIX*storages`(`id`) VALUES(?)'); $query->execute(array($this->storageId)); - $this->numericId = \OC_DB::insertid('*PREFIX*filecache'); + $this->numericId = \OC_DB::insertid('*PREFIX*storages'); } } @@ -493,8 +493,8 @@ class Cache { */ public function getIncomplete() { $query = \OC_DB::prepare('SELECT `path` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `size` = -1 ORDER BY `fileid` DESC LIMIT 1'); - $query->execute(array($this->numericId)); - if ($row = $query->fetchRow()) { + $result = $query->execute(array($this->numericId)); + if ($row = $result->fetchRow()) { return $row['path']; } else { return false; diff --git a/tests/lib/dbschema.php b/tests/lib/dbschema.php index fb60ce7dbb7..e20a04ef7fd 100644 --- a/tests/lib/dbschema.php +++ b/tests/lib/dbschema.php @@ -91,9 +91,15 @@ class Test_DBSchema extends PHPUnit_Framework_TestCase { break; case 'pgsql': $sql = "SELECT tablename AS table_name, schemaname AS schema_name " - . "FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' " - . "AND schemaname != 'information_schema' " - . "AND tablename = '".$table."'"; + . "FROM pg_tables WHERE schemaname NOT LIKE 'pg_%' " + . "AND schemaname != 'information_schema' " + . "AND tablename = '".$table."'"; + $query = OC_DB::prepare($sql); + $result = $query->execute(array()); + $exists = $result && $result->fetchOne(); + break; + case 'mssql': + $sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{$table}'"; $query = OC_DB::prepare($sql); $result = $query->execute(array()); $exists = $result && $result->fetchOne(); -- cgit v1.2.3 From 47b899e0c8d818614ad6e52d684b9954b0d769ac Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 26 Feb 2013 22:41:48 +0100 Subject: Disable prepared query caching while doing an upgrade --- core/ajax/update.php | 3 ++- lib/db.php | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) (limited to 'lib/db.php') diff --git a/core/ajax/update.php b/core/ajax/update.php index 20ab045c892..b112cf6266b 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -4,6 +4,7 @@ $RUNTIME_NOAPPS = true; require_once '../../lib/base.php'; if (OC::checkUpgrade(false)) { + \OC_DB::enableCaching(false); $updateEventSource = new OC_EventSource(); $watcher = new UpdateWatcher($updateEventSource); OC_Hook::connect('update', 'success', $watcher, 'success'); @@ -64,4 +65,4 @@ class UpdateWatcher { $this->eventSource->close(); } -} \ No newline at end of file +} diff --git a/lib/db.php b/lib/db.php index fb2c027cdb9..1fd852b370f 100644 --- a/lib/db.php +++ b/lib/db.php @@ -42,6 +42,7 @@ class OC_DB { const BACKEND_MDB2=1; static private $preparedQueries = array(); + static private $cachingEnabled = true; /** * @var MDB2_Driver_Common @@ -356,7 +357,7 @@ class OC_DB { } } } else { - if (isset(self::$preparedQueries[$query])) { + if (isset(self::$preparedQueries[$query]) and self::$cachingEnabled) { return self::$preparedQueries[$query]; } } @@ -382,7 +383,7 @@ class OC_DB { } $result=new PDOStatementWrapper($result); } - if (is_null($limit) || $limit == -1) { + if ((is_null($limit) || $limit == -1) and self::$cachingEnabled ) { self::$preparedQueries[$rawQuery] = $result; } return $result; @@ -915,6 +916,16 @@ class OC_DB { } return $msg; } + + /** + * @param bool $enabled + */ + static public function enableCaching($enabled) { + if (!$enabled) { + self::$preparedQueries = array(); + } + self::$cachingEnabled = $enabled; + } } /** -- cgit v1.2.3 From d7528f06dfd8eb0576bd2cee5ae4230ffb5b5066 Mon Sep 17 00:00:00 2001 From: Bart Visscher Date: Tue, 26 Feb 2013 22:41:05 +0100 Subject: Disable query cache for Sqlite --- lib/db.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/db.php') diff --git a/lib/db.php b/lib/db.php index 1fd852b370f..347deac8519 100644 --- a/lib/db.php +++ b/lib/db.php @@ -384,7 +384,10 @@ class OC_DB { $result=new PDOStatementWrapper($result); } if ((is_null($limit) || $limit == -1) and self::$cachingEnabled ) { - self::$preparedQueries[$rawQuery] = $result; + $type = OC_Config::getValue( "dbtype", "sqlite" ); + if( $type != 'sqlite' && $type != 'sqlite3' ) { + self::$preparedQueries[$rawQuery] = $result; + } } return $result; } -- cgit v1.2.3