00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00035 if (!defined('_ADODB_LAYER')) {
00036 define('_ADODB_LAYER',1);
00037
00038
00039
00040
00041
00042
00047 if (!defined('ADODB_DIR')) define('ADODB_DIR',dirname(__FILE__));
00048
00049
00050
00051
00052
00053 GLOBAL
00054 $ADODB_vers,
00055 $ADODB_COUNTRECS,
00056 $ADODB_CACHE_DIR,
00057 $ADODB_EXTENSION,
00058 $ADODB_COMPAT_FETCH,
00059 $ADODB_FETCH_MODE;
00060
00061
00062
00063
00064
00065 $ADODB_EXTENSION = defined('ADODB_EXTENSION');
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 define('ADODB_FORCE_IGNORE',0);
00078 define('ADODB_FORCE_NULL',1);
00079 define('ADODB_FORCE_EMPTY',2);
00080 define('ADODB_FORCE_VALUE',3);
00081
00082
00083
00084 if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
00085
00086 define('ADODB_BAD_RS','<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>');
00087
00088
00089 define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)');
00090
00091 // prefetching used by oracle
00092 if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10);
00093
00094
00095 /*
00096 Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names.
00097 This currently works only with mssql, odbc, oci8po and ibase derived drivers.
00098
00099 0 = assoc lowercase field names. $rs->fields['orderid']
00100 1 = assoc uppercase field names. $rs->fields['ORDERID']
00101 2 = use native-case field names. $rs->fields['OrderID']
00102 */
00103
00104 define('ADODB_FETCH_DEFAULT',0);
00105 define('ADODB_FETCH_NUM',1);
00106 define('ADODB_FETCH_ASSOC',2);
00107 define('ADODB_FETCH_BOTH',3);
00108
00109 if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100);
00110
00111 // PHP's version scheme makes converting to numbers difficult - workaround
00112 $_adodb_ver = (float) PHP_VERSION;
00113 if ($_adodb_ver >= 5.0) {
00114 define('ADODB_PHPVER',0x5000);
00115 } else if ($_adodb_ver > 4.299999) { # 4.3
00116 define('ADODB_PHPVER',0x4300);
00117 } else if ($_adodb_ver > 4.199999) { # 4.2
00118 define('ADODB_PHPVER',0x4200);
00119 } else if (strnatcmp(PHP_VERSION,'4.0.5')>=0) {
00120 define('ADODB_PHPVER',0x4050);
00121 } else {
00122 define('ADODB_PHPVER',0x4000);
00123 }
00124 }
00125
00126 //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
00127
00128
00132 function ADODB_str_replace($src, $dest, $data)
00133 {
00134 if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data);
00135
00136 $s = reset($src);
00137 $d = reset($dest);
00138 while ($s !== false) {
00139 $data = str_replace($s,$d,$data);
00140 $s = next($src);
00141 $d = next($dest);
00142 }
00143 return $data;
00144 }
00145
00146 function ADODB_Setup()
00147 {
00148 GLOBAL
00149 $ADODB_vers, // database version
00150 $ADODB_COUNTRECS, // count number of records returned - slows down query
00151 $ADODB_CACHE_DIR, // directory to cache recordsets
00152 $ADODB_FETCH_MODE,
00153 $ADODB_FORCE_TYPE;
00154
00155 $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT;
00156 $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE;
00157
00158
00159 if (!isset($ADODB_CACHE_DIR)) {
00160 $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp';
00161 } else {
00162 // do not accept url based paths, eg. http:/ or ftp:/
00163 if (strpos($ADODB_CACHE_DIR,'://') !== false)
00164 die("Illegal path http:
00165 }
00166
00167
00168
00169 srand(((double)microtime())*1000000);
00170
00174 $ADODB_vers = 'V4.80 8 Mar 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.';
00175
00181 if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true;
00182 }
00183
00184
00185
00186
00187
00188
00189 ADODB_Setup();
00190
00191
00192
00193
00197 class ADOFieldObject {
00198 var $name = '';
00199 var $max_length=0;
00200 var $type="";
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211 }
00212
00213
00214
00215 function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
00216 {
00217
00218 $thisConnection->_transOK = false;
00219 if ($thisConnection->_oldRaiseFn) {
00220 $fn = $thisConnection->_oldRaiseFn;
00221 $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection);
00222 }
00223 }
00224
00225
00226
00227
00228
00232 class ADOConnection {
00233
00234
00235
00236 var $dataProvider = 'native';
00237 var $databaseType = '';
00238 var $database = '';
00239 var $host = '';
00240 var $user = '';
00241 var $password = '';
00242 var $debug = false;
00243 var $maxblobsize = 262144;
00244 var $concat_operator = '+';
00245 var $substr = 'substr';
00246 var $length = 'length';
00247 var $random = 'rand()';
00248 var $upperCase = 'upper';
00249 var $fmtDate = "'Y-m-d'";
00250 var $fmtTimeStamp = "'Y-m-d, h:i:s A'";
00251 var $true = '1';
00252 var $false = '0';
00253 var $replaceQuote = "\\'";
00254 var $nameQuote = '"';
00255 var $charSet=false;
00256 var $metaDatabasesSQL = '';
00257 var $metaTablesSQL = '';
00258 var $uniqueOrderBy = false;
00259 var $emptyDate = ' ';
00260 var $emptyTimeStamp = ' ';
00261 var $lastInsID = false;
00262
00263 var $hasInsertID = false;
00264 var $hasAffectedRows = false;
00265 var $hasTop = false;
00266 var $hasLimit = false;
00267 var $readOnly = false;
00268 var $hasMoveFirst = false;
00269 var $hasGenID = false;
00270 var $hasTransactions = true;
00271
00272 var $genID = 0;
00273 var $raiseErrorFn = false;
00274 var $isoDates = false;
00275 var $cacheSecs = 3600;
00276 var $sysDate = false;
00277 var $sysTimeStamp = false;
00278 var $arrayClass = 'ADORecordSet_array';
00279
00280 var $noNullStrings = false;
00281 var $numCacheHits = 0;
00282 var $numCacheMisses = 0;
00283 var $pageExecuteCountRows = true;
00284 var $uniqueSort = false;
00285 var $leftOuter = false;
00286 var $rightOuter = false;
00287 var $ansiOuter = false;
00288 var $autoRollback = false;
00289 var $poorAffectedRows = false;
00290
00291 var $fnExecute = false;
00292 var $fnCacheExecute = false;
00293 var $blobEncodeType = false;
00294 var $rsPrefix = "ADORecordSet_";
00295
00296 var $autoCommit = true;
00297 var $transOff = 0;
00298 var $transCnt = 0;
00299
00300 var $fetchMode=false;
00301
00302
00303
00304 var $_oldRaiseFn = false;
00305 var $_transOK = null;
00306 var $_connectionID = false;
00307 var $_errorMsg = false;
00308
00309 var $_errorCode = false;
00310 var $_queryID = false;
00311
00312 var $_isPersistentConnection = false;
00313 var $_bindInputArray = false;
00314 var $_evalAll = false;
00315 var $_affected = false;
00316 var $_logsql = false;
00317
00321 function ADOConnection()
00322 {
00323 die('Virtual Class -- cannot instantiate');
00324 }
00325
00326 function Version()
00327 {
00328 global $ADODB_vers;
00329
00330 return (float) substr($ADODB_vers,1);
00331 }
00332
00339 function ServerInfo()
00340 {
00341 return array('description' => '', 'version' => '');
00342 }
00343
00344 function IsConnected()
00345 {
00346 return !empty($this->_connectionID);
00347 }
00348
00349 function _findvers($str)
00350 {
00351 if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1];
00352 else return '';
00353 }
00354
00359 function outp($msg,$newline=true)
00360 {
00361 global $ADODB_FLUSH,$ADODB_OUTP;
00362
00363 if (defined('ADODB_OUTP')) {
00364 $fn = ADODB_OUTP;
00365 $fn($msg,$newline);
00366 return;
00367 } else if (isset($ADODB_OUTP)) {
00368 $fn = $ADODB_OUTP;
00369 $fn($msg,$newline);
00370 return;
00371 }
00372
00373 if ($newline) $msg .= "<br>\n";
00374
00375 if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg;
00376 else echo strip_tags($msg);
00377
00378
00379 if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush();
00380
00381 }
00382
00383 function Time()
00384 {
00385 $rs =& $this->_Execute("select $this->sysTimeStamp");
00386 if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
00387
00388 return false;
00389 }
00390
00402 function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
00403 {
00404 if ($argHostname != "") $this->host = $argHostname;
00405 if ($argUsername != "") $this->user = $argUsername;
00406 if ($argPassword != "") $this->password = $argPassword;
00407 if ($argDatabaseName != "") $this->database = $argDatabaseName;
00408
00409 $this->_isPersistentConnection = false;
00410 if ($forceNew) {
00411 if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
00412 } else {
00413 if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
00414 }
00415 if (isset($rez)) {
00416 $err = $this->ErrorMsg();
00417 if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
00418 $ret = false;
00419 } else {
00420 $err = "Missing extension for ".$this->dataProvider;
00421 $ret = 0;
00422 }
00423 if ($fn = $this->raiseErrorFn)
00424 $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
00425
00426
00427 $this->_connectionID = false;
00428 if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
00429 return $ret;
00430 }
00431
00432 function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
00433 {
00434 return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
00435 }
00436
00437
00448 function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
00449 {
00450 return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true);
00451 }
00452
00463 function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
00464 {
00465 if (defined('ADODB_NEVER_PERSIST'))
00466 return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
00467
00468 if ($argHostname != "") $this->host = $argHostname;
00469 if ($argUsername != "") $this->user = $argUsername;
00470 if ($argPassword != "") $this->password = $argPassword;
00471 if ($argDatabaseName != "") $this->database = $argDatabaseName;
00472
00473 $this->_isPersistentConnection = true;
00474 if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
00475 if (isset($rez)) {
00476 $err = $this->ErrorMsg();
00477 if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
00478 $ret = false;
00479 } else {
00480 $err = "Missing extension for ".$this->dataProvider;
00481 $ret = 0;
00482 }
00483 if ($fn = $this->raiseErrorFn) {
00484 $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
00485 }
00486
00487 $this->_connectionID = false;
00488 if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
00489 return $ret;
00490 }
00491
00492
00493 function SQLDate($fmt, $col=false)
00494 {
00495 if (!$col) $col = $this->sysDate;
00496 return $col;
00497 }
00498
00514 function Prepare($sql)
00515 {
00516 return $sql;
00517 }
00518
00533 function PrepareSP($sql,$param=true)
00534 {
00535 return $this->Prepare($sql,$param);
00536 }
00537
00541 function Quote($s)
00542 {
00543 return $this->qstr($s,false);
00544 }
00545
00549 function QMagic($s)
00550 {
00551 return $this->qstr($s,get_magic_quotes_gpc());
00552 }
00553
00554 function q(&$s)
00555 {
00556 $s = $this->qstr($s,false);
00557 }
00558
00562 function ErrorNative()
00563 {
00564 return $this->ErrorNo();
00565 }
00566
00567
00571 function nextId($seq_name)
00572 {
00573 return $this->GenID($seq_name);
00574 }
00575
00583 function RowLock($table,$where)
00584 {
00585 return false;
00586 }
00587
00588 function CommitLock($table)
00589 {
00590 return $this->CommitTrans();
00591 }
00592
00593 function RollbackLock($table)
00594 {
00595 return $this->RollbackTrans();
00596 }
00597
00607 function SetFetchMode($mode)
00608 {
00609 $old = $this->fetchMode;
00610 $this->fetchMode = $mode;
00611
00612 if ($old === false) {
00613 global $ADODB_FETCH_MODE;
00614 return $ADODB_FETCH_MODE;
00615 }
00616 return $old;
00617 }
00618
00619
00623 function &Query($sql, $inputarr=false)
00624 {
00625 $rs = &$this->Execute($sql, $inputarr);
00626 if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
00627 return $rs;
00628 }
00629
00630
00634 function &LimitQuery($sql, $offset, $count, $params=false)
00635 {
00636 $rs = &$this->SelectLimit($sql, $count, $offset, $params);
00637 if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
00638 return $rs;
00639 }
00640
00641
00645 function Disconnect()
00646 {
00647 return $this->Close();
00648 }
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 function Param($name,$type='C')
00660 {
00661 return '?';
00662 }
00663
00664
00665
00666
00667 function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
00668 {
00669 return $this->Parameter($stmt,$var,$name,false,$maxLen,$type);
00670 }
00671
00672
00673
00674 function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
00675 {
00676 return $this->Parameter($stmt,$var,$name,true,$maxLen,$type);
00677
00678 }
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695 function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false)
00696 {
00697 return false;
00698 }
00699
00710 function StartTrans($errfn = 'ADODB_TransMonitor')
00711 {
00712 if ($this->transOff > 0) {
00713 $this->transOff += 1;
00714 return;
00715 }
00716
00717 $this->_oldRaiseFn = $this->raiseErrorFn;
00718 $this->raiseErrorFn = $errfn;
00719 $this->_transOK = true;
00720
00721 if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans");
00722 $this->BeginTrans();
00723 $this->transOff = 1;
00724 }
00725
00726
00735 function CompleteTrans($autoComplete = true)
00736 {
00737 if ($this->transOff > 1) {
00738 $this->transOff -= 1;
00739 return true;
00740 }
00741 $this->raiseErrorFn = $this->_oldRaiseFn;
00742
00743 $this->transOff = 0;
00744 if ($this->_transOK && $autoComplete) {
00745 if (!$this->CommitTrans()) {
00746 $this->_transOK = false;
00747 if ($this->debug) ADOConnection::outp("Smart Commit failed");
00748 } else
00749 if ($this->debug) ADOConnection::outp("Smart Commit occurred");
00750 } else {
00751 $this->_transOK = false;
00752 $this->RollbackTrans();
00753 if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred");
00754 }
00755
00756 return $this->_transOK;
00757 }
00758
00759
00760
00761
00762 function FailTrans()
00763 {
00764 if ($this->debug)
00765 if ($this->transOff == 0) {
00766 ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans");
00767 } else {
00768 ADOConnection::outp("FailTrans was called");
00769 adodb_backtrace();
00770 }
00771 $this->_transOK = false;
00772 }
00773
00777 function HasFailedTrans()
00778 {
00779 if ($this->transOff > 0) return $this->_transOK == false;
00780 return false;
00781 }
00782
00790 function &Execute($sql,$inputarr=false)
00791 {
00792 if ($this->fnExecute) {
00793 $fn = $this->fnExecute;
00794 $ret =& $fn($this,$sql,$inputarr);
00795 if (isset($ret)) return $ret;
00796 }
00797 if ($inputarr) {
00798 if (!is_array($inputarr)) $inputarr = array($inputarr);
00799
00800 $element0 = reset($inputarr);
00801 # is_object check because oci8 descriptors can be passed in
00802 $array_2d = is_array($element0) && !is_object(reset($element0));
00803
00804 unset($element0);
00805
00806 if (!is_array($sql) && !$this->_bindInputArray) {
00807 $sqlarr = explode('?',$sql);
00808
00809 if (!$array_2d) $inputarr = array($inputarr);
00810 foreach($inputarr as $arr) {
00811 $sql = ''; $i = 0;
00812
00813 while(list(, $v) = each($arr)) {
00814 $sql .= $sqlarr[$i];
00815
00816
00817 $typ = gettype($v);
00818 if ($typ == 'string')
00819
00820 $sql .= $this->qstr($v);
00821 else if ($typ == 'double')
00822 $sql .= str_replace(',','.',$v);
00823 else if ($typ == 'boolean')
00824 $sql .= $v ? $this->true : $this->false;
00825 else if ($v === null)
00826 $sql .= 'NULL';
00827 else
00828 $sql .= $v;
00829 $i += 1;
00830 }
00831 if (isset($sqlarr[$i])) {
00832 $sql .= $sqlarr[$i];
00833 if ($i+1 != sizeof($sqlarr)) ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql));
00834 } else if ($i != sizeof($sqlarr))
00835 ADOConnection::outp( "Input array does not match ?: ".htmlspecialchars($sql));
00836
00837 $ret =& $this->_Execute($sql);
00838 if (!$ret) return $ret;
00839 }
00840 } else {
00841 if ($array_2d) {
00842 if (is_string($sql))
00843 $stmt = $this->Prepare($sql);
00844 else
00845 $stmt = $sql;
00846
00847 foreach($inputarr as $arr) {
00848 $ret =& $this->_Execute($stmt,$arr);
00849 if (!$ret) return $ret;
00850 }
00851 } else {
00852 $ret =& $this->_Execute($sql,$inputarr);
00853 }
00854 }
00855 } else {
00856 $ret =& $this->_Execute($sql,false);
00857 }
00858
00859 return $ret;
00860 }
00861
00862
00863 function &_Execute($sql,$inputarr=false)
00864 {
00865 if ($this->debug) {
00866 global $ADODB_INCLUDED_LIB;
00867 if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
00868 $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr);
00869 } else {
00870 $this->_queryID = @$this->_query($sql,$inputarr);
00871 }
00872
00873
00874
00875
00876
00877 if ($this->_queryID === false) {
00878 if ($this->debug == 99) adodb_backtrace(true,5);
00879 $fn = $this->raiseErrorFn;
00880 if ($fn) {
00881 $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
00882 }
00883 $false = false;
00884 return $false;
00885 }
00886
00887 if ($this->_queryID === true) {
00888 $rs =& new ADORecordSet_empty();
00889 return $rs;
00890 }
00891
00892
00893 $rsclass = $this->rsPrefix.$this->databaseType;
00894 $rs = new $rsclass($this->_queryID,$this->fetchMode);
00895 $rs->connection = &$this;
00896 $rs->Init();
00897 if (is_array($sql)) $rs->sql = $sql[0];
00898 else $rs->sql = $sql;
00899 if ($rs->_numOfRows <= 0) {
00900 global $ADODB_COUNTRECS;
00901 if ($ADODB_COUNTRECS) {
00902 if (!$rs->EOF) {
00903 $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
00904 $rs->_queryID = $this->_queryID;
00905 } else
00906 $rs->_numOfRows = 0;
00907 }
00908 }
00909 return $rs;
00910 }
00911
00912 function CreateSequence($seqname='adodbseq',$startID=1)
00913 {
00914 if (empty($this->_genSeqSQL)) return false;
00915 return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
00916 }
00917
00918 function DropSequence($seqname='adodbseq')
00919 {
00920 if (empty($this->_dropSeqSQL)) return false;
00921 return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
00922 }
00923
00932 function GenID($seqname='adodbseq',$startID=1)
00933 {
00934 if (!$this->hasGenID) {
00935 return 0;
00936 }
00937
00938 $getnext = sprintf($this->_genIDSQL,$seqname);
00939
00940 $holdtransOK = $this->_transOK;
00941
00942 $save_handler = $this->raiseErrorFn;
00943 $this->raiseErrorFn = '';
00944 @($rs = $this->Execute($getnext));
00945 $this->raiseErrorFn = $save_handler;
00946
00947 if (!$rs) {
00948 $this->_transOK = $holdtransOK;
00949 $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
00950 $rs = $this->Execute($getnext);
00951 }
00952 if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
00953 else $this->genID = 0;
00954
00955 if ($rs) $rs->Close();
00956
00957 return $this->genID;
00958 }
00959
00965 function Insert_ID($table='',$column='')
00966 {
00967 if ($this->_logsql && $this->lastInsID) return $this->lastInsID;
00968 if ($this->hasInsertID) return $this->_insertid($table,$column);
00969 if ($this->debug) {
00970 ADOConnection::outp( '<p>Insert_ID error</p>');
00971 adodb_backtrace();
00972 }
00973 return false;
00974 }
00975
00976
00983 function PO_Insert_ID($table="", $id="")
00984 {
00985 if ($this->hasInsertID){
00986 return $this->Insert_ID($table,$id);
00987 } else {
00988 return $this->GetOne("SELECT MAX($id) FROM $table");
00989 }
00990 }
00991
00995 function Affected_Rows()
00996 {
00997 if ($this->hasAffectedRows) {
00998 if ($this->fnExecute === 'adodb_log_sql') {
00999 if ($this->_logsql && $this->_affected !== false) return $this->_affected;
01000 }
01001 $val = $this->_affectedrows();
01002 return ($val < 0) ? false : $val;
01003 }
01004
01005 if ($this->debug) ADOConnection::outp( '<p>Affected_Rows error</p>',false);
01006 return false;
01007 }
01008
01009
01013 function ErrorMsg()
01014 {
01015 if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg;
01016 else return '';
01017 }
01018
01019
01023 function ErrorNo()
01024 {
01025 return ($this->_errorMsg) ? -1 : 0;
01026 }
01027
01028 function MetaError($err=false)
01029 {
01030 include_once(ADODB_DIR."/adodb-error.inc.php");
01031 if ($err === false) $err = $this->ErrorNo();
01032 return adodb_error($this->dataProvider,$this->databaseType,$err);
01033 }
01034
01035 function MetaErrorMsg($errno)
01036 {
01037 include_once(ADODB_DIR."/adodb-error.inc.php");
01038 return adodb_errormsg($errno);
01039 }
01040
01044 function MetaPrimaryKeys($table, $owner=false)
01045 {
01046
01047 $p = array();
01048 $objs =& $this->MetaColumns($table);
01049 if ($objs) {
01050 foreach($objs as $v) {
01051 if (!empty($v->primary_key))
01052 $p[] = $v->name;
01053 }
01054 }
01055 if (sizeof($p)) return $p;
01056 if (function_exists('ADODB_VIEW_PRIMARYKEYS'))
01057 return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);
01058 return false;
01059 }
01060
01064 function MetaForeignKeys($table, $owner=false, $upper=false)
01065 {
01066 return false;
01067 }
01074 function SelectDB($dbName)
01075 {return false;}
01076
01077
01097 function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
01098 {
01099 if ($this->hasTop && $nrows > 0) {
01100
01101
01102 $ismssql = (strpos($this->databaseType,'mssql') !== false);
01103 if ($ismssql) $isaccess = false;
01104 else $isaccess = (strpos($this->databaseType,'access') !== false);
01105
01106 if ($offset <= 0) {
01107
01108
01109 if ($isaccess) {
01110 $sql = preg_replace(
01111 '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
01112
01113 if ($secs2cache>0) {
01114 $ret =& $this->CacheExecute($secs2cache, $sql,$inputarr);
01115 } else {
01116 $ret =& $this->Execute($sql,$inputarr);
01117 }
01118 return $ret;
01119 } else if ($ismssql){
01120 $sql = preg_replace(
01121 '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
01122 } else {
01123 $sql = preg_replace(
01124 '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
01125 }
01126 } else {
01127 $nn = $nrows + $offset;
01128 if ($isaccess || $ismssql) {
01129 $sql = preg_replace(
01130 '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
01131 } else {
01132 $sql = preg_replace(
01133 '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
01134 }
01135 }
01136 }
01137
01138
01139
01140 global $ADODB_COUNTRECS;
01141
01142 $savec = $ADODB_COUNTRECS;
01143 $ADODB_COUNTRECS = false;
01144
01145 if ($offset>0){
01146 if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
01147 else $rs = &$this->Execute($sql,$inputarr);
01148 } else {
01149 if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
01150 else $rs = &$this->Execute($sql,$inputarr);
01151 }
01152 $ADODB_COUNTRECS = $savec;
01153 if ($rs && !$rs->EOF) {
01154 $rs =& $this->_rs2rs($rs,$nrows,$offset);
01155 }
01156
01157 return $rs;
01158 }
01159
01165 function &SerializableRS(&$rs)
01166 {
01167 $rs2 =& $this->_rs2rs($rs);
01168 $ignore = false;
01169 $rs2->connection =& $ignore;
01170
01171 return $rs2;
01172 }
01173
01184 function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true)
01185 {
01186 if (! $rs) {
01187 $false = false;
01188 return $false;
01189 }
01190 $dbtype = $rs->databaseType;
01191 if (!$dbtype) {
01192 $rs = &$rs;
01193 return $rs;
01194 }
01195 if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) {
01196 $rs->MoveFirst();
01197 $rs = &$rs;
01198 return $rs;
01199 }
01200 $flds = array();
01201 for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
01202 $flds[] = $rs->FetchField($i);
01203 }
01204
01205 $arr =& $rs->GetArrayLimit($nrows,$offset);
01206
01207 if ($close) $rs->Close();
01208
01209 $arrayClass = $this->arrayClass;
01210
01211 $rs2 = new $arrayClass();
01212 $rs2->connection = &$this;
01213 $rs2->sql = $rs->sql;
01214 $rs2->dataProvider = $this->dataProvider;
01215 $rs2->InitArrayFields($arr,$flds);
01216 $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
01217 return $rs2;
01218 }
01219
01220
01221
01222
01223 function &GetAll($sql, $inputarr=false)
01224 {
01225 $arr =& $this->GetArray($sql,$inputarr);
01226 return $arr;
01227 }
01228
01229 function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false)
01230 {
01231 $rs =& $this->Execute($sql, $inputarr);
01232 if (!$rs) {
01233 $false = false;
01234 return $false;
01235 }
01236 $arr =& $rs->GetAssoc($force_array,$first2cols);
01237 return $arr;
01238 }
01239
01240 function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false)
01241 {
01242 if (!is_numeric($secs2cache)) {
01243 $first2cols = $force_array;
01244 $force_array = $inputarr;
01245 }
01246 $rs =& $this->CacheExecute($secs2cache, $sql, $inputarr);
01247 if (!$rs) {
01248 $false = false;
01249 return $false;
01250 }
01251 $arr =& $rs->GetAssoc($force_array,$first2cols);
01252 return $arr;
01253 }
01254
01262 function GetOne($sql,$inputarr=false)
01263 {
01264 global $ADODB_COUNTRECS;
01265 $crecs = $ADODB_COUNTRECS;
01266 $ADODB_COUNTRECS = false;
01267
01268 $ret = false;
01269 $rs = &$this->Execute($sql,$inputarr);
01270 if ($rs) {
01271 if (!$rs->EOF) $ret = reset($rs->fields);
01272 $rs->Close();
01273 }
01274 $ADODB_COUNTRECS = $crecs;
01275 return $ret;
01276 }
01277
01278 function CacheGetOne($secs2cache,$sql=false,$inputarr=false)
01279 {
01280 $ret = false;
01281 $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
01282 if ($rs) {
01283 if (!$rs->EOF) $ret = reset($rs->fields);
01284 $rs->Close();
01285 }
01286
01287 return $ret;
01288 }
01289
01290 function GetCol($sql, $inputarr = false, $trim = false)
01291 {
01292 $rv = false;
01293 $rs = &$this->Execute($sql, $inputarr);
01294 if ($rs) {
01295 $rv = array();
01296 if ($trim) {
01297 while (!$rs->EOF) {
01298 $rv[] = trim(reset($rs->fields));
01299 $rs->MoveNext();
01300 }
01301 } else {
01302 while (!$rs->EOF) {
01303 $rv[] = reset($rs->fields);
01304 $rs->MoveNext();
01305 }
01306 }
01307 $rs->Close();
01308 }
01309 return $rv;
01310 }
01311
01312 function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false)
01313 {
01314 $rv = false;
01315 $rs = &$this->CacheExecute($secs, $sql, $inputarr);
01316 if ($rs) {
01317 if ($trim) {
01318 while (!$rs->EOF) {
01319 $rv[] = trim(reset($rs->fields));
01320 $rs->MoveNext();
01321 }
01322 } else {
01323 while (!$rs->EOF) {
01324 $rv[] = reset($rs->fields);
01325 $rs->MoveNext();
01326 }
01327 }
01328 $rs->Close();
01329 }
01330 return $rv;
01331 }
01332
01333
01334
01335
01336
01337
01338
01339
01340 function OffsetDate($dayFraction,$date=false)
01341 {
01342 if (!$date) $date = $this->sysDate;
01343 return '('.$date.'+'.$dayFraction.')';
01344 }
01345
01346
01352 function &GetArray($sql,$inputarr=false)
01353 {
01354 global $ADODB_COUNTRECS;
01355
01356 $savec = $ADODB_COUNTRECS;
01357 $ADODB_COUNTRECS = false;
01358 $rs =& $this->Execute($sql,$inputarr);
01359 $ADODB_COUNTRECS = $savec;
01360 if (!$rs)
01361 if (defined('ADODB_PEAR')) {
01362 $cls = ADODB_PEAR_Error();
01363 return $cls;
01364 } else {
01365 $false = false;
01366 return $false;
01367 }
01368 $arr =& $rs->GetArray();
01369 $rs->Close();
01370 return $arr;
01371 }
01372