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');
81 define(
'ADODB_FORCE_IGNORE',0);
82 define(
'ADODB_FORCE_NULL',1);
83 define(
'ADODB_FORCE_EMPTY',2);
84 define(
'ADODB_FORCE_VALUE',3);
88 if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
90 define(
'ADODB_BAD_RS',
'<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>');
93 define(
'ADODB_TABLE_REGEX',
'([]0-9a-z_\:\"\`\.\@\[-]*)');
96 if (!defined(
'ADODB_PREFETCH_ROWS')) define(
'ADODB_PREFETCH_ROWS',10);
107 define(
'ADODB_ASSOC_CASE_LOWER', 0);
108 define(
'ADODB_ASSOC_CASE_UPPER', 1);
109 define(
'ADODB_ASSOC_CASE_NATIVE', 2);
111 define(
'ADODB_FETCH_DEFAULT',0);
112 define(
'ADODB_FETCH_NUM',1);
113 define(
'ADODB_FETCH_ASSOC',2);
114 define(
'ADODB_FETCH_BOTH',3);
116 if (!defined(
'TIMESTAMP_FIRST_YEAR')) define(
'TIMESTAMP_FIRST_YEAR',100);
119 $_adodb_ver = (float) PHP_VERSION;
120 if ($_adodb_ver >= 5.2) {
121 define(
'ADODB_PHPVER',0x5200);
122 }
else if ($_adodb_ver >= 5.0) {
123 define(
'ADODB_PHPVER',0x5000);
125 die(
"PHP5 or later required. You are running ".PHP_VERSION);
135 function ADODB_str_replace($src, $dest, $data)
137 if (ADODB_PHPVER >= 0x4050)
return str_replace($src,$dest,$data);
141 while ($s !==
false) {
142 $data = str_replace($s,$d,$data);
149 function ADODB_Setup()
160 $ADODB_QUOTE_FIELDNAMES;
162 if (empty($ADODB_CACHE_CLASS)) $ADODB_CACHE_CLASS =
'ADODB_Cache_File' ;
163 $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT;
164 $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE;
165 $ADODB_GETONE_EOF = null;
167 if (!isset($ADODB_CACHE_DIR)) {
168 $ADODB_CACHE_DIR =
'/tmp';
171 if (strpos($ADODB_CACHE_DIR,
'://') !==
false)
172 die(
"Illegal path http:// or ftp://");
178 srand(((
double)microtime())*1000000);
183 $ADODB_vers =
'V5.19dev ??-???-2014 (c) 2000-2014 John Lim (jlim#natsoft.com). All rights reserved. Released BSD & LGPL.';
190 if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS =
true;
206 class ADOFieldObject {
223 function _adodb_safedate($s)
225 return str_replace(array(
"'",
'\\'),
'', $s);
230 function _adodb_safedateq($s)
233 if ($s[0] !==
"'") $s2 =
"'".$s[0];
235 for($i=1; $i<$len; $i++) {
240 } elseif ($ch ===
"'") {
248 return strlen($s2) == 0 ?
'null' : $s2;
254 function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
257 $thisConnection->_transOK =
false;
258 if ($thisConnection->_oldRaiseFn) {
259 $fn = $thisConnection->_oldRaiseFn;
260 $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection);
266 class ADODB_Cache_File {
268 var $createdir =
true;
270 function ADODB_Cache_File()
273 if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.
'/adodb-csvlib.inc.php');
277 function writecache($filename, $contents, $debug, $secs2cache)
283 function &readcache($filename, &$err, $secs2cache, $rsClass)
285 $rs =
csv2rs($filename,$err,$secs2cache,$rsClass);
290 function flushall($debug=
false)
292 global $ADODB_CACHE_DIR;
296 if (strlen($ADODB_CACHE_DIR) > 1) {
297 $rez = $this->_dirFlush($ADODB_CACHE_DIR);
298 if ($debug) ADOConnection::outp(
"flushall: $dir<br><pre>\n". $rez.
"</pre>");
304 function flushcache($f, $debug=
false)
307 if ($debug) ADOConnection::outp(
"flushcache: failed for $f");
311 function getdirname($hash)
313 global $ADODB_CACHE_DIR;
314 if (!isset($this->notSafeMode)) $this->notSafeMode = !ini_get(
'safe_mode');
315 return ($this->notSafeMode) ? $ADODB_CACHE_DIR.
'/'.substr($hash,0,2) : $ADODB_CACHE_DIR;
319 function createdir($hash, $debug)
321 global $ADODB_CACHE_PERMS;
323 $dir = $this->getdirname($hash);
324 if ($this->notSafeMode && !file_exists($dir)) {
326 if (!@mkdir($dir, empty($ADODB_CACHE_PERMS) ? 0771 : $ADODB_CACHE_PERMS))
if(!is_dir($dir) && $debug) ADOConnection::outp(
"Cannot create $dir");
339 function _dirFlush($dir, $kill_top_level =
false)
341 if(!$dh = @opendir($dir))
return;
343 while (($obj = readdir($dh))) {
344 if($obj==
'.' || $obj==
'..')
continue;
347 if (strpos($obj,
'.cache')) @unlink($f);
348 if (is_dir($f)) $this->_dirFlush($f,
true);
350 if ($kill_top_level ===
true) @rmdir($dir);
362 class ADOConnection {
366 var $dataProvider =
'native';
367 var $databaseType =
'';
373 var $maxblobsize = 262144;
374 var $concat_operator =
'+';
375 var $substr =
'substr';
376 var $length =
'length';
377 var $random =
'rand()';
378 var $upperCase =
'upper';
379 var $fmtDate =
"'Y-m-d'";
380 var $fmtTimeStamp =
"'Y-m-d, h:i:s A'";
383 var $replaceQuote =
"\\'";
384 var $nameQuote =
'"';
386 var $metaDatabasesSQL =
'';
387 var $metaTablesSQL =
'';
388 var $uniqueOrderBy =
false;
389 var $emptyDate =
' ';
390 var $emptyTimeStamp =
' ';
391 var $lastInsID =
false;
393 var $hasInsertID =
false;
394 var $hasAffectedRows =
false;
396 var $hasLimit =
false;
397 var $readOnly =
false;
398 var $hasMoveFirst =
false;
399 var $hasGenID =
false;
400 var $hasTransactions =
true;
403 var $raiseErrorFn =
false;
404 var $isoDates =
false;
405 var $cacheSecs = 3600;
408 var $memCache =
false;
410 var $memCachePort = 11211;
411 var $memCacheCompress =
false;
413 var $sysDate =
false;
414 var $sysTimeStamp =
false;
415 var $sysUTimeStamp =
false;
416 var $arrayClass =
'ADORecordSet_array';
418 var $noNullStrings =
false;
419 var $numCacheHits = 0;
420 var $numCacheMisses = 0;
421 var $pageExecuteCountRows =
true;
422 var $uniqueSort =
false;
423 var $leftOuter =
false;
424 var $rightOuter =
false;
425 var $ansiOuter =
false;
426 var $autoRollback =
false;
427 var $poorAffectedRows =
false;
429 var $fnExecute =
false;
430 var $fnCacheExecute =
false;
431 var $blobEncodeType =
false;
432 var $rsPrefix =
"ADORecordSet_";
434 var $autoCommit =
true;
438 var $fetchMode=
false;
440 var $null2null =
'null';
441 var $bulkBind =
false;
445 var $_oldRaiseFn =
false;
446 var $_transOK = null;
447 var $_connectionID =
false;
448 var $_errorMsg =
false;
449 var $_errorCode =
false;
451 var $_queryID =
false;
453 var $_isPersistentConnection =
false;
454 var $_bindInputArray =
false;
455 var $_evalAll =
false;
456 var $_affected =
false;
457 var $_logsql =
false;
458 var $_transmode =
'';
465 function ADOConnection()
467 die(
'Virtual Class -- cannot instantiate');
470 static function Version()
474 $ok = preg_match(
'/^[Vv]([0-9\.]+)/', $ADODB_vers, $matches );
475 if (!
$ok)
return (
float) substr($ADODB_vers,1);
476 else return $matches[1];
485 function ServerInfo()
487 return array(
'description' =>
'',
'version' =>
'');
490 function IsConnected()
492 return !empty($this->_connectionID);
495 function _findvers($str)
497 if (preg_match(
'/([0-9]+\.([0-9\.])+)/',$str, $arr))
return $arr[1];
505 static function outp($msg,$newline=
true)
507 global $ADODB_FLUSH,$ADODB_OUTP;
509 if (defined(
'ADODB_OUTP')) {
513 }
else if (isset($ADODB_OUTP)) {
519 if ($newline) $msg .=
"<br>\n";
521 if (isset($_SERVER[
'HTTP_USER_AGENT']) || !$newline) echo $msg;
522 else echo strip_tags($msg);
525 if (!empty($ADODB_FLUSH) && ob_get_length() !==
false) flush();
531 $rs = $this->_Execute(
"select $this->sysTimeStamp");
532 if ($rs && !$rs->EOF)
return $this->UnixTimeStamp(reset($rs->fields));
548 function Connect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"", $forceNew =
false)
550 if ($argHostname !=
"") $this->host = $argHostname;
551 if ($argUsername !=
"") $this->user = $argUsername;
552 if ($argPassword !=
"") $this->password =
'not stored';
553 if ($argDatabaseName !=
"") $this->database = $argDatabaseName;
555 $this->_isPersistentConnection =
false;
558 if ($rez=$this->_nconnect($this->host, $this->user, $argPassword, $this->database))
return true;
560 if ($rez=$this->_connect($this->host, $this->user, $argPassword, $this->database))
return true;
563 $err = $this->ErrorMsg();
564 if (empty($err)) $err =
"Connection error to server '$argHostname' with user '$argUsername'";
567 $err =
"Missing extension for ".$this->dataProvider;
570 if ($fn = $this->raiseErrorFn)
571 $fn($this->databaseType,
'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
574 $this->_connectionID =
false;
575 if ($this->debug) ADOConnection::outp( $this->host.
': '.$err);
579 function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
581 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
595 function NConnect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"")
597 return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName,
true);
610 function PConnect($argHostname =
"", $argUsername =
"", $argPassword =
"", $argDatabaseName =
"")
613 if (defined(
'ADODB_NEVER_PERSIST'))
614 return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
616 if ($argHostname !=
"") $this->host = $argHostname;
617 if ($argUsername !=
"") $this->user = $argUsername;
618 if ($argPassword !=
"") $this->password =
'not stored';
619 if ($argDatabaseName !=
"") $this->database = $argDatabaseName;
621 $this->_isPersistentConnection =
true;
623 if ($rez = $this->_pconnect($this->host, $this->user, $argPassword, $this->database))
return true;
625 $err = $this->ErrorMsg();
626 if (empty($err)) $err =
"Connection error to server '$argHostname' with user '$argUsername'";
629 $err =
"Missing extension for ".$this->dataProvider;
632 if ($fn = $this->raiseErrorFn) {
633 $fn($this->databaseType,
'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
636 $this->_connectionID =
false;
637 if ($this->debug) ADOConnection::outp( $this->host.
': '.$err);
641 function outp_throw($msg,$src=
'WARN',$sql=
'')
644 adodb_throw($this->databaseType,$src,-9999,$msg,$sql,
false,$this);
647 ADOConnection::outp($msg);
651 function _CreateCache()
653 global $ADODB_CACHE, $ADODB_CACHE_CLASS;
655 if ($this->memCache) {
658 if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.
'/adodb-memcache.lib.inc.php');
661 $ADODB_CACHE =
new $ADODB_CACHE_CLASS($this);
666 function SQLDate($fmt, $col=
false)
668 if (!$col) $col = $this->sysDate;
687 function Prepare($sql)
706 function PrepareSP($sql,$param=
true)
708 return $this->Prepare($sql,$param);
716 return $this->qstr($s,
false);
724 return $this->qstr($s,get_magic_quotes_gpc());
729 #if (!empty($this->qNull)) if ($s == 'null') return $s;
730 $s = $this->qstr($s,
false);
736 function ErrorNative()
738 return $this->ErrorNo();
745 function nextId($seq_name)
747 return $this->GenID($seq_name);
757 function RowLock($table,$where,$col=
'1 as adodbignore')
762 function CommitLock($table)
764 return $this->CommitTrans();
767 function RollbackLock($table)
769 return $this->RollbackTrans();
781 function SetFetchMode($mode)
783 $old = $this->fetchMode;
784 $this->fetchMode = $mode;
786 if ($old ===
false) {
787 global $ADODB_FETCH_MODE;
788 return $ADODB_FETCH_MODE;
797 function Query($sql, $inputarr=
false)
799 $rs = $this->Execute($sql, $inputarr);
808 function LimitQuery($sql, $offset, $count,
$params=
false)
810 $rs = $this->SelectLimit($sql, $count, $offset,
$params);
819 function Disconnect()
821 return $this->Close();
833 function Param($name,$type=
'C')
841 function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=
false)
843 return $this->Parameter($stmt,$var,$name,
false,$maxLen,$type);
848 function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=
false)
850 return $this->Parameter($stmt,$var,$name,
true,$maxLen,$type);
870 function Parameter(&$stmt,&$var,$name,$isOutput=
false,$maxLen=4000,$type=
false)
876 function IgnoreErrors($saveErrs=
false)
879 $saveErrs = array($this->raiseErrorFn,$this->_transOK);
880 $this->raiseErrorFn =
false;
883 $this->raiseErrorFn = $saveErrs[0];
884 $this->_transOK = $saveErrs[1];
898 function StartTrans($errfn =
'ADODB_TransMonitor')
900 if ($this->transOff > 0) {
901 $this->transOff += 1;
905 $this->_oldRaiseFn = $this->raiseErrorFn;
906 $this->raiseErrorFn = $errfn;
907 $this->_transOK =
true;
909 if ($this->debug && $this->transCnt > 0) ADOConnection::outp(
"Bad Transaction: StartTrans called within BeginTrans");
910 $ok = $this->BeginTrans();
924 function CompleteTrans($autoComplete =
true)
926 if ($this->transOff > 1) {
927 $this->transOff -= 1;
930 $this->raiseErrorFn = $this->_oldRaiseFn;
933 if ($this->_transOK && $autoComplete) {
934 if (!$this->CommitTrans()) {
935 $this->_transOK =
false;
936 if ($this->debug) ADOConnection::outp(
"Smart Commit failed");
938 if ($this->debug) ADOConnection::outp(
"Smart Commit occurred");
940 $this->_transOK =
false;
941 $this->RollbackTrans();
942 if ($this->debug) ADOCOnnection::outp(
"Smart Rollback occurred");
945 return $this->_transOK;
954 if ($this->transOff == 0) {
955 ADOConnection::outp(
"FailTrans outside StartTrans/CompleteTrans");
957 ADOConnection::outp(
"FailTrans was called");
960 $this->_transOK =
false;
966 function HasFailedTrans()
968 if ($this->transOff > 0)
return $this->_transOK ==
false;
979 function Execute($sql,$inputarr=
false)
981 if ($this->fnExecute) {
982 $fn = $this->fnExecute;
983 $ret = $fn($this,$sql,$inputarr);
984 if (isset($ret))
return $ret;
987 if (!is_array($inputarr)) $inputarr = array($inputarr);
989 $element0 = reset($inputarr);
990 # is_object check because oci8 descriptors can be passed in
991 $array_2d = $this->bulkBind && is_array($element0) && !is_object(reset($element0));
997 $sqlarr = explode(
'?',$sql);
998 $nparams =
sizeof($sqlarr)-1;
999 if (!$array_2d) $inputarr = array($inputarr);
1001 foreach($inputarr as $arr) {
1004 while(list(, $v) = each($arr)) {
1005 $sql .= $sqlarr[$i];
1009 if ($typ ==
'string')
1011 $sql .= $this->qstr($v);
1012 else if ($typ ==
'double')
1013 $sql .= str_replace(
',',
'.',$v);
1014 else if ($typ ==
'boolean')
1015 $sql .= $v ? $this->
true : $this->false;
1016 else if ($typ ==
'object') {
1017 if (method_exists($v,
'__toString')) $sql .= $this->qstr($v->__toString());
1018 else $sql .= $this->qstr((
string) $v);
1019 }
else if ($v === null)
1025 if ($i == $nparams)
break;
1027 if (isset($sqlarr[$i])) {
1028 $sql .= $sqlarr[$i];
1029 if ($i+1 !=
sizeof($sqlarr)) $this->outp_throw(
"Input Array does not match ?: ".htmlspecialchars($sql),
'Execute');
1030 }
else if ($i !=
sizeof($sqlarr))
1031 $this->outp_throw(
"Input array does not match ?: ".htmlspecialchars($sql),
'Execute');
1033 $ret = $this->_Execute($sql);
1034 if (!$ret)
return $ret;
1038 if (is_string($sql))
1039 $stmt = $this->Prepare($sql);
1043 foreach($inputarr as $arr) {
1044 $ret = $this->_Execute($stmt,$arr);
1045 if (!$ret)
return $ret;
1048 $ret = $this->_Execute($sql,$inputarr);
1052 $ret = $this->_Execute($sql,
false);
1059 function _Execute($sql,$inputarr=
false)
1063 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1066 $this->_queryID = @$this->_query($sql,$inputarr);
1073 if ($this->_queryID ===
false) {
1074 if ($this->debug == 99) adodb_backtrace(
true,5);
1075 $fn = $this->raiseErrorFn;
1077 $fn($this->databaseType,
'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
1083 if ($this->_queryID ===
true) {
1084 $rsclass = $this->rsPrefix.
'empty';
1085 $rs = (class_exists($rsclass)) ?
new $rsclass():
new ADORecordSet_empty();
1091 $rsclass = $this->rsPrefix.$this->databaseType;
1092 $rs =
new $rsclass($this->_queryID,$this->fetchMode);
1093 $rs->connection = $this;
1095 if (is_array($sql)) $rs->sql = $sql[0];
1096 else $rs->sql = $sql;
1097 if ($rs->_numOfRows <= 0) {
1098 global $ADODB_COUNTRECS;
1099 if ($ADODB_COUNTRECS) {
1101 $rs = $this->_rs2rs($rs,-1,-1,!is_array($sql));
1102 $rs->_queryID = $this->_queryID;
1104 $rs->_numOfRows = 0;
1110 function CreateSequence($seqname=
'adodbseq',$startID=1)
1112 if (empty($this->_genSeqSQL))
return false;
1113 return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
1116 function DropSequence($seqname=
'adodbseq')
1118 if (empty($this->_dropSeqSQL))
return false;
1119 return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
1130 function GenID($seqname=
'adodbseq',$startID=1)
1132 if (!$this->hasGenID) {
1136 $getnext = sprintf($this->_genIDSQL,$seqname);
1138 $holdtransOK = $this->_transOK;
1140 $save_handler = $this->raiseErrorFn;
1141 $this->raiseErrorFn =
'';
1142 @($rs = $this->Execute($getnext));
1143 $this->raiseErrorFn = $save_handler;
1146 $this->_transOK = $holdtransOK;
1147 $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
1148 $rs = $this->Execute($getnext);
1150 if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
1151 else $this->genID = 0;
1153 if ($rs) $rs->Close();
1155 return $this->genID;
1163 function Insert_ID($table=
'',$column=
'')
1165 if ($this->_logsql && $this->lastInsID)
return $this->lastInsID;
1166 if ($this->hasInsertID)
return $this->_insertid($table,$column);
1168 ADOConnection::outp(
'<p>Insert_ID error</p>');
1181 function PO_Insert_ID($table=
"", $id=
"")
1183 if ($this->hasInsertID){
1184 return $this->Insert_ID($table,$id);
1186 return $this->GetOne(
"SELECT MAX($id) FROM $table");
1193 function Affected_Rows()
1195 if ($this->hasAffectedRows) {
1196 if ($this->fnExecute ===
'adodb_log_sql') {
1197 if ($this->_logsql && $this->_affected !==
false)
return $this->_affected;
1199 $val = $this->_affectedrows();
1200 return ($val < 0) ?
false : $val;
1203 if ($this->debug) ADOConnection::outp(
'<p>Affected_Rows error</p>',
false);
1213 if ($this->_errorMsg)
return '!! '.strtoupper($this->dataProvider.
' '.$this->databaseType).
': '.$this->_errorMsg;
1223 return ($this->_errorMsg) ? -1 : 0;
1226 function MetaError($err=
false)
1228 include_once(ADODB_DIR.
"/adodb-error.inc.php");
1229 if ($err ===
false) $err = $this->ErrorNo();
1230 return adodb_error($this->dataProvider,$this->databaseType,$err);
1233 function MetaErrorMsg($errno)
1235 include_once(ADODB_DIR.
"/adodb-error.inc.php");
1242 function MetaPrimaryKeys($table, $owner=
false)
1246 $objs = $this->MetaColumns($table);
1248 foreach($objs as $v) {
1249 if (!empty($v->primary_key))
1253 if (
sizeof($p))
return $p;
1254 if (function_exists(
'ADODB_VIEW_PRIMARYKEYS'))
1255 return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);
1262 function MetaForeignKeys($table, $owner=
false, $upper=
false)
1272 function SelectDB($dbName)
1295 function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=
false,$secs2cache=0)
1297 if ($this->hasTop && $nrows > 0) {
1300 $ismssql = (strpos($this->databaseType,
'mssql') !==
false);
1301 if ($ismssql) $isaccess =
false;
1302 else $isaccess = (strpos($this->databaseType,
'access') !==
false);
1308 $sql = preg_replace(
1309 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',$sql);
1311 if ($secs2cache != 0) {
1312 $ret = $this->CacheExecute($secs2cache, $sql,$inputarr);
1314 $ret = $this->Execute($sql,$inputarr);
1317 }
else if ($ismssql){
1318 $sql = preg_replace(
1319 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',$sql);
1321 $sql = preg_replace(
1322 '/(^\s*select\s)/i',
'\\1 '.$this->hasTop.
' '.((integer)$nrows).
' ',$sql);
1325 $nn = $nrows + $offset;
1326 if ($isaccess || $ismssql) {
1327 $sql = preg_replace(
1328 '/(^\s*select\s+(distinctrow|distinct)?)/i',
'\\1 '.$this->hasTop.
' '.$nn.
' ',$sql);
1330 $sql = preg_replace(
1331 '/(^\s*select\s)/i',
'\\1 '.$this->hasTop.
' '.$nn.
' ',$sql);
1338 global $ADODB_COUNTRECS;
1340 $savec = $ADODB_COUNTRECS;
1341 $ADODB_COUNTRECS =
false;
1344 if ($secs2cache != 0) $rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
1345 else $rs = $this->Execute($sql,$inputarr);
1347 $ADODB_COUNTRECS = $savec;
1348 if ($rs && !$rs->EOF) {
1349 $rs = $this->_rs2rs($rs,$nrows,$offset);
1360 function SerializableRS(&$rs)
1362 $rs2 = $this->_rs2rs($rs);
1364 $rs2->connection = $ignore;
1379 function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=
true)
1385 $dbtype = $rs->databaseType;
1390 if (($dbtype ==
'array' || $dbtype ==
'csv') && $nrows == -1 && $offset == -1) {
1396 for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
1397 $flds[] = $rs->FetchField($i);
1400 $arr = $rs->GetArrayLimit($nrows,$offset);
1402 if ($close) $rs->Close();
1404 $arrayClass = $this->arrayClass;
1406 $rs2 =
new $arrayClass();
1407 $rs2->connection = $this;
1408 $rs2->sql = $rs->sql;
1409 $rs2->dataProvider = $this->dataProvider;
1410 $rs2->InitArrayFields($arr,$flds);
1411 $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
1418 function GetAll($sql, $inputarr=
false)
1420 $arr = $this->GetArray($sql,$inputarr);
1424 function GetAssoc($sql, $inputarr=
false,$force_array =
false, $first2cols =
false)
1426 $rs = $this->Execute($sql, $inputarr);
1431 $arr = $rs->GetAssoc($force_array,$first2cols);
1435 function CacheGetAssoc($secs2cache, $sql=
false, $inputarr=
false,$force_array =
false, $first2cols =
false)
1437 if (!is_numeric($secs2cache)) {
1438 $first2cols = $force_array;
1439 $force_array = $inputarr;
1441 $rs = $this->CacheExecute($secs2cache, $sql, $inputarr);
1446 $arr = $rs->GetAssoc($force_array,$first2cols);
1457 function GetOne($sql,$inputarr=
false)
1459 global $ADODB_COUNTRECS,$ADODB_GETONE_EOF;
1460 $crecs = $ADODB_COUNTRECS;
1461 $ADODB_COUNTRECS =
false;
1464 $rs = $this->Execute($sql,$inputarr);
1466 if ($rs->EOF) $ret = $ADODB_GETONE_EOF;
1467 else $ret = reset($rs->fields);
1471 $ADODB_COUNTRECS = $crecs;
1476 function GetMedian($table, $field,$where =
'')
1478 $total = $this->GetOne(
"select count(*) from $table $where");
1479 if (!$total)
return false;
1481 $midrow = (integer) ($total/2);
1482 $rs = $this->SelectLimit(
"select $field from $table $where order by 1",1,$midrow);
1483 if ($rs && !$rs->EOF)
return reset($rs->fields);
1488 function CacheGetOne($secs2cache,$sql=
false,$inputarr=
false)
1490 global $ADODB_GETONE_EOF;
1492 $rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
1494 if ($rs->EOF) $ret = $ADODB_GETONE_EOF;
1495 else $ret = reset($rs->fields);
1502 function GetCol($sql, $inputarr =
false, $trim =
false)
1505 $rs = $this->Execute($sql, $inputarr);
1510 $rv[] = trim(reset($rs->fields));
1515 $rv[] = reset($rs->fields);
1525 function CacheGetCol($secs, $sql =
false, $inputarr =
false,$trim=
false)
1527 $rs = $this->CacheExecute($secs, $sql, $inputarr);
1532 $rv[] = trim(reset($rs->fields));
1537 $rv[] = reset($rs->fields);
1548 function Transpose(&$rs,$addfieldnames=
true)
1550 $rs2 = $this->_rs2rs($rs);
1552 if (!$rs2)
return $false;
1554 $rs2->_transpose($addfieldnames);
1565 function OffsetDate($dayFraction,$date=
false)
1567 if (!$date) $date = $this->sysDate;
1568 return '('.$date.
'+'.$dayFraction.
')';
1577 function GetArray($sql,$inputarr=
false)
1579 global $ADODB_COUNTRECS;
1581 $savec = $ADODB_COUNTRECS;
1582 $ADODB_COUNTRECS =
false;
1583 $rs = $this->Execute($sql,$inputarr);
1584 $ADODB_COUNTRECS = $savec;
1586 if (defined(
'ADODB_PEAR')) {
1593 $arr = $rs->GetArray();
1598 function CacheGetAll($secs2cache,$sql=
false,$inputarr=
false)
1600 $arr = $this->CacheGetArray($secs2cache,$sql,$inputarr);
1604 function CacheGetArray($secs2cache,$sql=
false,$inputarr=
false)
1606 global $ADODB_COUNTRECS;
1608 $savec = $ADODB_COUNTRECS;
1609 $ADODB_COUNTRECS =
false;
1610 $rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
1611 $ADODB_COUNTRECS = $savec;
1614 if (defined(
'ADODB_PEAR')) {
1621 $arr = $rs->GetArray();
1626 function GetRandRow($sql, $arr=
false)
1628 $rezarr = $this->GetAll($sql, $arr);
1629 $sz =
sizeof($rezarr);
1630 return $rezarr[abs(rand()) % $sz];
1640 function GetRow($sql,$inputarr=
false)
1642 global $ADODB_COUNTRECS;
1643 $crecs = $ADODB_COUNTRECS;
1644 $ADODB_COUNTRECS =
false;
1646 $rs = $this->Execute($sql,$inputarr);
1648 $ADODB_COUNTRECS = $crecs;
1650 if (!$rs->EOF) $arr = $rs->fields;
1651 else $arr = array();
1660 function CacheGetRow($secs2cache,$sql=
false,$inputarr=
false)
1662 $rs = $this->CacheExecute($secs2cache,$sql,$inputarr);
1664 if (!$rs->EOF) $arr = $rs->fields;
1665 else $arr = array();
1694 function Replace($table, $fieldArray, $keyCol, $autoQuote=
false, $has_autoinc=
false)
1697 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1699 return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc);
1721 function CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=
false)
1723 if (!is_numeric($secs2cache)) {
1724 if ($sql ===
false) $sql = -1;
1725 if ($offset == -1) $offset =
false;
1727 $rs = $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs);
1729 if ($sql ===
false) $this->outp_throw(
"Warning: \$sql missing from CacheSelectLimit()",
'CacheSelectLimit');
1730 $rs = $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
1745 function CacheFlush($sql=
false,$inputarr=
false)
1747 global $ADODB_CACHE_DIR, $ADODB_CACHE;
1749 if (empty($ADODB_CACHE))
return false;
1752 $ADODB_CACHE->flushall($this->debug);
1756 $f = $this->_gencachename($sql.serialize($inputarr),
false);
1757 return $ADODB_CACHE->flushcache($f, $this->debug);
1775 function _gencachename($sql,$createdir)
1777 global $ADODB_CACHE, $ADODB_CACHE_DIR;
1779 if ($this->fetchMode ===
false) {
1780 global $ADODB_FETCH_MODE;
1781 $mode = $ADODB_FETCH_MODE;
1783 $mode = $this->fetchMode;
1785 $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode);
1786 if (!$ADODB_CACHE->createdir)
return $m;
1787 if (!$createdir) $dir = $ADODB_CACHE->getdirname($m);
1788 else $dir = $ADODB_CACHE->createdir($m, $this->debug);
1790 return $dir.
'/adodb_'.$m.
'.cache';
1803 function CacheExecute($secs2cache,$sql=
false,$inputarr=
false)
1805 global $ADODB_CACHE;
1807 if (empty($ADODB_CACHE)) $this->_CreateCache();
1809 if (!is_numeric($secs2cache)) {
1812 $secs2cache = $this->cacheSecs;
1815 if (is_array($sql)) {
1822 $md5file = $this->_gencachename($sql.serialize($inputarr),
true);
1825 if ($secs2cache > 0){
1826 $rs = $ADODB_CACHE->readcache($md5file,$err,$secs2cache,$this->arrayClass);
1827 $this->numCacheHits += 1;
1831 $this->numCacheMisses += 1;
1837 if (get_magic_quotes_runtime() && !$this->memCache) {
1838 ADOConnection::outp(
"Please disable magic_quotes_runtime - it corrupts cache files :(");
1840 if ($this->debug !== -1) ADOConnection::outp(
" $md5file cache failure: $err (this is a notice and not an error)");
1843 $rs = $this->Execute($sqlparam,$inputarr);
1848 $rs = $this->_rs2rs($rs);
1849 $rs->timeCreated = time();
1852 $ok = $ADODB_CACHE->writecache($md5file,$txt,$this->debug, $secs2cache);
1854 if (
$ok ===
false) {
1855 $em =
'Cache write error';
1858 if ($fn = $this->raiseErrorFn) {
1859 $fn($this->databaseType,
'CacheExecute', $en, $em, $md5file,$sql,$this);
1862 $em =
'Cache file locked warning';
1867 if ($this->debug) ADOConnection::outp(
" ".$em);
1869 if ($rs->EOF && !$eof) {
1872 $rs->connection = $this;
1875 }
else if (!$this->memCache)
1876 $ADODB_CACHE->flushcache($md5file);
1878 $this->_errorMsg =
'';
1879 $this->_errorCode = 0;
1881 if ($this->fnCacheExecute) {
1882 $fn = $this->fnCacheExecute;
1883 $fn($this, $secs2cache, $sql, $inputarr);
1886 $rs->connection = $this;
1888 if ($this->debug == 99) adodb_backtrace();
1889 $inBrowser = isset($_SERVER[
'HTTP_USER_AGENT']);
1890 $ttl = $rs->timeCreated + $secs2cache - time();
1891 $s = is_array($sql) ? $sql[0] : $sql;
1892 if ($inBrowser) $s =
'<i>'.htmlspecialchars($s).
'</i>';
1894 ADOConnection::outp(
" $md5file reloaded, ttl=$ttl [ $s ]");
1908 function AutoExecute($table, $fields_values, $mode =
'INSERT', $where = FALSE, $forceUpdate=
true, $magicq=
false)
1911 $sql =
'SELECT * FROM '.$table;
1912 if ($where!==FALSE) $sql .=
' WHERE '.$where;
1913 else if ($mode ==
'UPDATE' || $mode == 2 ) {
1914 $this->outp_throw(
'AutoExecute: Illegal mode=UPDATE with empty WHERE clause',
'AutoExecute');
1918 $rs = $this->SelectLimit($sql,1);
1919 if (!$rs)
return $false;
1920 $rs->tableName = $table;
1923 switch((
string) $mode) {
1926 $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq);
1930 $sql = $this->GetInsertSQL($rs, $fields_values, $magicq);
1933 $this->outp_throw(
"AutoExecute: Unknown mode=$mode",
'AutoExecute');
1937 if ($sql) $ret = $this->Execute($sql);
1938 if ($ret) $ret =
true;
1954 function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=
false,$magicq=
false,$force=null)
1961 if (!isset($force)) {
1962 global $ADODB_FORCE_TYPE;
1963 $force = $ADODB_FORCE_TYPE;
1967 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
1979 function GetInsertSQL(&$rs, $arrFields,$magicq=
false,$force=null)
1982 if (!isset($force)) {
1983 global $ADODB_FORCE_TYPE;
1984 $force = $ADODB_FORCE_TYPE;
1987 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
2011 function UpdateBlob($table,$column,$val,$where,$blobtype=
'BLOB')
2013 return $this->Execute(
"UPDATE $table SET $column=? WHERE $where",array($val)) !=
false;
2025 function UpdateBlobFile($table,$column,$path,$where,$blobtype=
'BLOB')
2027 $fd = fopen($path,
'rb');
2028 if ($fd ===
false)
return false;
2029 $val = fread($fd,filesize($path));
2031 return $this->UpdateBlob($table,$column,$val,$where,$blobtype);
2034 function BlobDecode($blob)
2039 function BlobEncode($blob)
2044 function SetCharSet($charset)
2049 function IfNull( $field, $ifNull )
2051 return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
2054 function LogSQL($enable=
true)
2056 include_once(ADODB_DIR.
'/adodb-perf.inc.php');
2058 if ($enable) $this->fnExecute =
'adodb_log_sql';
2059 else $this->fnExecute =
false;
2061 $old = $this->_logsql;
2062 $this->_logsql = $enable;
2063 if ($enable && !$old) $this->_affected =
false;
2067 function GetCharSet()
2079 function UpdateClob($table,$column,$val,$where)
2081 return $this->UpdateBlob($table,$column,$val,$where,
'CLOB');
2086 function MetaType($t,$len=-1,$fieldobj=
false)
2089 if (empty($this->_metars)) {
2090 $rsclass = $this->rsPrefix.$this->databaseType;
2091 $this->_metars =
new $rsclass(
false,$this->fetchMode);
2092 $this->_metars->connection = $this;
2094 return $this->_metars->MetaType($t,$len,$fieldobj);
2102 function SetDateLocale($locale =
'En')
2104 $this->locale = $locale;
2105 switch (strtoupper($locale))
2108 $this->fmtDate=
"'Y-m-d'";
2109 $this->fmtTimeStamp =
"'Y-m-d H:i:s'";
2113 $this->fmtDate =
"'m-d-Y'";
2114 $this->fmtTimeStamp =
"'m-d-Y H:i:s'";
2122 $this->fmtDate=
"'d-m-Y'";
2123 $this->fmtTimeStamp =
"'d-m-Y H:i:s'";
2127 $this->fmtDate=
"'d.m.Y'";
2128 $this->fmtTimeStamp =
"'d.m.Y H:i:s'";
2132 $this->fmtDate=
"'Y-m-d'";
2133 $this->fmtTimeStamp =
"'Y-m-d H:i:s'";
2151 function GetActiveRecordsClass(
2152 $class, $table,$whereOrderBy=
false,$bindarr=
false, $primkeyArr=
false,
2157 ## reduce overhead of adodb.inc.php -- moved to adodb-active-record.inc.php
2158 ## if adodb-active-recordx is loaded -- should be no issue as they will probably use Find()
2159 if (!isset($_ADODB_ACTIVE_DBS))include_once(ADODB_DIR.
'/adodb-active-record.inc.php');
2163 function GetActiveRecords($table,$where=
false,$bindarr=
false,$primkeyArr=
false)
2165 $arr = $this->GetActiveRecordsClass(
'ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr);
2174 $rez = $this->_close();
2175 $this->_connectionID =
false;
2184 function BeginTrans()
2186 if ($this->debug) ADOConnection::outp(
"BeginTrans: Transactions not supported for this driver");
2191 function SetTransactionMode( $transaction_mode )
2193 $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider);
2194 $this->_transmode = $transaction_mode;
2202 function MetaTransaction($mode,$db)
2204 $mode = strtoupper($mode);
2205 $mode = str_replace(
'ISOLATION LEVEL ',
'',$mode);
2209 case 'READ UNCOMMITTED':
2213 return 'ISOLATION LEVEL READ COMMITTED';
2215 return 'ISOLATION LEVEL READ UNCOMMITTED';
2219 case 'READ COMMITTED':
2220 return 'ISOLATION LEVEL READ COMMITTED';
2223 case 'REPEATABLE READ':
2227 return 'ISOLATION LEVEL SERIALIZABLE';
2229 return 'ISOLATION LEVEL REPEATABLE READ';
2233 case 'SERIALIZABLE':
2234 return 'ISOLATION LEVEL SERIALIZABLE';
2249 function CommitTrans(
$ok=
true)
2258 function RollbackTrans()
2268 function MetaDatabases()
2270 global $ADODB_FETCH_MODE;
2272 if ($this->metaDatabasesSQL) {
2273 $save = $ADODB_FETCH_MODE;
2274 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2276 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2278 $arr = $this->GetCol($this->metaDatabasesSQL);
2279 if (isset($savem)) $this->SetFetchMode($savem);
2280 $ADODB_FETCH_MODE = $save;
2306 function MetaProcedures($procedureNamePattern = null, $catalog = null, $schemaPattern = null)
2322 function MetaTables($ttype=
false,$showSchema=
false,$mask=
false)
2324 global $ADODB_FETCH_MODE;
2331 if ($this->metaTablesSQL) {
2332 $save = $ADODB_FETCH_MODE;
2333 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2335 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2337 $rs = $this->Execute($this->metaTablesSQL);
2338 if (isset($savem)) $this->SetFetchMode($savem);
2339 $ADODB_FETCH_MODE = $save;
2341 if ($rs ===
false)
return $false;
2342 $arr = $rs->GetArray();
2345 if ($hast = ($ttype && isset($arr[0][1]))) {
2346 $showt = strncmp($ttype,
'T',1);
2349 for ($i=0; $i <
sizeof($arr); $i++) {
2352 if (strncmp($arr[$i][1],
'T',1) == 0) $arr2[] = trim($arr[$i][0]);
2354 if (strncmp($arr[$i][1],
'V',1) == 0) $arr2[] = trim($arr[$i][0]);
2357 $arr2[] = trim($arr[$i][0]);
2366 function _findschema(&$table,&$schema)
2368 if (!$schema && ($at = strpos($table,
'.')) !==
false) {
2369 $schema = substr($table,0,$at);
2370 $table = substr($table,$at+1);
2384 function MetaColumns($table,$normalize=
true)
2386 global $ADODB_FETCH_MODE;
2390 if (!empty($this->metaColumnsSQL)) {
2393 $this->_findschema($table,$schema);
2395 $save = $ADODB_FETCH_MODE;
2396 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
2397 if ($this->fetchMode !==
false) $savem = $this->SetFetchMode(
false);
2398 $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table));
2399 if (isset($savem)) $this->SetFetchMode($savem);
2400 $ADODB_FETCH_MODE = $save;
2401 if ($rs ===
false || $rs->EOF)
return $false;
2405 $fld =
new ADOFieldObject();
2406 $fld->name = $rs->fields[0];
2407 $fld->type = $rs->fields[1];
2408 if (isset($rs->fields[3]) && $rs->fields[3]) {
2409 if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3];
2410 $fld->scale = $rs->fields[4];
2411 if ($fld->scale>0) $fld->max_length += 1;
2413 $fld->max_length = $rs->fields[2];
2415 if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
2416 else $retarr[strtoupper($fld->name)] = $fld;
2443 function MetaIndexes($table, $primary =
false, $owner =
false)
2455 function MetaColumnNames($table, $numIndexes=
false,$useattnum=
false )
2457 $objarr = $this->MetaColumns($table);
2458 if (!is_array($objarr)) {
2466 foreach($objarr as $v)
2467 $arr[$v->attnum] = $v->name;
2470 foreach($objarr as $v) $arr[$i++] = $v->name;
2472 foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name;
2489 $arr = func_get_args();
2490 return implode($this->concat_operator, $arr);
2501 function DBDate($d, $isfld=
false)
2503 if (empty($d) && $d !== 0)
return 'null';
2504 if ($isfld)
return $d;
2506 if (is_object($d))
return $d->format($this->fmtDate);
2509 if (is_string($d) && !is_numeric($d)) {
2510 if ($d ===
'null')
return $d;
2511 if (strncmp($d,
"'",1) === 0) {
2512 $d = _adodb_safedateq($d);
2515 if ($this->isoDates)
return "'$d'";
2516 $d = ADOConnection::UnixDate($d);
2522 function BindDate($d)
2524 $d = $this->DBDate($d);
2525 if (strncmp($d,
"'",1))
return $d;
2527 return substr($d,1,strlen($d)-2);
2530 function BindTimeStamp($d)
2532 $d = $this->DBTimeStamp($d);
2533 if (strncmp($d,
"'",1))
return $d;
2535 return substr($d,1,strlen($d)-2);
2546 function DBTimeStamp($ts,$isfld=
false)
2548 if (empty($ts) && $ts !== 0)
return 'null';
2549 if ($isfld)
return $ts;
2550 if (is_object($ts))
return $ts->format($this->fmtTimeStamp);
2552 # strlen(14) allows YYYYMMDDHHMMSS format
2553 if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14))
2556 if ($ts ===
'null')
return $ts;
2557 if ($this->isoDates && strlen($ts) !== 14) {
2558 $ts = _adodb_safedate($ts);
2561 $ts = ADOConnection::UnixTimeStamp($ts);
2571 static function UnixDate($v)
2573 if (is_object($v)) {
2576 return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
2579 if (is_numeric($v) && strlen($v) !== 8)
return $v;
2580 if (!preg_match(
"|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
2581 ($v), $rr))
return false;
2583 if ($rr[1] <= TIMESTAMP_FIRST_YEAR)
return 0;
2595 static function UnixTimeStamp($v)
2597 if (is_object($v)) {
2600 return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
2604 "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
2605 ($v), $rr))
return false;
2607 if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1)
return 0;
2610 if (!isset($rr[5]))
return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
2611 return @
adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
2625 function UserDate($v,$fmt=
'Y-m-d',$gmt=
false)
2627 $tt = $this->UnixDate($v);
2630 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
2631 else if ($tt == 0)
return $this->emptyDate;
2632 else if ($tt == -1) {
2646 function UserTimeStamp($v,$fmt=
'Y-m-d H:i:s',$gmt=
false)
2648 if (!isset($v))
return $this->emptyTimeStamp;
2649 # strlen(14) allows YYYYMMDDHHMMSS format
2651 $tt = $this->UnixTimeStamp($v);
2653 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
2654 if ($tt == 0)
return $this->emptyTimeStamp;
2658 function escape($s,$magic_quotes=
false)
2660 return $this->addq($s,$magic_quotes);
2666 function addq($s,$magic_quotes=
false)
2668 if (!$magic_quotes) {
2670 if ($this->replaceQuote[0] ==
'\\'){
2672 $s = adodb_str_replace(array(
'\\',
"\0"),array(
'\\\\',
"\\\0"),$s);
2675 return str_replace(
"'",$this->replaceQuote,$s);
2679 $s = str_replace(
'\\"',
'"',$s);
2681 if ($this->replaceQuote ==
"\\'" || ini_get(
'magic_quotes_sybase'))
2684 $s = str_replace(
'\\\\',
'\\',$s);
2685 return str_replace(
"\\'",$this->replaceQuote,$s);
2700 function qstr($s,$magic_quotes=
false)
2702 if (!$magic_quotes) {
2704 if ($this->replaceQuote[0] ==
'\\'){
2706 $s = adodb_str_replace(array(
'\\',
"\0"),array(
'\\\\',
"\\\0"),$s);
2709 return "'".str_replace(
"'",$this->replaceQuote,$s).
"'";
2713 $s = str_replace(
'\\"',
'"',$s);
2715 if ($this->replaceQuote ==
"\\'" || ini_get(
'magic_quotes_sybase'))
2718 $s = str_replace(
'\\\\',
'\\',$s);
2719 return "'".str_replace(
"\\'",$this->replaceQuote,$s).
"'";
2741 function PageExecute($sql, $nrows, $page, $inputarr=
false, $secs2cache=0)
2744 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
2763 function CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=
false)
2771 $rs = $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache);
2793 class ADODB_Iterator_empty
implements Iterator {
2797 function __construct($rs)
2807 return !$this->rs->EOF;
2824 function __call($func,
$params)
2826 return call_user_func_array(array($this->rs, $func),
$params);
2840 class ADORecordSet_empty
implements IteratorAggregate
2842 var $dataProvider =
'empty';
2843 var $databaseType =
false;
2845 var $_numOfRows = 0;
2846 var $fields =
false;
2847 var $connection =
false;
2848 function RowCount() {
return 0;}
2849 function RecordCount() {
return 0;}
2850 function PO_RecordCount(){
return 0;}
2851 function Close(){
return true;}
2852 function FetchRow() {
return false;}
2853 function FieldCount(){
return 0;}
2855 function getIterator() {
return new ADODB_Iterator_empty($this);}
2856 function GetAssoc() {
return array();}
2862 if (!defined(
'ADODB_DATE_VERSION')) include(ADODB_DIR.
'/adodb-time.inc.php');
2868 class ADODB_Iterator
implements Iterator {
2872 function __construct($rs)
2878 $this->rs->MoveFirst();
2883 return !$this->rs->EOF;
2888 return $this->rs->_currentRow;
2893 return $this->rs->fields;
2898 $this->rs->MoveNext();
2901 function __call($func,
$params)
2903 return call_user_func_array(array($this->rs, $func),
$params);
2909 return !$this->rs->EOF;
2922 class ADORecordSet
implements IteratorAggregate {
2926 var $dataProvider =
"native";
2927 var $fields =
false;
2928 var $blobSize = 100;
2929 var $canSeek =
false;
2934 var $emptyTimeStamp =
' ';
2935 var $emptyDate =
' ';
2941 var $connection =
false;
2945 var $_numOfRows = -1;
2946 var $_numOfFields = -1;
2948 var $_currentRow = -1;
2949 var $_closed =
false;
2950 var $_inited =
false;
2954 var $_currentPage = -1;
2955 var $_atFirstPage =
false;
2956 var $_atLastPage =
false;
2957 var $_lastPageNo = -1;
2958 var $_maxRecordCount = 0;
2959 var $datetime =
false;
2967 function ADORecordSet($queryID)
2969 $this->_queryID = $queryID;
2972 function getIterator()
2974 return new ADODB_Iterator($this);
2978 function __toString()
2980 include_once(ADODB_DIR.
'/toexport.inc.php');
2987 if ($this->_inited)
return;
2988 $this->_inited =
true;
2989 if ($this->_queryID) @$this->_initrs();
2991 $this->_numOfRows = 0;
2992 $this->_numOfFields = 0;
2994 if ($this->_numOfRows != 0 && $this->_numOfFields && $this->_currentRow == -1) {
2996 $this->_currentRow = 0;
2997 if ($this->EOF = ($this->_fetch() ===
false)) {
2998 $this->_numOfRows = 0;
3026 function GetMenu($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,
3027 $size=0, $selectAttr=
'',$compareFields0=
true)
3030 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3031 return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple,
3032 $size, $selectAttr,$compareFields0);
3044 function GetMenu2($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,$size=0, $selectAttr=
'')
3046 return $this->GetMenu($name,$defstr,$blank1stItem,$multiple,
3047 $size, $selectAttr,
false);
3053 function GetMenu3($name,$defstr=
'',$blank1stItem=
true,$multiple=
false,
3054 $size=0, $selectAttr=
'')
3057 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3059 $size, $selectAttr,
false);
3069 function GetArray($nRows = -1)
3071 global $ADODB_EXTENSION;
if ($ADODB_EXTENSION) {
3072 $results = adodb_getall($this,$nRows);
3077 while (!$this->EOF && $nRows !=
$cnt) {
3078 $results[] = $this->fields;
3085 function GetAll($nRows = -1)
3087 $arr = $this->GetArray($nRows);
3095 function NextRecordSet()
3109 function GetArrayLimit($nrows,$offset=-1)
3112 $arr = $this->GetArray($nrows);
3116 $this->Move($offset);
3120 while (!$this->EOF && $nrows !=
$cnt) {
3121 $results[
$cnt++] = $this->fields;
3136 function GetRows($nRows = -1)
3138 $arr = $this->GetArray($nRows);
3158 function GetAssoc($force_array =
false, $first2cols =
false)
3160 global $ADODB_EXTENSION;
3162 $cols = $this->_numOfFields;
3167 $numIndex = isset($this->fields[0]) && isset($this->fields[1]);
3170 if (!$first2cols && ($cols > 2 || $force_array)) {
3171 if ($ADODB_EXTENSION) {
3173 while (!$this->EOF) {
3174 $results[trim($this->fields[0])] = array_slice($this->fields, 1);
3175 adodb_movenext($this);
3178 while (!$this->EOF) {
3180 $keys = array_slice(array_keys($this->fields), 1);
3181 $sliced_array = array();
3183 foreach($keys as $key) {
3184 $sliced_array[$key] = $this->fields[$key];
3187 $results[trim(reset($this->fields))] = $sliced_array;
3188 adodb_movenext($this);
3193 while (!$this->EOF) {
3194 $results[trim($this->fields[0])] = array_slice($this->fields, 1);
3198 while (!$this->EOF) {
3200 $keys = array_slice(array_keys($this->fields), 1);
3201 $sliced_array = array();
3203 foreach($keys as $key) {
3204 $sliced_array[$key] = $this->fields[$key];
3207 $results[trim(reset($this->fields))] = $sliced_array;
3213 if ($ADODB_EXTENSION) {
3216 while (!$this->EOF) {
3218 $results[trim(($this->fields[0]))] = $this->fields[1];
3219 adodb_movenext($this);
3222 while (!$this->EOF) {
3224 $v1 = trim(reset($this->fields));
3225 $v2 =
''.next($this->fields);
3226 $results[$v1] = $v2;
3227 adodb_movenext($this);
3232 while (!$this->EOF) {
3234 $results[trim(($this->fields[0]))] = $this->fields[1];
3238 while (!$this->EOF) {
3240 $v1 = trim(reset($this->fields));
3241 $v2 =
''.next($this->fields);
3242 $results[$v1] = $v2;
3249 $ref = $results; # workaround accelerator incompat with PHP 4.4 :(
3261 function UserTimeStamp($v,$fmt=
'Y-m-d H:i:s')
3263 if (is_numeric($v) && strlen($v)<14)
return adodb_date($fmt,$v);
3264 $tt = $this->UnixTimeStamp($v);
3266 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
3267 if ($tt === 0)
return $this->emptyTimeStamp;
3278 function UserDate($v,$fmt=
'Y-m-d')
3280 $tt = $this->UnixDate($v);
3282 if (($tt ===
false || $tt == -1) && $v !=
false)
return $v;
3283 else if ($tt == 0)
return $this->emptyDate;
3284 else if ($tt == -1) {
3295 static function UnixDate($v)
3297 return ADOConnection::UnixDate($v);
3306 static function UnixTimeStamp($v)
3308 return ADOConnection::UnixTimeStamp($v);
3317 return $this->Close();
3326 return $this->_numOfRows;
3335 return $this->_numOfFields;
3350 $arr = $this->fields;
3351 $this->_currentRow++;
3352 if (!$this->_fetch()) $this->EOF =
true;
3363 function FetchInto(&$arr)
3365 if ($this->EOF)
return (defined(
'PEAR_ERROR_RETURN')) ?
new PEAR_Error(
'EOF',-1): false;
3366 $arr = $this->fields;
3377 function MoveFirst()
3379 if ($this->_currentRow == 0)
return true;
3380 return $this->Move(0);
3391 if ($this->_numOfRows >= 0)
return $this->Move($this->_numOfRows-1);
3392 if ($this->EOF)
return false;
3393 while (!$this->EOF) {
3411 $this->_currentRow++;
3412 if ($this->_fetch())
return true;
3434 function Move($rowNumber = 0)
3437 if ($rowNumber == $this->_currentRow)
return true;
3438 if ($rowNumber >= $this->_numOfRows)
3439 if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2;
3441 if ($this->canSeek) {
3443 if ($this->_seek($rowNumber)) {
3444 $this->_currentRow = $rowNumber;
3445 if ($this->_fetch()) {
3453 if ($rowNumber < $this->_currentRow)
return false;
3454 global $ADODB_EXTENSION;
3455 if ($ADODB_EXTENSION) {
3456 while (!$this->EOF && $this->_currentRow < $rowNumber) {
3457 adodb_movenext($this);
3461 while (! $this->EOF && $this->_currentRow < $rowNumber) {
3462 $this->_currentRow++;
3464 if (!$this->_fetch()) $this->EOF =
true;
3467 return !($this->EOF);
3470 $this->fields =
false;
3484 function Fields($colname)
3486 return $this->fields[$colname];
3495 function GetAssocKeys($upper=ADODB_ASSOC_CASE_UPPER)
3497 $this->bind = array();
3498 for ($i=0; $i < $this->_numOfFields; $i++) {
3499 $o = $this->FetchField($i);
3501 case ADODB_ASSOC_CASE_LOWER:
3502 $key = strtolower($o->name);
3504 case ADODB_ASSOC_CASE_UPPER:
3505 $key = strtoupper($o->name);
3507 case ADODB_ASSOC_CASE_NATIVE:
3512 $val = $this->fetchMode == ADODB_FETCH_ASSOC ? $o->name : $i;
3513 $this->bind[$key] = $val;
3524 function GetRowAssoc($upper=ADODB_ASSOC_CASE_UPPER)
3528 $this->GetAssocKeys($upper);
3530 foreach($this->bind as $k => $v) {
3531 if( array_key_exists( $v, $this->fields ) ) {
3532 $record[$k] = $this->fields[$v];
3533 } elseif( array_key_exists( $k, $this->fields ) ) {
3534 $record[$k] = $this->fields[$k];
3536 # This should not happen... trigger error ?
3553 if (!$this->_closed) {
3554 $this->_closed =
true;
3555 return $this->_close();
3565 function RecordCount() {
return $this->_numOfRows;}
3572 function MaxRecordCount()
3574 return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount();
3582 function RowCount() {
return $this->_numOfRows;}
3593 function PO_RecordCount($table=
"", $condition=
"") {
3595 $lnumrows = $this->_numOfRows;
3597 if ($lnumrows == -1 && $this->connection) {
3599 if ($condition) $condition =
" WHERE " . $condition;
3600 $resultrows = $this->connection->Execute(
"SELECT COUNT(*) FROM $table $condition");
3601 if ($resultrows) $lnumrows = reset($resultrows->fields);
3611 function CurrentRow() {
return $this->_currentRow;}
3618 function AbsolutePosition() {
return $this->_currentRow;}
3624 function FieldCount() {
return $this->_numOfFields;}
3634 function FetchField($fieldoffset = -1)
3646 function FieldTypesArray()
3649 for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
3650 $arr[] = $this->FetchField($i);
3662 $o = $this->FetchObject(
false);
3674 function FetchObject($isupper=
true)
3676 if (empty($this->_obj)) {
3677 $this->_obj =
new ADOFetchObj();
3678 $this->_names = array();
3679 for ($i=0; $i <$this->_numOfFields; $i++) {
3680 $f = $this->FetchField($i);
3681 $this->_names[] = $f->name;
3685 if (PHP_VERSION >= 5) $o = clone($this->_obj);
3686 else $o = $this->_obj;
3688 for ($i=0; $i <$this->_numOfFields; $i++) {
3689 $name = $this->_names[$i];
3690 if ($isupper) $n = strtoupper($name);
3693 $o->$n = $this->Fields($name);
3707 function FetchNextObj()
3709 $o = $this->FetchNextObject(
false);
3725 function FetchNextObject($isupper=
true)
3728 if ($this->_numOfRows != 0 && !$this->EOF) {
3729 $o = $this->FetchObject($isupper);
3730 $this->_currentRow++;
3731 if ($this->_fetch())
return $o;
3761 function MetaType($t,$len=-1,$fieldobj=
false)
3763 if (is_object($t)) {
3765 $t = $fieldobj->type;
3766 $len = $fieldobj->max_length;
3769 static $typeMap = array(
3780 'INTERVAL' =>
'C', # Postgres
3781 'MACADDR' =>
'C', # postgres
3782 'VAR_STRING' =>
'C', # mysql
3797 'LONGBINARY' =>
'B',
3804 'UNIQUEIDENTIFIER' =>
'C', # MS SQL Server
3806 'SMALLDATETIME' =>
'T',
3810 'TIMESTAMPTZ' =>
'T',
3812 'TIMESTAMP WITHOUT TIME ZONE' =>
'T',
3822 'INT IDENTITY' =>
'R',
3829 'INTEGER UNSIGNED' =>
'I',
3841 'DOUBLE PRECISION' =>
'N',
3842 'SMALLFLOAT' =>
'N',
3853 'SQLSMFLOAT' =>
'N',
3856 'SQLDECIMAL' =>
'N',
3861 'SQLINTERVAL' =>
'N',
3866 "SQLSERIAL8" =>
'I8',
3869 "SQLLVARCHAR" =>
'X',
3874 $t = strtoupper($t);
3875 $tmap = (isset($typeMap[$t])) ? $typeMap[$t] :
'N';
3880 if ($this->blobSize >= 0) {
3881 if ($len > $this->blobSize)
return 'X';
3882 }
else if ($len > 250) {
3888 if (!empty($fieldobj->primary_key))
return 'R';
3895 if (isset($fieldobj->binary))
3896 return ($fieldobj->binary) ?
'B' :
'X';
3900 if (!empty($this->connection) && !empty($this->connection->datetime))
return 'T';
3904 if ($t ==
'LONG' && $this->dataProvider ==
'oci8')
return 'B';
3910 function _close() {}
3915 function AbsolutePage($page=-1)
3917 if ($page != -1) $this->_currentPage = $page;
3918 return $this->_currentPage;
3924 function AtFirstPage($status=
false)
3926 if ($status !=
false) $this->_atFirstPage = $status;
3927 return $this->_atFirstPage;
3930 function LastPageNo($page =
false)
3932 if ($page !=
false) $this->_lastPageNo = $page;
3933 return $this->_lastPageNo;
3939 function AtLastPage($status=
false)
3941 if ($status !=
false) $this->_atLastPage = $status;
3942 return $this->_atLastPage;
3958 class ADORecordSet_array
extends ADORecordSet
3960 var $databaseType =
'array';
3967 var $canSeek =
true;
3968 var $affectedrows =
false;
3969 var $insertid =
false;
3971 var $compat =
false;
3976 function ADORecordSet_array($fakeid=1)
3978 global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH;
3981 $this->compat = !empty($ADODB_COMPAT_FETCH);
3982 $this->ADORecordSet($fakeid);
3983 $this->fetchMode = $ADODB_FETCH_MODE;
3986 function _transpose($addfieldnames=
true)
3990 if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.
'/adodb-lib.inc.php');
3993 $fobjs = $addfieldnames ? $this->_fieldobjects :
false;
3997 $this->_skiprow1 =
false;
3998 $this->_array = $newarr;
3999 $this->_colnames = $hdr;
4003 $this->_fieldobjects = array();
4005 foreach($hdr as $k => $name) {
4006 $f =
new ADOFieldObject();
4008 $f->type = $this->_types[$k];
4009 $f->max_length = -1;
4010 $this->_fieldobjects[] = $f;
4012 $this->fields = reset($this->_array);
4029 function InitArray($array,$typearr,$colnames=
false)
4031 $this->_array = $array;
4032 $this->_types = $typearr;
4034 $this->_skiprow1 =
false;
4035 $this->_colnames = $colnames;
4037 $this->_skiprow1 =
true;
4038 $this->_colnames = $array[0];
4050 function InitArrayFields(&$array,&$fieldarr)
4052 $this->_array = $array;
4053 $this->_skiprow1=
false;
4055 $this->_fieldobjects = $fieldarr;
4060 function GetArray($nRows=-1)
4062 if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) {
4063 return $this->_array;
4065 $arr = ADORecordSet::GetArray($nRows);
4072 $this->_numOfRows =
sizeof($this->_array);
4073 if ($this->_skiprow1) $this->_numOfRows -= 1;
4075 $this->_numOfFields =(isset($this->_fieldobjects)) ?
4076 sizeof($this->_fieldobjects):
sizeof($this->_types);
4080 function Fields($colname)
4082 $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode;
4084 if ($mode & ADODB_FETCH_ASSOC) {
4085 if (!isset($this->fields[$colname]) && !is_null($this->fields[$colname])) $colname = strtolower($colname);
4086 return $this->fields[$colname];
4089 $this->bind = array();
4090 for ($i=0; $i < $this->_numOfFields; $i++) {
4091 $o = $this->FetchField($i);
4092 $this->bind[strtoupper($o->name)] = $i;
4095 return $this->fields[$this->bind[strtoupper($colname)]];
4098 function FetchField($fieldOffset = -1)
4100 if (isset($this->_fieldobjects)) {
4101 return $this->_fieldobjects[$fieldOffset];
4103 $o =
new ADOFieldObject();
4104 $o->name = $this->_colnames[$fieldOffset];
4105 $o->type = $this->_types[$fieldOffset];
4106 $o->max_length = -1;
4111 function _seek($row)
4113 if (
sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) {
4114 $this->_currentRow = $row;
4115 if ($this->_skiprow1) $row += 1;
4116 $this->fields = $this->_array[$row];
4125 $this->_currentRow++;
4127 $pos = $this->_currentRow;
4129 if ($this->_numOfRows <= $pos) {
4130 if (!$this->compat) $this->fields =
false;
4132 if ($this->_skiprow1) $pos += 1;
4133 $this->fields = $this->_array[$pos];
4144 $pos = $this->_currentRow;
4146 if ($this->_numOfRows <= $pos) {
4147 if (!$this->compat) $this->fields =
false;
4150 if ($this->_skiprow1) $pos += 1;
4151 $this->fields = $this->_array[$pos];
4171 function ADOLoadDB($dbType)
4173 return ADOLoadCode($dbType);
4179 function ADOLoadCode($dbType)
4181 global $ADODB_LASTDB;
4183 if (!$dbType)
return false;
4184 $db = strtolower($dbType);
4187 if (PHP_VERSION >= 5) $db =
'ado5';
4191 case 'maxsql': $class = $db =
'mysqlt';
break;
4194 case 'pgsql': $class = $db =
'postgres7';
break;
4196 $class = $db;
break;
4199 $file = ADODB_DIR.
"/drivers/adodb-".$db.
".inc.php";
4200 @include_once($file);
4201 $ADODB_LASTDB = $class;
4202 if (class_exists(
"ADODB_" . $class))
return $class;
4205 if (!file_exists($file)) ADOConnection::outp(
"Missing file: $file");
4206 else ADOConnection::outp(
"Syntax error in file: $file");
4213 function NewADOConnection($db=
'')
4215 $tmp = ADONewConnection($db);
4227 function ADONewConnection($db=
'')
4229 GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB;
4231 if (!defined(
'ADODB_ASSOC_CASE')) define(
'ADODB_ASSOC_CASE',2);
4234 if (($at = strpos($db,
'://')) !== FALSE) {
4236 $fakedsn =
'fake'.substr($origdsn,$at);
4237 if (($at2 = strpos($origdsn,
'@/')) !== FALSE) {
4239 $fakedsn = str_replace(
'@/',
'@adodb-fakehost/',$fakedsn);
4242 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');