diff options
-rwxr-xr-x | include/dba/dba_driver.php | 78 | ||||
-rwxr-xr-x | include/dba/dba_mysql.php | 2 | ||||
-rwxr-xr-x | include/dba/dba_mysqli.php | 2 | ||||
-rwxr-xr-x | include/dba/dba_pdo.php | 51 | ||||
-rw-r--r-- | include/dba/dba_postgres.php | 2 |
5 files changed, 92 insertions, 43 deletions
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php index 34597bec4..abbacc56e 100755 --- a/include/dba/dba_driver.php +++ b/include/dba/dba_driver.php @@ -12,8 +12,16 @@ class DBA { static public $dba = null; static public $dbtype = null; + static public $scheme = 'mysql'; static public $logging = false; + static public $install_script = 'install/schema_mysql.sql'; + static public $null_date = '0001-01-01 00:00:00'; + static public $utc_now = 'UTC_TIMESTAMP()'; + static public $tquot = "`"; + + + /** * @brief Returns the database driver object. * @@ -29,50 +37,48 @@ class DBA { * @return null|dba_driver A database driver object (dba_mysql|dba_mysqli) or null if no driver found. */ - static public function dba_factory($server, $port,$user,$pass,$db,$dbtype,$install = false) { + static public function dba_factory($server,$port,$user,$pass,$db,$dbtype,$install = false) { self::$dba = null; self::$dbtype = intval($dbtype); - $set_port = $port; + if(self::$dbtype == DBTYPE_POSTGRES) { - require_once('include/dba/dba_postgres.php'); - if(is_null($port)) $set_port = 5432; - self::$dba = new dba_postgres($server, $set_port, $user, $pass, $db, $install); - } - else { + if(!($port)) + $port = 5432; -// Highly experimental at the present time. -// require_once('include/dba/dba_pdo.php'); -// self::$dba = new dba_pdo($server, $set_port,$user,$pass,$db,$install); -// } + self::$install_script = 'install/schema_postgres.sql'; + self::$utc_now = "now() at time zone 'UTC'"; + self::$tquot = '"'; + self::$scheme = 'pgsql'; - if(class_exists('mysqli')) { - if (is_null($port)) $set_port = ini_get("mysqli.default_port"); - require_once('include/dba/dba_mysqli.php'); - self::$dba = new dba_mysqli($server, $set_port,$user,$pass,$db,$install); - } +// require_once('include/dba/dba_postgres.php'); +// self::$dba = new dba_postgres($server, self::$scheme, $port, $user, $pass, $db, $install); + } + else { + if(!($port)) + $port = 3306; + if($server === 'localhost') + $server = '127.0.0.1'; } - // Until we have a proper PDO driver, store the DB connection parameters for - // plugins/addons which use PDO natively (such as cdav). This is wasteful as - // it opens a separate connection to the DB, but saves a lot of effort re-writing - // third-party interfaces that are working and well tested. - + require_once('include/dba/dba_pdo.php'); + self::$dba = new dba_pdo($server,self::$scheme,$port,$user,$pass,$db,$install); + + if(is_object(self::$dba) && self::$dba->connected) { - if($server === 'localhost') - $port = $set_port; + $dns = ((self::$dbtype == DBTYPE_POSTGRES) ? 'postgres' : 'mysql') . ':host=' . $server . (is_null($port) ? '' : ';port=' . $port) . ';dbname=' . $db; self::$dba->pdo_set(array($dns,$user,$pass)); } - define('NULL_DATE', self::$dba->get_null_date()); + define('NULL_DATE', self::$null_date); define('ACTIVE_DBTYPE', self::$dbtype); - define('TQUOT', self::$dba->get_table_quote()); + define('TQUOT', self::$tquot); return self::$dba; } @@ -86,10 +92,6 @@ class DBA { */ abstract class dba_driver { // legacy behavior - const INSTALL_SCRIPT='install/schema_mysql.sql'; - const NULL_DATE = '0001-01-01 00:00:00'; - const UTC_NOW = 'UTC_TIMESTAMP()'; - const TQUOT = "`"; protected $db; protected $pdo = array(); @@ -110,7 +112,7 @@ abstract class dba_driver { * @param string $db database name * @return bool */ - abstract function connect($server, $port, $user, $pass, $db); + abstract function connect($server, $scheme, $port, $user, $pass, $db); /** * @brief Perform a DB query with the SQL statement $sql. @@ -144,31 +146,31 @@ abstract class dba_driver { */ abstract function getdriver(); - function __construct($server, $port, $user,$pass,$db,$install = false) { - if(($install) && (! $this->install($server, $port, $user, $pass, $db))) { + function __construct($server, $scheme, $port, $user,$pass,$db,$install = false) { + if(($install) && (! $this->install($server, $scheme, $port, $user, $pass, $db))) { return; } - $this->connect($server, $port, $user, $pass, $db); + $this->connect($server, $scheme, $port, $user, $pass, $db); } function get_null_date() { - return static::NULL_DATE; + return \DBA::$null_date; } function get_install_script() { - return static::INSTALL_SCRIPT; + return \DBA::$install_script; } function get_table_quote() { - return static::TQUOT; + return \DBA::$tquot; } function utcnow() { - return static::UTC_NOW; + return \DBA::$utc_now; } - function install($server,$user,$pass,$db) { + function install($server,$scheme,$port,$user,$pass,$db) { if (!(strlen($server) && strlen($user))){ $this->connected = false; $this->db = null; diff --git a/include/dba/dba_mysql.php b/include/dba/dba_mysql.php index 3cadad6dc..8b51cf578 100755 --- a/include/dba/dba_mysql.php +++ b/include/dba/dba_mysql.php @@ -5,7 +5,7 @@ require_once('include/dba/dba_driver.php'); class dba_mysql extends dba_driver { - function connect($server, $port, $user,$pass,$db) { + function connect($server, $scheme, $port, $user,$pass,$db) { $this->db = mysql_connect($server.":".$port,$user,$pass); if($this->db && mysql_select_db($db,$this->db)) { $this->connected = true; diff --git a/include/dba/dba_mysqli.php b/include/dba/dba_mysqli.php index afd2aa642..165c8e969 100755 --- a/include/dba/dba_mysqli.php +++ b/include/dba/dba_mysqli.php @@ -4,7 +4,7 @@ require_once('include/dba/dba_driver.php'); class dba_mysqli extends dba_driver { - function connect($server,$port,$user,$pass,$db) { + function connect($server,$scheme,$port,$user,$pass,$db) { if($port) $this->db = new mysqli($server,$user,$pass,$db, $port); else diff --git a/include/dba/dba_pdo.php b/include/dba/dba_pdo.php index 7255a2b66..bb89df6be 100755 --- a/include/dba/dba_pdo.php +++ b/include/dba/dba_pdo.php @@ -7,13 +7,14 @@ class dba_pdo extends dba_driver { public $driver_dbtype = null; - function connect($server,$port,$user,$pass,$db) { + function connect($server,$scheme,$port,$user,$pass,$db) { - $this->driver_dbtype = 'mysql'; // (($dbtype == DBTYPE_POSTGRES) ? 'postgres' : 'mysql'); + $this->driver_dbtype = $scheme; $dns = $this->driver_dbtype . ':host=' . $server . (is_null($port) ? '' : ';port=' . $port) . ';dbname=' . $db; + // db_logger('dns: ' . $dns); try { $this->db = new PDO($dns,$user,$pass); @@ -27,6 +28,9 @@ class dba_pdo extends dba_driver { return false; } + if($this->driver_dbtype === 'pgsql') + $this->q("SET standard_conforming_strings = 'off'; SET backslash_quote = 'on';"); + $this->connected = true; return true; @@ -36,6 +40,12 @@ class dba_pdo extends dba_driver { if((! $this->db) || (! $this->connected)) return false; + if($this->driver_dbtype === 'pgsql') { + if(substr(rtrim($sql),-1,1) !== ';') { + $sql .= ';'; + } + } + $this->error = ''; $select = ((stripos($sql,'select') === 0) ? true : false); @@ -88,6 +98,43 @@ class dba_pdo extends dba_driver { $this->connected = false; } + function concat($fld,$sep) { + if($this->driver_dbtype === 'pgsql') { + return 'string_agg(' . $fld . ',\'' . $sep . '\')'; + } + else { + return 'GROUP_CONCAT(DISTINCT '.$fld.' SEPARATOR \''.$sep.'\')'; + } + } + + function quote_interval($txt) { + if($this->driver_dbtype === 'pgsql') { + return "'$txt'"; + } + else { + return $txt; + } + } + + function escapebin($str) { + if($this->driver_dbtype === 'pgsql') { + return str_replace([ chr(92), chr(0), chr(39) ], [ '\\\134', '\\\000', '\\\047' ], $str); + } + else { + return $this->escape($str); + } + } + + function unescapebin($str) { + if($this->driver_dbtype === 'pgsql') { + return stripcslashes($str); + } + else { + return $str; + } + } + + function getdriver() { return 'pdo'; } diff --git a/include/dba/dba_postgres.php b/include/dba/dba_postgres.php index ae3e5a76f..560d8da60 100644 --- a/include/dba/dba_postgres.php +++ b/include/dba/dba_postgres.php @@ -9,7 +9,7 @@ class dba_postgres extends dba_driver { const UTC_NOW = "now() at time zone 'UTC'"; const TQUOT = '"'; - function connect($server,$port,$user,$pass,$db) { + function connect($server,$scheme,$port,$user,$pass,$db) { if(!$port) $port = 5432; $connstr = 'host=' . $server . ' port='.$port . ' user=' . $user . ' password=' . $pass . ' dbname='. $db; $this->db = pg_connect($connstr); |