]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - extlib/DB/DataObject.php
Removed plugin Google-Analytics as this is free/libre and decentralized
[quix0rs-gnu-social.git] / extlib / DB / DataObject.php
old mode 100755 (executable)
new mode 100644 (file)
index 828477d..1a7b346
@@ -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 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
  */
   
@@ -219,7 +219,7 @@ class DB_DataObject extends DB_DataObject_Overload
     * @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)
@@ -346,7 +346,7 @@ class DB_DataObject extends DB_DataObject_Overload
                $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" .
@@ -362,7 +362,7 @@ class DB_DataObject extends DB_DataObject_Overload
         
         $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" .
@@ -862,6 +862,43 @@ class DB_DataObject extends DB_DataObject_Overload
         $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
      *
@@ -1090,11 +1127,11 @@ class DB_DataObject extends DB_DataObject_Overload
                 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 
@@ -1311,7 +1348,7 @@ class DB_DataObject extends DB_DataObject_Overload
                 $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 {
@@ -1337,11 +1374,14 @@ class DB_DataObject extends DB_DataObject_Overload
                     || !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 
           
@@ -1412,7 +1452,7 @@ class DB_DataObject extends DB_DataObject_Overload
             // - 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);
@@ -1804,6 +1844,7 @@ class DB_DataObject extends DB_DataObject_Overload
         '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
@@ -2454,7 +2495,7 @@ class DB_DataObject extends DB_DataObject_Overload
             } else {
                 $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5] = DB::connect($dsn);
             }
-            
+             
         } else {
             /* assumption is MDB2 */
             require_once 'MDB2.php';
@@ -2526,7 +2567,10 @@ class DB_DataObject extends DB_DataObject_Overload
             
         }
         
-        if (strtoupper($string) == 'BEGIN') {
+        if (
+            strtoupper($string) == 'BEGIN' ||
+            strtoupper($string) == 'START TRANSACTION'
+        ) {
             if ($_DB_driver == 'DB') {
                 $DB->autoCommit(false);
                 $DB->simpleQuery('BEGIN');
@@ -2535,6 +2579,7 @@ class DB_DataObject extends DB_DataObject_Overload
             }
             return true;
         }
+        
         if (strtoupper($string) == 'COMMIT') {
             $res = $DB->commit();
             if ($_DB_driver == 'DB') {
@@ -2766,7 +2811,7 @@ class DB_DataObject extends DB_DataObject_Overload
     
     
 
-    function factory($table = '')
+    static function factory($table = '')
     {
         global $_DB_DATAOBJECT;
         
@@ -2784,13 +2829,14 @@ class DB_DataObject extends DB_DataObject_Overload
         }
         // 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();
@@ -2801,6 +2847,7 @@ class DB_DataObject extends DB_DataObject_Overload
             }
         }
         
+        */
         // does this need multi db support??
         $cp = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
             explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']['class_prefix']) : '';
@@ -2851,7 +2898,8 @@ class DB_DataObject extends DB_DataObject_Overload
         }
         
         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",
@@ -2936,7 +2984,8 @@ class DB_DataObject extends DB_DataObject_Overload
                 }
             }
             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'), 
@@ -2957,7 +3006,8 @@ class DB_DataObject extends DB_DataObject_Overload
             }
         }
         if (!$ce) {
-            DB_DataObject::raiseError(
+            $dor = new DB_DataObject();
+            $dor->raiseError(
                 "autoload:Could not autoload " . implode(',', $cls) , 
                 DB_DATAOBJECT_ERROR_INVALIDCONFIG);
             return false;
@@ -3808,7 +3858,7 @@ class DB_DataObject extends DB_DataObject_Overload
             }
             // 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)) ;
             
             
             
@@ -3908,9 +3958,8 @@ class DB_DataObject extends DB_DataObject_Overload
         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..
@@ -3968,6 +4017,7 @@ class DB_DataObject extends DB_DataObject_Overload
         global $_DB_DATAOBJECT;
         $keys  = $this->keys();
         $items = $this->table();
+        
         if (!$items) {
             $this->raiseError(
                 "setFrom:Could not find table definition for {$this->tableName()}", 
@@ -4585,7 +4635,7 @@ class DB_DataObject extends DB_DataObject_Overload
      * @access  public
      * @return  none
      */
-    function debugLevel($v = null)
+    static function debugLevel($v = null)
     {
         global $_DB_DATAOBJECT;
         if (empty($_DB_DATAOBJECT['CONFIG'])) {
@@ -4602,7 +4652,7 @@ class DB_DataObject extends DB_DataObject_Overload
     /**
      * 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)
@@ -4627,7 +4677,8 @@ class DB_DataObject extends DB_DataObject_Overload
         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.
@@ -4638,7 +4689,8 @@ class DB_DataObject extends DB_DataObject_Overload
             $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'
                         );
         }
@@ -4699,7 +4751,13 @@ class DB_DataObject extends DB_DataObject_Overload
 
         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();
+                }
             }
         }
 
@@ -4759,7 +4817,7 @@ class DB_DataObject extends DB_DataObject_Overload
     /**
      * (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;
@@ -4785,7 +4843,8 @@ class DB_DataObject extends DB_DataObject_Overload
 
         $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;
         }
@@ -4794,7 +4853,8 @@ class DB_DataObject extends DB_DataObject_Overload
             $_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;