diff options
author | Bart Visscher <bartv@thisnet.nl> | 2013-02-25 22:49:55 +0100 |
---|---|---|
committer | Bart Visscher <bartv@thisnet.nl> | 2013-07-21 23:17:37 +0200 |
commit | 58991150ab17846640907d43a6d4b0ff502d4986 (patch) | |
tree | 68b840c85a9b099872510b6adc6f420273ebbd80 | |
parent | 1d5d23a1de5a490595d8bb7ea81b8bda48b8feeb (diff) | |
download | nextcloud-server-58991150ab17846640907d43a6d4b0ff502d4986.tar.gz nextcloud-server-58991150ab17846640907d43a6d4b0ff502d4986.zip |
Move query statement fixup handling to Connection wrapper
-rw-r--r-- | lib/db.php | 48 | ||||
-rw-r--r-- | lib/db/adapter.php | 4 | ||||
-rw-r--r-- | lib/db/adapteroci8.php | 7 | ||||
-rw-r--r-- | lib/db/adapterpgsql.php | 6 | ||||
-rw-r--r-- | lib/db/adaptersqlite.php | 6 | ||||
-rw-r--r-- | lib/db/adaptersqlsrv.php | 9 | ||||
-rw-r--r-- | lib/db/connection.php | 9 |
7 files changed, 39 insertions, 50 deletions
diff --git a/lib/db.php b/lib/db.php index 4451f813905..0ad8a9b35d8 100644 --- a/lib/db.php +++ b/lib/db.php @@ -213,11 +213,6 @@ class OC_DB { * SQL query via Doctrine prepare(), needs to be execute()'d! */ static public function prepare( $query , $limit = null, $offset = null, $isManipulation = null) { - // Optimize the query - $query = self::processQuery( $query ); - if(OC_Config::getValue( "log_query", false)) { - OC_Log::write('core', 'DB prepare : '.$query, OC_Log::DEBUG); - } self::connect(); if ($isManipulation === null) { @@ -449,49 +444,6 @@ class OC_DB { } /** - * @brief does minor changes to query - * @param string $query Query string - * @return string corrected query string - * - * This function replaces *PREFIX* with the value of $CONFIG_DBTABLEPREFIX - * and replaces the ` with ' or " according to the database driver. - */ - private static function processQuery( $query ) { - self::connect(); - // We need Database type - if(is_null(self::$type)) { - self::$type=OC_Config::getValue( "dbtype", "sqlite" ); - } - $type = self::$type; - - // differences in escaping of table names ('`' for mysql) and getting the current timestamp - if( $type == 'sqlite' || $type == 'sqlite3' ) { - $query = str_replace( '`', '"', $query ); - $query = str_ireplace( 'NOW()', 'datetime(\'now\')', $query ); - $query = str_ireplace( 'UNIX_TIMESTAMP()', 'strftime(\'%s\',\'now\')', $query ); - } elseif( $type == 'pgsql' ) { - $query = str_replace( '`', '"', $query ); - $query = str_ireplace( 'UNIX_TIMESTAMP()', 'cast(extract(epoch from current_timestamp) as integer)', - $query ); - } elseif( $type == 'oci' ) { - $query = str_replace( '`', '"', $query ); - $query = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); - $query = str_ireplace( 'UNIX_TIMESTAMP()', "(cast(sys_extract_utc(systimestamp) as date) - date'1970-01-01') * 86400", $query ); - }elseif( $type == 'mssql' ) { - $query = preg_replace( "/\`(.*?)`/", "[$1]", $query ); - $query = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); - $query = str_replace( 'LENGTH(', 'LEN(', $query ); - $query = str_replace( 'SUBSTR(', 'SUBSTRING(', $query ); - $query = str_ireplace( 'UNIX_TIMESTAMP()', 'DATEDIFF(second,{d \'1970-01-01\'},GETDATE())', $query ); - } - - return $query; - } - - return $query; - } - - /** * @brief drop a table * @param string $tableName the table to drop */ diff --git a/lib/db/adapter.php b/lib/db/adapter.php index b0c9aab9c7a..3b83853289a 100644 --- a/lib/db/adapter.php +++ b/lib/db/adapter.php @@ -18,4 +18,8 @@ class Adapter { public function lastInsertId($table) { return $this->conn->realLastInsertId($table); } + + public function fixupStatement($statement) { + return $statement; + } } diff --git a/lib/db/adapteroci8.php b/lib/db/adapteroci8.php index 50c4d078243..6123007cb2f 100644 --- a/lib/db/adapteroci8.php +++ b/lib/db/adapteroci8.php @@ -18,4 +18,11 @@ class AdapterOCI8 extends Adapter { } return $this->conn->lastInsertId($table); } + + public function fixupStatement($statement) { + $statement = str_replace( '`', '"', $statement ); + $statement = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $statement ); + $statement = str_ireplace( 'UNIX_TIMESTAMP()', "(cast(sys_extract_utc(systimestamp) as date) - date'1970-01-01') * 86400", $statement ); + return $statement; + } } diff --git a/lib/db/adapterpgsql.php b/lib/db/adapterpgsql.php index 0084aad470e..acfc4201629 100644 --- a/lib/db/adapterpgsql.php +++ b/lib/db/adapterpgsql.php @@ -13,4 +13,10 @@ class AdapterPgSql extends Adapter { public function lastInsertId($table) { return $this->conn->fetchColumn('SELECT lastval()'); } + + public function fixupStatement($statement) { + $statement = str_replace( '`', '"', $statement ); + $statement = str_ireplace( 'UNIX_TIMESTAMP()', 'cast(extract(epoch from current_timestamp) as integer)', $statement ); + return $statement; + } } diff --git a/lib/db/adaptersqlite.php b/lib/db/adaptersqlite.php index 0b8107ac53e..f0057ab489f 100644 --- a/lib/db/adaptersqlite.php +++ b/lib/db/adaptersqlite.php @@ -10,4 +10,10 @@ namespace OC\DB; class AdapterSqlite extends Adapter { + public function fixupStatement($statement) { + $statement = str_replace( '`', '"', $statement ); + $statement = str_ireplace( 'NOW()', 'datetime(\'now\')', $statement ); + $statement = str_ireplace( 'UNIX_TIMESTAMP()', 'strftime(\'%s\',\'now\')', $statement ); + return $statement; + } } diff --git a/lib/db/adaptersqlsrv.php b/lib/db/adaptersqlsrv.php index 602c70456e5..d0a67af28a7 100644 --- a/lib/db/adaptersqlsrv.php +++ b/lib/db/adaptersqlsrv.php @@ -16,4 +16,13 @@ class AdapterSQLSrv extends Adapter { } return $this->conn->lastInsertId($table); } + + public function fixupStatement($statement) { + $statement = preg_replace( "/\`(.*?)`/", "[$1]", $statement ); + $statement = str_ireplace( 'NOW()', 'CURRENT_TIMESTAMP', $statement ); + $statement = str_replace( 'LENGTH(', 'LEN(', $statement ); + $statement = str_replace( 'SUBSTR(', 'SUBSTRING(', $statement ); + $statement = str_ireplace( 'UNIX_TIMESTAMP()', 'DATEDIFF(second,{d \'1970-01-01\'},GETDATE())', $statement ); + return $statement; + } } diff --git a/lib/db/connection.php b/lib/db/connection.php index c8695b13190..8442efc47c9 100644 --- a/lib/db/connection.php +++ b/lib/db/connection.php @@ -50,6 +50,8 @@ class Connection extends \Doctrine\DBAL\Connection { */ public function prepare( $statement, $limit=null, $offset=null ) { $statement = $this->replaceTablePrefix($statement); + $statement = $this->adapter->fixupStatement($statement); + if ($limit === -1) { $limit = null; } @@ -62,6 +64,9 @@ class Connection extends \Doctrine\DBAL\Connection { } } $rawQuery = $statement; + if(\OC_Config::getValue( "log_query", false)) { + \OC_Log::write('core', 'DB prepare : '.$statement, \OC_Log::DEBUG); + } $result = parent::prepare($statement); if (is_null($limit) && $this->cachingQueryStatementEnabled) { $this->preparedQueries[$rawQuery] = $result; @@ -85,7 +90,7 @@ class Connection extends \Doctrine\DBAL\Connection { public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null) { $query = $this->replaceTablePrefix($query); - // TODO: fixup + $query = $this->adapter->fixupStatement($query); return parent::executeQuery($query, $params, $types, $qcp); } @@ -104,7 +109,7 @@ class Connection extends \Doctrine\DBAL\Connection { public function executeUpdate($query, array $params = array(), array $types = array()) { $query = $this->replaceTablePrefix($query); - // TODO: fixup + $query = $this->adapter->fixupStatement($query); return parent::executeUpdate($query, $params, $types); } |