From 1e71b225c533bada107f439106c9216982b62daa Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 5 Jul 2012 14:19:49 -0400 Subject: [PATCH] Make mysql/postgres drivers compatible with Quercus --- classes/query_builder.php | 24 +++++++++++++++++++----- drivers/mysql/mysql_driver.php | 18 +++++++++++++----- drivers/mysql/mysql_util.php | 11 ++++++++--- drivers/pgsql/pgsql_driver.php | 7 ++++++- drivers/sqlite/sqlite_driver.php | 2 +- tests/databases/mysql/mysql-qb.php | 2 +- tests/databases/mysql/mysql.php | 6 +++--- tests/databases/pgsql/pgsql-qb.php | 2 +- tests/databases/pgsql/pgsql.php | 4 ++-- tests/db_files/FB_TEST_DB.FDB | Bin 802816 -> 802816 bytes 10 files changed, 54 insertions(+), 22 deletions(-) diff --git a/classes/query_builder.php b/classes/query_builder.php index 679c26c..0d28e82 100644 --- a/classes/query_builder.php +++ b/classes/query_builder.php @@ -158,7 +158,13 @@ class Query_Builder { // Convert array to object if (is_array($params)) { - $p = new ArrayObject($params, ArrayObject::ARRAY_AS_PROPS); + $p = new stdClass(); + + foreach($params as $k => $v) + { + $p->$k = $v; + } + $params = $p; } @@ -171,12 +177,20 @@ class Query_Builder { $params->type = strtolower($params->type); $dbtype = ($params->type !== 'postgresql') ? $params->type : 'pgsql'; + + $dsn = ''; + + // Add the driver type to the dsn + if ($dbtype !== 'firebird' && $dbtype !== 'sqlite') + { + $dsn = strtolower($dbtype).':'.$dsn; + } // Create the dsn for the database to connect to switch($dbtype) { default: - $dsn = "dbname={$params->conn_db}"; + $dsn .= "dbname={$params->conn_db}"; if ( ! empty($params->host)) { @@ -191,14 +205,14 @@ class Query_Builder { break; case "sqlite": - $dsn = $params->file; + $dsn .= $params->file; break; case "firebird": $dsn = "{$params->host}:{$params->file}"; break; } - + // Create the database connection if ( ! empty($params->user)) { @@ -1209,7 +1223,7 @@ class Query_Builder { // Only unset class variables that // are not callable. Otherwise, we'll // delete class methods! - foreach($this as $name => &$var) + foreach($this as $name => $var) { // Skip properties that are needed for every query if (in_array($name, array( diff --git a/drivers/mysql/mysql_driver.php b/drivers/mysql/mysql_driver.php index a8dd9f1..630eac9 100644 --- a/drivers/mysql/mysql_driver.php +++ b/drivers/mysql/mysql_driver.php @@ -38,11 +38,19 @@ class MySQL extends DB_PDO { */ public function __construct($dsn, $username=null, $password=null, $options=array()) { - $options = array_merge($options, array( - PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF-8 COLLATE 'UTF-8'", - )); - - parent::__construct("mysql:{$dsn}", $username, $password, $options); + if (defined('PDO::MYSQL_ATTR_INIT_COMMAND')) + { + $options = array_merge($options, array( + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF-8 COLLATE 'UTF-8'", + )); + } + + if (strpos($dsn, 'mysql') === FALSE) + { + $dsn = 'mysql:'.$dsn; + } + + parent::__construct($dsn, $username, $password, $options); } // -------------------------------------------------------------------------- diff --git a/drivers/mysql/mysql_util.php b/drivers/mysql/mysql_util.php index 79b818e..005e7cb 100644 --- a/drivers/mysql/mysql_util.php +++ b/drivers/mysql/mysql_util.php @@ -171,7 +171,7 @@ class MySQL_Util extends DB_Util { $output_sql = ''; // Select the rows from each Table - foreach($tables as &$t) + foreach($tables as $t) { $sql = "SELECT * FROM `{$t}`"; $res = $this->query($sql); @@ -188,10 +188,15 @@ class MySQL_Util extends DB_Util { $insert_rows = array(); // Create the insert statements - foreach($rows as &$row) + foreach($rows as $row) { $row = array_values($row); - $row = array_map(array(&$this, 'quote'), $row); + + // Workaround for Quercus + foreach($row as &$r) + { + $r = $this->quote($r); + } $row = array_map('trim', $row); $row_string = 'INSERT INTO `'.trim($t).'` (`'.implode('`,`', $columns).'`) VALUES ('.implode(',', $row).');'; diff --git a/drivers/pgsql/pgsql_driver.php b/drivers/pgsql/pgsql_driver.php index a0ac49e..1caa7d5 100644 --- a/drivers/pgsql/pgsql_driver.php +++ b/drivers/pgsql/pgsql_driver.php @@ -31,7 +31,12 @@ class PgSQL extends DB_PDO { */ public function __construct($dsn, $username=null, $password=null, $options=array()) { - parent::__construct("pgsql:{$dsn}", $username, $password, $options); + if (strpos($dsn, 'pgsql') === FALSE) + { + $dsn = 'pgsql:'.$dsn; + } + + parent::__construct($dsn, $username, $password, $options); } // -------------------------------------------------------------------------- diff --git a/drivers/sqlite/sqlite_driver.php b/drivers/sqlite/sqlite_driver.php index b042658..213d6dd 100644 --- a/drivers/sqlite/sqlite_driver.php +++ b/drivers/sqlite/sqlite_driver.php @@ -36,7 +36,7 @@ class SQLite extends DB_PDO { * @param string $pass */ public function __construct($dsn, $user=NULL, $pass=NULL) - { + { // DSN is simply `sqlite:/path/to/db` parent::__construct("sqlite:{$dsn}", $user, $pass); } diff --git a/tests/databases/mysql/mysql-qb.php b/tests/databases/mysql/mysql-qb.php index 6dbbb1f..f9c7c2b 100644 --- a/tests/databases/mysql/mysql-qb.php +++ b/tests/databases/mysql/mysql-qb.php @@ -24,7 +24,7 @@ class MySQLQBTest extends QBTest { { $params = json_decode(file_get_contents(QBASE_DIR . "test_config.json")); $params = $params->mysql; - $params->type = "mysql"; + $params->type = "MySQL"; $this->db = new Query_Builder($params); diff --git a/tests/databases/mysql/mysql.php b/tests/databases/mysql/mysql.php index 4bdd116..ddb2c04 100644 --- a/tests/databases/mysql/mysql.php +++ b/tests/databases/mysql/mysql.php @@ -25,10 +25,10 @@ class MySQLTest extends DBTest { // Attempt to connect, if there is a test config file if (is_file(QBASE_DIR . "test_config.json")) { - $params = json_decode(file_get_contents(QBASE_DIR . "test_config.json"), TRUE); - $params = $params['mysql']; + $params = json_decode(file_get_contents(QBASE_DIR . "test_config.json")); + $params = $params->mysql; - $this->db = new MySQL("host={$params['host']};port={$params['port']};dbname={$params['database']}", $params['user'], $params['pass']); + $this->db = new MySQL("mysql:host={$params->host};dbname={$params->database}", $params->user, $params->pass); } elseif (($var = getenv('CI'))) { diff --git a/tests/databases/pgsql/pgsql-qb.php b/tests/databases/pgsql/pgsql-qb.php index 295e51a..4619898 100644 --- a/tests/databases/pgsql/pgsql-qb.php +++ b/tests/databases/pgsql/pgsql-qb.php @@ -49,6 +49,6 @@ class PgSQLQBTest extends QBTest { public function TestExists() { - $this->assertTrue(in_array('pgsql', pdo_drivers())); + $this->assertTrue(in_array('pgsql', PDO::getAvailableDrivers())); } } \ No newline at end of file diff --git a/tests/databases/pgsql/pgsql.php b/tests/databases/pgsql/pgsql.php index dfb9f56..b1be75a 100644 --- a/tests/databases/pgsql/pgsql.php +++ b/tests/databases/pgsql/pgsql.php @@ -34,7 +34,7 @@ class PgTest extends DBTest { $params = json_decode(file_get_contents(QBASE_DIR . "test_config.json")); $params = $params->pgsql; - $this->db = new PgSQL("host={$params->host};port={$params->port};dbname={$params->database}", $params->user, $params->pass); + $this->db = new PgSQL("pgsql:host={$params->host};dbname={$params->database}", $params->user, $params->pass); } elseif (($var = getenv('CI'))) { @@ -46,7 +46,7 @@ class PgTest extends DBTest { public function TestExists() { - $this->assertTrue(in_array('pgsql', pdo_drivers())); + $this->assertTrue(in_array('pgsql', PDO::getAvailableDrivers())); } // -------------------------------------------------------------------------- diff --git a/tests/db_files/FB_TEST_DB.FDB b/tests/db_files/FB_TEST_DB.FDB index 4914d5f816a837023e8ea844d50625f37de0ecb9..a61d68fed99389d0e2ae089d232aa18d3d72fe7e 100644 GIT binary patch delta 2597 zcmbVOO=uHa6h1S}r0LuyxmpAZ7W0y(tx%yqQ`CoOmGYj7NRd+AS*56pYQP9C8(fSl zMQ|~oi?@HPhf2FqL9x)y(~T<;snrTDY+Z^N^gDOvBxz~d=nXfQ@6I{r-tU`p&z(}K zzf|f!VbQ+6e{xi9T9uk2#N$|&=oC7UZQXkfyys>2(e}_lla1em0T%wpvJd{4xSzhR zeQo*L_H~o5W4?BL9rty!uM@s*nbB@c+o!X$@r-*Tac5X}%--yA$D92=ccxFp{yQ_^ zhQZ~3+-jp&Do@)}dFo7N=yp0olgT7~N%asVv$Q>(qcPw&tvPzw+C#T7UQOj_1alW# z^E8zk9Be%f`ozpxJZBbR%*etsd9E3^*mOLyheb1{+RDeX!OT0A+g&(VfSYLv zUJLu-cnNfjR}yr&aC!H&!j;J~Vg&I;wKHEV4u%eFQgvZBbWj*d!}QyGmD`0?r8#U0 z%w`TcM|bG#RIzZ7Bi~w4x#0h0)oq{125(nX_MA8x2_i>3bY!_ap%gMmLkF+E`*D7urP#MV#Y0W<@d4GXcQ4fuptBw+)rR|X;JBR zyv7=qU>mZ84On&sj}}#@eax`zn6}E;ii9^*i}Q$BdE17nY&~waP8BK+W6+Z4DaN2W zvW6<-ut5yYI52YPLgB(x@Zz0HOmC^|fUQg(VB}q_CrdRNY&e?3ufTg6rf4 zIlM+n#$j7e${ibI({SV21k-<)aC~Gbj2r0zb8~#!KjQctHfm%hH_s}eW)2LN5Nr+% zXbLt`L5lsWq$tkq-{b(z!=vE?1XEOuOfS->rftL;9?aTu!z?%uWkIZwED$O}U9eCW zEY$a|qCQWI!?tb~Ow>C(R*mQHAD+FxmL4##rpKQRr-yJh^%Z0VOMMkAC&gQ(QE|`< z)1$Y(7JT7XDl!VmnDH3wz;sRRDc6={n4lzQIwSQlmexzvuXFk)4_MkH>;d!L7k*t{Rh8<+|nNxg?Hm&IBgs zmvEcP>KN-$fhm^*rVw3@Nx9!m!Um5QRF_u?w9!o~euh|zIA&~IkmuiY$h_bqSd{pNk=H^0yP=JzI- zOXhOP3k=S7os2>G5<+L4*ajLQZ$)9+ib2MXK?-db+s9T1+{C^%w9i{{ z?dmyegf*6sW83^ll$TGJCrHD+S(WeT&H99qtZ|W{Fd$3e$}QIVGbNN_d5gEkhbR=48cdZRj2dR{o)Subedn!~zEh!8?n|)9777l3 zU;XzgB4f)mE^}u^JRu#ATAlyV0=kgn>j%;@+?XYlsw7rRi}G@Umwj5hf|jB;v5P-6 zh8`SxZ&J-*X%FpEq-I(iQY|e?pA@U7MY+yx{RZati%;uR&{Fh7OSaj#V3SR>i+gAn zYp2B_)zYH0mfWJeoZC;Pcx7~px0roQu@fuVKC45vE>hf@3wu}>YG=hERaC9s$0)6( zYEfRU+K(o)vUQ8QhLvKcnkCz?10$Pimd+BYSv=lqtyvtR^4e2T=KCL>m0u8bvhDd0 zAJQkP`tH+VCvR`_SOB}rDVDGDyzMYW?vug1S&ROvj#!*PU;7=wAIvH{p%UODR$juI O_1F4Yfji?r`NiMRDvx3S