Adodb Dokumentation  V5.14 8 Sept 2011
tests/test.php
00001 <?php
00002 /* 
00003 V4.80 8 Mar 2006  (c) 2000-2011 John Lim (jlim#natsoft.com). All rights reserved.
00004   Released under both BSD license and Lesser GPL library license. 
00005   Whenever there is any discrepancy between the two licenses, 
00006   the BSD license will take precedence. 
00007   Set tabs to 4 for best viewing.
00008         
00009   Latest version is available at http://adodb.sourceforge.net
00010 */
00011 
00012 
00013 //if (!defined('E_STRICT')) define('E_STRICT',0);
00014 error_reporting(E_ALL|E_STRICT);
00015 
00016 $ADODB_FLUSH = true;
00017 
00018 define('ADODB_ASSOC_CASE',0);
00019 
00020 
00021 function getmicrotime()
00022 {
00023         $t = microtime();
00024         $t = explode(' ',$t);
00025         return (float)$t[1]+ (float)$t[0];
00026 }
00027 
00028 
00029 if (PHP_VERSION < 5) include_once('../adodb-pear.inc.php');
00030 //--------------------------------------------------------------------------------------
00031 //define('ADODB_ASSOC_CASE',1);
00032 //
00033 function Err($msg)
00034 {
00035         print "<b>$msg</b><br>";
00036         flush();
00037 }
00038 
00039 function CheckWS($conn)
00040 {
00041 global $ADODB_EXTENSION;
00042 
00043         include_once('../session/adodb-session.php');
00044         if (defined('CHECKWSFAIL')){ echo " TESTING $conn ";flush();}
00045         $saved = $ADODB_EXTENSION;
00046         $db = ADONewConnection($conn);
00047         $ADODB_EXTENSION = $saved;
00048         if (headers_sent()) {
00049                 print "<p><b>White space detected in adodb-$conn.inc.php or include file...</b></p>";
00050                 //die();
00051         }
00052 }
00053 
00054 function do_strtolower(&$arr)
00055 {
00056         foreach($arr as $k => $v) {
00057                 if (is_object($v)) $arr[$k] = adodb_pr($v,true);
00058                 else $arr[$k] = strtolower($v);
00059         }
00060 }
00061 
00062 
00063 function CountExecs($db, $sql, $inputarray)
00064 {
00065 global $EXECS;  $EXECS++;
00066 }
00067 
00068 function CountCachedExecs($db, $secs2cache, $sql, $inputarray)
00069 {
00070 global $CACHED; $CACHED++;
00071 }
00072 
00073 // the table creation code is specific to the database, so we allow the user 
00074 // to define their own table creation stuff
00075 
00076 function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)")
00077 {
00078 GLOBAL $ADODB_vers,$ADODB_CACHE_DIR,$ADODB_FETCH_MODE,$ADODB_COUNTRECS;
00079 
00080         //adodb_pr($db);
00081         
00082 ?>      <form method=GET>
00083         </p>
00084         <table width=100% ><tr><td bgcolor=beige>&nbsp;</td></tr></table>
00085         </p>
00086 <?php  
00087         $create =false;
00088         /*$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00089         
00090         $rs = $db->Execute('select lastname,firstname,lastname,id from ADOXYZ');
00091         $arr = $rs->GetAssoc();
00092         echo "<pre>";print_r($arr);
00093         die();*/
00094         
00095         if (!$db) die("testdb: database not inited");
00096         GLOBAL $EXECS, $CACHED;
00097         
00098         $EXECS = 0;
00099         $CACHED = 0;
00100         //$db->Execute("drop table adodb_logsql");
00101         if ((rand()%3) == 0) @$db->Execute("delete from adodb_logsql");
00102         $db->debug=1;
00103         
00104         $db->fnExecute = 'CountExecs';
00105         $db->fnCacheExecute = 'CountCachedExecs';
00106         
00107         if (empty($_GET['nolog'])) {
00108                 echo "<h3>SQL Logging enabled</h3>";
00109                 $db->LogSQL();/*
00110                 $sql =
00111 "SELECT t1.sid, t1.sid, t1.title, t1.hometext, t1.notes, t1.aid, t1.informant, 
00112 t2.url, t2.email, t1.catid, t3.title, t1.topic, t4.topicname, t4.topicimage, 
00113 t4.topictext, t1.score, t1.ratings, t1.counter, t1.comments, t1.acomm 
00114 FROM `nuke_stories` `t1`, `nuke_authors` `t2`, `nuke_stories_cat` `t3`, `nuke_topics` `t4` 
00115         WHERE ((t2.aid=t1.aid) AND (t3.catid=t1.catid) AND (t4.topicid=t1.topic) 
00116         AND ((t1.alanguage='german') OR (t1.alanguage='')) AND (t1.ihome='0')) 
00117         ORDER BY t1.time DESC";
00118                 $db->SelectLimit($sql);
00119                 echo $db->ErrorMsg();*/
00120         }
00121         $ADODB_CACHE_DIR = dirname(TempNam('/tmp','testadodb'));
00122         $db->debug = false;
00123         //print $db->UnixTimeStamp('2003-7-22 23:00:00');
00124         
00125         $phpv = phpversion();
00126         if (defined('ADODB_EXTENSION')) $ext = ' &nbsp; Extension '.ADODB_EXTENSION.' installed';
00127         else $ext = '';
00128         print "<h3>ADODB Version: $ADODB_vers Host: <i>$db->host</i> &nbsp; Database: <i>$db->database</i> &nbsp; PHP: $phpv $ext</h3>";
00129         
00130         flush();
00131 
00132         if (function_exists('date_default_timezone_set')) date_default_timezone_set('Asia/Kuala_Lumpur');
00133         
00134         $arr = $db->ServerInfo();
00135         print_r($arr);
00136         echo E_ALL,' ',E_STRICT, "<br>";
00137         $e = error_reporting(E_ALL | E_STRICT);
00138         echo error_reporting(),'<p>';
00139         flush();
00140         #$db->debug=1;
00141         $tt  = $db->Time(); 
00142         if ($tt == 0) echo '<br><b>$db->Time failed</b>';
00143         else echo "<br>db->Time: ".date('d-m-Y H:i:s',$tt);
00144         echo '<br>';
00145         
00146         echo "Date=",$db->UserDate('2002-04-07'),'<br>';
00147         print "<i>date1</i> (1969-02-20) = ".$db->DBDate('1969-2-20');
00148         print "<br><i>date1</i> (1999-02-20) = ".$db->DBDate('1999-2-20');
00149         print "<br><i>date1.1</i> 1999 = ".$db->DBDate("'1999'");
00150         print "<br><i>date2</i> (1970-1-2) = ".$db->DBDate(24*3600)."<p>";
00151         print "<i>ts1</i> (1999-02-20 13:40:50) = ".$db->DBTimeStamp('1999-2-20 1:40:50 pm');
00152         print "<br><i>ts1.1</i> (1999-02-20 13:40:00) = ".$db->DBTimeStamp('1999-2-20 13:40');
00153         print "<br><i>ts2</i> (1999-02-20) = ".$db->DBTimeStamp('1999-2-20');
00154         print "<br><i>ts3</i> (1970-1-2 +/- timezone) = ".$db->DBTimeStamp(24*3600);
00155         print "<br> Fractional TS (1999-2-20 13:40:50.91): ".$db->DBTimeStamp($db->UnixTimeStamp('1999-2-20 13:40:50.91+1'));
00156          $dd = $db->UnixDate('1999-02-20');
00157         print "<br>unixdate</i> 1999-02-20 = ".date('Y-m-d',$dd)."<p>";
00158         print "<br><i>ts4</i> =".($db->UnixTimeStamp("19700101000101")+8*3600);
00159         print "<br><i>ts5</i> =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123"));
00160         print "<br><i>ts6</i> =".$db->UserTimeStamp("20040110092123");
00161         print "<br><i>ts7</i> =".$db->DBTimeStamp("20040110092123");
00162         flush();
00163         // mssql too slow in failing bad connection
00164         if (false && $db->databaseType != 'mssql') {
00165                 print "<p>Testing bad connection. Ignore following error msgs:<br>";
00166                 $db2 = ADONewConnection();
00167                 $rez = $db2->Connect("bad connection");
00168                 $err = $db2->ErrorMsg();
00169                 print "<i>Error='$err'</i></p>";
00170                 if ($rez) print "<b>Cannot check if connection failed.</b> The Connect() function returned true.</p>";
00171         }
00172         #error_reporting($e);
00173         flush();
00174 
00175         //$ADODB_COUNTRECS=false;
00176         $rs=$db->Execute('select * from ADOXYZ order by id');
00177         if($rs === false) $create = true;
00178         else $rs->Close();
00179         
00180         //if ($db->databaseType !='vfp') $db->Execute("drop table ADOXYZ");
00181         
00182         if ($create) {
00183                 if (false && $db->databaseType == 'ibase') {
00184                         print "<b>Please create the following table for testing:</b></p>$createtab</p>";
00185                         return;
00186                 } else {
00187                         $db->debug = 99;
00188                 #       $e = error_reporting(E_ALL-E_WARNING);
00189                         $db->Execute($createtab);
00190                 #       error_reporting($e);
00191                 }
00192         }
00193         #error_reporting(E_ALL);
00194         echo "<p>Testing Metatypes</p>";
00195         $t = $db->MetaType('varchar');
00196         if ($t != 'C') Err("Bad Metatype for varchar");
00197         
00198         $rs = $db->Execute("delete from ADOXYZ"); // some ODBC drivers will fail the drop so we delete
00199         if ($rs) {
00200                 if(! $rs->EOF) print "<b>Error: </b>RecordSet returned by Execute('delete...') should show EOF</p>";
00201                 $rs->Close();
00202         } else print "err=".$db->ErrorMsg();
00203 
00204         print "<p>Test select on empty table, FetchField when EOF, and GetInsertSQL</p>";
00205         $rs = $db->Execute("select id,firstname from ADOXYZ where id=9999");
00206         if ($rs && !$rs->EOF) print "<b>Error: </b>RecordSet returned by Execute(select...') on empty table should show EOF</p>";
00207         if ($rs->EOF && (($ox = $rs->FetchField(0)) && !empty($ox->name))) {
00208                 $record['id'] = 99;
00209                 $record['firstname'] = 'John';
00210                 $sql =  $db->GetInsertSQL($rs, $record);
00211                 if (strtoupper($sql) != strtoupper("INSERT INTO ADOXYZ ( id, firstname ) VALUES ( 99, 'John' )")) Err("GetInsertSQL does not work on empty table: $sql");
00212         } else {
00213                 Err("FetchField does not work on empty recordset, meaning GetInsertSQL will fail...");
00214         }
00215         if ($rs) $rs->Close();
00216         flush();
00217         //$db->debug=true;      
00218         print "<p>Testing Commit: ";
00219         $time = $db->DBDate(time());
00220         if (!$db->BeginTrans()) {
00221                 print '<b>Transactions not supported</b></p>';
00222                 if ($db->hasTransactions) Err("hasTransactions should be false");
00223         } else { /* COMMIT */
00224                 if (!$db->hasTransactions) Err("hasTransactions should be true");
00225                 if ($db->transCnt != 1) Err("Invalid transCnt = $db->transCnt (should be 1)");
00226                 $rs = $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (99,'Should Not','Exist (Commit)',$time)");
00227                 if ($rs && $db->CommitTrans()) {
00228                         $rs->Close();
00229                         $rs = $db->Execute("select * from ADOXYZ where id=99");
00230                         if ($rs === false || $rs->EOF) {
00231                                 print '<b>Data not saved</b></p>';
00232                                 $rs = $db->Execute("select * from ADOXYZ where id=99");
00233                                 print_r($rs);
00234                                 die();
00235                         } else print 'OK</p>';
00236                         if ($rs) $rs->Close();
00237                 } else {
00238                         if (!$rs) {
00239                                 print "<b>Insert failed</b></p>";
00240                                 $db->RollbackTrans();
00241                         } else print "<b>Commit failed</b></p>";
00242                 }
00243                 if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)");
00244                 
00245                 /* ROLLBACK */  
00246                 if (!$db->BeginTrans()) print "<p><b>Error in BeginTrans</b>()</p>";
00247                 print "<p>Testing Rollback: ";
00248                 $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (100,'Should Not','Exist (Rollback)',$time)");
00249                 if ($db->RollbackTrans()) {
00250                         $rs = $db->Execute("select * from ADOXYZ where id=100");
00251                         if ($rs && !$rs->EOF) print '<b>Fail: Data should rollback</b></p>';
00252                         else print 'OK</p>';
00253                         if ($rs) $rs->Close();
00254                 } else
00255                         print "<b>Commit failed</b></p>";
00256                         
00257                 $rs = $db->Execute('delete from ADOXYZ where id>50');
00258                 if ($rs) $rs->Close();
00259                 
00260                 if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)");
00261         }
00262         
00263         if (1) {
00264                 print "<p>Testing MetaDatabases()</p>";
00265                 print_r( $db->MetaDatabases());
00266 
00267                 print "<p>Testing MetaTables() and MetaColumns()</p>";
00268                 $a = $db->MetaTables();
00269                 if ($a===false) print "<b>MetaTables not supported</b></p>";
00270                 else {
00271                         print "Array of tables and views: "; 
00272                         foreach($a as $v) print " ($v) ";
00273                         print '</p>';
00274                 }
00275                 
00276                 $a = $db->MetaTables('VIEW');
00277                 if ($a===false) print "<b>MetaTables not supported (views)</b></p>";
00278                 else {
00279                         print "Array of views: "; 
00280                         foreach($a as $v) print " ($v) ";
00281                         print '</p>';
00282                 }
00283                 
00284                 $a = $db->MetaTables(false,false,'aDo%');
00285                 if ($a===false) print "<b>MetaTables not supported (mask)</b></p>";
00286                 else {
00287                         print "Array of ado%: "; 
00288                         foreach($a as $v) print " ($v) ";
00289                         print '</p>';
00290                 }
00291                 
00292                 $a = $db->MetaTables('TABLE');
00293                 if ($a===false) print "<b>MetaTables not supported</b></p>";
00294                 else {
00295                         print "Array of tables: "; 
00296                         foreach($a as $v) print " ($v) ";
00297                         print '</p>';
00298                 }
00299                 
00300                 $db->debug=0;
00301                 $rez = $db->MetaColumns("NOSUCHTABLEHERE");
00302                 if ($rez !== false) {
00303                         Err("MetaColumns error handling failed");
00304                         var_dump($rez);
00305                 }
00306                 $db->debug=1;
00307                 $a = $db->MetaColumns('ADOXYZ');
00308                 if ($a===false) print "<b>MetaColumns not supported</b></p>";
00309                 else {
00310                         print "<p>Columns of ADOXYZ: <font size=1><br>";
00311                         foreach($a as $v) {print_r($v); echo "<br>";}
00312                         echo "</font>";
00313                 }
00314                 
00315                 print "<p>Testing MetaIndexes</p>";
00316                 
00317                 $a = $db->MetaIndexes(('ADOXYZ'),true);
00318                 if ($a===false) print "<b>MetaIndexes not supported</b></p>";
00319                 else {
00320                         print "<p>Indexes of ADOXYZ: <font size=1><br>";
00321                         adodb_pr($a);
00322                         echo "</font>";
00323                 }
00324                 print "<p>Testing MetaPrimaryKeys</p>";
00325                 $a = $db->MetaPrimaryKeys('ADOXYZ');
00326                 var_dump($a);
00327         }
00328         $rs = $db->Execute('delete from ADOXYZ');
00329         if ($rs) $rs->Close();
00330         
00331         $db->debug = false;
00332         
00333         
00334         switch ($db->databaseType) {
00335         case 'vfp':
00336                 
00337                 if (0) {
00338                         // memo test
00339                         $rs = $db->Execute("select data from memo");
00340                         rs2html($rs);
00341                 }
00342                 break;
00343 
00344         case 'postgres7':
00345         case 'postgres64':
00346         case 'postgres':
00347         case 'ibase':
00348                 print "<p>Encode=".$db->BlobEncode("abc\0d\"'
00349 ef")."</p>";//'
00350 
00351                 print "<p>Testing Foreign Keys</p>";
00352                 $arr = $db->MetaForeignKeys('ADOXYZ',false,true);
00353                 print_r($arr);
00354                 if (!$arr) Err("No MetaForeignKeys");
00355                 break;
00356         
00357         case 'odbc_mssql':
00358         case 'mssqlpo':
00359                 print "<p>Testing Foreign Keys</p>";
00360                 $arr = $db->MetaForeignKeys('Orders',false,true);
00361                 print_r($arr);
00362                 if (!$arr) Err("Bad MetaForeignKeys");
00363                 if ($db->databaseType == 'odbc_mssql') break;
00364         
00365         case 'mssql': 
00366         
00367                 
00368 /*
00369 ASSUME Northwind available...
00370 
00371 CREATE PROCEDURE SalesByCategory
00372         @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998'
00373 AS
00374 IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' 
00375 BEGIN
00376         SELECT @OrdYear = '1998'
00377 END
00378 
00379 SELECT ProductName,
00380         TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0)
00381 FROM [Order Details] OD, Orders O, Products P, Categories C
00382 WHERE OD.OrderID = O.OrderID 
00383         AND OD.ProductID = P.ProductID 
00384         AND P.CategoryID = C.CategoryID
00385         AND C.CategoryName = @CategoryName
00386         AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear
00387 GROUP BY ProductName
00388 ORDER BY ProductName
00389 GO
00390 
00391 
00392 CREATE PROCEDURE ADODBTestSP
00393 @a nvarchar(25)
00394 AS
00395 SELECT GETDATE() AS T, @a AS A
00396 GO
00397 */
00398                 print "<h4>Testing Stored Procedures for mssql</h4>";
00399                 $saved = $db->debug;
00400                 $db->debug=true;
00401                 $assoc = $ADODB_FETCH_MODE;
00402                 $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00403                 $cmd = $db->PrepareSP('ADODBTestSP');
00404                 $ss = "You should see me in the output.";
00405                 $db->InParameter($cmd,$ss,'a');
00406                 $rs = $db->Execute($cmd);
00407                 #var_dump($rs->fields);
00408                 echo $rs->fields['T']." --- ".$rs->fields['A']."---<br>";
00409 
00410                 $cat = 'Dairy Products';
00411                 $yr = '1998';
00412                 
00413                 $stmt = $db->PrepareSP('SalesByCategory');
00414                 $db->InParameter($stmt,$cat,'CategoryName');
00415                 $db->InParameter($stmt,$yr,'OrdYear');
00416                 $rs = $db->Execute($stmt);
00417                 rs2html($rs);
00418                 
00419                 $cat = 'Grains/Cereals';
00420                 $yr = 1998;
00421                 
00422                 $stmt = $db->PrepareSP('SalesByCategory');
00423                 $db->InParameter($stmt,$cat,'CategoryName');
00424                 $db->InParameter($stmt,$yr,'OrdYear');
00425                 $rs = $db->Execute($stmt);
00426                 rs2html($rs);
00427                 
00428                 $ADODB_FETCH_MODE = $assoc;
00429                 
00430                 /*
00431                 Test out params - works in PHP 4.2.3 and 4.3.3 and 4.3.8 but not 4.3.0:
00432                 
00433                         CREATE PROCEDURE at_date_interval 
00434                                 @days INTEGER, 
00435                                 @start VARCHAR(20) OUT, 
00436                                 @end VARCHAR(20) OUT    
00437                         AS 
00438                         BEGIN 
00439                                 set @start = CONVERT(VARCHAR(20), getdate(), 101) 
00440                                 set @end =CONVERT(VARCHAR(20), dateadd(day, @days, getdate()), 101 ) 
00441                         END
00442                         GO
00443                 */
00444                 $db->debug=1;
00445                 $stmt = $db->PrepareSP('at_date_interval');
00446                 $days = 10;
00447                 $begin_date = '';
00448                 $end_date = '';
00449                 $db->InParameter($stmt,$days,'days', 4, SQLINT4); 
00450                 $db->OutParameter($stmt,$begin_date,'start', 20, SQLVARCHAR ); 
00451                 $db->OutParameter($stmt,$end_date,'end', 20, SQLVARCHAR ); 
00452                 $db->Execute($stmt);
00453                 if (empty($begin_date) or empty($end_date) or $begin_date == $end_date) {
00454                         Err("MSSQL SP Test for OUT Failed");
00455                         print "begin=$begin_date end=$end_date<p>";
00456                 } else print "(Today +10days) = (begin=$begin_date end=$end_date)<p>";
00457         
00458                 $db->debug = $saved;
00459                 break;
00460         case 'oci8': 
00461         case 'oci8po':
00462                 
00463                 if (0) {
00464                 $t = getmicrotime();
00465                 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00466                 $arr = $db->GetArray('select * from abalone_tree');
00467                 $arr = $db->GetArray('select * from abalone_tree');
00468                 $arr = $db->GetArray('select * from abalone_tree');
00469                 echo "<p>t = ",getmicrotime() - $t,"</p>";
00470                 die();
00471                 }
00472                 
00473                 # cleanup
00474                 $db->Execute("delete from photos where id=99 or id=1");
00475                 $db->Execute("insert into photos (id) values(1)");
00476                 $db->Execute("update photos set photo=null,descclob=null where id=1");
00477                 
00478                 $saved = $db->debug;
00479                 $db->debug=true;
00480                 
00481                 
00482 
00483                 /*
00484                 CREATE TABLE PHOTOS
00485                 (
00486                   ID           NUMBER(16) primary key,
00487                   PHOTO        BLOB,
00488                   DESCRIPTION  VARCHAR2(4000 BYTE),
00489                   DESCCLOB     CLOB
00490                 );
00491                 
00492                 INSERT INTO PHOTOS (ID) VALUES(1);
00493                 */
00494                 $s = '';
00495                 for ($i = 0; $i <= 500; $i++) {
00496                         $s .= '1234567890';
00497                 }
00498                 
00499                 $sql = "INSERT INTO photos ( ID, photo) ".
00500                         "VALUES ( :id, empty_blob() )".
00501                         " RETURNING photo INTO :xx";
00502 
00503                 
00504                 $blob_data = $s;
00505                 $id = 99;
00506                 
00507                 $stmt = $db->PrepareSP($sql);
00508                 $db->InParameter($stmt, $id, 'id');
00509                 $blob = $db->InParameter($stmt, $s, 'xx',-1, OCI_B_BLOB);
00510                 $db->StartTrans();
00511                 $result = $db->Execute($stmt);
00512                 $db->CompleteTrans();
00513                 
00514                 $s2= $db->GetOne("select photo from photos where id=99");
00515                 echo "<br>---$s2";
00516                 if ($s !== $s2) Err("insert blob does not match");
00517 
00518                 print "<h4>Testing Blob: size=".strlen($s)."</h4>";
00519                 $ok = $db->Updateblob('photos','photo',$s,'id=1');
00520                 if (!$ok) Err("Blob failed 1");
00521                 else {
00522                         $s2= $db->GetOne("select photo from photos where id=1");
00523                         if ($s !== $s2) Err("updateblob does not match");
00524                 }
00525                 
00526                 print "<h4>Testing Clob: size=".strlen($s)."</h4>";
00527                 $ok = $db->UpdateClob('photos','descclob',$s,'id=1');
00528                 if (!$ok) Err("Clob failed 1");
00529                 else {
00530                         $s2= $db->GetOne("select descclob from photos where id=1");
00531                         if ($s !== $s2) Err("updateclob does not match");
00532                 }
00533                 
00534                 
00535                 $s = '';
00536                 $s2 = '';
00537                 print "<h4>Testing Foreign Keys</h4>";
00538                 $arr = $db->MetaForeignKeys('emp','scott');
00539                 print_r($arr);
00540                 if (!$arr) Err("Bad MetaForeignKeys");
00541 /*
00542 -- TEST PACKAGE
00543 -- "Set scan off" turns off substitution variables. 
00544 Set scan off; 
00545 
00546 CREATE OR REPLACE PACKAGE Adodb AS
00547 TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
00548 PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR);
00549 PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) ;
00550 PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR);
00551 PROCEDURE data_in(input IN VARCHAR);
00552 PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER);
00553 END Adodb;
00554 /
00555 
00556 
00557 CREATE OR REPLACE PACKAGE BODY Adodb AS
00558 PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
00559         BEGIN
00560                 OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
00561         END open_tab;
00562 
00563         PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS
00564         BEGIN
00565                 OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
00566                 tablenames := 'TEST';
00567         END open_tab2;
00568 
00569 PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS
00570         BEGIN
00571                 output := 'Cinta Hati '||input;
00572         END;
00573         
00574 PROCEDURE data_in(input IN VARCHAR) IS
00575         ignore varchar(1000);
00576         BEGIN
00577                 ignore := input;
00578         END;
00579 
00580 PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER) AS
00581 BEGIN
00582 p2 := p1;
00583 END;
00584 END Adodb;
00585 /
00586 
00587 */
00588 
00589                 print "<h4>Testing Cursor Variables</h4>";
00590                 $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:zz,'A%'); END;",'zz');
00591         
00592                 if ($rs && !$rs->EOF) {
00593                         $v = $db->GetOne("SELECT count(*) FROM tab where tname like 'A%'");
00594                         if ($v == $rs->RecordCount()) print "Test 1 RowCount: OK<p>";
00595                         else Err("Test 1 RowCount ".$rs->RecordCount().", actual = $v");
00596                 } else {
00597                         print "<b>Error in using Cursor Variables 1</b><p>";
00598                 }
00599                 if ($rs) $rs->Close();
00600                 
00601                 print "<h4>Testing Stored Procedures for oci8</h4>";
00602                 
00603                 $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;");
00604                 $a1 = 'Malaysia';
00605                 //$a2 = ''; # a2 doesn't even need to be defined!
00606                 $db->InParameter($stmt,$a1,'a1');
00607                 $db->OutParameter($stmt,$a2,'a2');
00608                 $rs = $db->Execute($stmt);
00609                 if ($rs) {
00610                         if ($a2 !== 'Cinta Hati Malaysia') print "<b>Stored Procedure Error: a2 = $a2</b><p>";
00611                         else echo  "OK: a2=$a2<p>";
00612                 } else {
00613                         print "<b>Error in using Stored Procedure IN/Out Variables</b><p>";
00614                 }
00615                 
00616                 $tname = 'A%';
00617                 
00618                 $stmt = $db->PrepareSP('select * from tab where tname like :tablename');
00619                 $db->Parameter($stmt,$tname,'tablename');
00620                 $rs = $db->Execute($stmt);
00621                 rs2html($rs);
00622                 
00623                 $stmt = $db->PrepareSP("begin adodb.data_in(:a1); end;");
00624                 $db->InParameter($stmt,$a1,'a1');
00625                 $db->Execute($stmt);
00626                 
00627                 $db->debug = $saved;
00628                 break;
00629         
00630         default:
00631                 break;
00632         }
00633         $arr = array(
00634                 array(1,'Caroline','Miranda'),
00635                 array(2,'John','Lim'),
00636                 array(3,'Wai Hun','See')
00637         );
00638         //$db->debug=1;
00639         print "<p>Testing Bulk Insert of 3 rows</p>";
00640 
00641         $sql = "insert into ADOXYZ (id,firstname,lastname) values (".$db->Param('0').",".$db->Param('1').",".$db->Param('2').")";
00642         $db->bulkBind = true;
00643         $db->StartTrans();
00644         $db->debug=99;
00645         $db->Execute($sql,$arr);
00646         $db->CompleteTrans();
00647         $db->bulkBind = false;
00648         $rs = $db->Execute('select * from ADOXYZ order by id');
00649         if (!$rs || $rs->RecordCount() != 3) Err("Bad bulk insert");
00650         
00651         rs2html($rs);
00652         
00653         $db->Execute('delete from ADOXYZ');
00654                 
00655         print "<p>Inserting 50 rows</p>";
00656 
00657         for ($i = 0; $i < 5; $i++) {    
00658 
00659         $time = $db->DBDate(time());
00660         if (empty($_GET['hide'])) $db->debug = true;
00661         switch($db->databaseType){
00662         case 'mssqlpo':
00663         case 'mssql':
00664                 $sqlt = "CREATE TABLE mytable (
00665   row1 INT  IDENTITY(1,1) NOT NULL,
00666   row2 varchar(16),
00667   PRIMARY KEY  (row1))";
00668                 //$db->debug=1;
00669                 if (!$db->Execute("delete from mytable")) 
00670                         $db->Execute($sqlt);
00671                         
00672                 $ok = $db->Execute("insert into mytable (row2) values ('test')");
00673                 $ins_id=$db->Insert_ID();
00674                 echo "Insert ID=";var_dump($ins_id);
00675                 if ($ins_id == 0) Err("Bad Insert_ID()");
00676                 $ins_id2 = $db->GetOne("select row1 from mytable");
00677                 if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2");
00678                 
00679                 $arr = array(0=>'Caroline',1=>'Miranda');
00680                 $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)";
00681                 break;
00682         case 'mysqli':
00683         case 'mysqlt':
00684         case 'mysql':
00685                 $sqlt = "CREATE TABLE `mytable` (
00686   `row1` int(11) NOT NULL auto_increment,
00687   `row2` varchar(16) NOT NULL default '',
00688   PRIMARY KEY  (`row1`),
00689   KEY `myindex` (`row1`,`row2`)
00690 ) ";
00691                 if (!$db->Execute("delete from mytable")) 
00692                         $db->Execute($sqlt);
00693                         
00694                 $ok = $db->Execute("insert into mytable (row2) values ('test')");
00695                 $ins_id=$db->Insert_ID();
00696                 echo "Insert ID=";var_dump($ins_id);
00697                 if ($ins_id == 0) Err("Bad Insert_ID()");
00698                 $ins_id2 = $db->GetOne("select row1 from mytable");
00699                 if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2");
00700                 
00701         default:
00702                 $arr = array(0=>'Caroline',1=>'Miranda');
00703                 $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)";
00704                 break;
00705         
00706         case 'oci8':
00707         case 'oci805':
00708                 $arr = array('first'=>'Caroline','last'=>'Miranda');
00709                 $amt = rand() % 100;
00710                 $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,:first,:last,$time)";                
00711                 break;
00712         }
00713         if ($i & 1) {
00714                 $sql = $db->Prepare($sql);
00715         }
00716         $rs = $db->Execute($sql,$arr);
00717                 
00718         if ($rs === false) Err( 'Error inserting with parameters');
00719         else $rs->Close();
00720         $db->debug = false;
00721         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+1,'John','Lim',$time)");
00722         /*$ins_id=$db->Insert_ID();
00723         echo "Insert ID=";var_dump($ins_id);*/
00724         if ($db->databaseType == 'mysql') if ($ins_id == 0) Err('Bad Insert_ID');
00725         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+2,'Mary','Lamb',$time )");
00726         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+3,'George','Washington',$time )");
00727         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+4,'Mr. Alan','Tam',$time )");
00728         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+5,'Alan',".$db->quote("Turing'ton").",$time )");
00729         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created)values ($i*10+6,'Serena','Williams',$time )");
00730         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+7,'Yat Sun','Sun',$time )");
00731         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+8,'Wai Hun','See',$time )");
00732         $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+9,'Steven','Oey',$time )");
00733         } // for
00734         if (1) {
00735         $db->debug=1;
00736         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00737         $cnt = $db->GetOne("select count(*) from ADOXYZ");
00738         $rs = $db->Execute('update ADOXYZ set id=id+1');        
00739         if (!is_object($rs)) {
00740                 print_r($rs);
00741                 err("Update should return object");
00742         } 
00743         if (!$rs) err("Update generated error");
00744         
00745         $nrows = $db->Affected_Rows();   
00746         if ($nrows === false) print "<p><b>Affected_Rows() not supported</b></p>";
00747         else if ($nrows != $cnt)  print "<p><b>Affected_Rows() Error: $nrows returned (should be 50) </b></p>";
00748         else print "<p>Affected_Rows() passed</p>";
00749         }
00750         
00751         if ($db->dataProvider == 'oci8')  $array = array('zid'=>1,'zdate'=>date('Y-m-d',time()));
00752         else $array=array(1,date('Y-m-d',time()));
00753         
00754         
00755         #$array = array(1,date('Y-m-d',time()));
00756         $id = $db->GetOne("select id from ADOXYZ 
00757                 where id=".$db->Param('zid')." and created>=".$db->Param('ZDATE')."",
00758                 $array);
00759         if ($id != 1) Err("Bad bind; id=$id");
00760         else echo "<br>Bind date/integer 1 passed";
00761         
00762         $array =array(1,$db->BindDate(time()));
00763         $id = $db->GetOne("select id from ADOXYZ 
00764                 where id=".$db->Param('0')." and created>=".$db->Param('1')."",
00765                 $array);
00766         if ($id != 1) Err("Bad bind; id=$id");
00767         else echo "<br>Bind date/integer 2 passed";
00768         
00769         $db->debug = false;
00770         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00772         
00773         $rs = $db->Execute("select * from ADOXYZ where firstname = 'not known'");
00774         if (!$rs ||  !$rs->EOF) print "<p><b>Error on empty recordset</b></p>";
00775         else if ($rs->RecordCount() != 0) {
00776                 print "<p><b>Error on RecordCount. Should be 0. Was ".$rs->RecordCount()."</b></p>"; 
00777                 print_r($rs->fields);
00778         }
00779         if ($db->databaseType !== 'odbc') {
00780                 $rs = $db->Execute("select id,firstname,lastname,created,".$db->random." from ADOXYZ order by id");
00781                 if ($rs) {
00782                         if ($rs->RecordCount() != 50) {
00783                                 print "<p><b>RecordCount returns ".$rs->RecordCount().", should be 50</b></p>";
00784                                 adodb_pr($rs->GetArray());
00785                                 $poc = $rs->PO_RecordCount('ADOXYZ');
00786                                 if ($poc == 50) print "<p> &nbsp; &nbsp; PO_RecordCount passed</p>";
00787                                 else print "<p><b>PO_RecordCount returns wrong value: $poc</b></p>";
00788                         } else print "<p>RecordCount() passed</p>";
00789                         if (isset($rs->fields['firstname'])) print '<p>The fields columns can be indexed by column name.</p>';
00790                         else {
00791                                 Err( '<p>The fields columns <i>cannot</i> be indexed by column name.</p>');
00792                                 print_r($rs->fields);
00793                         }
00794                         if (empty($_GET['hide'])) rs2html($rs);
00795                 }
00796                 else print "<p><b>Error in Execute of SELECT with random</b></p>";
00797         }
00798         $val = $db->GetOne("select count(*) from ADOXYZ");
00799          if ($val == 50) print "<p>GetOne returns ok</p>";
00800          else print "<p><b>Fail: GetOne returns $val</b></p>";
00801 
00802          echo "<b>GetRow Test</b>";
00803         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00804         $val1 = $db->GetRow("select count(*) from ADOXYZ");
00805         $val2 = $db->GetRow("select count(*) from ADOXYZ");
00806          if ($val1[0] == 50 and sizeof($val1) == 1 and $val2[0] == 50 and sizeof($val2) == 1) print "<p>GetRow returns ok</p>";
00807          else {
00808                 print_r($val);
00809                 print "<p><b>Fail: GetRow returns {$val2[0]}</b></p>";
00810         }
00811 
00812         print "<p>FetchObject/FetchNextObject Test</p>";
00813         $rs = $db->Execute('select * from ADOXYZ');
00814         if ($rs) {
00815                 if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>";
00816                 
00817                 while ($o = $rs->FetchNextObject()) { // calls FetchObject internally
00818                         if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) {
00819                                 print_r($o);
00820                                 print "<p><b>Firstname is not string</b></p>";
00821                                 break;
00822                         }
00823                 }
00824         } else {
00825                 print "<p><b>Failed rs</b></p>";
00826                 die("<p>ADOXYZ table cannot be read - die()");
00827         }
00828         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00829         print "<p>FetchObject/FetchNextObject Test 2</p>";
00830         #$db->debug=99;
00831         $rs = $db->Execute('select * from ADOXYZ');
00832         if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>";
00833         print_r($rs->fields);
00834         while ($o = $rs->FetchNextObject()) { // calls FetchObject internally
00835                 if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) {
00836                         print_r($o);
00837                         print "<p><b>Firstname is not string</b></p>";
00838                         break;
00839                 }
00840         }
00841         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00842         
00843         $savefetch = $ADODB_FETCH_MODE;
00844         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
00845         
00846         print "<p>CacheSelectLimit  Test...</p>";
00847         $db->debug=1;
00848         $rs = $db->CacheSelectLimit('select  id, firstname from  ADOXYZ order by id',2);
00849         
00850         if ($rs && !$rs->EOF) {
00851                 if (isset($rs->fields[0])) {
00852                         Err("ASSOC has numeric fields");
00853                         print_r($rs->fields);
00854                 }
00855                 if ($rs->fields['id'] != 1)  {Err("Error"); print_r($rs->fields);};
00856                 if (trim($rs->fields['firstname']) != 'Caroline')  {print Err("Error 2"); print_r($rs->fields);};
00857                 
00858                 $rs->MoveNext();
00859                 if ($rs->fields['id'] != 2)  {Err("Error 3"); print_r($rs->fields);};
00860                 $rs->MoveNext();
00861                 if (!$rs->EOF) {
00862                         Err("Error EOF");
00863                         print_r($rs);
00864                 }
00865         }
00866         
00867         print "<p>FETCH_MODE = ASSOC: Should get 1, Caroline</p>";
00868         $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',2);
00869         if ($rs && !$rs->EOF) {
00870                 if (ADODB_ASSOC_CASE == 2) {
00871                         $id = 'ID';
00872                         $fname = 'FIRSTNAME';
00873                 }else {
00874                         $id = 'id';
00875                         $fname = 'firstname';
00876                 }
00877                 if ($rs->fields[$id] != 1)  {Err("Error 1"); print_r($rs->fields);};
00878                 if (trim($rs->fields[$fname]) != 'Caroline')  {Err("Error 2"); print_r($rs->fields);};
00879                 $rs->MoveNext();
00880                 if ($rs->fields[$id] != 2)  {Err("Error 3"); print_r($rs->fields);};
00881                 $rs->MoveNext();
00882                 if (!$rs->EOF) Err("Error EOF");
00883                 else if (is_array($rs->fields) || $rs->fields) {
00884                         Err("Error: ## fields should be set to false on EOF");
00885                         print_r($rs->fields);
00886                 }
00887         }
00888         
00889         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00890         print "<p>FETCH_MODE = NUM: Should get 1, Caroline</p>";
00891         $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1);
00892         if ($rs && !$rs->EOF) {
00893                 if (isset($rs->fields['id'])) Err("FETCH_NUM has ASSOC fields");
00894                 if ($rs->fields[0] != 1)  {Err("Error 1"); print_r($rs->fields);};
00895                 if (trim($rs->fields[1]) != 'Caroline')  {Err("Error 2");print_r($rs->fields);};
00896                 $rs->MoveNext();
00897                 if (!$rs->EOF) Err("Error EOF");
00898 
00899         }
00900         $ADODB_FETCH_MODE = $savefetch;
00901         
00902         $db->debug = false;
00903         print "<p>GetRowAssoc Upper: Should get 1, Caroline</p>";
00904         $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1);
00905         if ($rs && !$rs->EOF) {
00906                 $arr = $rs->GetRowAssoc();
00907                 if ($arr['ID'] != 1) {Err("Error 1");print_r($arr);};
00908                 if (trim($arr['FIRSTNAME']) != 'Caroline') {Err("Error 2"); print_r($arr);};
00909                 $rs->MoveNext();
00910                 if (!$rs->EOF) Err("Error EOF");
00911 
00912         }
00913         print "<p>GetRowAssoc Lower: Should get 1, Caroline</p>";
00914         $rs = $db->SelectLimit('select id,firstname from ADOXYZ order by id',1);
00915         if ($rs && !$rs->EOF) {
00916                 $arr = $rs->GetRowAssoc(false);
00917                 if ($arr['id'] != 1) {Err("Error 1"); print_r($arr);};
00918                 if (trim($arr['firstname']) != 'Caroline') {Err("Error 2"); print_r($arr);};
00919 
00920         }
00921         
00922         print "<p>GetCol Test</p>";
00923         $col = $db->GetCol('select distinct firstname from ADOXYZ order by 1');
00924         if (!is_array($col)) Err("Col size is wrong");
00925         if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong");
00926         
00927         
00928         $col = $db->CacheGetCol('select distinct firstname from ADOXYZ order by 1');
00929         if (!is_array($col)) Err("Col size is wrong");
00930         if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong");
00931 
00932         $db->debug = true;
00933         
00934                 
00935         echo "<p>Date Update Test</p>";
00936         $zdate = date('Y-m-d',time()+3600*24);
00937         $zdate = $db->DBDate($zdate);
00938         $db->Execute("update ADOXYZ set created=$zdate where id=1");
00939         $row = $db->GetRow("select created,firstname from ADOXYZ where id=1");
00940         print_r($row); echo "<br>";
00941         
00942         
00943         
00944         print "<p>SelectLimit Distinct Test 1: Should see Caroline, John and Mary</p>";
00945         $rs = $db->SelectLimit('select distinct * from ADOXYZ order by id',3);
00946         
00947         
00948         if ($rs && !$rs->EOF) {
00949                 if (trim($rs->fields[1]) != 'Caroline') Err("Error 1 (exp Caroline), ".$rs->fields[1]);
00950                 $rs->MoveNext();
00951                 
00952                 if (trim($rs->fields[1]) != 'John') Err("Error 2 (exp John), ".$rs->fields[1]);
00953                 $rs->MoveNext();
00954                 if (trim($rs->fields[1]) != 'Mary') Err("Error 3 (exp Mary),".$rs->fields[1]);
00955                 $rs->MoveNext();
00956                 if (! $rs->EOF) Err("Error EOF");
00957                 //rs2html($rs);
00958         } else Err("Failed SelectLimit Test 1");
00959         
00960         print "<p>SelectLimit Test 2: Should see Mary, George and Mr. Alan</p>";
00961         $rs = $db->SelectLimit('select * from ADOXYZ order by id',3,2);
00962         if ($rs && !$rs->EOF) {
00963                 if (trim($rs->fields[1]) != 'Mary') Err("Error 1 - No Mary, instead: ".$rs->fields[1]);
00964                 $rs->MoveNext();
00965                 if (trim($rs->fields[1]) != 'George')Err("Error 2 - No George, instead: ".$rs->fields[1]);
00966                 $rs->MoveNext();
00967                 if (trim($rs->fields[1]) != 'Mr. Alan') Err("Error 3 - No Mr. Alan, instead: ".$rs->fields[1]);
00968                 $rs->MoveNext();
00969                 if (! $rs->EOF) Err("Error EOF");
00970         //      rs2html($rs);
00971         }
00972          else Err("Failed SelectLimit Test 2 ". ($rs ? 'EOF':'no RS'));
00973         
00974         print "<p>SelectLimit Test 3: Should see Wai Hun and Steven</p>";
00975         $db->debug=1;
00976         global $A; $A=1;
00977         $rs = $db->SelectLimit('select * from ADOXYZ order by id',-1,48);
00978         $A=0;
00979         if ($rs && !$rs->EOF) {
00980                 if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>";
00981                 if (trim($rs->fields[1]) != 'Wai Hun') Err("Error 1 ".$rs->fields[1]);
00982                 $rs->MoveNext();
00983                 if (trim($rs->fields[1]) != 'Steven') Err("Error 2 ".$rs->fields[1]);
00984                 $rs->MoveNext();
00985                 if (! $rs->EOF) {
00986                         Err("Error EOF");
00987                 }
00988                 //rs2html($rs);
00989         }
00990          else Err("Failed SelectLimit Test 3");
00991                 $db->debug = false;
00992         
00993         
00994         $rs = $db->Execute("select * from ADOXYZ order by id");
00995         print "<p>Testing Move()</p>";  
00996         if (!$rs)Err( "Failed Move SELECT");
00997         else {
00998                 if (!$rs->Move(2)) {
00999                         if (!$rs->canSeek) print "<p>$db->databaseType: <b>Move(), MoveFirst() nor MoveLast() not supported.</b></p>";
01000                         else print '<p><b>RecordSet->canSeek property should be set to false</b></p>';
01001                 } else {
01002                         $rs->MoveFirst();
01003                         if (trim($rs->Fields("firstname")) != 'Caroline') {
01004                                 print "<p><b>$db->databaseType: MoveFirst failed -- probably cannot scroll backwards</b></p>";
01005                         }
01006                         else print "MoveFirst() OK<BR>";
01007                                                 
01008                                                 // Move(3) tests error handling -- MoveFirst should not move cursor
01009                         $rs->Move(3);
01010                         if (trim($rs->Fields("firstname")) != 'George') {
01011                                 print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(3) failed</b></p>";
01012                         } else print "Move(3) OK<BR>";
01013                                                 
01014                         $rs->Move(7);
01015                         if (trim($rs->Fields("firstname")) != 'Yat Sun') {
01016                                 print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(7) failed</b></p>";
01017                                 print_r($rs);
01018                         } else print "Move(7) OK<BR>";
01019                         if ($rs->EOF) Err("Move(7) is EOF already");
01020                         $rs->MoveLast();
01021                         if (trim($rs->Fields("firstname")) != 'Steven'){
01022                                  print '<p>'.$rs->Fields("id")."<b>$db->databaseType: MoveLast() failed</b></p>";
01023                                  print_r($rs);
01024                         }else print "MoveLast() OK<BR>";
01025                         $rs->MoveNext();
01026                         if (!$rs->EOF) err("Bad MoveNext");
01027                         if ($rs->canSeek) {
01028                                 $rs->Move(3);
01029                                 if (trim($rs->Fields("firstname")) != 'George') {
01030                                         print '<p>'.$rs->Fields("id")."<b>$db->databaseType: Move(3) after MoveLast failed</b></p>";
01031                                         
01032                                 } else print "Move(3) after MoveLast() OK<BR>";
01033                         }
01034                         
01035                         print "<p>Empty Move Test";
01036                         $rs = $db->Execute("select * from ADOXYZ where id > 0 and id < 0");
01037                         $rs->MoveFirst();
01038                         if (!$rs->EOF || $rs->fields) Err("Error in empty move first");
01039                 }
01040         }
01041         
01042         $rs = $db->Execute('select * from ADOXYZ where id = 2');
01043         if ($rs->EOF || !is_array($rs->fields)) Err("Error in select");
01044         $rs->MoveNext();
01045         if (!$rs->EOF) Err("Error in EOF (xx) ");
01046  //     $db->debug=true;
01047         print "<p>Testing ADODB_FETCH_ASSOC and concat: concat firstname and lastname</p>";
01048 
01049         $save = $ADODB_FETCH_MODE;
01050         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01051         if ($db->dataProvider == 'postgres') {
01052                 $sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ";
01053                 $rs = $db->Execute($sql);
01054         } else {
01055                 $sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ";
01056                 $rs = $db->Execute($sql);
01057         }
01058         if ($rs) {
01059                 if (empty($_GET['hide'])) rs2html($rs);
01060         } else {
01061                 Err( "Failed Concat:".$sql);
01062         }
01063         $ADODB_FETCH_MODE = $save;
01064         print "<hr />Testing GetArray() ";
01065         //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01066         
01067         $rs = $db->Execute("select * from ADOXYZ order by id");
01068         if ($rs) {
01069                 $arr = $rs->GetArray(10);
01070                 if (sizeof($arr) != 10 || trim($arr[1][1]) != 'John' || trim($arr[1][2]) != 'Lim') print $arr[1][1].' '.$arr[1][2]."<b> &nbsp; ERROR</b><br>";
01071                 else print " OK<BR>";
01072         }
01073         
01074         $arr = $db->GetArray("select x from ADOXYZ");
01075         $e = $db->ErrorMsg(); $e2 = $db->ErrorNo();
01076         echo "Testing error handling, should see illegal column 'x' error=<i>$e ($e2) </i><br>";
01077         if (!$e || !$e2) Err("Error handling did not work");
01078         print "Testing FetchNextObject for 1 object ";
01079         $rs = $db->Execute("select distinct lastname,firstname from ADOXYZ where firstname='Caroline'");
01080         $fcnt = 0;
01081         if ($rs)
01082         while ($o = $rs->FetchNextObject()) {
01083                 $fcnt += 1;     
01084         }
01085         if ($fcnt == 1) print " OK<BR>";
01086         else print "<b>FAILED</b><BR>";
01087         
01088         $stmt = $db->Prepare("select * from ADOXYZ where id < 3");
01089         $rs = $db->Execute($stmt);
01090         if (!$rs) Err("Prepare failed");
01091         else {
01092                 $arr = $rs->GetArray();
01093                 if (!$arr) Err("Prepare failed 2");
01094                 if (sizeof($arr) != 2) Err("Prepare failed 3");
01095         }
01096         print "Testing GetAssoc() ";
01097         $savecrecs = $ADODB_COUNTRECS;
01098         $ADODB_COUNTRECS = false;
01099         //$arr = $db->GetArray("select  lastname,firstname from ADOXYZ");
01100         //print_r($arr);
01101         print "<hr />";
01102         $rs = $db->Execute("select distinct lastname,firstname,created from ADOXYZ");
01103         
01104         if ($rs) {
01105                 $arr = $rs->GetAssoc();
01106                 //print_r($arr);
01107                 if (empty($arr['See']) || trim(reset($arr['See'])) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>";
01108                 else print " OK 1";
01109         }
01110         
01111         $arr = $db->GetAssoc("select distinct lastname,firstname from ADOXYZ");
01112         if ($arr) {
01113                 //print_r($arr);
01114                 if (empty($arr['See']) || trim($arr['See']) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>";
01115                 else print " OK 2<BR>";
01116         }
01117         // Comment this out to test countrecs = false
01118         $ADODB_COUNTRECS = $savecrecs;
01119         $db->debug=1;
01120         $query = $db->Prepare("select count(*) from ADOXYZ");
01121         $rs = $db->CacheExecute(10,$query);
01122         if (reset($rs->fields) != 50) echo Err("$cnt wrong for Prepare/CacheGetOne");
01123         
01124         for ($loop=0; $loop < 1; $loop++) {
01125         print "Testing GetMenu() and CacheExecute<BR>";
01126         $db->debug = true;
01127         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01128         
01129         
01130 
01131 
01132         if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu('menu','Steven').'<BR>'; 
01133         else print " Fail<BR>";
01134         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01135         
01136         if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu('menu','Steven',false).'<BR>';
01137         else print " Fail<BR>";
01138         
01139         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01140         
01141         if ($rs) print ' 1st line set to **** , Steven selected: '. $rs->GetMenu('menu','Steven','1st:****').'<BR>';
01142         else print " Fail<BR>";
01143         
01144 
01145         
01146         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01147         if ($rs) print ' Multiple, Alan selected: '. $rs->GetMenu('menu','Alan',false,true).'<BR>';
01148         else print " Fail<BR>";
01149         print '</p><hr />';
01150         
01151         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01152         if ($rs) {
01153                 print ' Multiple, Alan and George selected: '. $rs->GetMenu('menu',array('Alan','George'),false,true);
01154                 if (empty($rs->connection)) print "<b>Connection object missing from recordset</b></br>";
01155         } else print " Fail<BR>";
01156         print '</p><hr />';
01157         
01158         print "Testing GetMenu3()<br>";
01159         $rs = $db->Execute("select ".$db->Concat('firstname',"'-'",'id').",id, lastname from ADOXYZ order by lastname,id");
01160         if ($rs) print "Grouped Menu: ".$rs->GetMenu3('name');
01161         else Err('Grouped Menu GetMenu3()');
01162         print "<hr />";
01163 
01164         print "Testing GetMenu2() <BR>";
01165         $rs = $db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ");
01166         if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu2('menu',('Oey')).'<BR>'; 
01167         else print " Fail<BR>";
01168         $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ");
01169         if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu2('menu',('Oey'),false).'<BR>';
01170         else print " Fail<BR>";
01171         }
01172         echo "<h3>CacheExecute</h3>";
01173 
01174         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
01175         $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ");
01176         print_r($rs->fields); echo $rs->fetchMode;echo "<br>";
01177         echo $rs->Fields('firstname');
01178         
01179         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01180         $rs = $db->CacheExecute(6,"select distinct firstname,lastname from ADOXYZ");
01181         print_r($rs->fields);echo "<br>";
01182         echo $rs->Fields('firstname');
01183         $db->debug = false;
01184         
01185         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
01186         // phplens
01187         
01188         $sql = 'select * from ADOXYZ where 0=1';
01189         echo "<p>**Testing '$sql' (phplens compat 1)</p>";
01190         $rs = $db->Execute($sql);
01191         if (!$rs) err( "<b>No recordset returned for '$sql'</b>");
01192         if (!$rs->FieldCount()) err( "<b>No fields returned for $sql</b>");
01193         if (!$rs->FetchField(1)) err( "<b>FetchField failed for $sql</b>");
01194         
01195         $sql = 'select * from ADOXYZ order by 1';
01196         echo "<p>**Testing '$sql' (phplens compat 2)</p>";
01197         $rs = $db->Execute($sql);
01198         if (!$rs) err( "<b>No recordset returned for '$sql'<br>".$db->ErrorMsg()."</b>");
01199         
01200         
01201         $sql = 'select * from ADOXYZ order by 1,1';
01202         echo "<p>**Testing '$sql' (phplens compat 3)</p>";
01203         $rs = $db->Execute($sql);
01204         if (!$rs) err( "<b>No recordset returned for '$sql'<br>".$db->ErrorMsg()."</b>");
01205         
01206         
01207         // Move
01208         $rs1 = $db->Execute("select id from ADOXYZ where id <= 2 order by 1");
01209         $rs2 = $db->Execute("select id from ADOXYZ where id = 3 or id = 4 order by 1");
01210 
01211         if ($rs1) $rs1->MoveLast();
01212         if ($rs2) $rs2->MoveLast();
01213         
01214         if (empty($rs1) || empty($rs2) || $rs1->fields[0] != 2 || $rs2->fields[0] != 4) {
01215                 $a = $rs1->fields[0];
01216                 $b = $rs2->fields[0];
01217                 print "<p><b>Error in multiple recordset test rs1=$a rs2=$b (should be rs1=2 rs2=4)</b></p>";
01218         } else
01219                 print "<p>Testing multiple recordsets OK</p>";
01220                 
01221         
01222         echo "<p> GenID test: ";
01223         for ($i=1; $i <= 10; $i++) 
01224                 echo  "($i: ",$val = $db->GenID($db->databaseType.'abcseq7' ,5), ") ";
01225         if ($val == 0) Err("GenID not supported");
01226         
01227         if ($val) {
01228                 $db->DropSequence('abc_seq2');
01229                 $db->CreateSequence('abc_seq2');
01230                 $val = $db->GenID('abc_seq2');
01231                 $db->DropSequence('abc_seq2');
01232                 $db->CreateSequence('abc_seq2');
01233                 $val = $db->GenID('abc_seq2');
01234                 if ($val != 1) Err("Drop and Create Sequence not supported ($val)");
01235         }
01236         echo "<p>";
01237         
01238         if (substr($db->dataProvider,0,3) != 'notused') { // used to crash ado
01239                 $sql = "select firstnames from ADOXYZ";
01240                 print "<p>Testing execution of illegal statement: <i>$sql</i></p>";
01241                 if ($db->Execute($sql) === false) {
01242                         print "<p>This returns the following ErrorMsg(): <i>".$db->ErrorMsg()."</i> and ErrorNo(): ".$db->ErrorNo().'</p>';
01243                 } else 
01244                         print "<p><b>Error in error handling -- Execute() should return false</b></p>";
01245         } else 
01246                 print "<p><b>ADO skipped error handling of bad select statement</b></p>";
01247         
01248         print "<p>ASSOC TEST 2<br>";
01249         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01250         $rs = $db->query('select * from ADOXYZ order by id');
01251         if ($ee = $db->ErrorMsg()) {
01252                 Err("Error message=$ee");
01253         }
01254         if ($ee = $db->ErrorNo()) {
01255                 Err("Error No = $ee");
01256         }
01257         print_r($rs->fields);
01258         for($i=0;$i<$rs->FieldCount();$i++) 
01259         { 
01260                 $fld=$rs->FetchField($i); 
01261                 print "<br> Field name is ".$fld->name; 
01262                 print " ".$rs->Fields($fld->name); 
01263         } 
01264 
01265                 
01266         print "<p>BOTH TEST 2<br>";
01267         if ($db->dataProvider == 'ado') {
01268                 print "<b>ADODB_FETCH_BOTH not supported</b> for dataProvider=".$db->dataProvider."<br>";
01269         } else {
01270                 $ADODB_FETCH_MODE = ADODB_FETCH_BOTH;
01271                 $rs = $db->query('select * from ADOXYZ order by id');
01272                 for($i=0;$i<$rs->FieldCount();$i++) 
01273                 { 
01274                         $fld=$rs->FetchField($i); 
01275                         print "<br> Field name is ".$fld->name; 
01276                         print " ".$rs->Fields($fld->name); 
01277                 } 
01278         }
01279         
01280         print "<p>NUM TEST 2<br>";
01281         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
01282         $rs = $db->query('select * from ADOXYZ order by id');
01283         for($i=0;$i<$rs->FieldCount();$i++) 
01284         { 
01285                 $fld=$rs->FetchField($i); 
01286                 print "<br> Field name is ".$fld->name; 
01287                 print " ".$rs->Fields($fld->name); 
01288         } 
01289         
01290         print "<p>ASSOC Test of SelectLimit<br>";
01291         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01292         $rs = $db->selectlimit('select * from ADOXYZ order by id',3,4);
01293         $cnt = 0;
01294         while ($rs && !$rs->EOF) {
01295                 $cnt += 1;
01296                 if (!isset($rs->fields['firstname'])) {
01297                         print "<br><b>ASSOC returned numeric field</b></p>";
01298                         break;
01299                 }
01300                 $rs->MoveNext();
01301         }
01302         if ($cnt != 3) print "<br><b>Count should be 3, instead it was $cnt</b></p>";
01303         
01304         
01305         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
01306         if ($db->sysDate) {
01307                 $saved = $db->debug;
01308                 $db->debug = 1;
01309                 $rs = $db->Execute("select {$db->sysDate} from ADOXYZ where id=1");
01310                 if (ADORecordSet::UnixDate(date('Y-m-d')) != $rs->UnixDate($rs->fields[0])) {
01311                         print "<p><b>Invalid date {$rs->fields[0]}</b></p>";
01312                 } else
01313                         print "<p>Passed \$sysDate test ({$rs->fields[0]})</p>";
01314                 
01315                 print_r($rs->FetchField(0));
01316                 print time();
01317                 $db->debug=$saved;
01318         } else {
01319                 print "<p><b>\$db->sysDate not defined</b></p>";
01320         }
01321 
01322         print "<p>Test CSV</p>";
01323         include_once('../toexport.inc.php');
01324         //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01325         $rs = $db->SelectLimit('select id,firstname,lastname,created,\'He, he\' he,\'"\' q  from ADOXYZ',10);   
01326         
01327         print "<pre>";
01328         print rs2csv($rs);
01329         print "</pre>";
01330         
01331         $rs = $db->SelectLimit('select id,firstname,lastname,created,\'The      "young man", he said\' from ADOXYZ',10);        
01332         
01333         if (PHP_VERSION < 5) {
01334                 print "<pre>";
01335                 rs2tabout($rs);
01336                 print "</pre>";
01337         }
01338         #print " CacheFlush ";
01339         #$db->CacheFlush();
01340         
01341         $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A');
01342         $sql = "SELECT $date from ADOXYZ";
01343         print "<p>Test SQLDate: ".htmlspecialchars($sql)."</p>";
01344         $rs = $db->SelectLimit($sql,1);
01345         $d = date('d-m-M-Y-').'Q'.(ceil(date('m')/3.0)).date(' h:i:s A');
01346         if (!$rs) Err("SQLDate query returned no recordset");
01347         else if ($d != $rs->fields[0]) Err("SQLDate 1 failed expected: <br>act:$d <br>sql:".$rs->fields[0]);
01348         
01349         $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A',$db->DBDate("1974-02-25"));
01350         $sql = "SELECT $date from ADOXYZ";
01351         print "<p>Test SQLDate: ".htmlspecialchars($sql)."</p>";
01352         $db->debug=1;
01353         $rs = $db->SelectLimit($sql,1);
01354         $ts = ADOConnection::UnixDate('1974-02-25');
01355         $d = date('d-m-M-Y-',$ts).'Q'.(ceil(date('m',$ts)/3.0)).date(' h:i:s A',$ts);
01356         if (!$rs) {
01357                 Err("SQLDate query returned no recordset");
01358                 echo $db->ErrorMsg(),'<br>';
01359         } else if ($d != reset($rs->fields)) {
01360                 Err("SQLDate 2 failed expected: <br>act:$d <br>sql:".$rs->fields[0].' <br>'.$db->ErrorMsg());
01361         }
01362         
01363         
01364         print "<p>Test Filter</p>";
01365         $db->debug = 1;
01366         
01367         $rs = $db->SelectLimit('select * from ADOXYZ where id < 3 order by id');
01368         
01369         $rs = RSFilter($rs,'do_strtolower');
01370         if (trim($rs->fields[1]) != 'caroline'  && trim($rs->fields[2]) != 'miranda') {
01371                 err('**** RSFilter failed');
01372                 print_r($rs->fields);
01373         }
01374         
01375         rs2html($rs);
01376                 
01377         $db->debug=1;
01378         
01379         
01380         print "<p>Test Replace</p>";
01381         
01382         $ret = $db->Replace('ADOXYZ', 
01383                 array('id'=>1,'firstname'=>'Caroline','lastname'=>'Miranda'),
01384                 array('id'),
01385                 $autoq = true);
01386         if (!$ret) echo "<p>Error in replacing existing record</p>";
01387         else {
01388                 $saved = $db->debug;
01389                 $db->debug = 0;
01390                 $savec = $ADODB_COUNTRECS;
01391                 $ADODB_COUNTRECS = true;
01392                 $rs = $db->Execute('select * FROM ADOXYZ where id=1');
01393                 $db->debug = $saved;
01394                 if ($rs->RecordCount() != 1) {
01395                         $cnt = $rs->RecordCount();
01396                         rs2html($rs);
01397                         print "<b>Error - Replace failed, count=$cnt</b><p>";
01398                 }
01399                 $ADODB_COUNTRECS = $savec;
01400         }
01401         $ret = $db->Replace('ADOXYZ', 
01402                 array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'),
01403                 array('id','firstname'),
01404                 $autoq = true);
01405         if ($ret != 2) print "<b>Replace failed: </b>";
01406         print "test A return value=$ret (2 expected) <p>";
01407         
01408         $ret = $db->Replace('ADOXYZ', 
01409                 array('id'=>1000,'firstname'=>'Sherazade','lastname'=>'Al-Rashid'),
01410                 'id',
01411                 $autoq = true);
01412         if ($ret != 1) 
01413                 if ($db->dataProvider == 'ibase' && $ret == 2);
01414                 else print "<b>Replace failed: </b>";
01415         print "test B return value=$ret (1 or if ibase then 2 expected) <p>";
01416         
01417         print "<h3>rs2rs Test</h3>";
01418         
01419         $rs = $db->Execute('select * from ADOXYZ where id>= 1 order by id');
01420         $rs = $db->_rs2rs($rs);
01421         $rs->valueX = 'X';
01422         $rs->MoveNext();
01423         $rs = $db->_rs2rs($rs);
01424         if (!isset($rs->valueX)) err("rs2rs does not preserve array recordsets");
01425         if (reset($rs->fields) != 1) err("rs2rs does not move to first row: id=".reset($rs->fields));
01426 
01428         include_once('../pivottable.inc.php');
01429         print "<h3>Pivot Test</h3>";
01430         $db->debug=true;
01431         $sql = PivotTableSQL(
01432                 $db,                    # adodb connection
01433                 'ADOXYZ',               # tables
01434                 'firstname',    # row fields
01435                 'lastname',             # column fields 
01436                 false,                  # join
01437                 'ID',                   # sum
01438                 'Sum ',                 # label for sum
01439                 'sum',                  # aggregate function
01440                 true
01441         );
01442         $rs = $db->Execute($sql);
01443         if ($rs) rs2html($rs);
01444         else Err("Pivot sql error");
01445         
01446         $pear = false; //true;
01447         $db->debug=false;
01448         
01449         if ($pear) {
01450         // PEAR TESTS BELOW
01451         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
01452         
01453         include_once "PEAR.php";
01454         $rs = $db->query('select * from ADOXYZ where id>0 and id<10 order by id');
01455         
01456         $i = 0;
01457         if ($rs && !$rs->EOF) {
01458                 while ($arr = $rs->fetchRow()) {
01459                         $i++;
01460                         //print "$i ";
01461                         if ($arr[0] != $i) {
01462                                 print_r($arr);
01463                                 print "<p><b>PEAR DB emulation error 1.</b></p>";
01464                                 $pear = false;
01465                                 break;
01466                         }
01467                 }
01468                 $rs->Close();
01469         }
01470         
01471         
01472         if ($i != $db->GetOne('select count(*) from ADOXYZ where id>0 and id<10')) {
01473                 print "<p><b>PEAR DB emulation error 1.1 EOF ($i)</b></p>";
01474                 $pear = false;
01475         }
01476         
01477         $rs = $db->limitQuery('select * from ADOXYZ where id>0 order by id',$i=3,$top=3);
01478         $i2 = $i;
01479         if ($rs && !$rs->EOF) {
01480 
01481                 while (!is_object($rs->fetchInto($arr))) {
01482                         $i2++;
01483                         
01484         //                      print_r($arr);
01485         //              print "$i ";print_r($arr);
01486                         if ($arr[0] != $i2) {
01487                                 print "<p><b>PEAR DB emulation error 2.</b></p>";
01488                                 $pear = false;
01489                                 break;
01490                         }
01491                 }
01492                 $rs->Close();
01493         }
01494         if ($i2 != $i+$top) {
01495                 print "<p><b>PEAR DB emulation error 2.1 EOF (correct=$i+$top, actual=$i2)</b></p>";
01496                 $pear = false;
01497         }
01498         }
01499         if ($pear) print "<p>PEAR DB emulation passed.</p>";
01500         flush();
01501 
01502         
01503         $rs = $db->SelectLimit("select ".$db->sysDate." from ADOXYZ",1);
01504         $date = $rs->fields[0];
01505         if (!$date) Err("Bad sysDate");
01506         else {
01507                 $ds = $db->UserDate($date,"d m Y");
01508                 if ($ds != date("d m Y")) Err("Bad UserDate: ".$ds.' expected='.date("d m Y"));
01509                 else echo "Passed UserDate: $ds<p>";
01510         }
01511         $db->debug=1;
01512         if ($db->dataProvider == 'oci8') 
01513                 $rs = $db->SelectLimit("select to_char(".$db->sysTimeStamp.",'YYYY-MM-DD HH24:MI:SS') from ADOXYZ",1);
01514         else 
01515                 $rs = $db->SelectLimit("select ".$db->sysTimeStamp." from ADOXYZ",1);
01516         $date = $rs->fields[0];
01517         if (!$date) Err("Bad sysTimeStamp");
01518         else {
01519                 $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y");
01520                 if ($ds != date("H \\h\\r\\s-d m Y")) Err("Bad UserTimeStamp: ".$ds.", correct is ".date("H \\h\\r\\s-d m Y"));
01521                 else echo "Passed UserTimeStamp: $ds<p>";
01522                 
01523                 $date = 100;
01524                 $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y");
01525                 $ds2 = date("H \\h\\r\\s-d m Y",$date);
01526                 if ($ds != $ds2) Err("Bad UserTimeStamp 2: $ds: $ds2");
01527                 else echo "Passed UserTimeStamp 2: $ds<p>";
01528         }
01529         flush();
01530         
01531         if ($db->hasTransactions) {
01532                 $db->debug=1;
01533                 echo "<p>Testing StartTrans CompleteTrans</p>";
01534                 $db->raiseErrorFn = false;
01535                 
01536                 $db->SetTransactionMode('SERIALIZABLE');
01537                 $db->StartTrans();
01538                 $rs = $db->Execute('select * from notable');
01539                         $db->StartTrans();
01540                                 $db->BeginTrans();
01541                         $db->Execute("update ADOXYZ set firstname='Carolx' where id=1");
01542                                 $db->CommitTrans();
01543                         $db->CompleteTrans();
01544                 $rez = $db->CompleteTrans();
01545                 $db->SetTransactionMode('');
01546                 $db->debug=0;
01547                 if ($rez !== false) {
01548                         if (is_null($rez)) Err("Error: _transOK not modified");
01549                         else Err("Error: CompleteTrans (1) should have failed");
01550                 } else {
01551                         $name = $db->GetOne("Select firstname from ADOXYZ where id=1");
01552                         if ($name == "Carolx") Err("Error: CompleteTrans (2) should have failed");
01553                         else echo "<p> -- Passed StartTrans test1 - rolling back</p>";
01554                 }
01555                 
01556                 $db->StartTrans();
01557                         $db->BeginTrans();
01558                 $db->Execute("update ADOXYZ set firstname='Carolx' where id=1");
01559                         $db->RollbackTrans();
01560                 $rez = $db->CompleteTrans();
01561                 if ($rez !== true) Err("Error: CompleteTrans (1) should have succeeded");
01562                 else {
01563                         $name = $db->GetOne("Select firstname from ADOXYZ where id=1");
01564                         if (trim($name) != "Carolx") Err("Error: CompleteTrans (2) should have succeeded, returned name=$name");
01565                         else echo "<p> -- Passed StartTrans test2 - commiting</p>";
01566                 }
01567         }
01568         flush();
01569         $saved = $db->debug;
01570         $db->debug=1;
01571         $cnt = _adodb_getcount($db, 'select * from ADOXYZ where firstname in (select firstname from ADOXYZ)');
01572         echo "<b>Count=</b> $cnt";
01573         $db->debug=$saved;
01574         
01575         global $TESTERRS;
01576         $debugerr = true;
01577         
01578         global $ADODB_LANG;$ADODB_LANG = 'fr';
01579         $db->debug = false;
01580         $TESTERRS = 0;
01581         $db->raiseErrorFn = 'adodb_test_err';
01582         global $ERRNO; // from adodb_test_err
01583         $db->Execute('select * from nowhere');
01584         $metae = $db->MetaError($ERRNO);
01585         if ($metae !== DB_ERROR_NOSUCHTABLE) print "<p><b>MetaError=".$metae." wrong</b>, should be ".DB_ERROR_NOSUCHTABLE."</p>";
01586         else print "<p>MetaError ok (".DB_ERROR_NOSUCHTABLE."): ".$db->MetaErrorMsg($metae)."</p>";
01587         if ($TESTERRS != 1) print "<b>raiseErrorFn select nowhere failed</b><br>";
01588         $rs = $db->Execute('select * from ADOXYZ');
01589         if ($debugerr) print " Move";
01590         $rs->Move(100);
01591         $rs->_queryID = false;
01592         if ($debugerr) print " MoveNext";
01593         $rs->MoveNext();
01594         if ($debugerr) print " $rs=false";
01595         $rs = false;
01596 
01597         flush();
01598         
01599         print "<p>SetFetchMode() tests</p>";
01600         $db->SetFetchMode(ADODB_FETCH_ASSOC);
01601         $rs = $db->SelectLimit('select firstname from ADOXYZ',1);
01602         if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC");
01603         
01604         $ADODB_FETCH_MODE = ADODB_FETCH_NUM;    
01605         $rs = $db->SelectLimit('select firstname from ADOXYZ',1);
01606         //var_dump($rs->fields);
01607         if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC");
01608         
01609         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;  
01610         $db->SetFetchMode(ADODB_FETCH_NUM);
01611         $rs = $db->SelectLimit('select firstname from ADOXYZ',1);
01612         if (!isset($rs->fields[0])) Err("BAD FETCH NUM");
01613         
01614         flush();
01615         
01616         print "<p>Test MetaTables again with SetFetchMode()</p>";
01617         $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
01618         $db->SetFetchMode(ADODB_FETCH_ASSOC);
01619         print_r($db->MetaTables());
01620         print "<p>";
01621         
01623         
01624         print "<p>Testing Bad Connection</p>";
01625         flush();
01626         
01627         if (true || PHP_VERSION < 5)  {
01628                 if ($db->dataProvider == 'odbtp') $db->databaseType = 'odbtp';
01629                 $conn = NewADOConnection($db->databaseType);
01630                 $conn->raiseErrorFn = 'adodb_test_err';
01631                 if (1) $conn->PConnect('abc','baduser','badpassword');
01632                 if ($TESTERRS == 2) print "raiseErrorFn tests passed<br>";
01633                 else print "<b>raiseErrorFn tests failed ($TESTERRS)</b><br>";
01634                 
01635                 flush();
01636         }
01638         
01639         global $nocountrecs;
01640         
01641         if (isset($nocountrecs) && $ADODB_COUNTRECS) err("Error: \$ADODB_COUNTRECS is set");
01642         if (empty($nocountrecs) && $ADODB_COUNTRECS==false) err("Error: \$ADODB_COUNTRECS is not set");
01643 
01644         flush();
01645 ?>
01646         </p>
01647         <table width=100% ><tr><td bgcolor=beige>&nbsp;</td></tr></table>
01648         </p></form>
01649 <?php
01650 
01651         if ($rs1) $rs1->Close();
01652         if ($rs2) $rs2->Close();
01653         if ($rs) $rs->Close();
01654         $db->Close();
01655         
01656         if ($db->transCnt != 0) Err("Error in transCnt=$db->transCnt (should be 0)");
01657         
01658         
01659         printf("<p>Total queries=%d; total cached=%d</p>",$EXECS+$CACHED, $CACHED);
01660         flush();
01661 }
01662 
01663 function adodb_test_err($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false)
01664 {
01665 global $TESTERRS,$ERRNO;
01666 
01667         $ERRNO = $errno;
01668         $TESTERRS += 1;
01669         print "<i>** $dbms ($fn): errno=$errno &nbsp; errmsg=$errmsg ($p1,$p2)</i><br>";
01670 }
01671 
01672 //--------------------------------------------------------------------------------------
01673 
01674 
01675 @set_time_limit(240); // increase timeout
01676 
01677 include("../tohtml.inc.php");
01678 include("../adodb.inc.php");
01679 include("../rsfilter.inc.php");
01680 
01681 /* White Space Check */
01682 
01683 if (isset($_SERVER['argv'][1])) {
01684         //print_r($_SERVER['argv']);
01685         $_GET[$_SERVER['argv'][1]] = 1;
01686 }
01687 
01688 if (@$_SERVER['COMPUTERNAME'] == 'TIGRESS') {
01689         CheckWS('mysqlt');
01690         CheckWS('postgres');
01691         CheckWS('oci8po');
01692         
01693         CheckWS('firebird');
01694         CheckWS('sybase');
01695         if (!ini_get('safe_mode')) CheckWS('informix');
01696 
01697         CheckWS('ado_mssql');
01698         CheckWS('ado_access');
01699         CheckWS('mssql');
01700         
01701         CheckWS('vfp');
01702         CheckWS('sqlanywhere');
01703         CheckWS('db2');
01704         CheckWS('access');
01705         CheckWS('odbc_mssql');
01706         CheckWS('firebird15');
01707         //
01708         CheckWS('oracle');
01709         CheckWS('proxy');
01710         CheckWS('fbsql');
01711         print "White Space Check complete<p>";
01712 }
01713 if (sizeof($_GET) == 0) $testmysql = true;
01714 
01715 
01716 foreach($_GET as $k=>$v)  {
01717         //global $$k;
01718         $$k = $v;
01719 }       
01720 
01721 ?>
01722 <html>
01723 <title>ADODB Testing</title>
01724 <body bgcolor=white>
01725 <H1>ADODB Test</H1>
01726 
01727 This script tests the following databases: Interbase, Oracle, Visual FoxPro, Microsoft Access (ODBC and ADO), MySQL, MSSQL (ODBC, native, ADO). 
01728 There is also support for Sybase, PostgreSQL.</p>
01729 For the latest version of ADODB, visit <a href=http://adodb.sourceforge.net/>adodb.sourceforge.net</a>.</p>
01730 
01731 Test <a href=test4.php>GetInsertSQL/GetUpdateSQL</a> &nbsp; 
01732         <a href=testsessions.php>Sessions</a> &nbsp;
01733         <a href=testpaging.php>Paging</a> &nbsp;
01734         <a href=test-perf.php>Perf Monitor</a><p>
01735 <?php
01736 
01737 
01738 include_once('../adodb-time.inc.php');
01739 if (isset($_GET['time'])) adodb_date_test();
01740 flush();
01741 
01742 include_once('./testdatabases.inc.php');
01743 
01744 echo "<br>vers=",ADOConnection::Version();
01745 
01746 
01747 
01748 ?>
01749 <p><i>ADODB Database Library  (c) 2000-2011 John Lim. All rights reserved. Released under BSD and LGPL, PHP <?php echo PHP_VERSION ?>.</i></p>
01750 </body>
01751 </html>