* @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 329992 2013-04-03 11:38:43Z alan_k $
+ * @version CVS: $Id: DataObject.php 320069 2011-11-28 04:34:08Z alan_k $
* @link http://pear.php.net/package/DB_DataObject
*/
* @access private
* @var string
*/
- var $_DB_DataObject_version = "1.11.0";
+ var $_DB_DataObject_version = "1.11.3";
/**
* The Database table (used by table extends)
$this->_query['derive_select']
.' FROM ( SELECT'.
$this->_query['data_select'] . " \n" .
- " FROM $tn \n" .
+ " FROM $tn " . $this->_query['useindex'] . " \n" .
$this->_join . " \n" .
$this->_query['condition'] . " \n" .
$this->_query['group_by'] . " \n" .
$sql = 'SELECT ' .
$this->_query['data_select'] . " \n" .
- " FROM $tn \n" .
+ " FROM $tn " . $this->_query['useindex'] . " \n" .
$this->_join . " \n" .
$this->_query['condition'] . " \n" .
$this->_query['group_by'] . " \n" .
$this->_query['having'] .= " AND {$having}";
}
+ /**
+ * Adds a using Index
+ *
+ * $object->useIndex(); //reset the use Index
+ * $object->useIndex("some_index");
+ *
+ * Note do not put unfiltered user input into theis method.
+ * This is mysql specific at present? - might need altering to support other databases.
+ *
+ * @param string|array $index index or indexes to use.
+ * @access public
+ * @return none|PEAR::Error - invalid args only
+ */
+ function useIndex($index = false)
+ {
+ if ($this->_query === false) {
+ $this->raiseError(
+ "You cannot do two queries on the same object (copy it before finding)",
+ DB_DATAOBJECT_ERROR_INVALIDARGS);
+ return false;
+ }
+ if ($index=== false) {
+ $this->_query['useindex'] = '';
+ return;
+ }
+ // check input...= 0 or ' ' == error!
+ if ((is_string($index) && !trim($index)) || (is_array($index) && !count($index)) ) {
+ return $this->raiseError("Having: No Valid Arguments", DB_DATAOBJECT_ERROR_INVALIDARGS);
+ }
+ $index = is_array($index) ? implode(', ', $index) : $index;
+
+ if (!$this->_query['useindex']) {
+ $this->_query['useindex'] = " USE INDEX ({$index}) ";
+ return;
+ }
+ $this->_query['useindex'] = substr($this->_query['useindex'],0, -2) . ", {$index}) ";
+ }
/**
* Sets the Limit
*
continue;
}
-
-
-
- // Ignore variables which aren't set to a value
- if ( !isset($this->$k) && $ignore_null) {
+
+ // Ignore INTEGERS which aren't set to a value - or empty string..
+ if ( (!isset($this->$k) || ($v == 1 && $this->$k === ''))
+ && $ignore_null
+ ) {
continue;
}
// dont insert data into mysql timestamps
$this->raiseError("update: trying to perform an update without
the key set, and argument to update is not
DB_DATAOBJECT_WHEREADD_ONLY
- ", DB_DATAOBJECT_ERROR_INVALIDARGS);
+ ". print_r(array('seq' => $seq , 'keys'=>$keys), true), DB_DATAOBJECT_ERROR_INVALIDARGS);
return false;
}
} else {
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
-
+
foreach($items as $k => $v) {
- if (!isset($this->$k) && $ignore_null) {
- continue;
+ // I think this is ignoring empty vlalues
+ if ((!isset($this->$k) || ($v == 1 && $this->$k === ''))
+ && $ignore_null
+ ) {
+ continue;
}
// ignore stuff thats
// - V2 may store additional data about float/int
$settings .= "$kSql = " . intval($this->$k) . ' ';
}
-
+
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
$this->debug("got keys as ".serialize($keys),3);
'group_by' => '', // the GROUP BY condition
'order_by' => '', // the ORDER BY condition
'having' => '', // the HAVING condition
+ 'useindex' => '', // the USE INDEX condition
'limit_start' => '', // the LIMIT condition
'limit_count' => '', // the LIMIT condition
'data_select' => '*', // the columns to be SELECTed
} else {
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5] = DB::connect($dsn);
}
-
+
} else {
/* assumption is MDB2 */
require_once 'MDB2.php';
}
- if (strtoupper($string) == 'BEGIN') {
+ if (
+ strtoupper($string) == 'BEGIN' ||
+ strtoupper($string) == 'START TRANSACTION'
+ ) {
if ($_DB_driver == 'DB') {
$DB->autoCommit(false);
$DB->simpleQuery('BEGIN');
}
return true;
}
+
if (strtoupper($string) == 'COMMIT') {
$res = $DB->commit();
if ($_DB_driver == 'DB') {
- function factory($table = '')
+ static function factory($table = '')
{
global $_DB_DATAOBJECT;
}
// no configuration available for database
if (!empty($database) && empty($_DB_DATAOBJECT['CONFIG']['database_'.$database])) {
- return DB_DataObject::raiseError(
+ $do = new DB_DataObject();
+ $do->raiseError(
"unable to find database_{$database} in Configuration, It is required for factory with database"
, 0, PEAR_ERROR_DIE );
}
-
+ /*
if ($table === '') {
if (is_a($this,'DB_DataObject') && strlen($this->tableName())) {
$table = $this->tableName();
}
}
+ */
// does this need multi db support??
$cp = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']['class_prefix']) : '';
}
if (!$rclass || !class_exists($rclass)) {
- return DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ return $dor->raiseError(
"factory could not find class " .
(is_array($class) ? implode(PATH_SEPARATOR, $class) : $class ).
"from $table",
}
}
if (!$found) {
- DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ $dor->raiseError(
"autoload:Could not find class " . implode(',', $cls) .
" using class_location value :" . $search .
" using include_path value :" . ini_get('include_path'),
}
}
if (!$ce) {
- DB_DataObject::raiseError(
+ $dor = new DB_DataObject();
+ $dor->raiseError(
"autoload:Could not autoload " . implode(',', $cls) ,
DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false;
}
// apply our filtered version, which excludes the distinct column.
- $selectAs = empty($cols) ? array() : array(array( $cols , '%s', false)) ;
+ $selectAs = empty($cols) ? array() : array(array(array( $cols) , '%s', false)) ;
if ($has_distinct) {
$this->selectAdd($has_distinct);
}
-
- foreach($selectAs as $ar) {
-
+
+ foreach($selectAs as $ar) {
$this->selectAs($ar[0], $ar[1], $ar[2]);
}
// restore links..
global $_DB_DATAOBJECT;
$keys = $this->keys();
$items = $this->table();
+
if (!$items) {
$this->raiseError(
"setFrom:Could not find table definition for {$this->tableName()}",
* @access public
* @return none
*/
- function debugLevel($v = null)
+ static function debugLevel($v = null)
{
global $_DB_DATAOBJECT;
if (empty($_DB_DATAOBJECT['CONFIG'])) {
/**
* Last Error that has occured
* - use $this->_lastError or
- * $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
+ * $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
*
* @access public
* @var object PEAR_Error (or false)
if ($behaviour == PEAR_ERROR_DIE && !empty($_DB_DATAOBJECT['CONFIG']['dont_die'])) {
$behaviour = null;
}
- $error = PEAR::getStaticProperty('DB_DataObject','lastError');
+
+ $error = &PEAR::getStaticProperty('DB_DataObject','lastError');
// no checks for production here?....... - we log errors before we throw them.
$error = $message;
} else {
require_once 'DB/DataObject/Error.php';
- $error = PEAR::raiseError($message, $type, $behaviour,
+ $dor = new PEAR();
+ $error = $dor->raiseError($message, $type, $behaviour,
$opts=null, $userinfo=null, 'DB_DataObject_Error'
);
}
if (is_array($this->_link_loaded)) {
foreach ($this->_link_loaded as $do) {
- $do->free();
+ if (
+ !empty($this->{$do}) &&
+ is_object($this->{$do}) &&
+ method_exists($this->{$do}, 'free')
+ ) {
+ $this->{$do}->free();
+ }
}
}
/**
* (deprecated - use ::get / and your own caching method)
*/
- function staticGet($class, $k, $v = null)
+ static function staticGet($class, $k, $v = null)
{
$lclass = strtolower($class);
global $_DB_DATAOBJECT;
$obj = DB_DataObject::factory(substr($class,strlen($_DB_DATAOBJECT['CONFIG']['class_prefix'])));
if (PEAR::isError($obj)) {
- DB_DataObject::raiseError("could not autoload $class", DB_DATAOBJECT_ERROR_NOCLASS);
+ $dor = new DB_DataObject();
+ $dor->raiseError("could not autoload $class", DB_DATAOBJECT_ERROR_NOCLASS);
$r = false;
return $r;
}
$_DB_DATAOBJECT['CACHE'][$lclass] = array();
}
if (!$obj->get($k,$v)) {
- DB_DataObject::raiseError("No Data return from get $k $v", DB_DATAOBJECT_ERROR_NODATA);
+ $dor = new DB_DataObject();
+ $dor->raiseError("No Data return from get $k $v", DB_DATAOBJECT_ERROR_NODATA);
$r = false;
return $r;