Move query statement fixup handling to Connection wrapper
This commit is contained in:
parent
1d5d23a1de
commit
58991150ab
48
lib/db.php
48
lib/db.php
|
@ -213,11 +213,6 @@ class OC_DB {
|
||||||
* SQL query via Doctrine prepare(), needs to be execute()'d!
|
* SQL query via Doctrine prepare(), needs to be execute()'d!
|
||||||
*/
|
*/
|
||||||
static public function prepare( $query , $limit = null, $offset = null, $isManipulation = null) {
|
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();
|
self::connect();
|
||||||
|
|
||||||
if ($isManipulation === null) {
|
if ($isManipulation === null) {
|
||||||
|
@ -448,49 +443,6 @@ class OC_DB {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @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
|
* @brief drop a table
|
||||||
* @param string $tableName the table to drop
|
* @param string $tableName the table to drop
|
||||||
|
|
|
@ -18,4 +18,8 @@ class Adapter {
|
||||||
public function lastInsertId($table) {
|
public function lastInsertId($table) {
|
||||||
return $this->conn->realLastInsertId($table);
|
return $this->conn->realLastInsertId($table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function fixupStatement($statement) {
|
||||||
|
return $statement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,4 +18,11 @@ class AdapterOCI8 extends Adapter {
|
||||||
}
|
}
|
||||||
return $this->conn->lastInsertId($table);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,4 +13,10 @@ class AdapterPgSql extends Adapter {
|
||||||
public function lastInsertId($table) {
|
public function lastInsertId($table) {
|
||||||
return $this->conn->fetchColumn('SELECT lastval()');
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,4 +10,10 @@
|
||||||
namespace OC\DB;
|
namespace OC\DB;
|
||||||
|
|
||||||
class AdapterSqlite extends Adapter {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,4 +16,13 @@ class AdapterSQLSrv extends Adapter {
|
||||||
}
|
}
|
||||||
return $this->conn->lastInsertId($table);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,8 @@ class Connection extends \Doctrine\DBAL\Connection {
|
||||||
*/
|
*/
|
||||||
public function prepare( $statement, $limit=null, $offset=null ) {
|
public function prepare( $statement, $limit=null, $offset=null ) {
|
||||||
$statement = $this->replaceTablePrefix($statement);
|
$statement = $this->replaceTablePrefix($statement);
|
||||||
|
$statement = $this->adapter->fixupStatement($statement);
|
||||||
|
|
||||||
if ($limit === -1) {
|
if ($limit === -1) {
|
||||||
$limit = null;
|
$limit = null;
|
||||||
}
|
}
|
||||||
|
@ -62,6 +64,9 @@ class Connection extends \Doctrine\DBAL\Connection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$rawQuery = $statement;
|
$rawQuery = $statement;
|
||||||
|
if(\OC_Config::getValue( "log_query", false)) {
|
||||||
|
\OC_Log::write('core', 'DB prepare : '.$statement, \OC_Log::DEBUG);
|
||||||
|
}
|
||||||
$result = parent::prepare($statement);
|
$result = parent::prepare($statement);
|
||||||
if (is_null($limit) && $this->cachingQueryStatementEnabled) {
|
if (is_null($limit) && $this->cachingQueryStatementEnabled) {
|
||||||
$this->preparedQueries[$rawQuery] = $result;
|
$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)
|
public function executeQuery($query, array $params = array(), $types = array(), QueryCacheProfile $qcp = null)
|
||||||
{
|
{
|
||||||
$query = $this->replaceTablePrefix($query);
|
$query = $this->replaceTablePrefix($query);
|
||||||
// TODO: fixup
|
$query = $this->adapter->fixupStatement($query);
|
||||||
return parent::executeQuery($query, $params, $types, $qcp);
|
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())
|
public function executeUpdate($query, array $params = array(), array $types = array())
|
||||||
{
|
{
|
||||||
$query = $this->replaceTablePrefix($query);
|
$query = $this->replaceTablePrefix($query);
|
||||||
// TODO: fixup
|
$query = $this->adapter->fixupStatement($query);
|
||||||
return parent::executeUpdate($query, $params, $types);
|
return parent::executeUpdate($query, $params, $types);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue