[ Index ]

PHP Cross Reference of MantisBT

title

Body

[close]

/library/adodb/drivers/ -> adodb-mysql.inc.php (source)

   1  <?php
   2  /*
   3  V5.11 5 May 2010   (c) 2000-2010 John Lim (jlim#natsoft.com). All rights reserved.
   4    Released under both BSD license and Lesser GPL library license. 
   5    Whenever there is any discrepancy between the two licenses, 
   6    the BSD license will take precedence.
   7    Set tabs to 8.
   8    
   9    MySQL code that does not support transactions. Use mysqlt if you need transactions.
  10    Requires mysql client. Works on Windows and Unix.
  11    
  12   28 Feb 2001: MetaColumns bug fix - suggested by  Freek Dijkstra (phpeverywhere@macfreek.com)
  13  */ 
  14  
  15  // security - hide paths
  16  if (!defined('ADODB_DIR')) die();
  17  
  18  if (! defined("_ADODB_MYSQL_LAYER")) {
  19   define("_ADODB_MYSQL_LAYER", 1 );
  20  
  21  class ADODB_mysql extends ADOConnection {
  22      var $databaseType = 'mysql';
  23      var $dataProvider = 'mysql';
  24      var $hasInsertID = true;
  25      var $hasAffectedRows = true;    
  26      var $metaTablesSQL = "SHOW TABLES";    
  27      var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
  28      var $fmtTimeStamp = "'Y-m-d H:i:s'";
  29      var $hasLimit = true;
  30      var $hasMoveFirst = true;
  31      var $hasGenID = true;
  32      var $isoDates = true; // accepts dates in ISO format
  33      var $sysDate = 'CURDATE()';
  34      var $sysTimeStamp = 'NOW()';
  35      var $hasTransactions = false;
  36      var $forceNewConnect = false;
  37      var $poorAffectedRows = true;
  38      var $clientFlags = 0;
  39      var $substr = "substring";
  40      var $nameQuote = '`';        /// string to use to quote identifiers and names
  41      var $compat323 = false;         // true if compat with mysql 3.23
  42      
  43  	function ADODB_mysql() 
  44      {            
  45          if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
  46      }
  47      
  48  	function ServerInfo()
  49      {
  50          $arr['description'] = ADOConnection::GetOne("select version()");
  51          $arr['version'] = ADOConnection::_findvers($arr['description']);
  52          return $arr;
  53      }
  54      
  55  	function IfNull( $field, $ifNull ) 
  56      {
  57          return " IFNULL($field, $ifNull) "; // if MySQL
  58      }
  59      
  60      
  61  	function MetaTables($ttype=false,$showSchema=false,$mask=false) 
  62      {    
  63          $save = $this->metaTablesSQL;
  64          if ($showSchema && is_string($showSchema)) {
  65              $this->metaTablesSQL .= " from $showSchema";
  66          }
  67          
  68          if ($mask) {
  69              $mask = $this->qstr($mask);
  70              $this->metaTablesSQL .= " like $mask";
  71          }
  72          $ret = ADOConnection::MetaTables($ttype,$showSchema);
  73          
  74          $this->metaTablesSQL = $save;
  75          return $ret;
  76      }
  77      
  78      
  79  	function MetaIndexes ($table, $primary = FALSE, $owner=false)
  80      {
  81          // save old fetch mode
  82          global $ADODB_FETCH_MODE;
  83          
  84          $false = false;
  85          $save = $ADODB_FETCH_MODE;
  86          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
  87          if ($this->fetchMode !== FALSE) {
  88                 $savem = $this->SetFetchMode(FALSE);
  89          }
  90          
  91          // get index details
  92          $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
  93          
  94          // restore fetchmode
  95          if (isset($savem)) {
  96                  $this->SetFetchMode($savem);
  97          }
  98          $ADODB_FETCH_MODE = $save;
  99          
 100          if (!is_object($rs)) {
 101                  return $false;
 102          }
 103          
 104          $indexes = array ();
 105          
 106          // parse index data into array
 107          while ($row = $rs->FetchRow()) {
 108                  if ($primary == FALSE AND $row[2] == 'PRIMARY') {
 109                          continue;
 110                  }
 111                  
 112                  if (!isset($indexes[$row[2]])) {
 113                          $indexes[$row[2]] = array(
 114                                  'unique' => ($row[1] == 0),
 115                                  'columns' => array()
 116                          );
 117                  }
 118                  
 119                  $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
 120          }
 121          
 122          // sort columns by order in the index
 123          foreach ( array_keys ($indexes) as $index )
 124          {
 125                  ksort ($indexes[$index]['columns']);
 126          }
 127          
 128          return $indexes;
 129      }
 130  
 131      
 132      // if magic quotes disabled, use mysql_real_escape_string()
 133  	function qstr($s,$magic_quotes=false)
 134      {
 135          if (is_null($s)) return 'NULL';
 136          if (!$magic_quotes) {
 137          
 138              if (ADODB_PHPVER >= 0x4300) {
 139                  if (is_resource($this->_connectionID))
 140                      return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
 141              }
 142              if ($this->replaceQuote[0] == '\\'){
 143                  $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
 144              }
 145              return  "'".str_replace("'",$this->replaceQuote,$s)."'"; 
 146          }
 147          
 148          // undo magic quotes for "
 149          $s = str_replace('\\"','"',$s);
 150          return "'$s'";
 151      }
 152      
 153  	function _insertid()
 154      {
 155          return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
 156          //return mysql_insert_id($this->_connectionID);
 157      }
 158      
 159  	function GetOne($sql,$inputarr=false)
 160      {
 161      global $ADODB_GETONE_EOF;
 162          if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
 163              $rs = $this->SelectLimit($sql,1,-1,$inputarr);
 164              if ($rs) {
 165                  $rs->Close();
 166                  if ($rs->EOF) return $ADODB_GETONE_EOF;
 167                  return reset($rs->fields);
 168              }
 169          } else {
 170              return ADOConnection::GetOne($sql,$inputarr);
 171          }
 172          return false;
 173      }
 174      
 175  	function BeginTrans()
 176      {
 177          if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
 178      }
 179      
 180  	function _affectedrows()
 181      {
 182              return mysql_affected_rows($this->_connectionID);
 183      }
 184    
 185        // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
 186      // Reference on Last_Insert_ID on the recommended way to simulate sequences
 187       var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
 188      var $_genSeqSQL = "create table %s (id int not null)";
 189      var $_genSeqCountSQL = "select count(*) from %s";
 190      var $_genSeq2SQL = "insert into %s values (%s)";
 191      var $_dropSeqSQL = "drop table %s";
 192      
 193  	function CreateSequence($seqname='adodbseq',$startID=1)
 194      {
 195          if (empty($this->_genSeqSQL)) return false;
 196          $u = strtoupper($seqname);
 197          
 198          $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
 199          if (!$ok) return false;
 200          return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
 201      }
 202      
 203  
 204  	function GenID($seqname='adodbseq',$startID=1)
 205      {
 206          // post-nuke sets hasGenID to false
 207          if (!$this->hasGenID) return false;
 208          
 209          $savelog = $this->_logsql;
 210          $this->_logsql = false;
 211          $getnext = sprintf($this->_genIDSQL,$seqname);
 212          $holdtransOK = $this->_transOK; // save the current status
 213          $rs = @$this->Execute($getnext);
 214          if (!$rs) {
 215              if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
 216              $u = strtoupper($seqname);
 217              $this->Execute(sprintf($this->_genSeqSQL,$seqname));
 218              $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
 219              if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
 220              $rs = $this->Execute($getnext);
 221          }
 222          
 223          if ($rs) {
 224              $this->genID = mysql_insert_id($this->_connectionID);
 225              $rs->Close();
 226          } else
 227              $this->genID = 0;
 228          
 229          $this->_logsql = $savelog;
 230          return $this->genID;
 231      }
 232      
 233    	function MetaDatabases()
 234      {
 235          $qid = mysql_list_dbs($this->_connectionID);
 236          $arr = array();
 237          $i = 0;
 238          $max = mysql_num_rows($qid);
 239          while ($i < $max) {
 240              $db = mysql_tablename($qid,$i);
 241              if ($db != 'mysql') $arr[] = $db;
 242              $i += 1;
 243          }
 244          return $arr;
 245      }
 246      
 247          
 248      // Format date column in sql string given an input format that understands Y M D
 249  	function SQLDate($fmt, $col=false)
 250      {    
 251          if (!$col) $col = $this->sysTimeStamp;
 252          $s = 'DATE_FORMAT('.$col.",'";
 253          $concat = false;
 254          $len = strlen($fmt);
 255          for ($i=0; $i < $len; $i++) {
 256              $ch = $fmt[$i];
 257              switch($ch) {
 258                  
 259              default:
 260                  if ($ch == '\\') {
 261                      $i++;
 262                      $ch = substr($fmt,$i,1);
 263                  }
 264                  /** FALL THROUGH */
 265              case '-':
 266              case '/':
 267                  $s .= $ch;
 268                  break;
 269                  
 270              case 'Y':
 271              case 'y':
 272                  $s .= '%Y';
 273                  break;
 274              case 'M':
 275                  $s .= '%b';
 276                  break;
 277                  
 278              case 'm':
 279                  $s .= '%m';
 280                  break;
 281              case 'D':
 282              case 'd':
 283                  $s .= '%d';
 284                  break;
 285              
 286              case 'Q':
 287              case 'q':
 288                  $s .= "'),Quarter($col)";
 289                  
 290                  if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
 291                  else $s .= ",('";
 292                  $concat = true;
 293                  break;
 294              
 295              case 'H': 
 296                  $s .= '%H';
 297                  break;
 298                  
 299              case 'h':
 300                  $s .= '%I';
 301                  break;
 302                  
 303              case 'i':
 304                  $s .= '%i';
 305                  break;
 306                  
 307              case 's':
 308                  $s .= '%s';
 309                  break;
 310                  
 311              case 'a':
 312              case 'A':
 313                  $s .= '%p';
 314                  break;
 315                  
 316              case 'w':
 317                  $s .= '%w';
 318                  break;
 319                  
 320               case 'W':
 321                  $s .= '%U';
 322                  break;
 323                  
 324              case 'l':
 325                  $s .= '%W';
 326                  break;
 327              }
 328          }
 329          $s.="')";
 330          if ($concat) $s = "CONCAT($s)";
 331          return $s;
 332      }
 333      
 334  
 335      // returns concatenated string
 336      // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
 337  	function Concat()
 338      {
 339          $s = "";
 340          $arr = func_get_args();
 341          
 342          // suggestion by andrew005@mnogo.ru
 343          $s = implode(',',$arr); 
 344          if (strlen($s) > 0) return "CONCAT($s)";
 345          else return '';
 346      }
 347      
 348  	function OffsetDate($dayFraction,$date=false)
 349      {        
 350          if (!$date) $date = $this->sysDate;
 351          
 352          $fraction = $dayFraction * 24 * 3600;
 353          return '('. $date . ' + INTERVAL ' .     $fraction.' SECOND)';
 354          
 355  //        return "from_unixtime(unix_timestamp($date)+$fraction)";
 356      }
 357      
 358      // returns true or false
 359  	function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
 360      {
 361          if (!empty($this->port)) $argHostname .= ":".$this->port;
 362          
 363          if (ADODB_PHPVER >= 0x4300)
 364              $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
 365                                                  $this->forceNewConnect,$this->clientFlags);
 366          else if (ADODB_PHPVER >= 0x4200)
 367              $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
 368                                                  $this->forceNewConnect);
 369          else
 370              $this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
 371      
 372          if ($this->_connectionID === false) return false;
 373          if ($argDatabasename) return $this->SelectDB($argDatabasename);
 374          return true;    
 375      }
 376      
 377      // returns true or false
 378  	function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
 379      {
 380          if (!empty($this->port)) $argHostname .= ":".$this->port;
 381          
 382          if (ADODB_PHPVER >= 0x4300)
 383              $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
 384          else
 385              $this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
 386          if ($this->_connectionID === false) return false;
 387          if ($this->autoRollback) $this->RollbackTrans();
 388          if ($argDatabasename) return $this->SelectDB($argDatabasename);
 389          return true;    
 390      }
 391      
 392  	function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
 393      {
 394          $this->forceNewConnect = true;
 395          return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
 396      }
 397      
 398   	function MetaColumns($table, $normalize=true) 
 399      {
 400          $this->_findschema($table,$schema);
 401          if ($schema) {
 402              $dbName = $this->database;
 403              $this->SelectDB($schema);
 404          }
 405          global $ADODB_FETCH_MODE;
 406          $save = $ADODB_FETCH_MODE;
 407          $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
 408          
 409          if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
 410          $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
 411          
 412          if ($schema) {
 413              $this->SelectDB($dbName);
 414          }
 415          
 416          if (isset($savem)) $this->SetFetchMode($savem);
 417          $ADODB_FETCH_MODE = $save;
 418          if (!is_object($rs)) {
 419              $false = false;
 420              return $false;
 421          }
 422              
 423          $retarr = array();
 424          while (!$rs->EOF){
 425              $fld = new ADOFieldObject();
 426              $fld->name = $rs->fields[0];
 427              $type = $rs->fields[1];
 428              
 429              // split type into type(length):
 430              $fld->scale = null;
 431              if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
 432                  $fld->type = $query_array[1];
 433                  $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
 434                  $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
 435              } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
 436                  $fld->type = $query_array[1];
 437                  $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
 438              } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
 439                  $fld->type = $query_array[1];
 440                  $arr = explode(",",$query_array[2]);
 441                  $fld->enums = $arr;
 442                  $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
 443                  $fld->max_length = ($zlen > 0) ? $zlen : 1;
 444              } else {
 445                  $fld->type = $type;
 446                  $fld->max_length = -1;
 447              }
 448              $fld->not_null = ($rs->fields[2] != 'YES');
 449              $fld->primary_key = ($rs->fields[3] == 'PRI');
 450              $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
 451              $fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
 452              $fld->unsigned = (strpos($type,'unsigned') !== false);
 453              $fld->zerofill = (strpos($type,'zerofill') !== false);
 454  
 455              if (!$fld->binary) {
 456                  $d = $rs->fields[4];
 457                  if ($d != '' && $d != 'NULL') {
 458                      $fld->has_default = true;
 459                      $fld->default_value = $d;
 460                  } else {
 461                      $fld->has_default = false;
 462                  }
 463              }
 464              
 465              if ($save == ADODB_FETCH_NUM) {
 466                  $retarr[] = $fld;
 467              } else {
 468                  $retarr[strtoupper($fld->name)] = $fld;
 469              }
 470                  $rs->MoveNext();
 471              }
 472          
 473              $rs->Close();
 474              return $retarr;    
 475      }
 476          
 477      // returns true or false
 478  	function SelectDB($dbName) 
 479      {
 480          $this->database = $dbName;
 481          $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
 482          if ($this->_connectionID) {
 483              return @mysql_select_db($dbName,$this->_connectionID);        
 484          }
 485          else return false;    
 486      }
 487      
 488      // parameters use PostgreSQL convention, not MySQL
 489  	function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
 490      {
 491          $offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
 492          // jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
 493          if ($nrows < 0) $nrows = '18446744073709551615'; 
 494          
 495          if ($secs)
 496              $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
 497          else
 498              $rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
 499          return $rs;
 500      }
 501      
 502      // returns queryID or false
 503  	function _query($sql,$inputarr=false)
 504      {
 505      //global $ADODB_COUNTRECS;
 506          //if($ADODB_COUNTRECS) 
 507          return mysql_query($sql,$this->_connectionID);
 508          //else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
 509      }
 510  
 511      /*    Returns: the last error message from previous database operation    */    
 512  	function ErrorMsg() 
 513      {
 514      
 515          if ($this->_logsql) return $this->_errorMsg;
 516          if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
 517          else $this->_errorMsg = @mysql_error($this->_connectionID);
 518          return $this->_errorMsg;
 519      }
 520      
 521      /*    Returns: the last error number from previous database operation    */    
 522  	function ErrorNo() 
 523      {
 524          if ($this->_logsql) return $this->_errorCode;
 525          if (empty($this->_connectionID))  return @mysql_errno();
 526          else return @mysql_errno($this->_connectionID);
 527      }
 528      
 529      // returns true or false
 530  	function _close()
 531      {
 532          @mysql_close($this->_connectionID);
 533          $this->_connectionID = false;
 534      }
 535  
 536      
 537      /*
 538      * Maximum size of C field
 539      */
 540  	function CharMax()
 541      {
 542          return 255; 
 543      }
 544      
 545      /*
 546      * Maximum size of X field
 547      */
 548  	function TextMax()
 549      {
 550          return 4294967295; 
 551      }
 552      
 553      // "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
 554  	function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
 555       {
 556       global $ADODB_FETCH_MODE;
 557          if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
 558  
 559           if ( !empty($owner) ) {
 560              $table = "$owner.$table";
 561           }
 562           $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
 563           if ($associative) {
 564               $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
 565           } else $create_sql  = $a_create_table[1];
 566  
 567           $matches = array();
 568  
 569           if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
 570           $foreign_keys = array();          
 571           $num_keys = count($matches[0]);
 572           for ( $i = 0;  $i < $num_keys;  $i ++ ) {
 573               $my_field  = explode('`, `', $matches[1][$i]);
 574               $ref_table = $matches[2][$i];
 575               $ref_field = explode('`, `', $matches[3][$i]);
 576  
 577               if ( $upper ) {
 578                   $ref_table = strtoupper($ref_table);
 579               }
 580  
 581              // see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
 582              if (!isset($foreign_keys[$ref_table])) {
 583                  $foreign_keys[$ref_table] = array();
 584              }
 585              $num_fields = count($my_field);
 586              for ( $j = 0;  $j < $num_fields;  $j ++ ) {
 587                   if ( $associative ) {
 588                       $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
 589                   } else {
 590                       $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
 591                   }
 592               }
 593           }
 594           
 595           return  $foreign_keys;
 596       }
 597       
 598      
 599  }
 600      
 601  /*--------------------------------------------------------------------------------------
 602       Class Name: Recordset
 603  --------------------------------------------------------------------------------------*/
 604  
 605  
 606  class ADORecordSet_mysql extends ADORecordSet{    
 607      
 608      var $databaseType = "mysql";
 609      var $canSeek = true;
 610      
 611  	function ADORecordSet_mysql($queryID,$mode=false) 
 612      {
 613          if ($mode === false) { 
 614              global $ADODB_FETCH_MODE;
 615              $mode = $ADODB_FETCH_MODE;
 616          }
 617          switch ($mode)
 618          {
 619          case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
 620          case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
 621          case ADODB_FETCH_DEFAULT:
 622          case ADODB_FETCH_BOTH:
 623          default:
 624              $this->fetchMode = MYSQL_BOTH; break;
 625          }
 626          $this->adodbFetchMode = $mode;
 627          $this->ADORecordSet($queryID);    
 628      }
 629      
 630  	function _initrs()
 631      {
 632      //GLOBAL $ADODB_COUNTRECS;
 633      //    $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
 634          $this->_numOfRows = @mysql_num_rows($this->_queryID);
 635          $this->_numOfFields = @mysql_num_fields($this->_queryID);
 636      }
 637      
 638  	function FetchField($fieldOffset = -1) 
 639      {    
 640          if ($fieldOffset != -1) {
 641              $o = @mysql_fetch_field($this->_queryID, $fieldOffset);
 642              $f = @mysql_field_flags($this->_queryID,$fieldOffset);
 643              if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
 644              //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
 645              if ($o) $o->binary = (strpos($f,'binary')!== false);
 646          }
 647          else if ($fieldOffset == -1) {    /*    The $fieldOffset argument is not provided thus its -1     */
 648              $o = @mysql_fetch_field($this->_queryID);
 649              if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
 650          //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
 651          }
 652              
 653          return $o;
 654      }
 655  
 656  	function GetRowAssoc($upper=true)
 657      {
 658          if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields;
 659          else $row = ADORecordSet::GetRowAssoc($upper);
 660          return $row;
 661      }
 662      
 663      /* Use associative array to get fields array */
 664  	function Fields($colname)
 665      {    
 666          // added @ by "Michael William Miller" <mille562@pilot.msu.edu>
 667          if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname];
 668          
 669          if (!$this->bind) {
 670              $this->bind = array();
 671              for ($i=0; $i < $this->_numOfFields; $i++) {
 672                  $o = $this->FetchField($i);
 673                  $this->bind[strtoupper($o->name)] = $i;
 674              }
 675          }
 676           return $this->fields[$this->bind[strtoupper($colname)]];
 677      }
 678      
 679  	function _seek($row)
 680      {
 681          if ($this->_numOfRows == 0) return false;
 682          return @mysql_data_seek($this->_queryID,$row);
 683      }
 684      
 685  	function MoveNext()
 686      {
 687          //return adodb_movenext($this);
 688          //if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
 689          if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
 690              $this->_currentRow += 1;
 691              return true;
 692          }
 693          if (!$this->EOF) {
 694              $this->_currentRow += 1;
 695              $this->EOF = true;
 696          }
 697          return false;
 698      }
 699      
 700  	function _fetch()
 701      {
 702          $this->fields =  @mysql_fetch_array($this->_queryID,$this->fetchMode);
 703          return is_array($this->fields);
 704      }
 705      
 706  	function _close() {
 707          @mysql_free_result($this->_queryID);    
 708          $this->_queryID = false;    
 709      }
 710      
 711  	function MetaType($t,$len=-1,$fieldobj=false)
 712      {
 713          if (is_object($t)) {
 714              $fieldobj = $t;
 715              $t = $fieldobj->type;
 716              $len = $fieldobj->max_length;
 717          }
 718          
 719          $len = -1; // mysql max_length is not accurate
 720          switch (strtoupper($t)) {
 721          case 'STRING': 
 722          case 'CHAR':
 723          case 'VARCHAR': 
 724          case 'TINYBLOB': 
 725          case 'TINYTEXT': 
 726          case 'ENUM': 
 727          case 'SET': 
 728              if ($len <= $this->blobSize) return 'C';
 729              
 730          case 'TEXT':
 731          case 'LONGTEXT': 
 732          case 'MEDIUMTEXT':
 733              return 'X';
 734              
 735          // php_mysql extension always returns 'blob' even if 'text'
 736          // so we have to check whether binary...
 737          case 'IMAGE':
 738          case 'LONGBLOB': 
 739          case 'BLOB':
 740          case 'MEDIUMBLOB':
 741          case 'BINARY':
 742              return !empty($fieldobj->binary) ? 'B' : 'X';
 743              
 744          case 'YEAR':
 745          case 'DATE': return 'D';
 746          
 747          case 'TIME':
 748          case 'DATETIME':
 749          case 'TIMESTAMP': return 'T';
 750          
 751          case 'INT': 
 752          case 'INTEGER':
 753          case 'BIGINT':
 754          case 'TINYINT':
 755          case 'MEDIUMINT':
 756          case 'SMALLINT': 
 757              
 758              if (!empty($fieldobj->primary_key)) return 'R';
 759              else return 'I';
 760          
 761          default: return 'N';
 762          }
 763      }
 764  
 765  }
 766  
 767  class ADORecordSet_ext_mysql extends ADORecordSet_mysql {    
 768  	function ADORecordSet_ext_mysql($queryID,$mode=false) 
 769      {
 770          if ($mode === false) { 
 771              global $ADODB_FETCH_MODE;
 772              $mode = $ADODB_FETCH_MODE;
 773          }
 774          switch ($mode)
 775          {
 776          case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
 777          case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
 778          case ADODB_FETCH_DEFAULT:
 779          case ADODB_FETCH_BOTH:
 780          default:
 781          $this->fetchMode = MYSQL_BOTH; break;
 782          }
 783          $this->adodbFetchMode = $mode;
 784          $this->ADORecordSet($queryID);
 785      }
 786      
 787  	function MoveNext()
 788      {
 789          return @adodb_movenext($this);
 790      }
 791  }
 792  
 793  
 794  }
 795  ?>


Generated: Thu Jul 28 15:48:31 2011 Cross-referenced by PHPXref 0.7