35 if (!defined(
'_ADODB_LAYER')) {
36 define(
'_ADODB_LAYER',1);
47 if (!defined(
'ADODB_DIR')) define(
'ADODB_DIR',dirname(__FILE__));
63 $ADODB_QUOTE_FIELDNAMES;
69 $ADODB_EXTENSION = defined(
'ADODB_EXTENSION');
80 define(
'ADODB_FORCE_IGNORE',0);
81 define(
'ADODB_FORCE_NULL',1);
82 define(
'ADODB_FORCE_EMPTY',2);
83 define(
'ADODB_FORCE_VALUE',3);
87 if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
89 define(
'ADODB_BAD_RS',
'<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>');
92 define(
'ADODB_TABLE_REGEX',
'([]0-9a-z_\:\"\`\.\@\[-]*)');
95 if (!defined(
'ADODB_PREFETCH_ROWS')) define(
'ADODB_PREFETCH_ROWS',10);
106 define(
'ADODB_ASSOC_CASE_LOWER', 0);
107 define(
'ADODB_ASSOC_CASE_UPPER', 1);
108 define(
'ADODB_ASSOC_CASE_NATIVE', 2);
110 define(
'ADODB_FETCH_DEFAULT',0);
111 define(
'ADODB_FETCH_NUM',1);
112 define(
'ADODB_FETCH_ASSOC',2);
113 define(
'ADODB_FETCH_BOTH',3);
115 if (!defined(
'TIMESTAMP_FIRST_YEAR')) define(
'TIMESTAMP_FIRST_YEAR',100);
118 $_adodb_ver = (float) PHP_VERSION;
119 if ($_adodb_ver >= 5.2) {
120 define(
'ADODB_PHPVER',0x5200);
121 }
else if ($_adodb_ver >= 5.0) {
122 define(
'ADODB_PHPVER',0x5000);
124 die(
"PHP5 or later required. You are running ".PHP_VERSION);
134 function ADODB_str_replace($src, $dest, $data)
136 if (ADODB_PHPVER >= 0x4050)
return str_replace($src,$dest,$data);
140 while ($s !==
false) {
141 $data = str_replace($s,$d,$data);
148 function ADODB_Setup()
159 $ADODB_QUOTE_FIELDNAMES;
161 if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS =
'ADODB_Cache_File' ;
162 $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT;
163 $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE;
164 $ADODB_GETONE_EOF = null;
166 if (!isset($ADODB_CACHE_DIR)) {
167 $ADODB_CACHE_DIR =
'/tmp';
170 if (strpos($ADODB_CACHE_DIR,
'://') !==
false)
171 die(
"Illegal path http:// or ftp://");
177 srand(((
double)microtime())*1000000);
182 $ADODB_vers =
'V5.19 23-Apr-2014 (c) 2000-2014 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.';
189 if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS =
true;
205 class ADOFieldObject {
222 function _adodb_safedate($s)
224 return str_replace(array(
"'",
'\\'),
'', $s);
229 function _adodb_safedateq($s)
232 if ($s[0] !==
"'") $s2 =
"'".$s[0];
234 for($i=1; $i<$len; $i++) {
239 } elseif ($ch ===
"'") {
247 return strlen($s2) == 0 ?
'null' : $s2;
253 function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
256 $thisConnection->_transOK =
false;
257 if ($thisConnection->_oldRaiseFn) {
258 $fn = $thisConnection->_oldRaiseFn;
259 $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection);
265 class ADODB_Cache_File {
267 var $createdir =
true;
269 function ADODB_Cache_File()
272 if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.
'/adodb-csvlib.inc.php');
276 function writecache($filename, $contents, $debug, $secs2cache)
282 function &readcache($filename, &$err, $secs2cache, $rsClass)
284 $rs =
csv2rs($filename,$err,$secs2cache,$rsClass);
289 function flushall($debug=
false)
291 global $ADODB_CACHE_DIR;
295 if (strlen($ADODB_CACHE_DIR) > 1) {
296 $rez = $this->_dirFlush($ADODB_CACHE_DIR);
297 if ($debug) ADOConnection::outp(
"flushall: $dir<br><pre>\n". $rez.
"</pre>");
303 function flushcache($f, $debug=
false)
306 if ($debug) ADOConnection::outp(
"flushcache: failed for $f");
310 function getdirname($hash)
312 global $ADODB_CACHE_DIR;
313 if (!isset($this->notSafeMode)) $this->notSafeMode = !ini_get(
'safe_mode');
314 return ($this->notSafeMode) ? $ADODB_CACHE_DIR.
'/'.substr($hash,0,2) : $ADODB_CACHE_DIR;
318 function createdir($hash, $debug)
320 global $ADODB_CACHE_PERMS;
322 $dir = $this->getdirname($hash);
323 if ($this->notSafeMode && !file_exists($dir)) {
325 if (!@mkdir($dir, empty($ADODB_CACHE_PERMS) ? 0771 : $ADODB_CACHE_PERMS))
if(!is_dir($dir) && $debug) ADOConnection::outp(
"Cannot create $dir");
338 function _dirFlush($dir, $kill_top_level =
false)
340 if(!$dh = @opendir($dir))
return;
342 while (($obj = readdir($dh))) {
343 if($obj==
'.' || $obj==
'..')
continue;
346 if (strpos($obj,
'.cache')) @unlink($f);
347 if (is_dir($f)) $this->_dirFlush($f,
true);
349 if ($kill_top_level ===
true) @rmdir($dir);
361 abstract class ADOConnection {
365 var $dataProvider =
'native';
366 var $databaseType =
'';
372 var $maxblobsize = 262144;
373 var $concat_operator =
'+';
374 var $substr =
'substr';
375 var $length =
'length';
376 var $random =
'rand()';
377 var $upperCase =
'upper';
378 var $fmtDate =
"'Y-m-d'";
379 var $fmtTimeStamp =
"'Y-m-d, h:i:s A'";
382 var $replaceQuote =
"\\'";
383 var $nameQuote =
'"';
385 var $metaDatabasesSQL =
'';
386 var $metaTablesSQL =
'';
387 var $uniqueOrderBy =
false;
388 var $emptyDate =
' ';
389 var $emptyTimeStamp =
' ';
390 var $lastInsID =
false;
392 var $hasInsertID =
false;
393 var $hasAffectedRows =
false;
395 var $hasLimit =
false;
396 var $readOnly =
false;
397 var $hasMoveFirst =
false;
398 var $hasGenID =
false;
399 var $hasTransactions =
true;
402 var $raiseErrorFn =
false;
403 var $isoDates =
false;
404 var $cacheSecs = 3600;
407 var $memCache =
false;
409 var $memCachePort = 11211;
410 var $memCacheCompress =
false;
412 var $sysDate =
false;
413 var $sysTimeStamp =
false;
414 var $sysUTimeStamp =
false;
415 var $arrayClass =
'ADORecordSet_array';
417 var $noNullStrings =
false;
418 var $numCacheHits = 0;
419 var $numCacheMisses = 0;
420 var $pageExecuteCountRows =
true;
421 var $uniqueSort =
false;
422 var $leftOuter =
false;
423 var $rightOuter =
false;
424 var $ansiOuter =
false;
425 var $autoRollback =
false;
426 var $poorAffectedRows =
false;
428 var $fnExecute =
false;
429 var $fnCacheExecute =
false;
430 var $blobEncodeType =
false;
431 var $rsPrefix =
"ADORecordSet_";
433 var $autoCommit =
true;
437 var $fetchMode=
false;
439 var $null2null =
'null';
440 var $bulkBind =
false;
444 var $_oldRaiseFn =
false;
445 var $_transOK = null;
446 var $_connectionID =
false;
447 var $_errorMsg =
false;
448 var $_errorCode =
false;
450 var $_queryID =
false;
452 var $_isPersistentConnection =
false;
453 var $_bindInputArray =
false;
454 var $_evalAll =
false;
455 var $_affected =
false;
456 var $_logsql =
false;
457 var $_transmode =
'';
460 static function Version()
464 $ok = preg_match(
'/^[Vv]?([0-9]\.[0-9]+(dev|[a-z]))?/', $ADODB_vers, $matches );
465 if (!$ok)
return (
float) substr($ADODB_vers,1);
466 else return $matches[1];
475 function ServerInfo()
477 return array(
'description' =>
'',
'version' =>
'');
480 function IsConnected()
482 return !empty($this->_connectionID);
485 function _findvers($str)
487 if (preg_match(
'/([0-9]+\.([0-9\.])+)/',$str, $arr))
return $arr[1];
495 static function outp($msg,$newline=
true)
497 global $ADODB_FLUSH,$ADODB_OUTP;
499 if (defined(
'ADODB_OUTP')) {
503 }
else if (isset($ADODB_OUTP)) {
509 if ($newline) $msg .=
"<br>\n";
511 if (isset($_SERVER[
'HTTP_USER_AGENT']) || !$newline) echo $msg;
512 else echo strip_tags($msg);
515 if (!empty($ADODB_FLUSH) && ob_get_length() !==
false) flush();
521 $rs = $this->_Execute(
"select $this->sysTimeStamp");
522 if (
$rs && !
$rs->EOF)
return $this->UnixTimeStamp(reset(
$rs->fields));
538 function Connect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"", $forceNew =
false)
540 if ($argHostname !=
"") $this->host = $argHostname;
541 if ($argUsername !=
"") $this->user = $argUsername;
542 if ($argPassword !=
"") $this->password =
'not stored';
543 if ($argDatabaseName !=
"") $this->database = $argDatabaseName;
545 $this->_isPersistentConnection =
false;
548 if ($rez=$this->_nconnect($this->host, $this->user, $argPassword, $this->database))
return true;
550 if ($rez=$this->_connect($this->host, $this->user, $argPassword, $this->database))
return true;
553 $err = $this->ErrorMsg();
554 if (empty($err)) $err =
"Connection error to server '$argHostname' with user '$argUsername'";
557 $err =
"Missing extension for ".$this->dataProvider;
560 if ($fn = $this->raiseErrorFn)
561 $fn($this->databaseType,
'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
564 $this->_connectionID =
false;
565 if ($this->
debug) ADOConnection::outp( $this->host.
': '.$err);
569 function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
571 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
585 function NConnect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"")
587 return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName,
true);
600 function PConnect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"")
603 if (defined(
'ADODB_NEVER_PERSIST'))
604 return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
606 if ($argHostname !=
"") $this->host = $argHostname;
607 if ($argUsername !=
"") $this->user = $argUsername;
608 if ($argPassword !=
"") $this->password =
'not stored';
609 if ($argDatabaseName !=
"") $this->database = $argDatabaseName;
611 $this->_isPersistentConnection =
true;
613 if ($rez = $this->_pconnect($this->host, $this->user, $argPassword, $this->database))
return true;
615 $err = $this->ErrorMsg();
616 if (empty($err)) $err =
"Connection error to server '$argHostname' with user '$argUsername'";
619 $err =
"Missing extension for ".$this->dataProvider;
622 if ($fn = $this->raiseErrorFn) {
623 $fn($this->databaseType,
'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
626 $this->_connectionID =
false;
627 if ($this->
debug) ADOConnection::outp( $this->host.
': '.$err);
631 function outp_throw($msg,$src=
'WARN',
$sql=
'')
637 ADOConnection::outp($msg);
641 function _CreateCache()
643 global $ADODB_CACHE, $ADODB_CACHE_CLASS;
645 if ($this->memCache) {
648 if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.
'/adodb-memcache.lib.inc.php');
651 $ADODB_CACHE =
new $ADODB_CACHE_CLASS($this);
656 function SQLDate($fmt, $col=
false)
658 if (!$col) $col = $this->sysDate;
677 function Prepare(
$sql)
696 function PrepareSP(
$sql,$param=
true)
698 return $this->Prepare(
$sql,$param);
706 return $this->qstr($s,
false);
714 return $this->qstr($s,get_magic_quotes_gpc());
719 #if (!empty($this->qNull)) if ($s == 'null') return $s; 720 $s = $this->qstr($s,
false);
726 function ErrorNative()
728 return $this->ErrorNo();
735 function nextId($seq_name)
737 return $this->GenID($seq_name);
747 function RowLock($table,$where,$col=
'1 as adodbignore')
752 function CommitLock($table)
754 return $this->CommitTrans();
757 function RollbackLock($table)
759 return $this->RollbackTrans();
771 function SetFetchMode($mode)
773 $old = $this->fetchMode;
774 $this->fetchMode = $mode;
776 if ($old ===
false) {
777 global $ADODB_FETCH_MODE;
778 return $ADODB_FETCH_MODE;
787 function Query(
$sql, $inputarr=
false)
789 $rs = $this->Execute(
$sql, $inputarr);
798 function LimitQuery(
$sql, $offset, $count, $params=
false)
800 $rs = $this->SelectLimit(
$sql, $count, $offset, $params);
809 function Disconnect()
811 return $this->Close();
827 function Param($name,$type=
'C')
835 function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=
false)
837 return $this->Parameter($stmt,$var,$name,
false,$maxLen,$type);
842 function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=
false)
844 return $this->Parameter($stmt,$var,$name,
true,$maxLen,$type);
864 function Parameter(&$stmt,&$var,$name,$isOutput=
false,$maxLen=4000,$type=
false)
870 function IgnoreErrors($saveErrs=
false)
873 $saveErrs = array($this->raiseErrorFn,$this->_transOK);
874 $this->raiseErrorFn =
false;
877 $this->raiseErrorFn = $saveErrs[0];
878 $this->_transOK = $saveErrs[1];
892 function StartTrans($errfn =
'ADODB_TransMonitor')
894 if ($this->transOff > 0) {
895 $this->transOff += 1;
899 $this->_oldRaiseFn = $this->raiseErrorFn;
900 $this->raiseErrorFn = $errfn;
901 $this->_transOK =
true;
903 if ($this->
debug && $this->transCnt > 0) ADOConnection::outp(
"Bad Transaction: StartTrans called within BeginTrans");
904 $ok = $this->BeginTrans();
918 function CompleteTrans($autoComplete =
true)
920 if ($this->transOff > 1) {
921 $this->transOff -= 1;
924 $this->raiseErrorFn = $this->_oldRaiseFn;
927 if ($this->_transOK && $autoComplete) {
928 if (!$this->CommitTrans()) {
929 $this->_transOK =
false;
930 if ($this->
debug) ADOConnection::outp(
"Smart Commit failed");
932 if ($this->
debug) ADOConnection::outp(
"Smart Commit occurred");
934 $this->_transOK =
false;
935 $this->RollbackTrans();
936 if ($this->
debug) ADOCOnnection::outp(
"Smart Rollback occurred");
939 return $this->_transOK;
948 if ($this->transOff == 0) {
949 ADOConnection::outp(
"FailTrans outside StartTrans/CompleteTrans");
951 ADOConnection::outp(
"FailTrans was called");
954 $this->_transOK =
false;
960 function HasFailedTrans()
962 if ($this->transOff > 0)
return $this->_transOK ==
false;
973 function Execute(
$sql,$inputarr=
false)
975 if ($this->fnExecute) {
976 $fn = $this->fnExecute;
977 $ret = $fn($this,
$sql,$inputarr);
978 if (isset($ret))
return $ret;
980 if ($inputarr !==
false) {
981 if (!is_array($inputarr)) $inputarr = array($inputarr);
983 $element0 = reset($inputarr);
984 # is_object check because oci8 descriptors can be passed in 985 $array_2d = $this->bulkBind && is_array($element0) && !is_object(reset($element0));
990 if (!is_array(
$sql) && !$this->_bindInputArray) {
991 $sqlarr = explode(
'?',
$sql);
992 $nparams =
sizeof($sqlarr)-1;
993 if (!$array_2d) $inputarr = array($inputarr);
995 foreach($inputarr as $arr) {
998 while(list(, $v) = each($arr)) {
1003 if ($typ ==
'string')
1005 $sql .= $this->qstr($v);
1006 else if ($typ ==
'double')
1007 $sql .= str_replace(
',',
'.',$v);
1008 else if ($typ ==
'boolean')
1009 $sql .= $v ? $this->true : $this->false;
1010 else if ($typ ==
'object') {
1011 if (method_exists($v,
'__toString'))
$sql .= $this->qstr($v->__toString());
1012 else $sql .= $this->qstr((
string) $v);
1013 }
else if ($v === null)
1019 if ($i == $nparams)
break;
1021 if (isset($sqlarr[$i])) {
1022 $sql .= $sqlarr[$i];
1023 if ($i+1 !=
sizeof($sqlarr)) $this->outp_throw(
"Input Array does not match ?: ".htmlspecialchars(
$sql),
'Execute');
1024 }
else if ($i !=
sizeof($sqlarr))
1025 $this->outp_throw(
"Input array does not match ?: ".htmlspecialchars(
$sql),
'Execute');
1027 $ret = $this->_Execute(
$sql);
1028 if (!$ret)
return $ret;
1032 if (is_string(
$sql))
1033 $stmt = $this->Prepare(
$sql);
1037 foreach($inputarr as $arr) {
1038 $ret = $this->_Execute($stmt,$arr);
1039 if (!$ret)
return $ret;
1042 $ret = $this->_Execute(
$sql,$inputarr);
1046 $ret = $this->_Execute(
$sql,
false);
1053 function _Execute(
$sql,$inputarr=
false)
1057 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1060 $this->_queryID = @$this->_query(
$sql,$inputarr);
1067 if ($this->_queryID ===
false) {
1068 if ($this->
debug == 99) adodb_backtrace(
true,5);
1069 $fn = $this->raiseErrorFn;
1071 $fn($this->databaseType,
'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),
$sql,$inputarr,$this);
1077 if ($this->_queryID ===
true) {
1078 $rsclass = $this->rsPrefix.
'empty';
1079 $rs = (class_exists($rsclass)) ?
new $rsclass():
new ADORecordSet_empty();
1085 $rsclass = $this->rsPrefix.$this->databaseType;
1086 $rs =
new $rsclass($this->_queryID,$this->fetchMode);
1087 $rs->connection = $this;
1091 if (
$rs->_numOfRows <= 0) {
1092 global $ADODB_COUNTRECS;
1093 if ($ADODB_COUNTRECS) {
1095 $rs = $this->_rs2rs(
$rs,-1,-1,!is_array(
$sql));
1096 $rs->_queryID = $this->_queryID;
1098 $rs->_numOfRows = 0;
1104 function CreateSequence($seqname=
'adodbseq',$startID=1)
1106 if (empty($this->_genSeqSQL))
return false;
1107 return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
1110 function DropSequence($seqname=
'adodbseq')
1112 if (empty($this->_dropSeqSQL))
return false;
1113 return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
1124 function GenID($seqname=
'adodbseq',$startID=1)
1126 if (!$this->hasGenID) {
1130 $getnext = sprintf($this->_genIDSQL,$seqname);
1132 $holdtransOK = $this->_transOK;
1134 $save_handler = $this->raiseErrorFn;
1135 $this->raiseErrorFn =
'';
1136 @(
$rs = $this->Execute($getnext));
1137 $this->raiseErrorFn = $save_handler;
1140 $this->_transOK = $holdtransOK;
1141 $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
1142 $rs = $this->Execute($getnext);
1144 if (
$rs && !
$rs->EOF) $this->genID = reset(
$rs->fields);
1145 else $this->genID = 0;
1149 return $this->genID;
1157 function Insert_ID($table=
'',$column=
'')
1159 if ($this->_logsql && $this->lastInsID)
return $this->lastInsID;
1160 if ($this->hasInsertID)
return $this->_insertid($table,$column);
1162 ADOConnection::outp(
'<p>Insert_ID error</p>');
1175 function PO_Insert_ID($table=
"", $id=
"")
1177 if ($this->hasInsertID){
1178 return $this->Insert_ID($table,$id);
1180 return $this->GetOne(
"SELECT MAX($id) FROM $table");
1187 function Affected_Rows()
1189 if ($this->hasAffectedRows) {
1190 if ($this->fnExecute ===
'adodb_log_sql') {
1191 if ($this->_logsql && $this->_affected !==
false)
return $this->_affected;
1193 $val = $this->_affectedrows();
1194 return ($val < 0) ? false : $val;
1197 if ($this->
debug) ADOConnection::outp(
'<p>Affected_Rows error</p>',
false);
1207 if ($this->_errorMsg)
return '!! '.strtoupper($this->dataProvider.
' '.$this->databaseType).
': '.$this->_errorMsg;
1217 return ($this->_errorMsg) ? -1 : 0;
1220 function MetaError($err=
false)
1222 include_once(ADODB_DIR.
"/adodb-error.inc.php");
1223 if ($err ===
false) $err = $this->ErrorNo();
1224 return adodb_error($this->dataProvider,$this->databaseType,$err);
1227 function MetaErrorMsg($errno)
1229 include_once(ADODB_DIR.
"/adodb-error.inc.php");
1236 function MetaPrimaryKeys($table, $owner=
false)
1240 $objs = $this->MetaColumns($table);
1242 foreach($objs as $v) {
1243 if (!empty($v->primary_key))
1247 if (
sizeof($p))
return $p;
1248 if (function_exists(
'ADODB_VIEW_PRIMARYKEYS'))
1249 return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);
1256 function MetaForeignKeys($table, $owner=
false, $upper=
false)
1266 function SelectDB($dbName)
1289 function SelectLimit(
$sql,$nrows=-1,$offset=-1, $inputarr=
false,$secs2cache=0)
1291 if ($this->hasTop && $nrows > 0) {
1294 $ismssql = (strpos($this->databaseType,
'mssql') !==
false);
1295 if ($ismssql) $isaccess =
false;
1296 else $isaccess = (strpos($this->databaseType,
'access') !==
false);
1302 $sql = preg_replace(
1303 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',
$sql);
1305 if ($secs2cache != 0) {
1306 $ret = $this->CacheExecute($secs2cache,
$sql,$inputarr);
1308 $ret = $this->Execute(
$sql,$inputarr);
1311 }
else if ($ismssql){
1312 $sql = preg_replace(
1313 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',
$sql);
1315 $sql = preg_replace(
1316 '/(^\s*select\s)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',
$sql);
1319 $nn = $nrows + $offset;
1320 if ($isaccess || $ismssql) {
1321 $sql = preg_replace(
1322 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.$nn.
' ',
$sql);
1324 $sql = preg_replace(
1325 '/(^\s*select\s)/i',
'\\1 '.$this->hasTop.
' '.$nn.
' ',
$sql);
1332 global $ADODB_COUNTRECS;
1334 $savec = $ADODB_COUNTRECS;
1335 $ADODB_COUNTRECS =
false;
1338 if ($secs2cache != 0)
$rs = $this->CacheExecute($secs2cache,
$sql,$inputarr);
1339 else $rs = $this->Execute(
$sql,$inputarr);
1341 $ADODB_COUNTRECS = $savec;
1343 $rs = $this->_rs2rs(
$rs,$nrows,$offset);
1354 function SerializableRS(&
$rs)
1356 $rs2 = $this->_rs2rs(
$rs);
1358 $rs2->connection = $ignore;
1373 function &_rs2rs(&
$rs,$nrows=-1,$offset=-1,$close=
true)
1379 $dbtype =
$rs->databaseType;
1384 if (($dbtype ==
'array' || $dbtype ==
'csv') && $nrows == -1 && $offset == -1) {
1390 for ($i=0, $max=
$rs->FieldCount(); $i < $max; $i++) {
1391 $flds[] =
$rs->FetchField($i);
1394 $arr =
$rs->GetArrayLimit($nrows,$offset);
1396 if ($close)
$rs->Close();
1398 $arrayClass = $this->arrayClass;
1400 $rs2 =
new $arrayClass();
1401 $rs2->connection = $this;
1402 $rs2->sql =
$rs->sql;
1403 $rs2->dataProvider = $this->dataProvider;
1404 $rs2->InitArrayFields($arr,$flds);
1405 $rs2->fetchMode = isset(
$rs->adodbFetchMode) ?
$rs->adodbFetchMode :
$rs->fetchMode;
1412 function GetAll(
$sql, $inputarr=
false)
1414 $arr = $this->GetArray(
$sql,$inputarr);
1418 function GetAssoc(
$sql, $inputarr=
false,$force_array =
false, $first2cols =
false)
1420 $rs = $this->Execute(
$sql, $inputarr);
1425 $arr =
$rs->GetAssoc($force_array,$first2cols);
1429 function CacheGetAssoc($secs2cache,
$sql=
false, $inputarr=
false,$force_array =
false, $first2cols =
false)
1431 if (!is_numeric($secs2cache)) {
1432 $first2cols = $force_array;
1433 $force_array = $inputarr;
1435 $rs = $this->CacheExecute($secs2cache,
$sql, $inputarr);
1440 $arr =
$rs->GetAssoc($force_array,$first2cols);
1451 function GetOne(
$sql,$inputarr=
false)
1453 global $ADODB_COUNTRECS,$ADODB_GETONE_EOF;
1454 $crecs = $ADODB_COUNTRECS;
1455 $ADODB_COUNTRECS =
false;
1458 $rs = $this->Execute(
$sql,$inputarr);
1460 if (
$rs->EOF) $ret = $ADODB_GETONE_EOF;
1461 else $ret = reset(
$rs->fields);
1465 $ADODB_COUNTRECS = $crecs;
1470 function GetMedian($table, $field,$where =
'')
1472 $total = $this->GetOne(
"select count(*) from $table $where");
1473 if (!$total)
return false;
1475 $midrow = (integer) ($total/2);
1476 $rs = $this->SelectLimit(
"select $field from $table $where order by 1",1,$midrow);
1477 if (
$rs && !
$rs->EOF)
return reset(
$rs->fields);
1482 function CacheGetOne($secs2cache,
$sql=
false,$inputarr=
false)
1484 global $ADODB_GETONE_EOF;
1486 $rs = $this->CacheExecute($secs2cache,
$sql,$inputarr);
1488 if (
$rs->EOF) $ret = $ADODB_GETONE_EOF;
1489 else $ret = reset(
$rs->fields);
1496 function GetCol(
$sql, $inputarr =
false, $trim =
false)
1499 $rs = $this->Execute(
$sql, $inputarr);
1504 $rv[] = trim(reset(
$rs->fields));
1509 $rv[] = reset(
$rs->fields);
1519 function CacheGetCol($secs,
$sql =
false, $inputarr =
false,$trim=
false)
1521 $rs = $this->CacheExecute($secs,
$sql, $inputarr);
1526 $rv[] = trim(reset(
$rs->fields));
1531 $rv[] = reset(
$rs->fields);
1542 function Transpose(&
$rs,$addfieldnames=
true)
1544 $rs2 = $this->_rs2rs(
$rs);
1546 if (!$rs2)
return $false;
1548 $rs2->_transpose($addfieldnames);
1559 function OffsetDate($dayFraction,$date=
false)
1561 if (!$date) $date = $this->sysDate;
1562 return '('.$date.
'+'.$dayFraction.
')';
1571 function GetArray(
$sql,$inputarr=
false)
1573 global $ADODB_COUNTRECS;
1575 $savec = $ADODB_COUNTRECS;
1576 $ADODB_COUNTRECS =
false;
1577 $rs = $this->Execute(
$sql,$inputarr);
1578 $ADODB_COUNTRECS = $savec;
1580 if (defined(
'ADODB_PEAR')) {
1587 $arr =
$rs->GetArray();
1592 function CacheGetAll($secs2cache,
$sql=
false,$inputarr=
false)
1594 $arr = $this->CacheGetArray($secs2cache,
$sql,$inputarr);
1598 function CacheGetArray($secs2cache,
$sql=
false,$inputarr=
false)
1600 global $ADODB_COUNTRECS;
1602 $savec = $ADODB_COUNTRECS;
1603 $ADODB_COUNTRECS =
false;
1604 $rs = $this->CacheExecute($secs2cache,
$sql,$inputarr);
1605 $ADODB_COUNTRECS = $savec;
1608 if (defined(
'ADODB_PEAR')) {
1615 $arr =
$rs->GetArray();
1620 function GetRandRow(
$sql, $arr=
false)
1622 $rezarr = $this->GetAll(
$sql, $arr);
1623 $sz =
sizeof($rezarr);
1624 return $rezarr[abs(rand()) % $sz];
1634 function GetRow(
$sql,$inputarr=
false)
1636 global $ADODB_COUNTRECS;
1637 $crecs = $ADODB_COUNTRECS;
1638 $ADODB_COUNTRECS =
false;
1640 $rs = $this->Execute(
$sql,$inputarr);
1642 $ADODB_COUNTRECS = $crecs;
1644 if (!
$rs->EOF) $arr =
$rs->fields;
1645 else $arr = array();
1654 function CacheGetRow($secs2cache,
$sql=
false,$inputarr=
false)
1656 $rs = $this->CacheExecute($secs2cache,
$sql,$inputarr);
1658 if (!
$rs->EOF) $arr =
$rs->fields;
1659 else $arr = array();
1688 function Replace($table, $fieldArray, $keyCol, $autoQuote=
false, $has_autoinc=
false)
1691 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1693 return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc);
1715 function CacheSelectLimit($secs2cache,
$sql,$nrows=-1,$offset=-1,$inputarr=
false)
1717 if (!is_numeric($secs2cache)) {
1719 if ($offset == -1) $offset =
false;
1721 $rs = $this->SelectLimit($secs2cache,
$sql,$nrows,$offset,$this->cacheSecs);
1723 if (
$sql ===
false) $this->outp_throw(
"Warning: \$sql missing from CacheSelectLimit()",
'CacheSelectLimit');
1724 $rs = $this->SelectLimit(
$sql,$nrows,$offset,$inputarr,$secs2cache);
1739 function CacheFlush(
$sql=
false,$inputarr=
false)
1741 global $ADODB_CACHE_DIR, $ADODB_CACHE;
1743 if (empty($ADODB_CACHE))
return false;
1746 $ADODB_CACHE->flushall($this->
debug);
1750 $f = $this->_gencachename(
$sql.serialize($inputarr),
false);
1751 return $ADODB_CACHE->flushcache($f, $this->
debug);
1769 function _gencachename(
$sql,$createdir)
1771 global $ADODB_CACHE, $ADODB_CACHE_DIR;
1773 if ($this->fetchMode ===
false) {
1774 global $ADODB_FETCH_MODE;
1775 $mode = $ADODB_FETCH_MODE;
1777 $mode = $this->fetchMode;
1779 $m = md5(
$sql.$this->databaseType.$this->database.$this->user.$mode);
1780 if (!$ADODB_CACHE->createdir)
return $m;
1781 if (!$createdir) $dir = $ADODB_CACHE->getdirname($m);
1782 else $dir = $ADODB_CACHE->createdir($m, $this->
debug);
1784 return $dir.
'/adodb_'.$m.
'.cache';
1797 function CacheExecute($secs2cache,
$sql=
false,$inputarr=
false)
1799 global $ADODB_CACHE;
1801 if (empty($ADODB_CACHE)) $this->_CreateCache();
1803 if (!is_numeric($secs2cache)) {
1806 $secs2cache = $this->cacheSecs;
1809 if (is_array(
$sql)) {
1816 $md5file = $this->_gencachename(
$sql.serialize($inputarr),
true);
1819 if ($secs2cache > 0){
1820 $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass);
1821 $this->numCacheHits += 1;
1825 $this->numCacheMisses += 1;
1831 if (get_magic_quotes_runtime() && !$this->memCache) {
1832 ADOConnection::outp(
"Please disable magic_quotes_runtime - it corrupts cache files :(");
1834 if ($this->
debug !== -1) ADOConnection::outp(
" $md5file cache failure: $err (this is a notice and not an error)");
1837 $rs = $this->Execute($sqlparam,$inputarr);
1842 $rs = $this->_rs2rs(
$rs);
1843 $rs->timeCreated = time();
1846 $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->
debug, $secs2cache);
1848 if ($ok ===
false) {
1849 $em =
'Cache write error';
1852 if ($fn = $this->raiseErrorFn) {
1853 $fn($this->databaseType,
'CacheExecute', $en, $em, $md5file,
$sql,$this);
1856 $em =
'Cache file locked warning';
1861 if ($this->
debug) ADOConnection::outp(
" ".$em);
1863 if (
$rs->EOF && !$eof) {
1866 $rs->connection = $this;
1869 }
else if (!$this->memCache)
1870 $ADODB_CACHE->flushcache($md5file);
1872 $this->_errorMsg =
'';
1873 $this->_errorCode = 0;
1875 if ($this->fnCacheExecute) {
1876 $fn = $this->fnCacheExecute;
1877 $fn($this, $secs2cache,
$sql, $inputarr);
1880 $rs->connection = $this;
1882 if ($this->
debug == 99) adodb_backtrace();
1883 $inBrowser = isset($_SERVER[
'HTTP_USER_AGENT']);
1884 $ttl =
$rs->timeCreated + $secs2cache - time();
1886 if ($inBrowser) $s =
'<i>'.htmlspecialchars($s).
'</i>';
1888 ADOConnection::outp(
" $md5file reloaded, ttl=$ttl [ $s ]");
1902 function AutoExecute($table, $fields_values, $mode =
'INSERT', $where = FALSE, $forceUpdate=
true, $magicq=
false)
1905 $sql =
'SELECT * FROM '.$table;
1906 if ($where!==FALSE)
$sql .=
' WHERE '.$where;
1907 else if ($mode ==
'UPDATE' || $mode == 2 ) {
1908 $this->outp_throw(
'AutoExecute: Illegal mode=UPDATE with empty WHERE clause',
'AutoExecute');
1912 $rs = $this->SelectLimit(
$sql,1);
1913 if (!
$rs)
return $false;
1914 $rs->tableName = $table;
1917 switch((
string) $mode) {
1920 $sql = $this->GetUpdateSQL(
$rs, $fields_values, $forceUpdate, $magicq);
1924 $sql = $this->GetInsertSQL(
$rs, $fields_values, $magicq);
1927 $this->outp_throw(
"AutoExecute: Unknown mode=$mode",
'AutoExecute');
1931 if (
$sql) $ret = $this->Execute(
$sql);
1932 if ($ret) $ret =
true;
1948 function GetUpdateSQL(&
$rs, $arrFields,$forceUpdate=
false,$magicq=
false,$force=null)
1955 if (!isset($force)) {
1956 global $ADODB_FORCE_TYPE;
1957 $force = $ADODB_FORCE_TYPE;
1961 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1973 function GetInsertSQL(&
$rs, $arrFields,$magicq=
false,$force=null)
1976 if (!isset($force)) {
1977 global $ADODB_FORCE_TYPE;
1978 $force = $ADODB_FORCE_TYPE;
1981 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
2005 function UpdateBlob($table,$column,$val,$where,$blobtype=
'BLOB')
2007 return $this->Execute(
"UPDATE $table SET $column=? WHERE $where",array($val)) !=
false;
2019 function UpdateBlobFile($table,$column,$path,$where,$blobtype=
'BLOB')
2021 $fd = fopen($path,
'rb');
2022 if ($fd ===
false)
return false;
2023 $val = fread($fd,filesize($path));
2025 return $this->UpdateBlob($table,$column,$val,$where,$blobtype);
2028 function BlobDecode($blob)
2033 function BlobEncode($blob)
2038 function SetCharSet($charset)
2040 $this->charSet = $charset;
2044 function IfNull( $field, $ifNull )
2046 return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
2049 function LogSQL($enable=
true)
2051 include_once(ADODB_DIR.
'/adodb-perf.inc.php');
2053 if ($enable) $this->fnExecute =
'adodb_log_sql';
2054 else $this->fnExecute =
false;
2056 $old = $this->_logsql;
2057 $this->_logsql = $enable;
2058 if ($enable && !$old) $this->_affected =
false;
2062 function GetCharSet()
2074 function UpdateClob($table,$column,$val,$where)
2076 return $this->UpdateBlob($table,$column,$val,$where,
'CLOB');
2081 function MetaType($t,$len=-1,$fieldobj=
false)
2084 if (empty($this->_metars)) {
2085 $rsclass = $this->rsPrefix.$this->databaseType;
2086 $this->_metars =
new $rsclass(
false,$this->fetchMode);
2087 $this->_metars->connection = $this;
2089 return $this->_metars->MetaType($t,$len,$fieldobj);
2097 function SetDateLocale($locale =
'En')
2099 $this->locale = $locale;
2100 switch (strtoupper($locale))
2103 $this->fmtDate=
"'Y-m-d'";
2104 $this->fmtTimeStamp =
"'Y-m-d H:i:s'";
2108 $this->fmtDate =
"'m-d-Y'";
2109 $this->fmtTimeStamp =
"'m-d-Y H:i:s'";
2117 $this->fmtDate=
"'d-m-Y'";
2118 $this->fmtTimeStamp =
"'d-m-Y H:i:s'";
2122 $this->fmtDate=
"'d.m.Y'";
2123 $this->fmtTimeStamp =
"'d.m.Y H:i:s'";
2127 $this->fmtDate=
"'Y-m-d'";
2128 $this->fmtTimeStamp =
"'Y-m-d H:i:s'";
2146 function GetActiveRecordsClass(
2147 $class, $table,$whereOrderBy=
false,$bindarr=
false, $primkeyArr=
false,
2152 ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php 2153 ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find() 2154 if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.
'/adodb-active-record.inc.php');
2158 function GetActiveRecords($table,$where=
false,$bindarr=
false,$primkeyArr=
false)
2160 $arr = $this->GetActiveRecordsClass(
'ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr);
2169 $rez = $this->_close();
2170 $this->_connectionID =
false;
2179 function BeginTrans()
2181 if ($this->
debug) ADOConnection::outp(
"BeginTrans: Transactions not supported for this driver");
2186 function SetTransactionMode( $transaction_mode )
2188 $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider);
2189 $this->_transmode = $transaction_mode;
2197 function MetaTransaction($mode,$db)
2199 $mode = strtoupper($mode);
2200 $mode = str_replace(
'ISOLATION LEVEL ',
'',$mode);
2204 case 'READ UNCOMMITTED':
2208 return 'ISOLATION LEVEL READ COMMITTED';
2210 return 'ISOLATION LEVEL READ UNCOMMITTED';
2214 case 'READ COMMITTED':
2215 return 'ISOLATION LEVEL READ COMMITTED';
2218 case 'REPEATABLE READ':
2222 return 'ISOLATION LEVEL SERIALIZABLE';
2224 return 'ISOLATION LEVEL REPEATABLE READ';
2228 case 'SERIALIZABLE':
2229 return 'ISOLATION LEVEL SERIALIZABLE';
2244 function CommitTrans($ok=
true)
2253 function RollbackTrans()
2263 function MetaDatabases()
2265 global $ADODB_FETCH_MODE;
2267 if ($this->metaDatabasesSQL) {
2268 $save = $ADODB_FETCH_MODE;
2269 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2271 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2273 $arr = $this->GetCol($this->metaDatabasesSQL);
2274 if (isset($savem)) $this->SetFetchMode($savem);
2275 $ADODB_FETCH_MODE = $save;
2300 function MetaProcedures($procedureNamePattern = null, $catalog = null, $schemaPattern = null)
2316 function MetaTables($ttype=
false,$showSchema=
false,$mask=
false)
2318 global $ADODB_FETCH_MODE;
2325 if ($this->metaTablesSQL) {
2326 $save = $ADODB_FETCH_MODE;
2327 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2329 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2331 $rs = $this->Execute($this->metaTablesSQL);
2332 if (isset($savem)) $this->SetFetchMode($savem);
2333 $ADODB_FETCH_MODE = $save;
2335 if (
$rs ===
false)
return $false;
2336 $arr =
$rs->GetArray();
2339 if ($hast = ($ttype && isset($arr[0][1]))) {
2340 $showt = strncmp($ttype,
'T',1);
2343 for ($i=0; $i <
sizeof($arr); $i++) {
2346 if (strncmp($arr[$i][1],
'T',1) == 0) $arr2[] = trim($arr[$i][0]);
2348 if (strncmp($arr[$i][1],
'V',1) == 0) $arr2[] = trim($arr[$i][0]);
2351 $arr2[] = trim($arr[$i][0]);
2360 function _findschema(&$table,&$schema)
2362 if (!$schema && ($at = strpos($table,
'.')) !==
false) {
2363 $schema = substr($table,0,$at);
2364 $table = substr($table,$at+1);
2378 function MetaColumns($table,$normalize=
true)
2380 global $ADODB_FETCH_MODE;
2384 if (!empty($this->metaColumnsSQL)) {
2387 $this->_findschema($table,$schema);
2389 $save = $ADODB_FETCH_MODE;
2390 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2391 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2392 $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table));
2393 if (isset($savem)) $this->SetFetchMode($savem);
2394 $ADODB_FETCH_MODE = $save;
2395 if (
$rs ===
false ||
$rs->EOF)
return $false;
2399 $fld =
new ADOFieldObject();
2400 $fld->name =
$rs->fields[0];
2401 $fld->type =
$rs->fields[1];
2402 if (isset(
$rs->fields[3]) &&
$rs->fields[3]) {
2403 if (
$rs->fields[3]>0) $fld->max_length =
$rs->fields[3];
2404 $fld->scale =
$rs->fields[4];
2405 if ($fld->scale>0) $fld->max_length += 1;
2407 $fld->max_length =
$rs->fields[2];
2409 if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
2410 else $retarr[strtoupper($fld->name)] = $fld;
2436 function MetaIndexes($table, $primary =
false, $owner =
false)
2448 function MetaColumnNames($table, $numIndexes=
false,$useattnum=
false )
2450 $objarr = $this->MetaColumns($table);
2451 if (!is_array($objarr)) {
2459 foreach($objarr as $v)
2460 $arr[$v->attnum] = $v->name;
2463 foreach($objarr as $v) $arr[$i++] = $v->name;
2465 foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name;
2482 $arr = func_get_args();
2483 return implode($this->concat_operator, $arr);
2494 function DBDate($d, $isfld=
false)
2496 if (empty($d) && $d !== 0)
return 'null';
2497 if ($isfld)
return $d;
2499 if (is_object($d))
return $d->format($this->fmtDate);
2502 if (is_string($d) && !is_numeric($d)) {
2503 if ($d ===
'null')
return $d;
2504 if (strncmp($d,
"'",1) === 0) {
2505 $d = _adodb_safedateq($d);
2508 if ($this->isoDates)
return "'$d'";
2509 $d = ADOConnection::UnixDate($d);
2515 function BindDate($d)
2517 $d = $this->DBDate($d);
2518 if (strncmp($d,
"'",1))
return $d;
2520 return substr($d,1,strlen($d)-2);
2523 function BindTimeStamp($d)
2525 $d = $this->DBTimeStamp($d);
2526 if (strncmp($d,
"'",1))
return $d;
2528 return substr($d,1,strlen($d)-2);
2539 function DBTimeStamp($ts,$isfld=
false)
2541 if (empty($ts) && $ts !== 0)
return 'null';
2542 if ($isfld)
return $ts;
2543 if (is_object($ts))
return $ts->format($this->fmtTimeStamp);
2545 # strlen(14) allows YYYYMMDDHHMMSS format 2546 if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14))
2549 if ($ts ===
'null')
return $ts;
2550 if ($this->isoDates && strlen($ts) !== 14) {
2551 $ts = _adodb_safedate($ts);
2554 $ts = ADOConnection::UnixTimeStamp($ts);
2564 static function UnixDate($v)
2566 if (is_object($v)) {
2569 return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
2572 if (is_numeric($v) && strlen($v) !== 8)
return $v;
2573 if (!preg_match(
"|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
2574 ($v), $rr))
return false;
2576 if ($rr[1] <= TIMESTAMP_FIRST_YEAR)
return 0;
2588 static function UnixTimeStamp($v)
2590 if (is_object($v)) {
2593 return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
2597 "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
2598 ($v), $rr))
return false;
2600 if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1)
return 0;
2603 if (!isset($rr[5]))
return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
2604 return @
adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
2618 function UserDate($v,$fmt=
'Y-m-d',$gmt=
false)
2620 $tt = $this->UnixDate($v);
2623 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
2624 else if ($tt == 0)
return $this->emptyDate;
2625 else if ($tt == -1) {
2639 function UserTimeStamp($v,$fmt=
'Y-m-d H:i:s',$gmt=
false)
2641 if (!isset($v))
return $this->emptyTimeStamp;
2642 # strlen(14) allows YYYYMMDDHHMMSS format 2644 $tt = $this->UnixTimeStamp($v);
2646 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
2647 if ($tt == 0)
return $this->emptyTimeStamp;
2651 function escape($s,$magic_quotes=
false)
2653 return $this->addq($s,$magic_quotes);
2659 function addq($s,$magic_quotes=
false)
2661 if (!$magic_quotes) {
2663 if ($this->replaceQuote[0] ==
'\\'){
2665 $s = adodb_str_replace(array(
'\\',
"\0"),array(
'\\\\',
"\\\0"),$s);
2668 return str_replace(
"'",$this->replaceQuote,$s);
2672 $s = str_replace(
'\\"',
'"',$s);
2674 if ($this->replaceQuote ==
"\\'" || ini_get(
'magic_quotes_sybase'))
2677 $s = str_replace(
'\\\\',
'\\',$s);
2678 return str_replace(
"\\'",$this->replaceQuote,$s);
2693 function qstr($s,$magic_quotes=
false)
2695 if (!$magic_quotes) {
2697 if ($this->replaceQuote[0] ==
'\\'){
2699 $s = adodb_str_replace(array(
'\\',
"\0"),array(
'\\\\',
"\\\0"),$s);
2702 return "'".str_replace(
"'",$this->replaceQuote,$s).
"'";
2706 $s = str_replace(
'\\"',
'"',$s);
2708 if ($this->replaceQuote ==
"\\'" || ini_get(
'magic_quotes_sybase'))
2711 $s = str_replace(
'\\\\',
'\\',$s);
2712 return "'".str_replace(
"\\'",$this->replaceQuote,$s).
"'";
2734 function PageExecute(
$sql, $nrows, $page, $inputarr=
false, $secs2cache=0)
2737 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
2756 function CachePageExecute($secs2cache,
$sql, $nrows, $page,$inputarr=
false)
2764 $rs = $this->PageExecute(
$sql,$nrows,$page,$inputarr,$secs2cache);
2786 class ADODB_Iterator_empty
implements Iterator {
2790 function __construct(
$rs)
2800 return !$this->rs->EOF;
2817 function __call($func, $params)
2819 return call_user_func_array(array($this->rs, $func), $params);
2833 class ADORecordSet_empty
implements IteratorAggregate
2835 var $dataProvider =
'empty';
2836 var $databaseType =
false;
2838 var $_numOfRows = 0;
2839 var $fields =
false;
2840 var $connection =
false;
2841 function RowCount() {
return 0;}
2842 function RecordCount() {
return 0;}
2843 function PO_RecordCount(){
return 0;}
2844 function Close(){
return true;}
2845 function FetchRow() {
return false;}
2846 function FieldCount(){
return 0;}
2848 function getIterator() {
return new ADODB_Iterator_empty($this);}
2849 function GetAssoc() {
return array();}
2855 if (!defined(
'ADODB_DATE_VERSION')) include(ADODB_DIR.
'/adodb-time.inc.php');
2861 class ADODB_Iterator
implements Iterator {
2865 function __construct(
$rs)
2871 $this->rs->MoveFirst();
2876 return !$this->rs->EOF;
2881 return $this->rs->_currentRow;
2886 return $this->rs->fields;
2891 $this->rs->MoveNext();
2894 function __call($func, $params)
2896 return call_user_func_array(array($this->rs, $func), $params);
2902 return !$this->rs->EOF;
2915 class ADORecordSet
implements IteratorAggregate {
2919 var $dataProvider =
"native";
2920 var $fields =
false;
2921 var $blobSize = 100;
2922 var $canSeek =
false;
2927 var $emptyTimeStamp =
' ';
2928 var $emptyDate =
' ';
2934 var $connection =
false;
2938 var $_numOfRows = -1;
2939 var $_numOfFields = -1;
2941 var $_currentRow = -1;
2942 var $_closed =
false;
2943 var $_inited =
false;
2947 var $_currentPage = -1;
2948 var $_atFirstPage =
false;
2949 var $_atLastPage =
false;
2950 var $_lastPageNo = -1;
2951 var $_maxRecordCount = 0;
2952 var $datetime =
false;
2960 function ADORecordSet($queryID)
2962 $this->_queryID = $queryID;
2965 function getIterator()
2967 return new ADODB_Iterator($this);
2971 function __toString()
2973 include_once(ADODB_DIR.
'/toexport.inc.php');
2980 if ($this->_inited)
return;
2981 $this->_inited =
true;
2982 if ($this->_queryID) @$this->_initrs();
2984 $this->_numOfRows = 0;
2985 $this->_numOfFields = 0;
2987 if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) {
2989 $this->_currentRow = 0;
2990 if ($this->EOF = ($this->_fetch() ===
false)) {
2991 $this->_numOfRows = 0;
3019 function GetMenu($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,
3020 $size=0, $selectAttr=
'',$compareFields0=
true)
3023 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3024 return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple,
3025 $size, $selectAttr,$compareFields0);
3037 function GetMenu2($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,$size=0, $selectAttr=
'')
3039 return $this->GetMenu($name,$defstr,$blank1stItem,$multiple,
3040 $size, $selectAttr,
false);
3046 function GetMenu3($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,
3047 $size=0, $selectAttr=
'')
3050 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3052 $size, $selectAttr,
false);
3062 function GetArray($nRows = -1)
3064 global $ADODB_EXTENSION;
if ($ADODB_EXTENSION) {
3065 $results = adodb_getall($this,$nRows);
3070 while (!$this->EOF && $nRows != $cnt) {
3071 $results[] = $this->fields;
3078 function GetAll($nRows = -1)
3080 $arr = $this->GetArray($nRows);
3088 function NextRecordSet()
3102 function GetArrayLimit($nrows,$offset=-1)
3105 $arr = $this->GetArray($nrows);
3109 $this->Move($offset);
3113 while (!$this->EOF && $nrows != $cnt) {
3114 $results[$cnt++] = $this->fields;
3129 function GetRows($nRows = -1)
3131 $arr = $this->GetArray($nRows);
3151 function GetAssoc($force_array =
false, $first2cols =
false)
3153 global $ADODB_EXTENSION;
3155 $cols = $this->_numOfFields;
3160 $numIndex = is_array($this->fields) && array_key_exists(0, $this->fields);
3163 if (!$first2cols && ($cols > 2 || $force_array)) {
3164 if ($ADODB_EXTENSION) {
3166 while (!$this->EOF) {
3167 $results[trim($this->fields[0])] = array_slice($this->fields, 1);
3168 adodb_movenext($this);
3171 while (!$this->EOF) {
3173 $keys = array_slice(array_keys($this->fields), 1);
3174 $sliced_array = array();
3176 foreach($keys as $key) {
3177 $sliced_array[$key] = $this->fields[$key];
3180 $results[trim(reset($this->fields))] = $sliced_array;
3181 adodb_movenext($this);
3186 while (!$this->EOF) {
3187 $results[trim($this->fields[0])] = array_slice($this->fields, 1);
3191 while (!$this->EOF) {
3193 $keys = array_slice(array_keys($this->fields), 1);
3194 $sliced_array = array();
3196 foreach($keys as $key) {
3197 $sliced_array[$key] = $this->fields[$key];
3200 $results[trim(reset($this->fields))] = $sliced_array;
3206 if ($ADODB_EXTENSION) {
3209 while (!$this->EOF) {
3211 $results[trim(($this->fields[0]))] = $this->fields[1];
3212 adodb_movenext($this);
3215 while (!$this->EOF) {
3217 $v1 = trim(reset($this->fields));
3218 $v2 =
''.next($this->fields);
3219 $results[$v1] = $v2;
3220 adodb_movenext($this);
3225 while (!$this->EOF) {
3227 $results[trim(($this->fields[0]))] = $this->fields[1];
3231 while (!$this->EOF) {
3233 $v1 = trim(reset($this->fields));
3234 $v2 =
''.next($this->fields);
3235 $results[$v1] = $v2;
3242 $ref = $results; # workaround accelerator incompat with PHP 4.4 :(
3254 function UserTimeStamp($v,$fmt=
'Y-m-d H:i:s')
3256 if (is_numeric($v) && strlen($v)<14)
return adodb_date($fmt,$v);
3257 $tt = $this->UnixTimeStamp($v);
3259 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
3260 if ($tt === 0)
return $this->emptyTimeStamp;
3271 function UserDate($v,$fmt=
'Y-m-d')
3273 $tt = $this->UnixDate($v);
3275 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
3276 else if ($tt == 0)
return $this->emptyDate;
3277 else if ($tt == -1) {
3288 static function UnixDate($v)
3290 return ADOConnection::UnixDate($v);
3299 static function UnixTimeStamp($v)
3301 return ADOConnection::UnixTimeStamp($v);
3310 return $this->Close();
3319 return $this->_numOfRows;
3328 return $this->_numOfFields;
3343 $arr = $this->fields;
3344 $this->_currentRow++;
3345 if (!$this->_fetch()) $this->EOF =
true;
3356 function FetchInto(&$arr)
3358 if ($this->EOF)
return (defined(
'PEAR_ERROR_RETURN')) ?
new PEAR_Error(
'EOF',-1): false;
3359 $arr = $this->fields;
3370 function MoveFirst()
3372 if ($this->_currentRow == 0)
return true;
3373 return $this->Move(0);
3384 if ($this->_numOfRows >= 0)
return $this->Move($this->_numOfRows-1);
3385 if ($this->EOF)
return false;
3386 while (!$this->EOF) {
3404 $this->_currentRow++;
3405 if ($this->_fetch())
return true;
3427 function Move($rowNumber = 0)
3430 if ($rowNumber == $this->_currentRow)
return true;
3431 if ($rowNumber >= $this->_numOfRows)
3432 if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2;
3434 if ($this->canSeek) {
3436 if ($this->_seek($rowNumber)) {
3437 $this->_currentRow = $rowNumber;
3438 if ($this->_fetch()) {
3446 if ($rowNumber < $this->_currentRow)
return false;
3447 global $ADODB_EXTENSION;
3448 if ($ADODB_EXTENSION) {
3449 while (!$this->EOF && $this->_currentRow < $rowNumber) {
3450 adodb_movenext($this);
3454 while (! $this->EOF && $this->_currentRow < $rowNumber) {
3455 $this->_currentRow++;
3457 if (!$this->_fetch()) $this->EOF =
true;
3460 return !($this->EOF);
3463 $this->fields =
false;
3477 function Fields($colname)
3479 return $this->fields[$colname];
3488 function GetAssocKeys($upper=ADODB_ASSOC_CASE_UPPER)
3490 $this->bind = array();
3491 for ($i=0; $i < $this->_numOfFields; $i++) {
3492 $o = $this->FetchField($i);
3494 case ADODB_ASSOC_CASE_LOWER:
3495 $key = strtolower($o->name);
3497 case ADODB_ASSOC_CASE_UPPER:
3498 $key = strtoupper($o->name);
3500 case ADODB_ASSOC_CASE_NATIVE:
3505 $val = $this->fetchMode == ADODB_FETCH_ASSOC ? $o->name : $i;
3506 $this->bind[$key] = $val;
3517 function GetRowAssoc($upper=ADODB_ASSOC_CASE_UPPER)
3521 $this->GetAssocKeys($upper);
3523 foreach($this->bind as $k => $v) {
3524 if( array_key_exists( $v, $this->fields ) ) {
3525 $record[$k] = $this->fields[$v];
3526 } elseif( array_key_exists( $k, $this->fields ) ) {
3527 $record[$k] = $this->fields[$k];
3529 # This should not happen... trigger error ? 3546 if (!$this->_closed) {
3547 $this->_closed =
true;
3548 return $this->_close();
3558 function RecordCount() {
return $this->_numOfRows;}
3565 function MaxRecordCount()
3567 return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount();
3575 function RowCount() {
return $this->_numOfRows;}
3586 function PO_RecordCount($table=
"", $condition=
"") {
3588 $lnumrows = $this->_numOfRows;
3590 if ($lnumrows == -1 && $this->connection) {
3592 if ($condition) $condition =
" WHERE " . $condition;
3593 $resultrows = $this->connection->Execute(
"SELECT COUNT(*) FROM $table $condition");
3594 if ($resultrows) $lnumrows = reset($resultrows->fields);
3604 function CurrentRow() {
return $this->_currentRow;}
3611 function AbsolutePosition() {
return $this->_currentRow;}
3617 function FieldCount() {
return $this->_numOfFields;}
3627 function FetchField($fieldoffset = -1)
3639 function FieldTypesArray()
3642 for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
3643 $arr[] = $this->FetchField($i);
3655 $o = $this->FetchObject(
false);
3667 function FetchObject($isupper=
true)
3669 if (empty($this->_obj)) {
3670 $this->_obj =
new ADOFetchObj();
3671 $this->_names = array();
3672 for ($i=0; $i <$this->_numOfFields; $i++) {
3673 $f = $this->FetchField($i);
3674 $this->_names[] = $f->name;
3678 if (PHP_VERSION >= 5) $o = clone($this->_obj);
3679 else $o = $this->_obj;
3681 for ($i=0; $i <$this->_numOfFields; $i++) {
3682 $name = $this->_names[$i];
3683 if ($isupper) $n = strtoupper($name);
3686 $o->$n = $this->Fields($name);
3700 function FetchNextObj()
3702 $o = $this->FetchNextObject(
false);
3718 function FetchNextObject($isupper=
true)
3721 if ($this->_numOfRows != 0 && !$this->EOF) {
3722 $o = $this->FetchObject($isupper);
3723 $this->_currentRow++;
3724 if ($this->_fetch())
return $o;
3754 function MetaType($t,$len=-1,$fieldobj=
false)
3756 if (is_object($t)) {
3758 $t = $fieldobj->type;
3759 $len = $fieldobj->max_length;
3762 static $typeMap = array(
3773 'INTERVAL' =>
'C', # Postgres
3774 'MACADDR' =>
'C', # postgres
3775 'VAR_STRING' =>
'C', # mysql
3790 'LONGBINARY' =>
'B',
3797 'UNIQUEIDENTIFIER' =>
'C', # MS SQL Server
3799 'SMALLDATETIME' =>
'T',
3803 'TIMESTAMPTZ' =>
'T',
3805 'TIMESTAMP WITHOUT TIME ZONE' =>
'T',
3815 'INT IDENTITY' =>
'R',
3822 'INTEGER UNSIGNED' =>
'I',
3834 'DOUBLE PRECISION' =>
'N',
3835 'SMALLFLOAT' =>
'N',
3846 'SQLSMFLOAT' =>
'N',
3849 'SQLDECIMAL' =>
'N',
3854 'SQLINTERVAL' =>
'N',
3859 "SQLSERIAL8" =>
'I8',
3862 "SQLLVARCHAR" =>
'X',
3867 $t = strtoupper($t);
3868 $tmap = (isset($typeMap[$t])) ? $typeMap[$t] :
'N';
3873 if ($this->blobSize >= 0) {
3874 if ($len > $this->blobSize)
return 'X';
3875 }
else if ($len > 250) {
3881 if (!empty($fieldobj->primary_key))
return 'R';
3888 if (isset($fieldobj->binary))
3889 return ($fieldobj->binary) ?
'B' :
'X';
3893 if (!empty($this->connection) && !empty($this->connection->datetime))
return 'T';
3897 if ($t ==
'LONG' && $this->dataProvider ==
'oci8')
return 'B';
3903 function _close() {}
3908 function AbsolutePage($page=-1)
3910 if ($page != -1) $this->_currentPage = $page;
3911 return $this->_currentPage;
3917 function AtFirstPage($status=
false)
3919 if ($status !=
false) $this->_atFirstPage = $status;
3920 return $this->_atFirstPage;
3923 function LastPageNo($page =
false)
3925 if ($page !=
false) $this->_lastPageNo = $page;
3926 return $this->_lastPageNo;
3932 function AtLastPage($status=
false)
3934 if ($status !=
false) $this->_atLastPage = $status;
3935 return $this->_atLastPage;
3951 class ADORecordSet_array
extends ADORecordSet
3953 var $databaseType =
'array';
3960 var $canSeek =
true;
3961 var $affectedrows =
false;
3962 var $insertid =
false;
3964 var $compat =
false;
3969 function ADORecordSet_array($fakeid=1)
3971 global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH;
3974 $this->compat = !empty($ADODB_COMPAT_FETCH);
3975 $this->ADORecordSet($fakeid);
3976 $this->fetchMode = $ADODB_FETCH_MODE;
3979 function _transpose($addfieldnames=
true)
3983 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3986 $fobjs = $addfieldnames ? $this->_fieldobjects :
false;
3990 $this->_skiprow1 =
false;
3991 $this->_array = $newarr;
3992 $this->_colnames = $hdr;
3996 $this->_fieldobjects = array();
3998 foreach($hdr as $k => $name) {
3999 $f =
new ADOFieldObject();
4001 $f->type = $this->_types[$k];
4002 $f->max_length = -1;
4003 $this->_fieldobjects[] = $f;
4005 $this->fields = reset($this->_array);
4022 function InitArray($array,$typearr,$colnames=
false)
4024 $this->_array = $array;
4025 $this->_types = $typearr;
4027 $this->_skiprow1 =
false;
4028 $this->_colnames = $colnames;
4030 $this->_skiprow1 =
true;
4031 $this->_colnames = $array[0];
4043 function InitArrayFields(&$array,&$fieldarr)
4045 $this->_array = $array;
4046 $this->_skiprow1=
false;
4048 $this->_fieldobjects = $fieldarr;
4053 function GetArray($nRows=-1)
4055 if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) {
4056 return $this->_array;
4058 $arr = ADORecordSet::GetArray($nRows);
4065 $this->_numOfRows =
sizeof($this->_array);
4066 if ($this->_skiprow1) $this->_numOfRows -= 1;
4068 $this->_numOfFields =(isset($this->_fieldobjects)) ?
4069 sizeof($this->_fieldobjects):
sizeof($this->_types);
4073 function Fields($colname)
4075 $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode;
4077 if ($mode & ADODB_FETCH_ASSOC) {
4078 if (!isset($this->fields[$colname]) && !is_null($this->fields[$colname])) $colname = strtolower($colname);
4079 return $this->fields[$colname];
4082 $this->bind = array();
4083 for ($i=0; $i < $this->_numOfFields; $i++) {
4084 $o = $this->FetchField($i);
4085 $this->bind[strtoupper($o->name)] = $i;
4088 return $this->fields[$this->bind[strtoupper($colname)]];
4091 function FetchField($fieldOffset = -1)
4093 if (isset($this->_fieldobjects)) {
4094 return $this->_fieldobjects[$fieldOffset];
4096 $o =
new ADOFieldObject();
4097 $o->name = $this->_colnames[$fieldOffset];
4098 $o->type = $this->_types[$fieldOffset];
4099 $o->max_length = -1;
4104 function _seek($row)
4106 if (
sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) {
4107 $this->_currentRow = $row;
4108 if ($this->_skiprow1) $row += 1;
4109 $this->fields = $this->_array[$row];
4118 $this->_currentRow++;
4120 $pos = $this->_currentRow;
4122 if ($this->_numOfRows <= $pos) {
4123 if (!$this->compat) $this->fields =
false;
4125 if ($this->_skiprow1) $pos += 1;
4126 $this->fields = $this->_array[$pos];
4137 $pos = $this->_currentRow;
4139 if ($this->_numOfRows <= $pos) {
4140 if (!$this->compat) $this->fields =
false;
4143 if ($this->_skiprow1) $pos += 1;
4144 $this->fields = $this->_array[$pos];
4164 function ADOLoadDB($dbType)
4166 return ADOLoadCode($dbType);
4172 function ADOLoadCode($dbType)
4174 global $ADODB_LASTDB;
4176 if (!$dbType)
return false;
4177 $db = strtolower($dbType);
4180 if (PHP_VERSION >= 5) $db =
'ado5';
4186 $class = $db =
'mysqlt';
4191 $class = $db =
'postgres8';
4195 $class = $db;
break;
4198 $file = ADODB_DIR.
"/drivers/adodb-".$db.
".inc.php";
4199 @include_once($file);
4200 $ADODB_LASTDB = $class;
4201 if (class_exists(
"ADODB_" . $class))
return $class;
4204 if (!file_exists($file)) ADOConnection::outp(
"Missing file: $file");
4205 else ADOConnection::outp(
"Syntax error in file: $file");
4212 function NewADOConnection($db=
'')
4214 $tmp = ADONewConnection($db);
4226 function ADONewConnection($db=
'')
4228 GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB;
4230 if (!defined(
'ADODB_ASSOC_CASE')) define(
'ADODB_ASSOC_CASE',2);
4233 if (($at = strpos($db,
'://')) !== FALSE) {
4235 $fakedsn =
'fake'.substr($origdsn,$at);
4236 if (($at2 = strpos($origdsn,
'@/')) !== FALSE) {
4238 $fakedsn = str_replace(
'@/',
'@adodb-fakehost/',$fakedsn);
4241 if ((strpos($origdsn,
'sqlite')) !== FALSE && stripos($origdsn,
'%2F') === FALSE) {
4246 list($scheme, $path) = explode(
'://', $origdsn);
4247 $dsna[
'scheme'] = $scheme;
4248 if ($qmark = strpos($path,
'?')) {
4249 $dsn[
'query'] = substr($path,$qmark+1);
4250 $path = substr($path,0,$qmark);
4252 $dsna[
'path'] =
'/' . urlencode($path);
4254 $dsna = @parse_url($fakedsn);
4259 $dsna[
'scheme'] = substr($origdsn,0,$at);
4260 if ($at2 !== FALSE) {
4264 if (strncmp($origdsn,
'pdo',3) == 0) {
4265 $sch = explode(
'_',$dsna[
'scheme']);
4266 if (
sizeof($sch)>1) {
4268 $dsna[
'host'] = isset($dsna[
'host']) ? rawurldecode($dsna[
'host']) :
'';
4269 if ($sch[1] ==
'sqlite')
4270 $dsna[
'host'] = rawurlencode($sch[1].
':'.rawurldecode($dsna[
'host']));
4272 $dsna[
'host'] = rawurlencode($sch[1].
':host='.rawurldecode($dsna[
'host']));
4273 $dsna[
'scheme'] =
'pdo';
4277 $db = @$dsna[
'scheme'];
4278 if (!$db)
return $false;
4279 $dsna[
'host'] = isset($dsna[
'host']) ? rawurldecode($dsna[
'host']) :
'';
4280 $dsna[
'user'] = isset($dsna[
'user']) ? rawurldecode($dsna[
'user']) :
'';
4281 $dsna[
'pass'] = isset($dsna[
'pass']) ? rawurldecode($dsna[
'pass']) :
'';
4282 $dsna[
'path'] = isset($dsna[
'path']) ? rawurldecode(substr($dsna[
'path'],1)) :
''; # strip off initial /
4284 if (isset($dsna[
'query'])) {
4285 $opt1 = explode(
'&',$dsna[
'query']);
4286 foreach($opt1 as $k => $v) {
4287 $arr = explode(
'=',$v);
4288 $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1;
4290 }
else $opt = array();
4301 if (!empty($ADODB_NEWCONNECTION)) {
4302 $obj = $ADODB_NEWCONNECTION($db);
4308 if (!isset($ADODB_LASTDB)) $ADODB_LASTDB =
'';
4309 if (empty($db)) $db = $ADODB_LASTDB;
4311 if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db);
4314 if (isset($origdsn)) $db = $origdsn;
4318 $errorfn(
'ADONewConnection',
'ADONewConnection', -998,
4319 "could not load the database driver for '$db'",
4322 ADOConnection::outp(
"<p>ADONewConnection: Unable to load database driver '$db'</p>",
false);
4327 $cls =
'ADODB_'.$db;
4328 if (!class_exists($cls)) {
4336 # constructor should not fail 4338 if ($errorfn) $obj->raiseErrorFn = $errorfn;
4340 if (isset($dsna[
'port'])) $obj->port = $dsna[
'port'];
4341 foreach($opt as $k => $v) {
4342 switch(strtolower($k)) {
4344 $nconnect =
true; $persist =
true;
break;
4346 case 'persistent': $persist = $v;
break;
4347 case 'debug': $obj->debug = (integer) $v;
break;
4349 case 'role': $obj->role = $v;
break;
4350 case 'dialect': $obj->dialect = (integer) $v;
break;
4351 case 'charset': $obj->charset = $v; $obj->charSet=$v;
break;
4352 case 'buffers': $obj->buffers = $v;
break;
4353 case 'fetchmode': $obj->SetFetchMode($v);
break;
4355 case 'charpage': $obj->charPage = $v;
break;
4357 case 'clientflags': $obj->clientFlags = $v;
break;
4358 #mysql, mysqli, postgres 4359 case 'port': $obj->port = $v;
break;
4361 case 'socket': $obj->socket = $v;
break;
4363 case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v;
break;
4364 case 'cachesecs': $obj->cacheSecs = $v;
break;
4366 $varr = explode(
':',$v);
4367 $vlen =
sizeof($varr);
4368 if ($vlen == 0)
break;
4369 $obj->memCache =
true;
4370 $obj->memCacheHost = explode(
',',$varr[0]);
4371 if ($vlen == 1)
break;
4372 $obj->memCachePort = $varr[1];
4373 if ($vlen == 2)
break;
4374 $obj->memCacheCompress = $varr[2] ? true :
false;
4378 if (empty($persist))
4379 $ok = $obj->Connect($dsna[
'host'], $dsna[
'user'], $dsna[
'pass'], $dsna[
'path']);
4380 else if (empty($nconnect))
4381 $ok = $obj->PConnect($dsna[
'host'], $dsna[
'user'], $dsna[
'pass'], $dsna[
'path']);
4383 $ok = $obj->NConnect($dsna[
'host'], $dsna[
'user'], $dsna[
'pass'], $dsna[
'path']);
4385 if (!$ok)
return $false;
4394 function _adodb_getdriver($provider,$drivername,$perf=
false)
4396 switch ($provider) {
4397 case 'odbtp':
if (strncmp(
'odbtp_',$drivername,6)==0)
return substr($drivername,6);
4398 case 'odbc' :
if (strncmp(
'odbc_',$drivername,5)==0)
return substr($drivername,5);
4399 case 'ado' :
if (strncmp(
'ado_',$drivername,4)==0)
return substr($drivername,4);
4400 case 'native':
break;
4405 switch($drivername) {
4408 $drivername=
'mysql';
4412 $drivername =
'postgres';
4414 case 'firebird15': $drivername =
'firebird';
break;
4415 case 'oracle': $drivername =
'oci8';
break;
4416 case 'access':
if ($perf) $drivername =
'';
break;
4418 case 'sapdb' :
break;
4420 $drivername =
'generic';
4426 function NewPerfMonitor(&
$conn)
4429 $drivername = _adodb_getdriver(
$conn->dataProvider,
$conn->databaseType,
true);
4430 if (!$drivername || $drivername ==
'generic')
return $false;
4431 include_once(ADODB_DIR.
'/adodb-perf.inc.php');
4432 @include_once(ADODB_DIR.
"/perf/perf-$drivername.inc.php");
4433 $class =
"Perf_$drivername";
4434 if (!class_exists($class))
return $false;
4435 $perf =
new $class(
$conn);
4440 function NewDataDictionary(&
$conn,$drivername=
false)
4443 if (!$drivername) $drivername = _adodb_getdriver(
$conn->dataProvider,
$conn->databaseType);
4445 include_once(ADODB_DIR.
'/adodb-lib.inc.php');
4446 include_once(ADODB_DIR.
'/adodb-datadict.inc.php');
4447 $path = ADODB_DIR.
"/datadict/datadict-$drivername.inc.php";
4449 if (!file_exists($path)) {
4450 ADOConnection::outp(
"Dictionary driver '$path' not available");
4453 include_once($path);
4454 $class =
"ADODB2_$drivername";
4455 $dict =
new $class();
4456 $dict->dataProvider =
$conn->dataProvider;
4457 $dict->connection =
$conn;
4458 $dict->upperName = strtoupper($drivername);
4459 $dict->quote =
$conn->nameQuote;
4460 if (!empty(
$conn->_connectionID))
4461 $dict->serverInfo =
$conn->ServerInfo();
4471 function adodb_pr($var,$as_string=
false)
4473 if ($as_string) ob_start();
4475 if (isset($_SERVER[
'HTTP_USER_AGENT'])) {
4476 echo
" <pre>\n";print_r($var);echo
"</pre>\n";
4481 $s = ob_get_contents();
4493 function adodb_backtrace($printOrArr=
true,$levels=9999,$ishtml=null)
4496 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
_adodb_getupdatesql(&$zthis, &$rs, $arrFields, $forceUpdate=false, $magicq=false, $force=2)
_adodb_backtrace($printOrArr=true, $levels=9999, $skippy=0, $ishtml=null)
if(false) adodb_probetypes(&$array, &$types, $probe=8)
global $_ADODB_ACTIVE_DBS
_rs2serialize(&$rs, $conn=false, $sql='')
if(isset($_REQUEST['nrows'])) else $rs
global $ADODB_INCLUDED_LIB
_adodb_getinsertsql(&$zthis, &$rs, $arrFields, $magicq=false, $force=2)
global $ADODB_INCLUDED_CSV
_adodb_export(&$rs, $sep, $sepreplace, $fp=false, $addtitles=true, $quote='"',$escquote = '"', $replaceNewLine=' ')
_adodb_getmenu_gp(&$zthis, $name, $defstr='', $blank1stItem=true, $multiple=false, $size=0, $selectAttr='', $compareFields0=true)
_adodb_debug_execute(&$zthis, $sql, $inputarr)
adodb_gmdate($fmt, $d=false)
adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
adodb_date($fmt, $d=false, $is_gmt=false)
_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)
adodb_error($provider, $dbType, $errno)
_adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc)
const ADODB_ERROR_HANDLER
if(!defined("DB_ERROR_SYNTAX")) adodb_errormsg($value)
csv2rs($url, &$err, $timeout=0, $rsclass='ADORecordSet_array')
_adodb_getmenu(&$zthis, $name, $defstr='', $blank1stItem=true, $multiple=false, $size=0, $selectAttr='', $compareFields0=true)
debug($variable='', $name=' *variable *', $line=' *line *', $file=' *file *', $recursiveDepth=3, $debugLevel=E_DEBUG)
adodb_transpose(&$arr, &$newarr, &$hdr, &$fobjs)
adodb_mktime($hr, $min, $sec, $mon=false, $day=false, $year=false, $is_dst=false, $is_gmt=false)
adodb_GetActiveRecordsClass(&$db, $class, $table, $whereOrderBy, $bindarr, $primkeyArr, $extra)
global $ADODB_INCLUDED_MEMCACHE
_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)
adodb_write_file($filename, $contents, $debug=false)