Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
<?php
< /* < @version v5.21.0 2021-02-27 < @copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved. < @copyright (c) 2014 Damien Regad, Mark Newnham and the ADOdb community < Released under both BSD license and Lesser GPL library license. < Whenever there is any discrepancy between the two licenses, < the BSD license will take precedence. < Set tabs to 8. < < This driver only supports the original non-transactional MySQL driver. It < is deprecated in PHP version 5.5 and removed in PHP version 7. It is deprecated < as of ADOdb version 5.20.0. Use the mysqli driver instead, which supports both < transactional and non-transactional updates < < Requires mysql client. Works on Windows and Unix. < < 28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com)
> /** > * MySQL driver > * > * @deprecated > * > * This driver only supports the original non-transactional MySQL driver, > * which was deprecated in PHP version 5.5 and removed in PHP version 7. > * It is deprecated as of ADOdb version 5.20.0, use the mysqli driver > * instead, which supports both transactional and non-transactional updates. > * > * This file is part of ADOdb, a Database Abstraction Layer library for PHP. > * > * @package ADOdb > * @link https://adodb.org Project's web site and documentation > * @link https://github.com/ADOdb/ADOdb Source code and issue tracker > * > * The ADOdb Library is dual-licensed, released under both the BSD 3-Clause > * and the GNU Lesser General Public Licence (LGPL) v2.1 or, at your option, > * any later version. This means you can use it in proprietary products. > * See the LICENSE.md file distributed with this source code for details. > * @license BSD-3-Clause > * @license LGPL-2.1-or-later > * > * @copyright 2000-2013 John Lim > * @copyright 2014 Damien Regad, Mark Newnham and the ADOdb community
*/ // security - hide paths if (!defined('ADODB_DIR')) die(); if (! defined("_ADODB_MYSQL_LAYER")) { define("_ADODB_MYSQL_LAYER", 1 ); class ADODB_mysql extends ADOConnection { var $databaseType = 'mysql'; var $dataProvider = 'mysql'; var $hasInsertID = true; var $hasAffectedRows = true; var $metaTablesSQL = "SELECT TABLE_NAME, CASE WHEN TABLE_TYPE = 'VIEW' THEN 'V' ELSE 'T' END FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="; var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; var $fmtTimeStamp = "'Y-m-d H:i:s'"; var $hasLimit = true; var $hasMoveFirst = true; var $hasGenID = true; var $isoDates = true; // accepts dates in ISO format var $sysDate = 'CURDATE()'; var $sysTimeStamp = 'NOW()'; var $hasTransactions = false; var $forceNewConnect = false; var $poorAffectedRows = true; var $clientFlags = 0; var $charSet = ''; var $substr = "substring"; var $nameQuote = '`'; /// string to use to quote identifiers and names var $compat323 = false; // true if compat with mysql 3.23 /** * ADODB_mysql constructor. */ public function __construct() { if(version_compare(PHP_VERSION, '7.0.0', '>=')) { $this->outp_throw( 'mysql extension is not supported since PHP 7.0.0, use mysqli instead', __METHOD__ ); die(1); // Stop execution even if not using Exceptions } elseif(version_compare(PHP_VERSION, '5.5.0', '>=')) { // If mysql extension is available just print a warning, // otherwise die with an error message if(function_exists('mysql_connect')) { $this->outp('mysql extension is deprecated since PHP 5.5.0, consider using mysqli'); } else { $this->outp_throw( 'mysql extension is not available, use mysqli instead', __METHOD__ ); die(1); // Stop execution even if not using Exceptions } } }
< // SetCharSet - switch the client encoding < function setCharSet($charset_name)
> function setCharSet($charset)
{ if (!function_exists('mysql_set_charset')) { return false; }
< if ($this->charSet !== $charset_name) { < $ok = @mysql_set_charset($charset_name,$this->_connectionID);
> if ($this->charSet !== $charset) { > $ok = @mysql_set_charset($charset,$this->_connectionID);
if ($ok) {
< $this->charSet = $charset_name;
> $this->charSet = $charset;
return true; } return false; } return true; } function serverInfo() { $arr['description'] = ADOConnection::GetOne("select version()"); $arr['version'] = ADOConnection::_findvers($arr['description']); return $arr; } function ifNull( $field, $ifNull ) { return " IFNULL($field, $ifNull) "; // if MySQL } function metaProcedures($NamePattern = false, $catalog = null, $schemaPattern = null) { // save old fetch mode global $ADODB_FETCH_MODE; $false = false; $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; if ($this->fetchMode !== FALSE) { $savem = $this->SetFetchMode(FALSE); } $procedures = array (); // get index details $likepattern = ''; if ($NamePattern) { $likepattern = " LIKE '".$NamePattern."'"; } $rs = $this->Execute('SHOW PROCEDURE STATUS'.$likepattern); if (is_object($rs)) { // parse index data into array while ($row = $rs->FetchRow()) { $procedures[$row[1]] = array( 'type' => 'PROCEDURE', 'catalog' => '', 'schema' => '', 'remarks' => $row[7], ); } } $rs = $this->Execute('SHOW FUNCTION STATUS'.$likepattern); if (is_object($rs)) { // parse index data into array while ($row = $rs->FetchRow()) { $procedures[$row[1]] = array( 'type' => 'FUNCTION', 'catalog' => '', 'schema' => '', 'remarks' => $row[7] ); } } // restore fetchmode if (isset($savem)) { $this->SetFetchMode($savem); } $ADODB_FETCH_MODE = $save; return $procedures; } /** * Retrieves a list of tables based on given criteria * * @param string $ttype Table type = 'TABLE', 'VIEW' or false=both (default) * @param string $showSchema schema name, false = current schema (default) * @param string $mask filters the table by name * * @return array list of tables */ function metaTables($ttype=false,$showSchema=false,$mask=false) { $save = $this->metaTablesSQL; if ($showSchema && is_string($showSchema)) { $this->metaTablesSQL .= $this->qstr($showSchema); } else { $this->metaTablesSQL .= "schema()"; } if ($mask) { $mask = $this->qstr($mask); $this->metaTablesSQL .= " AND table_name LIKE $mask"; } $ret = ADOConnection::MetaTables($ttype,$showSchema); $this->metaTablesSQL = $save; return $ret; } function metaIndexes ($table, $primary = FALSE, $owner=false) { // save old fetch mode global $ADODB_FETCH_MODE; $false = false; $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; if ($this->fetchMode !== FALSE) { $savem = $this->SetFetchMode(FALSE); } // get index details $rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table)); // restore fetchmode if (isset($savem)) { $this->SetFetchMode($savem); } $ADODB_FETCH_MODE = $save; if (!is_object($rs)) { return $false; } $indexes = array (); // parse index data into array while ($row = $rs->FetchRow()) { if ($primary == FALSE AND $row[2] == 'PRIMARY') { continue; } if (!isset($indexes[$row[2]])) { $indexes[$row[2]] = array( 'unique' => ($row[1] == 0), 'columns' => array() ); } $indexes[$row[2]]['columns'][$row[3] - 1] = $row[4]; } // sort columns by order in the index foreach ( array_keys ($indexes) as $index ) { ksort ($indexes[$index]['columns']); } return $indexes; } /** * Appropriately quotes strings with ' characters for insertion into the database. * * Relies on mysql_real_escape_string() * @link https://adodb.org/dokuwiki/doku.php?id=v5:reference:connection:qstr * * @param string $s The string to quote * @param bool $magic_quotes This param is not used since 5.21.0. * It remains for backwards compatibility. * * @return string Quoted string */ function qStr($s, $magic_quotes=false) { if (is_null($s)) { return 'NULL'; } if (is_resource($this->_connectionID)) { return "'" . mysql_real_escape_string($s, $this->_connectionID) . "'"; } if ($this->replaceQuote[0] == '\\') { $s = str_replace(array('\\', "\0"), array('\\\\', "\\\0"), $s); } return "'" . str_replace("'", $this->replaceQuote, $s) . "'"; }
< function _insertid()
> protected function _insertID($table = '', $column = '')
{ return ADOConnection::GetOne('SELECT LAST_INSERT_ID()'); //return mysql_insert_id($this->_connectionID); } function getOne($sql,$inputarr=false) { global $ADODB_GETONE_EOF; if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) { $rs = $this->SelectLimit($sql,1,-1,$inputarr); if ($rs) { $rs->Close(); if ($rs->EOF) return $ADODB_GETONE_EOF; return reset($rs->fields); } } else { return ADOConnection::GetOne($sql,$inputarr); } return false; } function beginTrans() { if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver"); } function _affectedrows() { return mysql_affected_rows($this->_connectionID); } // See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html // Reference on Last_Insert_ID on the recommended way to simulate sequences var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);"; var $_genSeqSQL = "create table if not exists %s (id int not null)"; var $_genSeqCountSQL = "select count(*) from %s"; var $_genSeq2SQL = "insert into %s values (%s)"; var $_dropSeqSQL = "drop table if exists %s"; function createSequence($seqname='adodbseq',$startID=1) { if (empty($this->_genSeqSQL)) return false; $u = strtoupper($seqname); $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname)); if (!$ok) return false; return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); } function genID($seqname='adodbseq',$startID=1) { // post-nuke sets hasGenID to false if (!$this->hasGenID) return false; $savelog = $this->_logsql; $this->_logsql = false; $getnext = sprintf($this->_genIDSQL,$seqname); $holdtransOK = $this->_transOK; // save the current status $rs = @$this->Execute($getnext); if (!$rs) { if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset $u = strtoupper($seqname); $this->Execute(sprintf($this->_genSeqSQL,$seqname)); $cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname)); if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1)); $rs = $this->Execute($getnext); } if ($rs) { $this->genID = mysql_insert_id($this->_connectionID); $rs->Close(); } else $this->genID = 0; $this->_logsql = $savelog; return $this->genID; } function metaDatabases() { $qid = mysql_list_dbs($this->_connectionID); $arr = array(); $i = 0; $max = mysql_num_rows($qid); while ($i < $max) { $db = mysql_tablename($qid,$i); if ($db != 'mysql') $arr[] = $db; $i += 1; } return $arr; } // Format date column in sql string given an input format that understands Y M D function sqlDate($fmt, $col=false) { if (!$col) $col = $this->sysTimeStamp; $s = 'DATE_FORMAT('.$col.",'"; $concat = false; $len = strlen($fmt); for ($i=0; $i < $len; $i++) { $ch = $fmt[$i]; switch($ch) { default: if ($ch == '\\') { $i++; $ch = substr($fmt,$i,1); } /** FALL THROUGH */ case '-': case '/': $s .= $ch; break; case 'Y': case 'y': $s .= '%Y'; break; case 'M': $s .= '%b'; break; case 'm': $s .= '%m'; break; case 'D': case 'd': $s .= '%d'; break; case 'Q': case 'q': $s .= "'),Quarter($col)"; if ($len > $i+1) $s .= ",DATE_FORMAT($col,'"; else $s .= ",('"; $concat = true; break; case 'H': $s .= '%H'; break; case 'h': $s .= '%I'; break; case 'i': $s .= '%i'; break; case 's': $s .= '%s'; break; case 'a': case 'A': $s .= '%p'; break; case 'w': $s .= '%w'; break; case 'W': $s .= '%U'; break; case 'l': $s .= '%W'; break; } } $s.="')"; if ($concat) $s = "CONCAT($s)"; return $s; } // returns concatenated string // much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator function concat() { $s = ""; $arr = func_get_args(); // suggestion by andrew005@mnogo.ru $s = implode(',',$arr); if (strlen($s) > 0) return "CONCAT($s)"; else return ''; } function offsetDate($dayFraction,$date=false) { if (!$date) $date = $this->sysDate; $fraction = $dayFraction * 24 * 3600; return '('. $date . ' + INTERVAL ' . $fraction.' SECOND)'; // return "from_unixtime(unix_timestamp($date)+$fraction)"; } // returns true or false function _connect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (!empty($this->port)) $argHostname .= ":".$this->port; $this->_connectionID = mysql_connect($argHostname, $argUsername, $argPassword, $this->forceNewConnect, $this->clientFlags ); if ($this->_connectionID === false) return false; if ($argDatabasename) return $this->SelectDB($argDatabasename); return true; } // returns true or false function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename) { if (!empty($this->port)) $argHostname .= ":".$this->port; $this->_connectionID = mysql_pconnect($argHostname, $argUsername, $argPassword, $this->clientFlags); if ($this->_connectionID === false) return false; if ($this->autoRollback) $this->RollbackTrans(); if ($argDatabasename) return $this->SelectDB($argDatabasename); return true; } function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) { $this->forceNewConnect = true; return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename); } function metaColumns($table, $normalize=true) { $this->_findschema($table,$schema); if ($schema) { $dbName = $this->database; $this->SelectDB($schema); } global $ADODB_FETCH_MODE; $save = $ADODB_FETCH_MODE; $ADODB_FETCH_MODE = ADODB_FETCH_NUM; if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false); $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table)); if ($schema) { $this->SelectDB($dbName); } if (isset($savem)) $this->SetFetchMode($savem); $ADODB_FETCH_MODE = $save; if (!is_object($rs)) { $false = false; return $false; } $retarr = array(); while (!$rs->EOF){ $fld = new ADOFieldObject(); $fld->name = $rs->fields[0]; $type = $rs->fields[1]; // split type into type(length): $fld->scale = null; if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) { $fld->type = $query_array[1]; $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; $fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1; } elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) { $fld->type = $query_array[1]; $fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1; } elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) { $fld->type = $query_array[1]; $arr = explode(",",$query_array[2]); $fld->enums = $arr; $zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6 $fld->max_length = ($zlen > 0) ? $zlen : 1; } else { $fld->type = $type; $fld->max_length = -1; } $fld->not_null = ($rs->fields[2] != 'YES'); $fld->primary_key = ($rs->fields[3] == 'PRI'); $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false); $fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false); $fld->unsigned = (strpos($type,'unsigned') !== false); $fld->zerofill = (strpos($type,'zerofill') !== false); if (!$fld->binary) { $d = $rs->fields[4]; if ($d != '' && $d != 'NULL') { $fld->has_default = true; $fld->default_value = $d; } else { $fld->has_default = false; } } if ($save == ADODB_FETCH_NUM) { $retarr[] = $fld; } else { $retarr[strtoupper($fld->name)] = $fld; } $rs->MoveNext(); } $rs->Close(); return $retarr; } // returns true or false function selectDB($dbName) { $this->database = $dbName; $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions if ($this->_connectionID) { return @mysql_select_db($dbName,$this->_connectionID); } else return false; } // parameters use PostgreSQL convention, not MySQL function selectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) { $nrows = (int) $nrows; $offset = (int) $offset; $offsetStr =($offset>=0) ? ((integer)$offset)."," : ''; // jason judge, see PHPLens Issue No: 9220 if ($nrows < 0) $nrows = '18446744073709551615'; if ($secs) $rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); else $rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr); return $rs; } // returns queryID or false function _query($sql,$inputarr=false) { return mysql_query($sql,$this->_connectionID); /* global $ADODB_COUNTRECS; if($ADODB_COUNTRECS) return mysql_query($sql,$this->_connectionID); else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6 */ } /* Returns: the last error message from previous database operation */ function errorMsg() { if ($this->_logsql) return $this->_errorMsg; if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error(); else $this->_errorMsg = @mysql_error($this->_connectionID); return $this->_errorMsg; } /* Returns: the last error number from previous database operation */ function errorNo() { if ($this->_logsql) return $this->_errorCode; if (empty($this->_connectionID)) return @mysql_errno(); else return @mysql_errno($this->_connectionID); } // returns true or false function _close() { @mysql_close($this->_connectionID); $this->charSet = ''; $this->_connectionID = false; } /* * Maximum size of C field */ function charMax() { return 255; } /* * Maximum size of X field */ function textMax() { return 4294967295; } // "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx> function metaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE ) { global $ADODB_FETCH_MODE; if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true; if ( !empty($owner) ) { $table = "$owner.$table"; } $a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table)); if ($associative) { $create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"]; } else { $create_sql = $a_create_table[1]; } $matches = array(); if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false; $foreign_keys = array(); $num_keys = count($matches[0]); for ( $i = 0; $i < $num_keys; $i ++ ) { $my_field = explode('`, `', $matches[1][$i]); $ref_table = $matches[2][$i]; $ref_field = explode('`, `', $matches[3][$i]); if ( $upper ) { $ref_table = strtoupper($ref_table); } // see https://sourceforge.net/p/adodb/bugs/100/ if (!isset($foreign_keys[$ref_table])) { $foreign_keys[$ref_table] = array(); } $num_fields = count($my_field); for ( $j = 0; $j < $num_fields; $j ++ ) { if ( $associative ) { $foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j]; } else { $foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}"; } } } return $foreign_keys; } } /*-------------------------------------------------------------------------------------- Class Name: Recordset --------------------------------------------------------------------------------------*/ class ADORecordSet_mysql extends ADORecordSet{ var $databaseType = "mysql"; var $canSeek = true; function __construct($queryID,$mode=false) { if ($mode === false) { global $ADODB_FETCH_MODE; $mode = $ADODB_FETCH_MODE; } switch ($mode) { case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break; case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break; case ADODB_FETCH_DEFAULT: case ADODB_FETCH_BOTH: default: $this->fetchMode = MYSQL_BOTH; break; } $this->adodbFetchMode = $mode; parent::__construct($queryID); } function _initrs() { //GLOBAL $ADODB_COUNTRECS; // $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1; $this->_numOfRows = @mysql_num_rows($this->_queryID); $this->_numOfFields = @mysql_num_fields($this->_queryID); } function fetchField($fieldOffset = -1) { if ($fieldOffset != -1) { $o = @mysql_fetch_field($this->_queryID, $fieldOffset); $f = @mysql_field_flags($this->_queryID,$fieldOffset); if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com) //$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable if ($o) $o->binary = (strpos($f,'binary')!== false); } else { /* The $fieldOffset argument is not provided thus its -1 */ $o = @mysql_fetch_field($this->_queryID); //if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com) $o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable } return $o; } function getRowAssoc($upper = ADODB_ASSOC_CASE) { if ($this->fetchMode == MYSQL_ASSOC && $upper == ADODB_ASSOC_CASE_LOWER) { $row = $this->fields; } else { $row = ADORecordSet::GetRowAssoc($upper); } return $row; } /* Use associative array to get fields array */ function fields($colname) { // added @ by "Michael William Miller" <mille562@pilot.msu.edu> if ($this->fetchMode != MYSQL_NUM) return @$this->fields[$colname]; if (!$this->bind) { $this->bind = array(); for ($i=0; $i < $this->_numOfFields; $i++) { $o = $this->FetchField($i); $this->bind[strtoupper($o->name)] = $i; } } return $this->fields[$this->bind[strtoupper($colname)]]; } function _seek($row) { if ($this->_numOfRows == 0) return false; return @mysql_data_seek($this->_queryID,$row); } function moveNext() { if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) { $this->_updatefields(); $this->_currentRow += 1; return true; } if (!$this->EOF) { $this->_currentRow += 1; $this->EOF = true; } return false; } function _fetch() { $this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode); $this->_updatefields(); return is_array($this->fields); } function _close() { @mysql_free_result($this->_queryID); $this->_queryID = false; } function metaType($t,$len=-1,$fieldobj=false) { if (is_object($t)) { $fieldobj = $t; $t = $fieldobj->type; $len = $fieldobj->max_length; } $len = -1; // mysql max_length is not accurate switch (strtoupper($t)) { case 'STRING': case 'CHAR': case 'VARCHAR': case 'TINYBLOB': case 'TINYTEXT': case 'ENUM': case 'SET': if ($len <= $this->blobSize) return 'C'; case 'TEXT': case 'LONGTEXT': case 'MEDIUMTEXT': return 'X'; // php_mysql extension always returns 'blob' even if 'text' // so we have to check whether binary... case 'IMAGE': case 'LONGBLOB': case 'BLOB': case 'MEDIUMBLOB': case 'BINARY': return !empty($fieldobj->binary) ? 'B' : 'X'; case 'YEAR': case 'DATE': return 'D'; case 'TIME': case 'DATETIME': case 'TIMESTAMP': return 'T'; case 'INT': case 'INTEGER': case 'BIGINT': case 'TINYINT': case 'MEDIUMINT': case 'SMALLINT': if (!empty($fieldobj->primary_key)) return 'R'; else return 'I'; default: return ADODB_DEFAULT_METATYPE; } } } /** * Class ADORecordSet_ext_mysql */ class ADORecordSet_ext_mysql extends ADORecordSet_mysql { function moveNext() { return @adodb_movenext($this); } } }