include DB_DataObject 1.9.0

This commit is contained in:
Evan Prodromou 2009-12-08 15:32:50 -05:00
parent 3536f01258
commit dfba47bdf4
2 changed files with 207 additions and 72 deletions

View File

@ -15,7 +15,7 @@
* @author Alan Knowles <alan@akbkhome.com>
* @copyright 1997-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: DataObject.php 284150 2009-07-15 23:27:59Z alan_k $
* @version CVS: $Id: DataObject.php 291349 2009-11-27 09:15:18Z alan_k $
* @link http://pear.php.net/package/DB_DataObject
*/
@ -235,7 +235,7 @@ class DB_DataObject extends DB_DataObject_Overload
* @access private
* @var string
*/
var $_DB_DataObject_version = "1.8.12";
var $_DB_DataObject_version = "1.9.0";
/**
* The Database table (used by table extends)
@ -309,6 +309,7 @@ class DB_DataObject extends DB_DataObject_Overload
/**
* An autoloading, caching static get method using key, value (based on get)
* (depreciated - use ::get / and your own caching method)
*
* Usage:
* $object = DB_DataObject::staticGet("DbTable_mytable",12);
@ -943,6 +944,10 @@ class DB_DataObject extends DB_DataObject_Overload
$this->$key = $keyvalue;
}
// if we haven't set disable_null_strings to "full"
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) {
@ -953,7 +958,10 @@ class DB_DataObject extends DB_DataObject_Overload
}
if (!isset($this->$k)) {
// Ignore variables which aren't set to a value
if ( !isset($this->$k) && $ignore_null) {
continue;
}
// dont insert data into mysql timestamps
@ -980,8 +988,7 @@ class DB_DataObject extends DB_DataObject_Overload
}
if (!isset($options['disable_null_strings']) && is_string($this->$k) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) {
if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
$rightq .= " NULL ";
continue;
}
@ -1194,8 +1201,14 @@ class DB_DataObject extends DB_DataObject_Overload
$options = $_DB_DATAOBJECT['CONFIG'];
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) {
if (!isset($this->$k)) {
if (!isset($this->$k) && $ignore_null) {
continue;
}
// ignore stuff thats
@ -1234,7 +1247,7 @@ class DB_DataObject extends DB_DataObject_Overload
}
// special values ... at least null is handled...
if (!isset($options['disable_null_strings']) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) {
if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
$settings .= "$kSql = NULL ";
continue;
}
@ -1796,10 +1809,15 @@ class DB_DataObject extends DB_DataObject_Overload
}
$_DB_DATAOBJECT['INI'][$this->_database] = array();
foreach ($schemas as $ini) {
if (file_exists($ini) && is_file($ini)) {
$_DB_DATAOBJECT['INI'][$this->_database] = parse_ini_file($ini, true);
$_DB_DATAOBJECT['INI'][$this->_database] = array_merge(
$_DB_DATAOBJECT['INI'][$this->_database],
parse_ini_file($ini, true)
);
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
if (!is_readable ($ini)) {
$this->debug("ini file is not readable: $ini","databaseStructure",1);
@ -2479,6 +2497,7 @@ class DB_DataObject extends DB_DataObject_Overload
$this->_query= $x->_query;
}
foreach($keys as $k => $v) {
// index keys is an indexed array
/* these filter checks are a bit suspicious..
@ -2519,7 +2538,7 @@ class DB_DataObject extends DB_DataObject_Overload
continue;
}
if (!isset($options['disable_null_strings']) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) {
if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
$this->whereAdd(" $kSql IS NULL");
continue;
}
@ -2624,15 +2643,31 @@ class DB_DataObject extends DB_DataObject_Overload
}
// does this need multi db support??
$p = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
$_DB_DATAOBJECT['CONFIG']['class_prefix'] : '';
$class = $p . preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
$cp = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']['class_prefix']) : '';
$class = $ce ? $class : DB_DataObject::_autoloadClass($class);
// multiprefix support.
$tbl = preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
if (is_array($cp)) {
$class = array();
foreach($cp as $cpr) {
$ce = substr(phpversion(),0,1) > 4 ? class_exists($cpr . $tbl,false) : class_exists($cpr . $tbl);
if ($ce) {
$class = $cpr . $tbl;
break;
}
$class[] = $cpr . $tbl;
}
} else {
$class = $tbl;
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
}
$rclass = $ce ? $class : DB_DataObject::_autoloadClass($class, $table);
// proxy = full|light
if (!$class && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) {
if (!$rclass && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) {
DB_DataObject::debug("FAILED TO Autoload $database.$table - using proxy.","FACTORY",1);
@ -2653,12 +2688,14 @@ class DB_DataObject extends DB_DataObject_Overload
return $x->$proxyMethod( $d->_database, $table);
}
if (!$class) {
if (!$rclass) {
return DB_DataObject::raiseError(
"factory could not find class $class from $table",
"factory could not find class " .
(is_array($class) ? implode(PATH_SEPARATOR, $class) : $class ).
"from $table",
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
}
$ret = new $class;
$ret = new $rclass;
if (!empty($database)) {
DB_DataObject::debug("Setting database to $database","FACTORY",1);
$ret->database($database);
@ -2668,11 +2705,12 @@ class DB_DataObject extends DB_DataObject_Overload
/**
* autoload Class
*
* @param string $class Class
* @param string|array $class Class
* @param string $table Table trying to load.
* @access private
* @return string classname on Success
*/
function _autoloadClass($class)
function _autoloadClass($class, $table=false)
{
global $_DB_DATAOBJECT;
@ -2682,32 +2720,62 @@ class DB_DataObject extends DB_DataObject_Overload
$class_prefix = empty($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
'' : $_DB_DATAOBJECT['CONFIG']['class_prefix'];
$table = substr($class,strlen($class_prefix));
$table = $table ? $table : substr($class,strlen($class_prefix));
// only include the file if it exists - and barf badly if it has parse errors :)
if (!empty($_DB_DATAOBJECT['CONFIG']['proxy']) || empty($_DB_DATAOBJECT['CONFIG']['class_location'])) {
return false;
}
// support for:
// class_location = mydir/ => maps to mydir/Tablename.php
// class_location = mydir/myfile_%s.php => maps to mydir/myfile_Tablename
// with directory sepr
// class_location = mydir/:mydir2/: => tries all of thes locations.
$cl = $_DB_DATAOBJECT['CONFIG']['class_location'];
if (strpos($_DB_DATAOBJECT['CONFIG']['class_location'],'%s') !== false) {
$file = sprintf($_DB_DATAOBJECT['CONFIG']['class_location'], preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)));
} else {
$file = $_DB_DATAOBJECT['CONFIG']['class_location'].'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php";
switch (true) {
case (strpos($cl ,'%s') !== false):
$file = sprintf($cl , preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)));
break;
case (strpos($cl , PATH_SEPARATOR) !== false):
$file = array();
foreach(explode(PATH_SEPARATOR, $cl ) as $p) {
$file[] = $p .'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php";
}
break;
default:
$file = $cl .'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php";
break;
}
if (!file_exists($file)) {
$cls = is_array($class) ? $class : array($class);
if (is_array($file) || !file_exists($file)) {
$found = false;
foreach(explode(PATH_SEPARATOR, ini_get('include_path')) as $p) {
if (file_exists("$p/$file")) {
$file = "$p/$file";
$found = true;
$file = is_array($file) ? $file : array($file);
$search = implode(PATH_SEPARATOR, $file);
foreach($file as $f) {
foreach(explode(PATH_SEPARATOR, '' . PATH_SEPARATOR . ini_get('include_path')) as $p) {
$ff = empty($p) ? $f : "$p/$f";
if (file_exists($ff)) {
$file = $ff;
$found = true;
break;
}
}
if ($found) {
break;
}
}
if (!$found) {
DB_DataObject::raiseError(
"autoload:Could not find class {$class} using class_location value",
"autoload:Could not find class " . implode(',', $cls) .
" using class_location value :" . $search .
" using include_path value :" . ini_get('include_path'),
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false;
}
@ -2716,11 +2784,17 @@ class DB_DataObject extends DB_DataObject_Overload
include_once $file;
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
$ce = false;
foreach($cls as $c) {
$ce = substr(phpversion(),0,1) > 4 ? class_exists($c,false) : class_exists($c);
if ($ce) {
$class = $c;
break;
}
}
if (!$ce) {
DB_DataObject::raiseError(
"autoload:Could not autoload {$class}",
"autoload:Could not autoload " . implode(',', $cls) ,
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false;
}
@ -2786,7 +2860,7 @@ class DB_DataObject extends DB_DataObject_Overload
}
$_DB_DATAOBJECT['LINKS'][$this->_database] = array();
foreach ($schemas as $ini) {
$links =
@ -2794,9 +2868,13 @@ class DB_DataObject extends DB_DataObject_Overload
$_DB_DATAOBJECT['CONFIG']["links_{$this->_database}"] :
str_replace('.ini','.links.ini',$ini);
if (empty($_DB_DATAOBJECT['LINKS'][$this->_database]) && file_exists($links) && is_file($links)) {
if (file_exists($links) && is_file($links)) {
/* not sure why $links = ... here - TODO check if that works */
$_DB_DATAOBJECT['LINKS'][$this->_database] = parse_ini_file($links, true);
$_DB_DATAOBJECT['LINKS'][$this->_database] = array_merge(
$_DB_DATAOBJECT['LINKS'][$this->_database],
parse_ini_file($links, true)
);
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
$this->debug("Loaded links.ini file: $links","links",1);
}
@ -2977,14 +3055,12 @@ class DB_DataObject extends DB_DataObject_Overload
}
if ($link) {
if ($obj->get($link, $this->$row)) {
$obj->free();
return $obj;
}
return false;
}
if ($obj->get($this->$row)) {
$obj->free();
return $obj;
}
return false;
@ -3316,13 +3392,22 @@ class DB_DataObject extends DB_DataObject_Overload
return false;
}
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) {
if (!isset($obj->$k)) {
if (!isset($obj->$k) && $ignore_null) {
continue;
}
$kSql = ($quoteIdentifiers ? $DB->quoteIdentifier($k) : $k);
if (DB_DataObject::_is_null($obj,$k)) {
$obj->whereAdd("{$joinAs}.{$kSql} IS NULL");
continue;
}
if ($v & DB_DATAOBJECT_STR) {
$obj->whereAdd("{$joinAs}.{$kSql} = " . $this->_quote((string) (
@ -3345,13 +3430,8 @@ class DB_DataObject extends DB_DataObject_Overload
$this->raiseError($value->getMessage() ,DB_DATAOBJECT_ERROR_INVALIDARG);
return false;
}
if (!isset($options['disable_null_strings']) && strtolower($value) === 'null') {
$obj->whereAdd("{$joinAs}.{$kSql} IS NULL");
continue;
} else {
$obj->whereAdd("{$joinAs}.{$kSql} = $value");
continue;
}
$obj->whereAdd("{$joinAs}.{$kSql} = $value");
continue;
}
@ -3514,7 +3594,7 @@ class DB_DataObject extends DB_DataObject_Overload
continue;
}
if (!isset($from[sprintf($format,$k)])) {
if (!isset($from[sprintf($format,$k)]) && !DB_DataObject::_is_null($from, sprintf($format,$k))) {
continue;
}
@ -3643,7 +3723,7 @@ class DB_DataObject extends DB_DataObject_Overload
// if not null - and it's not set.......
if (!isset($this->$key) && ($val & DB_DATAOBJECT_NOTNULL)) {
if ($val & DB_DATAOBJECT_NOTNULL && DB_DataObject::_is_null($this, $key)) {
// dont check empty sequence key values..
if (($key == $seq[0]) && ($seq[1] == true)) {
continue;
@ -3653,7 +3733,7 @@ class DB_DataObject extends DB_DataObject_Overload
}
if (!isset($options['disable_null_strings']) && is_string($this->$key) && (strtolower($this->$key) == 'null')) {
if (DB_DataObject::_is_null($this, $key)) {
if ($val & DB_DATAOBJECT_NOTNULL) {
$this->debug("'null' field used for '$key', but it is defined as NOT NULL", 'VALIDATION', 4);
$ret[$key] = false;
@ -3868,13 +3948,14 @@ class DB_DataObject extends DB_DataObject_Overload
//echo "FROM VALUE $col, {$cols[$col]}, $value\n";
switch (true) {
// set to null and column is can be null...
case (!isset($options['disable_null_strings']) && (strtolower($value) == 'null') && (!($cols[$col] & DB_DATAOBJECT_NOTNULL))):
case ((!($cols[$col] & DB_DATAOBJECT_NOTNULL)) && DB_DataObject::_is_null($value, false)):
case (is_object($value) && is_a($value,'DB_DataObject_Cast')):
$this->$col = $value;
return true;
// fail on setting null on a not null field..
case (!isset($options['disable_null_strings']) && (strtolower($value) == 'null') && ($cols[$col] & DB_DATAOBJECT_NOTNULL)):
case (($cols[$col] & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($value,false)):
return false;
case (($cols[$col] & DB_DATAOBJECT_DATE) && ($cols[$col] & DB_DATAOBJECT_TIME)):
@ -4190,9 +4271,65 @@ class DB_DataObject extends DB_DataObject_Overload
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->num_rows = array();
}
}
if (is_array($this->_link_loaded)) {
foreach ($this->_link_loaded as $do) {
$do->free();
}
}
}
/**
* Evaluate whether or not a value is set to null, taking the 'disable_null_strings' option into account.
* If the value is a string set to "null" and the "disable_null_strings" option is not set to
* true, then the value is considered to be null.
* If the value is actually a PHP NULL value, and "disable_null_strings" has been set to
* the value "full", then it will also be considered null. - this can not differenticate between not set
*
*
* @param object|array $obj_or_ar
* @param string|false $prop prperty
* @access private
* @return bool object
*/
function _is_null($obj_or_ar , $prop)
{
global $_DB_DATAOBJECT;
$isset = $prop === false ? isset($obj_or_ar) :
(is_array($obj_or_ar) ? isset($obj_or_ar[$prop]) : isset($obj_or_ar->$prop));
$value = $isset ?
($prop === false ? $obj_or_ar :
(is_array($obj_or_ar) ? $obj_or_ar[$prop] : $obj_or_ar->$prop))
: null;
$options = $_DB_DATAOBJECT['CONFIG'];
$null_strings = !isset($options['disable_null_strings'])
|| $options['disable_null_strings'] === false;
$crazy_null = isset($options['disable_null_strings'])
&& is_string($options['disable_null_strings'])
&& strtolower($options['disable_null_strings'] === 'full');
if ( $null_strings && $isset && is_string($value) && (strtolower($value) === 'null') ) {
return true;
}
if ( $crazy_null && !$isset ) {
return true;
}
return false;
}
/* ---- LEGACY BC METHODS - NOT DOCUMENTED - See Documentation on New Methods. ---*/
function _get_table() { return $this->table(); }
@ -4214,3 +4351,4 @@ if (!defined('DB_DATAOBJECT_NO_OVERLOAD')) {
}
}

View File

@ -15,7 +15,7 @@
* @author Alan Knowles <alan@akbkhome.com>
* @copyright 1997-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Generator.php 284150 2009-07-15 23:27:59Z alan_k $
* @version CVS: $Id: Generator.php 289384 2009-10-09 00:17:26Z alan_k $
* @link http://pear.php.net/package/DB_DataObject
*/
@ -33,7 +33,7 @@
/**
*
* Config _$ptions
* [DB_DataObject_Generator]
* [DB_DataObject]
* ; optional default = DB/DataObject.php
* extends_location =
* ; optional default = DB_DataObject
@ -775,11 +775,9 @@ class DB_DataObject_Generator extends DB_DataObject
//echo "Generating Class files: \n";
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$this->_extends = empty($options['extends']) ? $this->_extends : $options['extends'];
$this->_extendsFile = empty($options['extends_location']) ? $this->_extendsFile : $options['extends_location'];
if ($extends = @$options['extends']) {
$this->_extends = $extends;
$this->_extendsFile = $options['extends_location'];
}
foreach($this->tables as $this->table) {
$this->table = trim($this->table);
@ -814,7 +812,7 @@ class DB_DataObject_Generator extends DB_DataObject
}
/**
* class being extended (can be overridden by [DB_DataObject_Generator] extends=xxxx
* class being extended (can be overridden by [DB_DataObject] extends=xxxx
*
* @var string
* @access private
@ -1142,10 +1140,9 @@ class DB_DataObject_Generator extends DB_DataObject
$options = &PEAR::getStaticProperty('DB_DataObject','options');
$class_prefix = empty($options['class_prefix']) ? '' : $options['class_prefix'];
if ($extends = @$options['extends']) {
$this->_extends = $extends;
$this->_extendsFile = $options['extends_location'];
}
$this->_extends = empty($options['extends']) ? $this->_extends : $options['extends'];
$this->_extendsFile = empty($options['extends_location']) ? $this->_extendsFile : $options['extends_location'];
$classname = $this->classname = $this->getClassNameFromTableName($this->table);
$out = $this->_generateClassTable();