1<?php 2/* 3 * driver_test.php 4 * 5 * @(#) $Header: /repository/pear/MDB/tests/driver_test.php,v 1.21 2003/01/16 16:05:06 lsmith Exp $ 6 * 7 * This is a script intended to be used by Metabase DBMS driver class 8 * developers or other users to verify if the implementation of a given 9 * driver works in conformance with the documented behavior of the driver 10 * class functions. 11 * 12 * Driver classes that are not compliant may lead to bugs in the Metabase 13 * applications that use such drivers. Make sure that new or updated 14 * drivers pass all tests performed by this script before releasing the 15 * driver classes to Metabase users. In the future this script will be 16 * updated to perform conformance tests. 17 * 18 * To use this script, edit the driver_test_configuration.php script and 19 * adjust any database setup values that may be needed to use the driver 20 * class being tested in your environment. Read Metabase documentation 21 * about the MetabaseSetupDatabase section to learn more about these 22 * database setup arguments. 23 * 24 */ 25 26// BC hack to define PATH_SEPARATOR for version of PHP prior 4.3 27if(!defined('PATH_SEPARATOR')) { 28 if(defined('DIRECTORY_SEPARATOR') && DIRECTORY_SEPARATOR == "\\") { 29 define('PATH_SEPARATOR', ';'); 30 } else { 31 define('PATH_SEPARATOR', ':'); 32 } 33} 34ini_set('include_path', '..'.PATH_SEPARATOR.ini_get('include_path')); 35 36require_once 'MDB.php'; 37MDB::loadFile('metabase_wrapper'); 38MDB::loadFile('Manager'); 39 40Function VerifyFetchedValues($database,$result,$row,&$data,&$value,&$field) 41{ 42 return(strcmp($value=MetabaseFetchResult($database,$result,$row,"user_name"),$data[$field="user_name"]) 43 || strcmp($value=MetabaseFetchResult($database,$result,$row,"user_password"),$data[$field="user_password"]) 44 || strcmp($value=MetabaseFetchBooleanResult($database,$result,$row,"subscribed"),$data[$field="subscribed"]) 45 || strcmp($value=MetabaseFetchResult($database,$result,$row,"user_id"),$data[$field="user_id"]) 46 || ($value=MetabaseFetchDecimalResult($database,$result,$row,"quota"))!=$data[$field="quota"] 47 || strcmp($value=MetabaseFetchFloatResult($database,$result,$row,"weight"),$data[$field="weight"]) 48 || strcmp($value=MetabaseFetchDateResult($database,$result,$row,"access_date"),$data[$field="access_date"]) 49 || strcmp($value=MetabaseFetchTimeResult($database,$result,$row,"access_time"),$data[$field="access_time"]) 50 || strcmp($value=MetabaseFetchTimestampResult($database,$result,$row,"approved"),$data[$field="approved"])); 51} 52 53Function InsertTestValues($database,$prepared_query,&$data) 54{ 55 MetabaseQuerySetText($database,$prepared_query,1,$data["user_name"]); 56 MetabaseQuerySetText($database,$prepared_query,2,$data["user_password"]); 57 MetabaseQuerySetBoolean($database,$prepared_query,3,$data["subscribed"]); 58 MetabaseQuerySetInteger($database,$prepared_query,4,$data["user_id"]); 59 MetabaseQuerySetDecimal($database,$prepared_query,5,$data["quota"]); 60 MetabaseQuerySetFloat($database,$prepared_query,6,$data["weight"]); 61 MetabaseQuerySetDate($database,$prepared_query,7,$data["access_date"]); 62 MetabaseQuerySetTime($database,$prepared_query,8,$data["access_time"]); 63 MetabaseQuerySetTimestamp($database,$prepared_query,9,$data["approved"]); 64 return(MetabaseExecuteQuery($database,$prepared_query)); 65} 66 67 $driver_arguments=array( 68 ); 69 70 $database_variables=array( 71 "create"=>"1", 72 "name"=>"driver_test" 73 ); 74 75 if(file_exists("driver_test_config.php")) 76 include("driver_test_config.php"); 77 78 $eol=(IsSet($driver_arguments["LogLineBreak"]) ? $driver_arguments["LogLineBreak"] : "\n"); 79 80 $default_tests=array( 81 "storage"=>1, 82 "bulkfetch"=>1, 83 "preparedqueries"=>1, 84 "metadata"=>1, 85 "nulls"=>1, 86 "escapesequences"=>1, 87 "ranges"=>1, 88 "sequences"=>1, 89 "affectedrows"=>1, 90 "transactions"=>1, 91 "replace"=>1, 92 "lobstorage"=>1, 93 "lobfiles"=>1, 94 "lobnulls"=>1 95 ); 96 if($argc<=1) 97 $tests=$default_tests; 98 else 99 { 100 for($tests=array(),$argument=1;$argument<$argc;$argument++) 101 { 102 if(!IsSet($default_tests[$argv[$argument]])) 103 { 104 echo "Usage: ",$argv[0]; 105 for(Reset($default_tests);Key($default_tests);Next($default_tests)) 106 echo " [",Key($default_tests),"]"; 107 echo $eol; 108 exit; 109 } 110 $tests[$argv[$argument]]=$default_tests[$argv[$argument]]; 111 } 112 } 113 114 set_time_limit(0); 115 $input_file="driver_test.schema"; 116 $manager=new metabase_manager_class; 117 $success=$manager->UpdateDatabase($input_file,$input_file.".before",$driver_arguments,$database_variables); 118 $debug_output=""; 119 if(count($manager->warnings)>0) 120 $debug_output.="WARNING:$eol".implode($manager->warnings,"!$eol").$eol; 121 if($manager->database 122 && IsSet($driver_arguments["CaptureDebug"])) 123 $debug_output.=MetabaseDebugOutput($manager->database); 124 $passed=$failed=0; 125 if($success) 126 { 127 if(!strcmp($error=MetabaseSetupDatabase($driver_arguments,$database),"")) 128 { 129 if(IsSet($driver_arguments["CaptureDebug"])) 130 MetabaseCaptureDebugOutput($database,1); 131 MetabaseSetDatabase($database,$database_variables["name"]); 132 133 if(IsSet($tests["storage"]) 134 && $success) 135 { 136 $test="storage"; 137 echo "Testing typed field storage and retrieval ... "; 138 flush(); 139 $pass=1; 140 if(!MetabaseQuery($database,"DELETE FROM users")) 141 $success=0; 142 else 143 { 144 $row=1234; 145 $data=array(); 146 $data["user_name"]="user_$row"; 147 $data["user_password"]="somepassword"; 148 $data["subscribed"]=$row % 2; 149 $data["user_id"]=$row; 150 $data["quota"]=strval($row/100); 151 $data["weight"]=sqrt($row); 152 $data["access_date"]=MetabaseToday(); 153 $data["access_time"]=MetabaseTime(); 154 $data["approved"]=MetabaseNow(); 155 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 156 { 157 if(!InsertTestValues($database,$prepared_query,$data)) 158 { 159 $success=0; 160 } 161 MetabaseFreePreparedQuery($database,$prepared_query); 162 if($success) 163 { 164 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users"))) 165 $success=0; 166 else 167 { 168 if(VerifyFetchedValues($database,$result,0,$data,$value,$field)) 169 { 170 $pass=0; 171 echo "FAILED!$eol"; 172 $failed++; 173 echo "Test $test: the value retrieved for field \"$field\" ($value) doesn't match what was stored (".$data[$field].")$eol"; 174 } 175 else 176 { 177 if(!MetabaseEndOfResult($database,$result)) 178 { 179 $pass=0; 180 echo "FAILED!$eol"; 181 $failed++; 182 echo "Test $test: the query result did not seem to have reached the end of result as expected$eol"; 183 } 184 } 185 MetabaseFreeResult($database,$result); 186 } 187 } 188 if($success 189 && $pass) 190 { 191 $passed++; 192 echo "OK.$eol"; 193 } 194 } 195 else 196 $success=0; 197 } 198 } 199 200 if(IsSet($tests["bulkfetch"]) 201 && $success) 202 { 203 $test="bulkfetch"; 204 echo "Testing query result data bulk fetching... "; 205 flush(); 206 $pass=1; 207 if(!MetabaseQuery($database,"DELETE FROM users")) 208 $success=0; 209 else 210 { 211 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 212 { 213 $data=array(); 214 for($total_rows=5,$row=0;$row<$total_rows;$row++) 215 { 216 $data[$row]["user_name"]="user_$row"; 217 $data[$row]["user_password"]="somepassword"; 218 $data[$row]["subscribed"]=$row % 2; 219 $data[$row]["user_id"]=$row; 220 $data[$row]["quota"]=sprintf("%.2f",strval(1+($row+1)/100)); 221 $data[$row]["weight"]=sqrt($row); 222 $data[$row]["access_date"]=MetabaseToday(); 223 $data[$row]["access_time"]=MetabaseTime(); 224 $data[$row]["approved"]=MetabaseNow(); 225 if(!InsertTestValues($database,$prepared_query,$data[$row])) 226 { 227 $success=0; 228 break; 229 } 230 } 231 MetabaseFreePreparedQuery($database,$prepared_query); 232 $types=array( 233 "text", 234 "text", 235 "boolean", 236 "integer", 237 "decimal", 238 "float", 239 "date", 240 "time", 241 "timestamp" 242 ); 243 if($success) 244 { 245 for($row=0;$row<$total_rows;$row++) 246 { 247 for(Reset($data[$row]),$column=0;$column<count($data[$row]);Next($data[$row]),$column++) 248 { 249 $field=Key($data[$row]); 250 $type=$types[$column]; 251 if(!($success=MetabaseQueryField($database,"SELECT $field FROM users WHERE user_id=$row",$value,$type))) 252 break 2; 253 if(strcmp(strval($data[$row][$field]),strval($value))) 254 { 255 $pass=0; 256 echo "FAILED!$eol"; 257 $failed++; 258 echo "Test $test: the query field \"$field\" of type $type for row $row was returned in \"$value\" unlike \"".$data[$row][$field]."\" as expected$eol"; 259 break 2; 260 } 261 } 262 } 263 } 264 if($success 265 && $pass) 266 { 267 for($fields="",Reset($data[0]),$column=0;$column<count($data[0]);Next($data[0]),$column++) 268 { 269 if($column>0) 270 $fields.=","; 271 $fields.=Key($data[0]); 272 } 273 for($row=0;$row<$total_rows;$row++) 274 { 275 if(!($success=MetabaseQueryRow($database,"SELECT $fields FROM users WHERE user_id=$row",$value,$types))) 276 break; 277 for(Reset($data[$row]),$column=0;$column<count($data[$row]);Next($data[$row]),$column++) 278 { 279 $field=Key($data[$row]); 280 if(strcmp(strval($data[$row][$field]),strval($value[$column]))) 281 { 282 $pass=0; 283 echo "FAILED!$eol"; 284 $failed++; 285 echo "Test $test: the query row field \"$field\" of for row $row was returned in \"".$value[$column]."\" unlike \"".$data[$row][$field]."\" as expected$eol"; 286 break 2; 287 } 288 } 289 } 290 } 291 if($success 292 && $pass) 293 { 294 for(Reset($data[0]),$column=0;$column<count($data[0]);Next($data[0]),$column++) 295 { 296 $field=Key($data[0]); 297 $type=$types[$column]; 298 if(!($success=MetabaseQueryColumn($database,"SELECT $field,user_id FROM users ORDER BY 2",$value,$type))) 299 break; 300 for($row=0;$row<$total_rows;$row++) 301 { 302 if(strcmp(strval($data[$row][$field]),strval($value[$row]))) 303 { 304 $pass=0; 305 echo "FAILED!$eol"; 306 $failed++; 307 echo "Test $test: the query column field \"$field\" of type $type for row $row was returned in \"".$value[$row]."\" unlike \"".$data[$row][$field]."\" as expected$eol"; 308 break 2; 309 } 310 } 311 } 312 } 313 if($success 314 && $pass) 315 { 316 for($fields="",Reset($data[0]),$column=0;$column<count($data[0]);Next($data[0]),$column++) 317 { 318 if($column>0) 319 $fields.=","; 320 $fields.=Key($data[0]); 321 } 322 if(($success=MetabaseQueryAll($database,"SELECT $fields FROM users ORDER BY user_id",$value,$types))) 323 { 324 for($row=0;$row<$total_rows;$row++) 325 { 326 for(Reset($data[$row]),$column=0;$column<count($data[$row]);Next($data[$row]),$column++) 327 { 328 $field=Key($data[$row]); 329 if(strcmp(strval($data[$row][$field]),strval($value[$row][$column]))) 330 { 331 $pass=0; 332 echo "FAILED!$eol"; 333 $failed++; 334 echo "Test $test: the query all field \"$field\" of for row $row was returned in \"".$value[$row][$column]."\" unlike \"".$data[$row][$field]."\" as expected$eol"; 335 break 2; 336 } 337 } 338 } 339 } 340 } 341 if($success 342 && $pass) 343 { 344 $passed++; 345 echo "OK.$eol"; 346 } 347 } 348 else 349 $success=0; 350 } 351 } 352 353 if(IsSet($tests["preparedqueries"]) 354 && $success) 355 { 356 $test="preparedqueries"; 357 echo "Testing prepared queries ... "; 358 flush(); 359 $pass=1; 360 if(!MetabaseQuery($database,"DELETE FROM users")) 361 $success=0; 362 else 363 { 364 $question_value=MetabaseGetTextFieldValue($database,"Does this work?"); 365 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,user_id) VALUES (?,$question_value,1)"))) 366 { 367 MetabaseQuerySetText($database,$prepared_query,1,"Sure!"); 368 if(!MetabaseExecuteQuery($database,$prepared_query)) 369 { 370 $sucess=$pass=0; 371 echo "FAILED!$eol"; 372 echo "Test $test: could not execute prepared query with a text value with a question mark. Error: ".MetabaseError($database).$eol; 373 echo "Testing prepared queries ... "; 374 flush(); 375 } 376 MetabaseFreePreparedQuery($database,$prepared_query); 377 } 378 else 379 { 380 $sucess=$pass=0; 381 echo "FAILED!$eol"; 382 echo "Test $test: could not execute prepared query with a text value with a question mark. Error: ".MetabaseError($database).$eol; 383 echo "Testing prepared queries ... "; 384 flush(); 385 } 386 $question_value=MetabaseGetTextFieldValue($database,"Wouldn't it be great if this worked too?"); 387 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,user_id) VALUES (?,$question_value,2)"))) 388 { 389 MetabaseQuerySetText($database,$prepared_query,1,"Sure!"); 390 if(!MetabaseExecuteQuery($database,$prepared_query)) 391 { 392 $sucess=$pass=0; 393 echo "FAILED!$eol"; 394 echo "Test $test: could not execute prepared query with a text value with a quote character before a question mark. Error: ".MetabaseError($database).$eol; 395 } 396 MetabaseFreePreparedQuery($database,$prepared_query); 397 } 398 else 399 { 400 $sucess=$pass=0; 401 echo "FAILED!$eol"; 402 echo "Test $test: could not execute prepared query with a text value with a quote character before a question mark. Error: ".MetabaseError($database).$eol; 403 } 404 if($success 405 && $pass) 406 { 407 $passed++; 408 echo "OK.$eol"; 409 } 410 else 411 $failed++; 412 } 413 } 414 415 if(IsSet($tests["metadata"]) 416 && $success) 417 { 418 $test="metadata"; 419 echo "Testing retrieval of result metadata... "; 420 flush(); 421 $pass=1; 422 if(!MetabaseQuery($database,"DELETE FROM users")) 423 $success=0; 424 else 425 { 426 $row=1234; 427 $data=array(); 428 $data["user_name"]="user_$row"; 429 $data["user_password"]="somepassword"; 430 $data["subscribed"]=$row % 2; 431 $data["user_id"]=$row; 432 $data["quota"]=strval($row/100); 433 $data["weight"]=sqrt($row); 434 $data["access_date"]=MetabaseToday(); 435 $data["access_time"]=MetabaseTime(); 436 $data["approved"]=MetabaseNow(); 437 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 438 { 439 if(!InsertTestValues($database,$prepared_query,$data)) 440 { 441 $success=0; 442 } 443 MetabaseFreePreparedQuery($database,$prepared_query); 444 if($success) 445 { 446 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users"))) 447 $success=0; 448 else 449 { 450 $fields=array( 451 "user_name", 452 "user_password", 453 "subscribed", 454 "user_id", 455 "quota", 456 "weight", 457 "access_date", 458 "access_time", 459 "approved" 460 ); 461 if(($columns=MetabaseNumberOfColumns($database,$result))==count($fields)) 462 { 463 if(($success=MetabaseGetColumnNames($database,$result,$column_names))) 464 { 465 if($columns==count($column_names)) 466 { 467 for($column=0;$column<$columns;$column++) 468 { 469 if($column_names[$fields[$column]]!=$column) 470 { 471 $pass=0; 472 echo "FAILED!$eol"; 473 $failed++; 474 echo "Test $test: the query result column \"".$fields[$column]."\" was returned in position ".$column_names[$fields[$column]]." unlike $column as expected$eol"; 475 } 476 } 477 } 478 else 479 { 480 $pass=0; 481 echo "FAILED!$eol"; 482 $failed++; 483 echo "Test $test: the query result returned a number of ".count($column_names)." column names unlike $columns as expected$eol"; 484 } 485 } 486 } 487 else 488 { 489 if($columns==-1) 490 $success=0; 491 else 492 { 493 $pass=0; 494 echo "FAILED!$eol"; 495 $failed++; 496 echo "Test $test: the query result returned a number of $columns columns unlike ".count($fields)." as expected$eol"; 497 } 498 } 499 MetabaseFreeResult($database,$result); 500 } 501 } 502 if($success 503 && $pass) 504 { 505 $passed++; 506 echo "OK.$eol"; 507 } 508 } 509 else 510 $success=0; 511 } 512 } 513 514 if(IsSet($tests["nulls"]) 515 && $success) 516 { 517 $test="nulls"; 518 echo "Testing storage and retrieval of NULL values... "; 519 flush(); 520 $pass=1; 521 $test_values=array( 522 "test", 523 "NULL", 524 "null", 525 "" 526 ); 527 for($test_value=0;$success && $test_value<=count($test_values);$test_value++) 528 { 529 $is_null=($test_value==count($test_values)); 530 if($is_null) 531 $value="NULL"; 532 else 533 $value=MetabaseGetTextFieldValue($database,$test_values[$test_value]); 534 if(MetabaseQuery($database,"DELETE FROM users") 535 && MetabaseQuery($database,"INSERT INTO users (user_name,user_password,user_id) VALUES ($value,$value,0)") 536 && ($result=MetabaseQuery($database,"SELECT user_name,user_password FROM users"))) 537 { 538 if(MetabaseEndOfResult($database,$result)) 539 { 540 if($pass) 541 { 542 $pass=0; 543 $failed++; 544 echo "FAILED!$eol"; 545 } 546 echo "Test $test: the query result seems to have reached the end of result earlier than expected$eol"; 547 } 548 else 549 { 550 if(MetabaseResultIsNull($database,$result,0,0)!=$is_null) 551 { 552 if($pass) 553 { 554 $pass=0; 555 $failed++; 556 echo "FAILED!$eol"; 557 } 558 if($is_null) 559 echo "Test $test: a query result column is not NULL unlike what was expected$eol"; 560 else 561 echo "Test $test: a query result column is NULL although it was expected to be \"".$test_values[$test_value]."\"$eol"; 562 } 563 else 564 { 565 if(MetabaseResultIsNull($database,$result,0,1)!=$is_null) 566 { 567 if($pass) 568 { 569 $pass=0; 570 $failed++; 571 echo "FAILED!$eol"; 572 } 573 if($is_null) 574 echo "Test $test: a query result column is not NULL unlike what was expected$eol"; 575 else 576 echo "Test $test: a query result column is NULL although it was expected to be \"".$test_values[$test_value]."\"$eol"; 577 } 578 else 579 { 580 if(!MetabaseEndOfResult($database,$result)) 581 { 582 if($pass) 583 { 584 $pass=0; 585 $failed++; 586 echo "FAILED!$eol"; 587 } 588 echo "Test $test: the query result did not seem to have reached the end of result as expected after testing only if columns are NULLs$eol"; 589 } 590 } 591 } 592 } 593 MetabaseFreeResult($database,$result); 594 } 595 else 596 { 597 $success=0; 598 break; 599 } 600 } 601 if($success 602 && $pass) 603 { 604 $passed++; 605 echo "OK.$eol"; 606 } 607 } 608 609 if(IsSet($tests["escapesequences"]) 610 && $success) 611 { 612 $test="escapesequences"; 613 echo "Testing escaping text values with special characters... "; 614 flush(); 615 $pass=1; 616 $test_strings=array( 617 "'", 618 "\"", 619 "\\", 620 "%", 621 "_", 622 "''", 623 "\"\"", 624 "\\\\", 625 "\\'\\'", 626 "\\\"\\\"" 627 ); 628 for($string=0;$string<count($test_strings);$string++) 629 { 630 $value=MetabaseGetTextFieldValue($database,$test_strings[$string]); 631 if(!MetabaseQuery($database,"DELETE FROM users") 632 || !MetabaseQuery($database,"INSERT INTO users (user_name,user_password,user_id) VALUES ($value,$value,0)") 633 || !($result=MetabaseQuery($database,"SELECT user_name,user_password FROM users"))) 634 $success=0; 635 else 636 { 637 if(MetabaseEndOfResult($database,$result)) 638 { 639 $pass=0; 640 echo "FAILED!$eol"; 641 $failed++; 642 echo "Test $test: the query result seems to have reached the end of result earlier than expected$eol"; 643 } 644 else 645 { 646 $field="user_name"; 647 if(strcmp($value=MetabaseFetchResult($database,$result,0,$field),$test_strings[$string])) 648 { 649 $pass=0; 650 echo "FAILED!$eol"; 651 $failed++; 652 echo "Test $test: the value retrieved for field \"$field\" (\"$value\") doesn't match what was stored (".$test_strings[$string].")$eol"; 653 } 654 else 655 { 656 $field="user_password"; 657 if(strcmp($value=MetabaseFetchResult($database,$result,0,$field),$test_strings[$string])) 658 { 659 $pass=0; 660 echo "FAILED!$eol"; 661 $failed++; 662 echo "Test $test: the value retrieved for field \"$field\" (\"$value\") doesn't match what was stored (".$test_string[$string].")$eol"; 663 } 664 else 665 { 666 if(!MetabaseEndOfResult($database,$result)) 667 { 668 $pass=0; 669 echo "FAILED!$eol"; 670 $failed++; 671 echo "Test $test: the query result did not seem to have reached the end of result as expected after testing only if text fields values are correctly escaped$eol"; 672 } 673 } 674 } 675 } 676 MetabaseFreeResult($database,$result); 677 } 678 if(!$success 679 || !$pass) 680 break; 681 } 682 if($success 683 && $pass) 684 { 685 $passed++; 686 echo "OK.$eol"; 687 } 688 } 689 690 if(IsSet($tests["ranges"]) 691 && $success) 692 { 693 if(MetabaseSupport($database,"SelectRowRanges")) 694 { 695 $test="ranges"; 696 echo "Testing paged queries... "; 697 flush(); 698 $pass=1; 699 if(!MetabaseQuery($database,"DELETE FROM users")) 700 $success=0; 701 else 702 { 703 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 704 { 705 $data=array(); 706 for($total_rows=5,$row=0;$row<$total_rows;$row++) 707 { 708 $data[$row]["user_name"]="user_$row"; 709 $data[$row]["user_password"]="somepassword"; 710 $data[$row]["subscribed"]=$row % 2; 711 $data[$row]["user_id"]=$row; 712 $data[$row]["quota"]=sprintf("%.2f",strval($row/100)); 713 $data[$row]["weight"]=sqrt($row); 714 $data[$row]["access_date"]=MetabaseToday(); 715 $data[$row]["access_time"]=MetabaseTime(); 716 $data[$row]["approved"]=MetabaseNow(); 717 if(!InsertTestValues($database,$prepared_query,$data[$row])) 718 { 719 $success=0; 720 break; 721 } 722 } 723 MetabaseFreePreparedQuery($database,$prepared_query); 724 if($success) 725 { 726 for($rows=2,$start_row=0;$pass && $start_row<$total_rows;$start_row+=$rows) 727 { 728 MetabaseSetSelectedRowRange($database,$start_row,$rows); 729 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users ORDER BY user_id"))) 730 { 731 $success=0; 732 break; 733 } 734 else 735 { 736 for($row=0;$row<$rows && $row+$start_row<$total_rows;$row++) 737 { 738 if(VerifyFetchedValues($database,$result,$row,$data[$row+$start_row],$value,$field)) 739 { 740 $pass=0; 741 echo "FAILED!$eol"; 742 $failed++; 743 echo "Test $test: the value retrieved from row ".($row+$start_row)." for field \"$field\" ($value) doesn't match what was stored (".$data[$row+$start_row][$field].")$eol"; 744 break; 745 } 746 } 747 if($pass) 748 { 749 if(!MetabaseEndOfResult($database,$result)) 750 { 751 $pass=0; 752 echo "FAILED!$eol"; 753 $failed++; 754 echo "Test $test: the query result did not seem to have reached the end of result as expected starting row $start_row after fetching upto row $row$eol"; 755 } 756 } 757 MetabaseFreeResult($database,$result); 758 } 759 } 760 } 761 if($success) 762 { 763 for($rows=2,$start_row=0;$pass && $start_row<$total_rows;$start_row+=$rows) 764 { 765 MetabaseSetSelectedRowRange($database,$start_row,$rows); 766 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users ORDER BY user_id"))) 767 { 768 $success=0; 769 break; 770 } 771 else 772 { 773 if(($result_rows=MetabaseNumberOfRows($database,$result))>$rows) 774 { 775 $pass=0; 776 echo "FAILED!$eol"; 777 $failed++; 778 echo "Test $test: expected a result of no more than $rows but the returned number of rows is $result_rows"; 779 } 780 else 781 { 782 for($row=0;$row<$result_rows;$row++) 783 { 784 if(MetabaseEndOfResult($database,$result)) 785 { 786 $pass=0; 787 echo "FAILED!$eol"; 788 $failed++; 789 echo "Test $test: the query result seem to have reached the end of result at row $row that is before $result_rows as expected$eol"; 790 break; 791 } 792 if(VerifyFetchedValues($database,$result,$row,$data[$row+$start_row],$value,$field)) 793 { 794 $pass=0; 795 echo "FAILED!$eol"; 796 $failed++; 797 echo "Test $test: the value retrieved from row ".($row+$start_row)." for field \"$field\" ($value) doesn't match what was stored (".$data[$row+$start_row][$field].")$eol"; 798 break; 799 } 800 } 801 } 802 if($pass) 803 { 804 if(!MetabaseEndOfResult($database,$result)) 805 { 806 $pass=0; 807 echo "FAILED!$eol"; 808 $failed++; 809 echo "Test $test: the query result did not seem to have reached the end of result as expected$eol"; 810 } 811 } 812 MetabaseFreeResult($database,$result); 813 } 814 } 815 } 816 if($success 817 && $pass) 818 { 819 $passed++; 820 echo "OK.$eol"; 821 } 822 } 823 else 824 $success=0; 825 } 826 } 827 else 828 echo "Selecting rows ranges is not supported.$eol"; 829 } 830 831 if(IsSet($tests["sequences"]) 832 && $success) 833 { 834 if(MetabaseSupport($database,"Sequences")) 835 { 836 $test="sequences"; 837 echo "Testing sequences... "; 838 flush(); 839 $pass=1; 840 for($start_value=1;$success && $pass && $start_value<4;$start_value++) 841 { 842 $sequence_name="test_sequence_$start_value"; 843 MetabaseDropSequence($database,$sequence_name); 844 if(($success=MetabaseCreateSequence($database,$sequence_name,$start_value))) 845 { 846 for($sequence_value=$start_value;$sequence_value<$start_value+4;$sequence_value++) 847 { 848 if(!($success=MetabaseGetSequenceNextValue($database,$sequence_name,$value))) 849 break; 850 if($value!=$sequence_value) 851 { 852 $pass=0; 853 echo "FAILED!$eol"; 854 $failed++; 855 echo "Test $test: the returned sequence value is $value and not $sequence_value as expected with sequence start value with $start_value$eol"; 856 break; 857 } 858 } 859 if(!$success) 860 $error=MetabaseError($database); 861 if(!MetabaseDropSequence($database,$sequence_name)) 862 { 863 if(!$success) 864 $error.=" - "; 865 $error.=MetabaseError($database); 866 $success=0; 867 } 868 } 869 } 870 if($success 871 && $pass) 872 { 873 $passed++; 874 echo "OK.$eol"; 875 } 876 } 877 else 878 echo "Sequences are not supported.$eol"; 879 } 880 881 if(IsSet($tests["replace"]) 882 && $success) 883 { 884 if(MetabaseSupport($database,"Replace")) 885 { 886 $test="sequences"; 887 echo "Testing the replace query... "; 888 flush(); 889 $pass=1; 890 if(!MetabaseQuery($database,"DELETE FROM users")) 891 $success=0; 892 else 893 { 894 $row=1234; 895 $data=array(); 896 $data["user_name"]="user_$row"; 897 $data["user_password"]="somepassword"; 898 $data["subscribed"]=$row % 2; 899 $data["user_id"]=$row; 900 $data["quota"]=strval($row/100); 901 $data["weight"]=sqrt($row); 902 $data["access_date"]=MetabaseToday(); 903 $data["access_time"]=MetabaseTime(); 904 $data["approved"]=MetabaseNow(); 905 $fields=array( 906 "user_name"=>array( 907 "Value"=>"user_$row", 908 "Type"=>"text" 909 ), 910 "user_password"=>array( 911 "Value"=>$data["user_password"], 912 "Type"=>"text" 913 ), 914 "subscribed"=>array( 915 "Value"=>$data["subscribed"], 916 "Type"=>"boolean" 917 ), 918 "user_id"=>array( 919 "Value"=>$data["user_id"], 920 "Type"=>"integer", 921 "Key"=>1 922 ), 923 "quota"=>array( 924 "Value"=>$data["quota"], 925 "Type"=>"decimal" 926 ), 927 "weight"=>array( 928 "Value"=>$data["weight"], 929 "Type"=>"float" 930 ), 931 "access_date"=>array( 932 "Value"=>$data["access_date"], 933 "Type"=>"date" 934 ), 935 "access_time"=>array( 936 "Value"=>$data["access_time"], 937 "Type"=>"time" 938 ), 939 "approved"=>array( 940 "Value"=>$data["approved"], 941 "Type"=>"timestamp" 942 ) 943 ); 944 $support_affected_rows=MetabaseSupport($database,"AffectedRows"); 945 if(($success=MetabaseReplace($database,"users",$fields)) 946 && (!$support_affected_rows 947 || ($success=MetabaseAffectedRows($database,$affected_rows)))) 948 { 949 if($support_affected_rows 950 && $affected_rows!=1) 951 { 952 $pass=0; 953 echo "FAILED!$eol"; 954 $failed++; 955 echo "Test $test: replacing a row in an empty table returned $affected_rows unlike 1 as expected$eol"; 956 } 957 else 958 { 959 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users"))) 960 $success=0; 961 else 962 { 963 $verify=VerifyFetchedValues($database,$result,0,$data,$value,$field); 964 MetabaseFreeResult($database,$result); 965 if($verify) 966 { 967 $pass=0; 968 echo "FAILED!$eol"; 969 $failed++; 970 echo "Test $test: the value retrieved for field \"$field\" ($value) doesn't match what was inserted (".$data[$field].")$eol"; 971 } 972 else 973 { 974 $row=4321; 975 $fields["user_name"]["Value"]=$data["user_name"]="user_$row"; 976 $fields["user_password"]["Value"]=$data["user_password"]="somepassword"; 977 $fields["subscribed"]["Value"]=$data["subscribed"]=$row % 2; 978 $fields["quota"]["Value"]=$data["quota"]=strval($row/100); 979 $fields["weight"]["Value"]=$data["weight"]=sqrt($row); 980 $fields["access_date"]["Value"]=$data["access_date"]=MetabaseToday(); 981 $fields["access_time"]["Value"]=$data["access_time"]=MetabaseTime(); 982 $fields["approved"]["Value"]=$data["approved"]=MetabaseNow(); 983 if(($success=MetabaseReplace($database,"users",$fields)) 984 && (!$support_affected_rows 985 || ($success=MetabaseAffectedRows($database,$affected_rows)))) 986 { 987 if(!$support_affected_rows 988 && $affected_rows!=2) 989 { 990 $pass=0; 991 echo "FAILED!$eol"; 992 $failed++; 993 echo "Test $test: replacing a row in an table with a single row returned $affected_rows unlike 2 as expected$eol"; 994 } 995 if(!($result=MetabaseQuery($database,"SELECT user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved FROM users"))) 996 $success=0; 997 else 998 { 999 if(VerifyFetchedValues($database,$result,0,$data,$value,$field)) 1000 { 1001 $pass=0; 1002 echo "FAILED!$eol"; 1003 $failed++; 1004 echo "Test $test: the value retrieved for field \"$field\" ($value) doesn't match what was replaced (".$data[$field].")$eol"; 1005 } 1006 else 1007 { 1008 if(!MetabaseEndOfResult($database,$result)) 1009 { 1010 $pass=0; 1011 echo "FAILED!$eol"; 1012 $failed++; 1013 echo "Test $test: the query result did not seem to have reached the end of result as expected$eol"; 1014 } 1015 } 1016 MetabaseFreeResult($database,$result); 1017 } 1018 } 1019 } 1020 } 1021 } 1022 } 1023 } 1024 if($success 1025 && $pass) 1026 { 1027 $passed++; 1028 echo "OK.$eol"; 1029 } 1030 } 1031 else 1032 echo "Replace query is not supported.$eol"; 1033 } 1034 1035 if(IsSet($tests["affectedrows"]) 1036 && $success) 1037 { 1038 if(MetabaseSupport($database,"AffectedRows")) 1039 { 1040 $test="affectedrows"; 1041 echo "Testing query affected rows... "; 1042 flush(); 1043 $pass=1; 1044 if(!MetabaseQuery($database,"DELETE FROM users")) 1045 $success=0; 1046 else 1047 { 1048 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 1049 { 1050 $data=array(); 1051 $inserted_rows=7; 1052 for($row=0;$row<$inserted_rows;$row++) 1053 { 1054 $data["user_name"]="user_$row"; 1055 $data["user_password"]="somepassword"; 1056 $data["subscribed"]=$row % 2; 1057 $data["user_id"]=$row; 1058 $data["quota"]=strval($row/100); 1059 $data["weight"]=sqrt($row); 1060 $data["access_date"]=MetabaseToday(); 1061 $data["access_time"]=MetabaseTime(); 1062 $data["approved"]=MetabaseNow(); 1063 if(!InsertTestValues($database,$prepared_query,$data) 1064 || !MetabaseAffectedRows($database,$affected_rows)) 1065 { 1066 $success=0; 1067 break; 1068 } 1069 if($affected_rows!=1) 1070 { 1071 $pass=0; 1072 echo "FAILED!$eol"; 1073 $failed++; 1074 echo "Test $test: inserting the row $row return $affected_rows affected row count instead of 1 as expected$eol"; 1075 break; 1076 } 1077 } 1078 MetabaseFreePreparedQuery($database,$prepared_query); 1079 } 1080 else 1081 $success=0; 1082 if($success 1083 && $pass 1084 && ($prepared_query=MetabasePrepareQuery($database,"UPDATE users SET user_password=? WHERE user_id<?"))) 1085 { 1086 for($row=0;$row<$inserted_rows;$row++) 1087 { 1088 MetabaseQuerySetText($database,$prepared_query,1,"another_password_$row"); 1089 MetabaseQuerySetInteger($database,$prepared_query,2,$row); 1090 if(!MetabaseExecuteQuery($database,$prepared_query) 1091 || !MetabaseAffectedRows($database,$affected_rows)) 1092 { 1093 $success=0; 1094 break; 1095 } 1096 if($affected_rows!=$row) 1097 { 1098 $pass=0; 1099 echo "FAILED!$eol"; 1100 $failed++; 1101 echo "Test $test: updating the $row rows returned $affected_rows affected row count$eol"; 1102 break; 1103 } 1104 } 1105 MetabaseFreePreparedQuery($database,$prepared_query); 1106 } 1107 else 1108 $success=0; 1109 if($success 1110 && $pass 1111 && ($prepared_query=MetabasePrepareQuery($database,"DELETE FROM users WHERE user_id>=?"))) 1112 { 1113 for($row=$inserted_rows;$inserted_rows;$inserted_rows=$row) 1114 { 1115 MetabaseQuerySetInteger($database,$prepared_query,1,$row=intval($inserted_rows/2)); 1116 if(!MetabaseExecuteQuery($database,$prepared_query) 1117 || !MetabaseAffectedRows($database,$affected_rows)) 1118 { 1119 $success=0; 1120 break; 1121 } 1122 if($affected_rows!=$inserted_rows-$row) 1123 { 1124 $pass=0; 1125 echo "FAILED!$eol"; 1126 $failed++; 1127 echo "Test $test: deleting ".($inserted_rows-$row)." rows returned $affected_rows affected row count$eol"; 1128 break; 1129 } 1130 } 1131 MetabaseFreePreparedQuery($database,$prepared_query); 1132 } 1133 else 1134 $success=0; 1135 if($success 1136 && $pass) 1137 { 1138 $passed++; 1139 echo "OK.$eol"; 1140 } 1141 } 1142 } 1143 else 1144 echo "Query AffectedRows fetching is not supported.$eol"; 1145 } 1146 1147 if(IsSet($tests["transactions"]) 1148 && $success) 1149 { 1150 if(MetabaseSupport($database,"Transactions")) 1151 { 1152 $test="transactions"; 1153 echo "Testing transactions... "; 1154 flush(); 1155 $pass=1; 1156 if(!MetabaseQuery($database,"DELETE FROM users") 1157 || !MetabaseAutoCommitTransactions($database,0)) 1158 $success=0; 1159 else 1160 { 1161 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO users (user_name,user_password,subscribed,user_id,quota,weight,access_date,access_time,approved) VALUES (?,?,?,?,?,?,?,?,?)"))) 1162 { 1163 $data=array(); 1164 $row=0; 1165 $data["user_name"]="user_$row"; 1166 $data["user_password"]="somepassword"; 1167 $data["subscribed"]=$row % 2; 1168 $data["user_id"]=$row; 1169 $data["quota"]=strval($row/100); 1170 $data["weight"]=sqrt($row); 1171 $data["access_date"]=MetabaseToday(); 1172 $data["access_time"]=MetabaseTime(); 1173 $data["approved"]=MetabaseNow(); 1174 if(!InsertTestValues($database,$prepared_query,$data) 1175 || !MetabaseRollbackTransaction($database) 1176 || !($result=MetabaseQuery($database,"SELECT * FROM users"))) 1177 { 1178 $success=0; 1179 } 1180 else 1181 { 1182 if(!MetabaseEndOfResult($database,$result)) 1183 { 1184 $pass=0; 1185 echo "FAILED!$eol"; 1186 $failed++; 1187 echo "Test $test: transaction rollback did not revert the row that was inserted$eol"; 1188 } 1189 MetabaseFreeResult($database,$result); 1190 } 1191 if($success 1192 && $pass) 1193 { 1194 if(!InsertTestValues($database,$prepared_query,$data) 1195 || !MetabaseCommitTransaction($database) 1196 || !($result=MetabaseQuery($database,"SELECT * FROM users"))) 1197 $success=0; 1198 else 1199 { 1200 if(MetabaseEndOfResult($database,$result)) 1201 { 1202 $pass=0; 1203 echo "FAILED!$eol"; 1204 $failed++; 1205 echo "Test $test: transaction commit did not make permanent the row that was inserted$eol"; 1206 } 1207 MetabaseFreeResult($database,$result); 1208 } 1209 } 1210 if($success 1211 && $pass) 1212 { 1213 if(!($result=MetabaseQuery($database,"DELETE FROM users"))) 1214 $success=0; 1215 } 1216 if(!$success) 1217 { 1218 $error=MetabaseError($database); 1219 MetabaseRollbackTransaction($database); 1220 } 1221 if(!MetabaseAutoCommitTransactions($database,1)) 1222 { 1223 if(strcmp($error,"")) 1224 $error.=" and then could not end the transactions"; 1225 $success=0; 1226 } 1227 MetabaseFreePreparedQuery($database,$prepared_query); 1228 if($success 1229 && $pass) 1230 { 1231 if(!($result=MetabaseQuery($database,"SELECT * FROM users"))) 1232 $success=0; 1233 else 1234 { 1235 if(!MetabaseEndOfResult($database,$result)) 1236 { 1237 $pass=0; 1238 echo "FAILED!$eol"; 1239 $failed++; 1240 echo "Test $test: transaction end with implicit commit when re-enabling auto-commit did not make permanent the rows that were deleted$eol"; 1241 } 1242 MetabaseFreeResult($database,$result); 1243 } 1244 } 1245 } 1246 else 1247 $success=0; 1248 if($success 1249 && $pass) 1250 { 1251 $passed++; 1252 echo "OK.$eol"; 1253 } 1254 } 1255 } 1256 else 1257 echo "Transactions are not supported.$eol"; 1258 } 1259 1260 $support_lobs=MetabaseSupport($database,"LOBs"); 1261 if((IsSet($tests["lobstorage"]) 1262 || IsSet($tests["lobfiles"]) 1263 || IsSet($tests["lobnulls"])) 1264 && $success) 1265 { 1266 if($support_lobs) 1267 { 1268 $input_file="lob_test.schema"; 1269 if(!($success=$manager->UpdateDatabase($input_file,$input_file.".before",$driver_arguments,$database_variables))) 1270 $error=$manager->error; 1271 $debug_output=""; 1272 if(count($manager->warnings)>0) 1273 $debug_output.="WARNING:$eol".implode($manager->warnings,"!$eol").$eol; 1274 if($manager->database 1275 && IsSet($driver_arguments["CaptureDebug"])) 1276 $debug_output.=MetabaseDebugOutput($manager->database); 1277 } 1278 else 1279 echo "LOBs are not supported.$eol"; 1280 } 1281 1282 if($support_lobs 1283 && IsSet($tests["lobstorage"]) 1284 && $success) 1285 { 1286 $test="lobstorage"; 1287 echo "Testing lob storage... "; 1288 flush(); 1289 $pass=1; 1290 if(!MetabaseQuery($database,"DELETE FROM files")) 1291 $success=0; 1292 else 1293 { 1294 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO files (document,picture) VALUES (?,?)"))) 1295 { 1296 $character_lob=array( 1297 "Database"=>$database, 1298 "Error"=>"", 1299 "Data"=>"" 1300 ); 1301 for($code=32;$code<=127;$code++) 1302 $character_lob["Data"].=chr($code); 1303 $binary_lob=array( 1304 "Database"=>$database, 1305 "Error"=>"", 1306 "Data"=>"" 1307 ); 1308 for($code=0;$code<=255;$code++) 1309 $binary_lob["Data"].=chr($code); 1310 if(($success=MetabaseCreateLOB($character_lob,$clob))) 1311 { 1312 if(($success=MetabaseCreateLOB($binary_lob,$blob))) 1313 { 1314 MetabaseQuerySetCLOB($database,$prepared_query,1,$clob,"document"); 1315 MetabaseQuerySetBLOB($database,$prepared_query,2,$blob,"picture"); 1316 $success=MetabaseExecuteQuery($database,$prepared_query); 1317 MetabaseDestroyLOB($blob); 1318 } 1319 else 1320 $error=$binary_lob["Error"]; 1321 MetabaseDestroyLOB($clob); 1322 } 1323 else 1324 $error=$character_lob["Error"]; 1325 MetabaseFreePreparedQuery($database,$prepared_query); 1326 if(!$success 1327 || !($result=MetabaseQuery($database,"SELECT document,picture FROM files"))) 1328 $success=0; 1329 else 1330 { 1331 if(MetabaseEndOfResult($database,$result)) 1332 { 1333 $pass=0; 1334 echo "FAILED!$eol"; 1335 $failed++; 1336 echo "Test $test: the query result seem to have reached the end of result too soon.$eol"; 1337 } 1338 else 1339 { 1340 $clob=MetabaseFetchCLOBResult($database,$result,0,"document"); 1341 if($clob) 1342 { 1343 for($value="";!MetabaseEndOfLOB($clob);) 1344 { 1345 if(MetabaseReadLOB($clob,$data,8000)<0) 1346 { 1347 $error=MetabaseLOBError($clob); 1348 $success=0; 1349 break; 1350 } 1351 $value.=$data; 1352 } 1353 MetabaseDestroyLOB($clob); 1354 if($success) 1355 { 1356 if(strcmp($value,$character_lob["Data"])) 1357 { 1358 $pass=0; 1359 echo "FAILED!$eol"; 1360 $failed++; 1361 echo "Test $test: retrieved character LOB value (\"".$value."\") is different from what was stored (\"".$character_lob["Data"]."\")$eol"; 1362 } 1363 else 1364 { 1365 $blob=MetabaseFetchBLOBResult($database,$result,0,"picture"); 1366 if($blob) 1367 { 1368 for($value="";!MetabaseEndOfLOB($blob);) 1369 { 1370 if(MetabaseReadLOB($blob,$data,8000)<0) 1371 { 1372 $error=MetabaseLOBError($blob); 1373 $success=0; 1374 break; 1375 } 1376 $value.=$data; 1377 } 1378 MetabaseDestroyLOB($blob); 1379 if($success) 1380 { 1381 if(strcmp($value,$binary_lob["Data"])) 1382 { 1383 $pass=0; 1384 echo "FAILED!$eol"; 1385 $failed++; 1386 echo "Test $test: retrieved binary LOB value (\"".$value."\") is different from what was stored (\"".$binary_lob["Data"]."\")$eol"; 1387 } 1388 } 1389 } 1390 else 1391 $success=0; 1392 } 1393 } 1394 } 1395 else 1396 $success=0; 1397 } 1398 MetabaseFreeResult($database,$result); 1399 } 1400 } 1401 else 1402 $success=0; 1403 } 1404 if($success 1405 && $pass) 1406 { 1407 $passed++; 1408 echo "OK.$eol"; 1409 } 1410 } 1411 1412 if($support_lobs 1413 && IsSet($tests["lobfiles"]) 1414 && $success) 1415 { 1416 $test="lobfiles"; 1417 echo "Testing lob storage from and to files... "; 1418 flush(); 1419 $pass=1; 1420 if(!MetabaseQuery($database,"DELETE FROM files")) 1421 $success=0; 1422 else 1423 { 1424 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO files (document,picture) VALUES (?,?)"))) 1425 { 1426 $character_data_file="character_data"; 1427 if(($file=fopen($character_data_file,"wb"))) 1428 { 1429 for($character_data="",$code=32;$code<=127;$code++) 1430 $character_data.=chr($code); 1431 $character_lob=array( 1432 "Type"=>"inputfile", 1433 "Database"=>$database, 1434 "Error"=>"", 1435 "FileName"=>$character_data_file, 1436 "BufferLength"=>32 1437 ); 1438 $success=(fwrite($file,$character_data,strlen($character_data))==strlen($character_data)); 1439 fclose($file); 1440 if($success) 1441 { 1442 $binary_data_file="binary_data"; 1443 if(($file=fopen($binary_data_file,"wb"))) 1444 { 1445 for($binary_data="",$code=0;$code<=255;$code++) 1446 $binary_data.=chr($code); 1447 $binary_lob=array( 1448 "Type"=>"inputfile", 1449 "Database"=>$database, 1450 "Error"=>"", 1451 "FileName"=>$binary_data_file, 1452 "BufferLength"=>32 1453 ); 1454 $success=(fwrite($file,$binary_data,strlen($binary_data))==strlen($binary_data)); 1455 fclose($file); 1456 } 1457 else 1458 $success=0; 1459 } 1460 } 1461 else 1462 $sucess=0; 1463 if($success) 1464 { 1465 if(($success=MetabaseCreateLOB($character_lob,$clob))) 1466 { 1467 if(($success=MetabaseCreateLOB($binary_lob,$blob))) 1468 { 1469 MetabaseQuerySetCLOB($database,$prepared_query,1,$clob,"document"); 1470 MetabaseQuerySetBLOB($database,$prepared_query,2,$blob,"picture"); 1471 $success=MetabaseExecuteQuery($database,$prepared_query); 1472 MetabaseDestroyLOB($blob); 1473 } 1474 else 1475 $error=$binary_lob["Error"]; 1476 MetabaseDestroyLOB($clob); 1477 } 1478 else 1479 $error=$character_lob["Error"]; 1480 MetabaseFreePreparedQuery($database,$prepared_query); 1481 if(!$success 1482 || !($result=MetabaseQuery($database,"SELECT document,picture FROM files"))) 1483 $success=0; 1484 else 1485 { 1486 if(MetabaseEndOfResult($database,$result)) 1487 { 1488 $pass=0; 1489 echo "FAILED!$eol"; 1490 $failed++; 1491 echo "Test $test: the query result seem to have reached the end of result too soon.$eol"; 1492 } 1493 else 1494 { 1495 $character_lob=array( 1496 "Type"=>"outputfile", 1497 "Database"=>$database, 1498 "Result"=>$result, 1499 "Row"=>0, 1500 "Field"=>"document", 1501 "Binary"=>0, 1502 "Error"=>"", 1503 "FileName"=>$character_data_file, 1504 "BufferLength"=>32 1505 ); 1506 if(($success=MetabaseCreateLOB($character_lob,$clob))) 1507 { 1508 if(MetabaseReadLOB($clob,$data,0)<0) 1509 { 1510 $error=MetabaseLOBError($clob); 1511 $success=0; 1512 } 1513 MetabaseDestroyLOB($clob); 1514 if($success) 1515 { 1516 if(($file=fopen($character_data_file,"rb"))) 1517 { 1518 if(GetType($value=fread($file,filesize($character_data_file)))!="string") 1519 { 1520 $success=0; 1521 $error="could not read from the character lob data file"; 1522 } 1523 fclose($file); 1524 } 1525 else 1526 { 1527 $success=0; 1528 $error="could not reopen the character lob data file"; 1529 } 1530 } 1531 if($success) 1532 { 1533 if(strcmp($value,$character_data)) 1534 { 1535 $pass=0; 1536 echo "FAILED!$eol"; 1537 $failed++; 1538 echo "Test $test: retrieved character LOB value (\"".$value."\") is different from what was stored (\"".$character_data."\")$eol"; 1539 } 1540 else 1541 { 1542 $binary_lob=array( 1543 "Type"=>"outputfile", 1544 "Database"=>$database, 1545 "Result"=>$result, 1546 "Row"=>0, 1547 "Field"=>"picture", 1548 "Binary"=>1, 1549 "Error"=>"", 1550 "FileName"=>$binary_data_file, 1551 "BufferLength"=>32 1552 ); 1553 if(($success=MetabaseCreateLOB($binary_lob,$blob))) 1554 { 1555 if(MetabaseReadLOB($blob,$data,0)<0) 1556 { 1557 $error=MetabaseLOBError($clob); 1558 $success=0; 1559 } 1560 MetabaseDestroyLOB($blob); 1561 if($success) 1562 { 1563 if(($file=fopen($binary_data_file,"rb"))) 1564 { 1565 if(GetType($value=fread($file,filesize($binary_data_file)))!="string") 1566 { 1567 $success=0; 1568 $error="could not read from the binary lob data file"; 1569 } 1570 fclose($file); 1571 } 1572 else 1573 { 1574 $success=0; 1575 $error="could not reopen the binary lob data file"; 1576 } 1577 } 1578 if($success) 1579 { 1580 if(strcmp($value,$binary_data)) 1581 { 1582 $pass=0; 1583 echo "FAILED!$eol"; 1584 $failed++; 1585 echo "Test $test: retrieved binary LOB value (\"".$value."\") is different from what was stored (\"".$binary_data."\")$eol"; 1586 } 1587 } 1588 } 1589 else 1590 $success=0; 1591 } 1592 } 1593 } 1594 else 1595 $error=$character_lob["Error"]; 1596 } 1597 MetabaseFreeResult($database,$result); 1598 } 1599 } 1600 else 1601 $success=0; 1602 } 1603 } 1604 if($success 1605 && $pass) 1606 { 1607 $passed++; 1608 echo "OK.$eol"; 1609 } 1610 } 1611 1612 if($support_lobs 1613 && IsSet($tests["lobnulls"]) 1614 && $success) 1615 { 1616 $test="lobnulls"; 1617 echo "Testing lob nulls... "; 1618 flush(); 1619 $pass=1; 1620 if(!MetabaseQuery($database,"DELETE FROM files")) 1621 $success=0; 1622 else 1623 { 1624 if(($prepared_query=MetabasePrepareQuery($database,"INSERT INTO files (document,picture) VALUES (?,?)"))) 1625 { 1626 MetabaseQuerySetNULL($database,$prepared_query,1,"clob"); 1627 MetabaseQuerySetNULL($database,$prepared_query,2,"blob"); 1628 $success=MetabaseExecuteQuery($database,$prepared_query); 1629 MetabaseFreePreparedQuery($database,$prepared_query); 1630 if(!$success 1631 || !($result=MetabaseQuery($database,"SELECT document,picture FROM files"))) 1632 $success=0; 1633 else 1634 { 1635 if(MetabaseEndOfResult($database,$result)) 1636 { 1637 $pass=0; 1638 echo "FAILED!$eol"; 1639 $failed++; 1640 echo "Test $test: the query result seem to have reached the end of result too soon.$eol"; 1641 } 1642 else 1643 { 1644 if(!MetabaseResultIsNull($database,$result,0,$field="document") 1645 || !MetabaseResultIsNull($database,$result,0,$field="picture")) 1646 { 1647 $pass=0; 1648 echo "FAILED!$eol"; 1649 $failed++; 1650 echo "Test $test: a query result large object column is not NULL unlike what was expected$eol"; 1651 } 1652 } 1653 MetabaseFreeResult($database,$result); 1654 } 1655 } 1656 else 1657 $success=0; 1658 } 1659 if($success 1660 && $pass) 1661 { 1662 $passed++; 1663 echo "OK.$eol"; 1664 } 1665 } 1666 1667 if(!$success 1668 && !strcmp($error,"")) 1669 $error=MetabaseError($database); 1670 if(IsSet($driver_arguments["CaptureDebug"])) 1671 $debug_output.=MetabaseDebugOutput($database); 1672 MetabaseCloseSetup($database); 1673 } 1674 } 1675 else 1676 $error=$manager->error; 1677 if(strcmp($error,"")) 1678 echo "Error: $error$eol"; 1679 else 1680 { 1681 echo ($failed==0 ? "Passed all the $passed tests that were performed!$eol" : ($passed==1 ? "Passed one test" : "$passed tests passed").", ".($failed==1 ? "Failed one test" : "$failed tests failed")."!$eol"); 1682 } 1683 if(IsSet($driver_arguments["CaptureDebug"])) 1684 echo $debug_output; 1685 echo "Exiting.$eol"; flush(); 1686?> 1687