upgrade to latest version of DB_DataObject
This commit is contained in:
parent
eb22f06ac6
commit
77faf7610b
@ -2,11 +2,11 @@
|
|||||||
/**
|
/**
|
||||||
* Object Based Database Query Builder and data store
|
* Object Based Database Query Builder and data store
|
||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* For PHP versions 4,5 and 6
|
||||||
*
|
*
|
||||||
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
||||||
* that is available through the world-wide-web at the following URI:
|
* that is available through the world-wide-web at the following URI:
|
||||||
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
||||||
* the PHP License and are unable to obtain it through the web, please
|
* the PHP License and are unable to obtain it through the web, please
|
||||||
* send a note to license@php.net so we can mail you a copy immediately.
|
* send a note to license@php.net so we can mail you a copy immediately.
|
||||||
*
|
*
|
||||||
@ -14,8 +14,8 @@
|
|||||||
* @package DB_DataObject
|
* @package DB_DataObject
|
||||||
* @author Alan Knowles <alan@akbkhome.com>
|
* @author Alan Knowles <alan@akbkhome.com>
|
||||||
* @copyright 1997-2006 The PHP Group
|
* @copyright 1997-2006 The PHP Group
|
||||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
||||||
* @version CVS: $Id: DataObject.php,v 1.439 2008/01/30 02:14:06 alan_k Exp $
|
* @version CVS: $Id: DataObject.php 284150 2009-07-15 23:27:59Z alan_k $
|
||||||
* @link http://pear.php.net/package/DB_DataObject
|
* @link http://pear.php.net/package/DB_DataObject
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
* @access private
|
* @access private
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
var $_DB_DataObject_version = "1.8.8";
|
var $_DB_DataObject_version = "1.8.11";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Database table (used by table extends)
|
* The Database table (used by table extends)
|
||||||
@ -1027,7 +1027,13 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
if ($leftq || $useNative) {
|
if ($leftq || $useNative) {
|
||||||
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
||||||
|
|
||||||
$r = $this->_query("INSERT INTO {$table} ($leftq) VALUES ($rightq) ");
|
|
||||||
|
if (($dbtype == 'pgsql') && empty($leftq)) {
|
||||||
|
$r = $this->_query("INSERT INTO {$table} DEFAULT VALUES");
|
||||||
|
} else {
|
||||||
|
$r = $this->_query("INSERT INTO {$table} ($leftq) VALUES ($rightq) ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1339,7 +1345,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
* build the condition only using the object parameters.
|
* build the condition only using the object parameters.
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @return mixed True on success, false on failure, 0 on no data affected
|
* @return mixed Int (No. of rows affected) on success, false on failure, 0 on no data affected
|
||||||
*/
|
*/
|
||||||
function delete($useWhere = false)
|
function delete($useWhere = false)
|
||||||
{
|
{
|
||||||
@ -1369,7 +1375,13 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
if (($this->_query !== false) && $this->_query['condition']) {
|
if (($this->_query !== false) && $this->_query['condition']) {
|
||||||
|
|
||||||
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
||||||
$sql = "DELETE FROM {$table} {$this->_query['condition']}{$extra_cond}";
|
$sql = "DELETE ";
|
||||||
|
// using a joined delete. - with useWhere..
|
||||||
|
$sql .= (!empty($this->_join) && $useWhere) ?
|
||||||
|
"{$table} FROM {$table} {$this->_join} " :
|
||||||
|
"FROM {$table} ";
|
||||||
|
|
||||||
|
$sql .= $this->_query['condition']. $extra_cond;
|
||||||
|
|
||||||
// add limit..
|
// add limit..
|
||||||
|
|
||||||
@ -1521,15 +1533,15 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
}
|
}
|
||||||
$keys = $this->keys();
|
$keys = $this->keys();
|
||||||
|
|
||||||
if (!$keys[0] && !is_string($countWhat)) {
|
if (empty($keys[0]) && (!is_string($countWhat) || (strtoupper($countWhat) == 'DISTINCT'))) {
|
||||||
$this->raiseError(
|
$this->raiseError(
|
||||||
"You cannot do run count without keys - use \$do->keys('id');",
|
"You cannot do run count without keys - use \$do->count('id'), or use \$do->count('distinct id')';",
|
||||||
DB_DATAOBJECT_ERROR_INVALIDARGS,PEAR_ERROR_DIE);
|
DB_DATAOBJECT_ERROR_INVALIDARGS,PEAR_ERROR_DIE);
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
$table = ($quoteIdentifiers ? $DB->quoteIdentifier($this->__table) : $this->__table);
|
||||||
$key_col = ($quoteIdentifiers ? $DB->quoteIdentifier($keys[0]) : $keys[0]);
|
$key_col = empty($keys[0]) ? '' : (($quoteIdentifiers ? $DB->quoteIdentifier($keys[0]) : $keys[0]));
|
||||||
$as = ($quoteIdentifiers ? $DB->quoteIdentifier('DATAOBJECT_NUM') : 'DATAOBJECT_NUM');
|
$as = ($quoteIdentifiers ? $DB->quoteIdentifier('DATAOBJECT_NUM') : 'DATAOBJECT_NUM');
|
||||||
|
|
||||||
// support distinct on default keys.
|
// support distinct on default keys.
|
||||||
@ -2044,7 +2056,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
// technically postgres native here...
|
// technically postgres native here...
|
||||||
// we need to get the new improved tabledata sorted out first.
|
// we need to get the new improved tabledata sorted out first.
|
||||||
|
|
||||||
if ( in_array($dbtype , array('psql', 'mysql', 'mysqli', 'mssql', 'ifx')) &&
|
if ( in_array($dbtype , array('pgsql', 'mysql', 'mysqli', 'mssql', 'ifx')) &&
|
||||||
($table[$usekey] & DB_DATAOBJECT_INT) &&
|
($table[$usekey] & DB_DATAOBJECT_INT) &&
|
||||||
isset($realkeys[$usekey]) && ($realkeys[$usekey] == 'N')
|
isset($realkeys[$usekey]) && ($realkeys[$usekey] == 'N')
|
||||||
) {
|
) {
|
||||||
@ -2125,10 +2137,13 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
$this->_loadConfig();
|
$this->_loadConfig();
|
||||||
}
|
}
|
||||||
// Set database driver for reference
|
// Set database driver for reference
|
||||||
$db_driver = empty($_DB_DATAOBJECT['CONFIG']['db_driver']) ? 'DB' : $_DB_DATAOBJECT['CONFIG']['db_driver'];
|
$db_driver = empty($_DB_DATAOBJECT['CONFIG']['db_driver']) ?
|
||||||
// is it already connected ?
|
'DB' : $_DB_DATAOBJECT['CONFIG']['db_driver'];
|
||||||
|
|
||||||
|
// is it already connected ?
|
||||||
if ($this->_database_dsn_md5 && !empty($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) {
|
if ($this->_database_dsn_md5 && !empty($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) {
|
||||||
|
|
||||||
|
// connection is an error...
|
||||||
if (PEAR::isError($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) {
|
if (PEAR::isError($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) {
|
||||||
return $this->raiseError(
|
return $this->raiseError(
|
||||||
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->message,
|
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->message,
|
||||||
@ -2137,7 +2152,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->_database) {
|
if (empty($this->_database)) {
|
||||||
$this->_database = $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->dsn['database'];
|
$this->_database = $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->dsn['database'];
|
||||||
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
||||||
|
|
||||||
@ -2166,6 +2181,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
// try and work out what to use for the dsn !
|
// try and work out what to use for the dsn !
|
||||||
|
|
||||||
$options= &$_DB_DATAOBJECT['CONFIG'];
|
$options= &$_DB_DATAOBJECT['CONFIG'];
|
||||||
|
// if the databse dsn dis defined in the object..
|
||||||
$dsn = isset($this->_database_dsn) ? $this->_database_dsn : null;
|
$dsn = isset($this->_database_dsn) ? $this->_database_dsn : null;
|
||||||
|
|
||||||
if (!$dsn) {
|
if (!$dsn) {
|
||||||
@ -2173,14 +2189,14 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
$this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null;
|
$this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null;
|
||||||
}
|
}
|
||||||
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
||||||
$this->debug("Checking for database database_{$this->_database} in options","CONNECT");
|
$this->debug("Checking for database specific ini ('{$this->_database}') : database_{$this->_database} in options","CONNECT");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->_database && !empty($options["database_{$this->_database}"])) {
|
if ($this->_database && !empty($options["database_{$this->_database}"])) {
|
||||||
|
|
||||||
$dsn = $options["database_{$this->_database}"];
|
$dsn = $options["database_{$this->_database}"];
|
||||||
} else if (!empty($options['database'])) {
|
} else if (!empty($options['database'])) {
|
||||||
$dsn = $options['database'];
|
$dsn = $options['database'];
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2205,6 +2221,9 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
||||||
$this->debug("USING CACHED CONNECTION", "CONNECT",3);
|
$this->debug("USING CACHED CONNECTION", "CONNECT",3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!$this->_database) {
|
if (!$this->_database) {
|
||||||
|
|
||||||
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
||||||
@ -2221,7 +2240,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
||||||
$this->debug("NEW CONNECTION", "CONNECT",3);
|
$this->debug("NEW CONNECTION TP DATABASE :" .$this->_database , "CONNECT",3);
|
||||||
/* actualy make a connection */
|
/* actualy make a connection */
|
||||||
$this->debug(print_r($dsn,true) ." {$this->_database_dsn_md5}", "CONNECT",3);
|
$this->debug(print_r($dsn,true) ." {$this->_database_dsn_md5}", "CONNECT",3);
|
||||||
}
|
}
|
||||||
@ -2265,8 +2284,8 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->_database) {
|
if (empty($this->_database)) {
|
||||||
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
$hasGetDatabase = method_exists($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5], 'getDatabase');
|
||||||
|
|
||||||
$this->_database = ($db_driver != 'DB' && $hasGetDatabase)
|
$this->_database = ($db_driver != 'DB' && $hasGetDatabase)
|
||||||
@ -2357,38 +2376,38 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
$t= explode(' ',microtime());
|
$t= explode(' ',microtime());
|
||||||
$_DB_DATAOBJECT['QUERYENDTIME'] = $time = $t[0]+$t[1];
|
$_DB_DATAOBJECT['QUERYENDTIME'] = $time = $t[0]+$t[1];
|
||||||
|
|
||||||
|
|
||||||
do {
|
|
||||||
|
|
||||||
if ($_DB_driver == 'DB') {
|
for ($tries = 0;$tries < 3;$tries++) {
|
||||||
$result = $DB->query($string);
|
|
||||||
} else {
|
|
||||||
switch (strtolower(substr(trim($string),0,6))) {
|
|
||||||
|
|
||||||
case 'insert':
|
if ($_DB_driver == 'DB') {
|
||||||
case 'update':
|
|
||||||
case 'delete':
|
$result = $DB->query($string);
|
||||||
$result = $DB->exec($string);
|
} else {
|
||||||
break;
|
switch (strtolower(substr(trim($string),0,6))) {
|
||||||
|
|
||||||
default:
|
case 'insert':
|
||||||
$result = $DB->query($string);
|
case 'update':
|
||||||
break;
|
case 'delete':
|
||||||
|
$result = $DB->exec($string);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$result = $DB->query($string);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see if we got a failure.. - try again a few times..
|
||||||
|
if (!is_a($result,'PEAR_Error')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ($result->getCode() != -14) { // *DB_ERROR_NODBSELECTED
|
||||||
|
break; // not a connection error..
|
||||||
|
}
|
||||||
|
sleep(1); // wait before retyring..
|
||||||
|
$DB->connect($DB->dsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to reconnect, at most 3 times
|
|
||||||
$again = false;
|
|
||||||
if (is_a($result, 'PEAR_Error')
|
|
||||||
AND $result->getCode() == DB_ERROR_NODBSELECTED
|
|
||||||
AND $cpt++<3) {
|
|
||||||
$DB->disconnect();
|
|
||||||
sleep(1);
|
|
||||||
$DB->connect($DB->dsn);
|
|
||||||
$again = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} while ($again);
|
|
||||||
|
|
||||||
if (is_a($result,'PEAR_Error')) {
|
if (is_a($result,'PEAR_Error')) {
|
||||||
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
|
||||||
@ -2556,11 +2575,13 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
* use @ to silence it (if you are sure it is acceptable)
|
* use @ to silence it (if you are sure it is acceptable)
|
||||||
* eg. $do = @DB_DataObject::factory('person')
|
* eg. $do = @DB_DataObject::factory('person')
|
||||||
*
|
*
|
||||||
* table name will eventually be databasename/table
|
* table name can bedatabasename/table
|
||||||
* - and allow modular dataobjects to be written..
|
* - and allow modular dataobjects to be written..
|
||||||
* (this also helps proxy creation)
|
* (this also helps proxy creation)
|
||||||
*
|
*
|
||||||
*
|
* Experimental Support for Multi-Database factory eg. mydatabase.mytable
|
||||||
|
*
|
||||||
|
*
|
||||||
* @param string $table tablename (use blank to create a new instance of the same class.)
|
* @param string $table tablename (use blank to create a new instance of the same class.)
|
||||||
* @access private
|
* @access private
|
||||||
* @return DataObject|PEAR_Error
|
* @return DataObject|PEAR_Error
|
||||||
@ -2570,9 +2591,27 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
|
|
||||||
function factory($table = '') {
|
function factory($table = '') {
|
||||||
global $_DB_DATAOBJECT;
|
global $_DB_DATAOBJECT;
|
||||||
|
|
||||||
|
|
||||||
|
// multi-database support.. - experimental.
|
||||||
|
$database = '';
|
||||||
|
|
||||||
|
if (strpos( $table,'/') !== false ) {
|
||||||
|
list($database,$table) = explode('.',$table, 2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (empty($_DB_DATAOBJECT['CONFIG'])) {
|
if (empty($_DB_DATAOBJECT['CONFIG'])) {
|
||||||
DB_DataObject::_loadConfig();
|
DB_DataObject::_loadConfig();
|
||||||
}
|
}
|
||||||
|
// no configuration available for database
|
||||||
|
if (!empty($database) && empty($_DB_DATAOBJECT['CONFIG']['database_'.$database])) {
|
||||||
|
return DB_DataObject::raiseError(
|
||||||
|
"unable to find database_{$database} in Configuration, It is required for factory with database"
|
||||||
|
, 0, PEAR_ERROR_DIE );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ($table === '') {
|
if ($table === '') {
|
||||||
if (is_a($this,'DB_DataObject') && strlen($this->__table)) {
|
if (is_a($this,'DB_DataObject') && strlen($this->__table)) {
|
||||||
@ -2584,17 +2623,22 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// does this need multi db support??
|
||||||
$p = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
|
$p = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
|
||||||
$_DB_DATAOBJECT['CONFIG']['class_prefix'] : '';
|
$_DB_DATAOBJECT['CONFIG']['class_prefix'] : '';
|
||||||
$class = $p . preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
|
$class = $p . preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
|
||||||
|
|
||||||
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
|
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
|
||||||
|
|
||||||
$class = $ce ? $class : DB_DataObject::_autoloadClass($class);
|
$class = $ce ? $class : DB_DataObject::_autoloadClass($class);
|
||||||
|
|
||||||
// proxy = full|light
|
// proxy = full|light
|
||||||
if (!$class && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) {
|
if (!$class && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) {
|
||||||
|
|
||||||
|
DB_DataObject::debug("FAILED TO Autoload $database.$table - using proxy.","FACTORY",1);
|
||||||
|
|
||||||
|
|
||||||
$proxyMethod = 'getProxy'.$_DB_DATAOBJECT['CONFIG']['proxy'];
|
$proxyMethod = 'getProxy'.$_DB_DATAOBJECT['CONFIG']['proxy'];
|
||||||
|
// if you have loaded (some other way) - dont try and load it again..
|
||||||
class_exists('DB_DataObject_Generator') ? '' :
|
class_exists('DB_DataObject_Generator') ? '' :
|
||||||
require_once 'DB/DataObject/Generator.php';
|
require_once 'DB/DataObject/Generator.php';
|
||||||
|
|
||||||
@ -2614,8 +2658,12 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
"factory could not find class $class from $table",
|
"factory could not find class $class from $table",
|
||||||
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
|
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
|
||||||
}
|
}
|
||||||
|
$ret = new $class;
|
||||||
return new $class;
|
if (!empty($database)) {
|
||||||
|
DB_DataObject::debug("Setting database to $database","FACTORY",1);
|
||||||
|
$ret->database($database);
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* autoload Class
|
* autoload Class
|
||||||
@ -3079,7 +3127,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//echo '<PRE>'; print_r(func_get_args());
|
||||||
$useWhereAsOn = false;
|
$useWhereAsOn = false;
|
||||||
// support for 2nd argument as an array of options
|
// support for 2nd argument as an array of options
|
||||||
if (is_array($joinType)) {
|
if (is_array($joinType)) {
|
||||||
@ -3119,8 +3167,39 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
$DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
|
$DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
|
||||||
|
|
||||||
|
|
||||||
|
/// CHANGED 26 JUN 2009 - we prefer links from our local table over the remote one.
|
||||||
|
|
||||||
|
/* otherwise see if there are any links from this table to the obj. */
|
||||||
|
//print_r($this->links());
|
||||||
|
if (($ofield === false) && ($links = $this->links())) {
|
||||||
|
foreach ($links as $k => $v) {
|
||||||
|
/* link contains {this column} = {linked table}:{linked column} */
|
||||||
|
$ar = explode(':', $v);
|
||||||
|
// Feature Request #4266 - Allow joins with multiple keys
|
||||||
|
if (strpos($k, ',') !== false) {
|
||||||
|
$k = explode(',', $k);
|
||||||
|
}
|
||||||
|
if (strpos($ar[1], ',') !== false) {
|
||||||
|
$ar[1] = explode(',', $ar[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ar[0] == $obj->__table) {
|
||||||
|
if ($joinCol !== false) {
|
||||||
|
if ($k == $joinCol) {
|
||||||
|
$tfield = $k;
|
||||||
|
$ofield = $ar[1];
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$tfield = $k;
|
||||||
|
$ofield = $ar[1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/* look up the links for obj table */
|
/* look up the links for obj table */
|
||||||
//print_r($obj->links());
|
//print_r($obj->links());
|
||||||
if (!$ofield && ($olinks = $obj->links())) {
|
if (!$ofield && ($olinks = $obj->links())) {
|
||||||
@ -3164,37 +3243,6 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* otherwise see if there are any links from this table to the obj. */
|
|
||||||
//print_r($this->links());
|
|
||||||
if (($ofield === false) && ($links = $this->links())) {
|
|
||||||
foreach ($links as $k => $v) {
|
|
||||||
/* link contains {this column} = {linked table}:{linked column} */
|
|
||||||
$ar = explode(':', $v);
|
|
||||||
// Feature Request #4266 - Allow joins with multiple keys
|
|
||||||
if (strpos($k, ',') !== false) {
|
|
||||||
$k = explode(',', $k);
|
|
||||||
}
|
|
||||||
if (strpos($ar[1], ',') !== false) {
|
|
||||||
$ar[1] = explode(',', $ar[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ar[0] == $obj->__table) {
|
|
||||||
if ($joinCol !== false) {
|
|
||||||
if ($k == $joinCol) {
|
|
||||||
$tfield = $k;
|
|
||||||
$ofield = $ar[1];
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$tfield = $k;
|
|
||||||
$ofield = $ar[1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// finally if these two table have column names that match do a join by default on them
|
// finally if these two table have column names that match do a join by default on them
|
||||||
|
|
||||||
if (($ofield === false) && $joinCol) {
|
if (($ofield === false) && $joinCol) {
|
||||||
@ -3383,22 +3431,25 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
case 'RIGHT': // others??? .. cross, left outer, right outer, natural..?
|
case 'RIGHT': // others??? .. cross, left outer, right outer, natural..?
|
||||||
|
|
||||||
// Feature Request #4266 - Allow joins with multiple keys
|
// Feature Request #4266 - Allow joins with multiple keys
|
||||||
$this->_join .= "\n {$joinType} JOIN {$objTable} {$fullJoinAs}";
|
$jadd = "\n {$joinType} JOIN {$objTable} {$fullJoinAs}";
|
||||||
|
//$this->_join .= "\n {$joinType} JOIN {$objTable} {$fullJoinAs}";
|
||||||
if (is_array($ofield)) {
|
if (is_array($ofield)) {
|
||||||
$key_count = count($ofield);
|
$key_count = count($ofield);
|
||||||
for($i = 0; $i < $key_count; $i++) {
|
for($i = 0; $i < $key_count; $i++) {
|
||||||
if ($i == 0) {
|
if ($i == 0) {
|
||||||
$this->_join .= " ON ({$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]}) ";
|
$jadd .= " ON ({$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]}) ";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$this->_join .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
|
$jadd .= " AND {$joinAs}.{$ofield[$i]}={$table}.{$tfield[$i]} ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->_join .= ' ' . $appendJoin . ' ';
|
$jadd .= ' ' . $appendJoin . ' ';
|
||||||
} else {
|
} else {
|
||||||
$this->_join .= " ON ({$joinAs}.{$ofield}={$table}.{$tfield}) {$appendJoin} ";
|
$jadd .= " ON ({$joinAs}.{$ofield}={$table}.{$tfield}) {$appendJoin} ";
|
||||||
}
|
}
|
||||||
|
// jadd avaliable for debugging join build.
|
||||||
|
//echo $jadd ."\n";
|
||||||
|
$this->_join .= $jadd;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '': // this is just a standard multitable select..
|
case '': // this is just a standard multitable select..
|
||||||
@ -3459,7 +3510,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($from[$k]) && $skipEmpty) {
|
if (empty($from[sprintf($format,$k)]) && $skipEmpty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,9 +15,9 @@
|
|||||||
* @category Database
|
* @category Database
|
||||||
* @package DB_DataObject
|
* @package DB_DataObject
|
||||||
* @author Alan Knowles <alan@akbkhome.com>
|
* @author Alan Knowles <alan@akbkhome.com>
|
||||||
* @copyright 1997-2006 The PHP Group
|
* @copyright 1997-2008 The PHP Group
|
||||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
||||||
* @version CVS: $Id: Cast.php,v 1.15 2005/07/07 05:30:53 alan_k Exp $
|
* @version CVS: $Id: Cast.php 264148 2008-08-04 03:44:59Z alan_k $
|
||||||
* @link http://pear.php.net/package/DB_DataObject
|
* @link http://pear.php.net/package/DB_DataObject
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -391,7 +391,10 @@ class DB_DataObject_Cast {
|
|||||||
// this is funny - the parameter order is reversed ;)
|
// this is funny - the parameter order is reversed ;)
|
||||||
return "'".mysqli_real_escape_string($db->connection, $this->value)."'";
|
return "'".mysqli_real_escape_string($db->connection, $this->value)."'";
|
||||||
|
|
||||||
|
case 'sqlite':
|
||||||
|
// this is funny - the parameter order is reversed ;)
|
||||||
|
return "'".sqlite_escape_string($this->value)."'";
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:{$db->dsn['phptype']} Yet");
|
return PEAR::raiseError("DB_DataObject_Cast cant handle blobs for Database:{$db->dsn['phptype']} Yet");
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
* @author Alan Knowles <alan@akbkhome.com>
|
* @author Alan Knowles <alan@akbkhome.com>
|
||||||
* @copyright 1997-2006 The PHP Group
|
* @copyright 1997-2006 The PHP Group
|
||||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
||||||
* @version CVS: $Id: Error.php,v 1.3 2005/03/23 02:35:35 alan_k Exp $
|
* @version CVS: $Id: Error.php 277015 2009-03-12 05:51:03Z alan_k $
|
||||||
* @link http://pear.php.net/package/DB_DataObject
|
* @link http://pear.php.net/package/DB_DataObject
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
*
|
*
|
||||||
* PHP versions 4 and 5
|
* PHP versions 4 and 5
|
||||||
*
|
*
|
||||||
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
||||||
* that is available through the world-wide-web at the following URI:
|
* that is available through the world-wide-web at the following URI:
|
||||||
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
||||||
* the PHP License and are unable to obtain it through the web, please
|
* the PHP License and are unable to obtain it through the web, please
|
||||||
* send a note to license@php.net so we can mail you a copy immediately.
|
* send a note to license@php.net so we can mail you a copy immediately.
|
||||||
*
|
*
|
||||||
@ -14,8 +14,8 @@
|
|||||||
* @package DB_DataObject
|
* @package DB_DataObject
|
||||||
* @author Alan Knowles <alan@akbkhome.com>
|
* @author Alan Knowles <alan@akbkhome.com>
|
||||||
* @copyright 1997-2006 The PHP Group
|
* @copyright 1997-2006 The PHP Group
|
||||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
||||||
* @version CVS: $Id: Generator.php,v 1.141 2008/01/30 02:29:39 alan_k Exp $
|
* @version CVS: $Id: Generator.php 284150 2009-07-15 23:27:59Z alan_k $
|
||||||
* @link http://pear.php.net/package/DB_DataObject
|
* @link http://pear.php.net/package/DB_DataObject
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -193,7 +193,11 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
/**
|
/**
|
||||||
* set portability and some modules to fetch the informations
|
* set portability and some modules to fetch the informations
|
||||||
*/
|
*/
|
||||||
$__DB->setOption('portability', MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_FIX_CASE);
|
$db_options = PEAR::getStaticProperty('MDB2','options');
|
||||||
|
if (empty($db_options)) {
|
||||||
|
$__DB->setOption('portability', MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_FIX_CASE);
|
||||||
|
}
|
||||||
|
|
||||||
$__DB->loadModule('Manager');
|
$__DB->loadModule('Manager');
|
||||||
$__DB->loadModule('Reverse');
|
$__DB->loadModule('Reverse');
|
||||||
}
|
}
|
||||||
@ -265,12 +269,7 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
} else {
|
} else {
|
||||||
$defs = $__DB->reverse->tableInfo($quotedTable);
|
$defs = $__DB->reverse->tableInfo($quotedTable);
|
||||||
// rename the length value, so it matches db's return.
|
// rename the length value, so it matches db's return.
|
||||||
foreach ($defs as $k => $v) {
|
|
||||||
if (!isset($defs[$k]['length'])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$defs[$k]['len'] = $defs[$k]['length'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_a($defs,'PEAR_Error')) {
|
if (is_a($defs,'PEAR_Error')) {
|
||||||
@ -286,7 +285,10 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
if (!is_array($def)) {
|
if (!is_array($def)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// rename the length value, so it matches db's return.
|
||||||
|
if (isset($def['length']) && !isset($def['len'])) {
|
||||||
|
$def['len'] = $def['length'];
|
||||||
|
}
|
||||||
$this->_definitions[$table][] = (object) $def;
|
$this->_definitions[$table][] = (object) $def;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -391,7 +393,10 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
$fk = array();
|
$fk = array();
|
||||||
|
|
||||||
foreach($this->tables as $this->table) {
|
foreach($this->tables as $this->table) {
|
||||||
$res =& $DB->query('SHOW CREATE TABLE ' . $this->table);
|
$quotedTable = !empty($options['quote_identifiers_tableinfo']) ? $DB->quoteIdentifier($table) : $this->table;
|
||||||
|
|
||||||
|
$res =& $DB->query('SHOW CREATE TABLE ' . $quotedTable );
|
||||||
|
|
||||||
if (PEAR::isError($res)) {
|
if (PEAR::isError($res)) {
|
||||||
die($res->getMessage());
|
die($res->getMessage());
|
||||||
}
|
}
|
||||||
@ -467,7 +472,7 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
function _generateDefinitionsTable()
|
function _generateDefinitionsTable()
|
||||||
{
|
{
|
||||||
global $_DB_DATAOBJECT;
|
global $_DB_DATAOBJECT;
|
||||||
|
$options = PEAR::getStaticProperty('DB_DataObject','options');
|
||||||
$defs = $this->_definitions[$this->table];
|
$defs = $this->_definitions[$this->table];
|
||||||
$this->_newConfig .= "\n[{$this->table}]\n";
|
$this->_newConfig .= "\n[{$this->table}]\n";
|
||||||
$keys_out = "\n[{$this->table}__keys]\n";
|
$keys_out = "\n[{$this->table}__keys]\n";
|
||||||
@ -551,6 +556,9 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
|
|
||||||
case 'ENUM':
|
case 'ENUM':
|
||||||
case 'SET': // not really but oh well
|
case 'SET': // not really but oh well
|
||||||
|
|
||||||
|
case 'POINT': // mysql geometry stuff - not really string - but will do..
|
||||||
|
|
||||||
case 'TIMESTAMPTZ': // postgres
|
case 'TIMESTAMPTZ': // postgres
|
||||||
case 'BPCHAR': // postgres
|
case 'BPCHAR': // postgres
|
||||||
case 'INTERVAL': // postgres (eg. '12 days')
|
case 'INTERVAL': // postgres (eg. '12 days')
|
||||||
@ -594,14 +602,18 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME;
|
DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case 'TINYBLOB':
|
|
||||||
case 'BLOB': /// these should really be ignored!!!???
|
case 'BLOB': /// these should really be ignored!!!???
|
||||||
|
case 'TINYBLOB':
|
||||||
case 'MEDIUMBLOB':
|
case 'MEDIUMBLOB':
|
||||||
case 'LONGBLOB':
|
case 'LONGBLOB':
|
||||||
|
|
||||||
|
case 'CLOB': // oracle character lob support
|
||||||
|
|
||||||
case 'BYTEA': // postgres blob support..
|
case 'BYTEA': // postgres blob support..
|
||||||
$type = DB_DATAOBJECT_STR + DB_DATAOBJECT_BLOB;
|
$type = DB_DATAOBJECT_STR + DB_DATAOBJECT_BLOB;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
echo "*****************************************************************\n".
|
echo "*****************************************************************\n".
|
||||||
"** WARNING UNKNOWN TYPE **\n".
|
"** WARNING UNKNOWN TYPE **\n".
|
||||||
@ -653,7 +665,9 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
// only use primary key or nextval(), cause the setFrom blocks you setting all key items...
|
// only use primary key or nextval(), cause the setFrom blocks you setting all key items...
|
||||||
// if no keys exist fall back to using unique
|
// if no keys exist fall back to using unique
|
||||||
//echo "\n{$t->name} => {$t->flags}\n";
|
//echo "\n{$t->name} => {$t->flags}\n";
|
||||||
if (preg_match("/(auto_increment|nextval\()/i",rawurldecode($t->flags))
|
$secondary_key_match = isset($options['generator_secondary_key_match']) ? $options['generator_secondary_key_match'] : 'primary|unique';
|
||||||
|
|
||||||
|
if (preg_match('/(auto_increment|nextval\()/i',rawurldecode($t->flags))
|
||||||
|| (isset($t->autoincrement) && ($t->autoincrement === true))) {
|
|| (isset($t->autoincrement) && ($t->autoincrement === true))) {
|
||||||
|
|
||||||
// native sequences = 2
|
// native sequences = 2
|
||||||
@ -662,7 +676,7 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
}
|
}
|
||||||
$ret_keys_primary[$t->name] = 'N';
|
$ret_keys_primary[$t->name] = 'N';
|
||||||
|
|
||||||
} else if (preg_match("/(primary|unique)/i",$t->flags)) {
|
} else if ($secondary_key_match && preg_match('/('.$secondary_key_match.')/i',$t->flags)) {
|
||||||
// keys.. = 1
|
// keys.. = 1
|
||||||
$key_type = 'K';
|
$key_type = 'K';
|
||||||
if (!preg_match("/(primary)/i",$t->flags)) {
|
if (!preg_match("/(primary)/i",$t->flags)) {
|
||||||
@ -868,10 +882,13 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
// then we should add var $_database = here
|
// then we should add var $_database = here
|
||||||
// as database names may not always match..
|
// as database names may not always match..
|
||||||
|
|
||||||
|
if (empty($GLOBALS['_DB_DATAOBJECT']['CONFIG'])) {
|
||||||
|
DB_DataObject::_loadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only include the $_database property if the omit_database_var is unset or false
|
||||||
|
|
||||||
|
if (isset($options["database_{$this->_database}"]) && empty($GLOBALS['_DB_DATAOBJECT']['CONFIG']['generator_omit_database_var'])) {
|
||||||
|
|
||||||
if (isset($options["database_{$this->_database}"])) {
|
|
||||||
$body .= " {$var} \$_database = '{$this->_database}'; {$p}// database name (used with database_{*} config)\n";
|
$body .= " {$var} \$_database = '{$this->_database}'; {$p}// database name (used with database_{*} config)\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -904,9 +921,10 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
$padding = (30 - strlen($t->name));
|
$padding = (30 - strlen($t->name));
|
||||||
if ($padding < 2) $padding =2;
|
if ($padding < 2) $padding =2;
|
||||||
$p = str_repeat(' ',$padding) ;
|
$p = str_repeat(' ',$padding) ;
|
||||||
|
|
||||||
$body .=" {$var} \${$t->name}; {$p}// {$t->type}({$t->len}) {$t->flags}\n";
|
$length = empty($t->len) ? '' : '('.$t->len.')';
|
||||||
|
$body .=" {$var} \${$t->name}; {$p}// {$t->type}$length {$t->flags}\n";
|
||||||
|
|
||||||
// can not do set as PEAR::DB table info doesnt support it.
|
// can not do set as PEAR::DB table info doesnt support it.
|
||||||
//if (substr($t->Type,0,3) == "set")
|
//if (substr($t->Type,0,3) == "set")
|
||||||
// $sets[$t->Field] = "array".substr($t->Type,3);
|
// $sets[$t->Field] = "array".substr($t->Type,3);
|
||||||
@ -1185,7 +1203,7 @@ class DB_DataObject_Generator extends DB_DataObject
|
|||||||
$__DB->loadModule('Manager');
|
$__DB->loadModule('Manager');
|
||||||
$__DB->loadModule('Reverse');
|
$__DB->loadModule('Reverse');
|
||||||
}
|
}
|
||||||
$quotedTable = !empty($options['quote_identifiers']) ?
|
$quotedTable = !empty($options['quote_identifiers_tableinfo']) ?
|
||||||
$__DB->quoteIdentifier($table) : $table;
|
$__DB->quoteIdentifier($table) : $table;
|
||||||
|
|
||||||
if (!$is_MDB2) {
|
if (!$is_MDB2) {
|
||||||
|
2
extlib/DB/DataObject/createTables.php
Executable file → Normal file
2
extlib/DB/DataObject/createTables.php
Executable file → Normal file
@ -16,7 +16,7 @@
|
|||||||
// | Author: Alan Knowles <alan@akbkhome.com>
|
// | Author: Alan Knowles <alan@akbkhome.com>
|
||||||
// +----------------------------------------------------------------------+
|
// +----------------------------------------------------------------------+
|
||||||
//
|
//
|
||||||
// $Id: createTables.php,v 1.24 2006/01/13 01:27:55 alan_k Exp $
|
// $Id: createTables.php 277015 2009-03-12 05:51:03Z alan_k $
|
||||||
//
|
//
|
||||||
|
|
||||||
// since this version doesnt use overload,
|
// since this version doesnt use overload,
|
||||||
|
Loading…
Reference in New Issue
Block a user