aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBart Visscher <bartv@thisnet.nl>2013-02-25 22:49:55 +0100
committerBart Visscher <bartv@thisnet.nl>2013-07-21 23:17:37 +0200
commit58991150ab17846640907d43a6d4b0ff502d4986 (patch)
tree68b840c85a9b099872510b6adc6f420273ebbd80
parent1d5d23a1de5a490595d8bb7ea81b8bda48b8feeb (diff)
downloadnextcloud-server-58991150ab17846640907d43a6d4b0ff502d4986.tar.gz
nextcloud-server-58991150ab17846640907d43a6d4b0ff502d4986.zip
Move query statement fixup handling to Connection wrapper
-rw-r--r--lib/db.php48
-rw-r--r--lib/db/adapter.php4
-rw-r--r--lib/db/adapteroci8.php7
-rw-r--r--lib/db/adapterpgsql.php6
-rw-r--r--lib/db/adaptersqlite.php6
-rw-r--r--lib/db/adaptersqlsrv.php9
-rw-r--r--lib/db/connection.php9
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);
}