BASE . LOG, 'file_id' => $LOG_FILE_ID, // add file date 'print_file_date' => true, // set debug and print flags 'debug_all' => $DEBUG_ALL ?? true, 'echo_all' => $ECHO_ALL, 'print_all' => $PRINT_ALL ?? true, ]); // db connection and attach logger $db = new CoreLibs\DB\IO(DB_CONFIG, $log); $db->log->debug('START', '=============================>'); $PAGE_NAME = 'TEST CLASS: DB'; print ""; print "" . $PAGE_NAME . ""; print ""; print '
Class Test Master
'; print '
Class Test DB dbReturn
'; print '

' . $PAGE_NAME . '

'; print "LOGFILE NAME: " . $db->log->getSetting('log_file_name') . "
"; print "LOGFILE ID: " . $db->log->getSetting('log_file_id') . "
"; print "DBINFO: " . $db->dbInfo() . "
"; echo "DB_CONFIG_SET constant:
" . print_r(DB_CONFIG, true) . "

"; // DB client encoding print "DB client encoding: " . $db->dbGetEncoding() . "
"; print "DB search path: " . $db->dbGetSchema() . "
"; $to_db_version = '13.6'; print "VERSION DB: " . $db->dbVersion() . "
"; print "VERSION LONG DB: " . $db->dbVersionInfo('server', false) . "
"; print "VERSION NUMERIC DB: " . $db->dbVersionNumeric() . "
"; print "SERVER ENCODING: " . $db->dbVersionInfo('server_encoding') . "
"; print "ALL PG VERSION PARAMETERS:
" . print_r($db->dbVersionInfoParameters(), true) . "

"; if (($dbh = $db->dbGetDbh()) instanceof \PgSql\Connection) { print "ALL OUTPUT [TEST]:
" . print_r(pg_version($dbh), true) . "

"; } else { print "NO DB HANDLER
"; } print "DB Version smaller $to_db_version: " . $db->dbCompareVersion('<' . $to_db_version) . "
"; print "DB Version smaller than $to_db_version: " . $db->dbCompareVersion('<=' . $to_db_version) . "
"; print "DB Version equal $to_db_version: " . $db->dbCompareVersion('=' . $to_db_version) . "
"; print "DB Version bigger than $to_db_version: " . $db->dbCompareVersion('>=' . $to_db_version) . "
"; print "DB Version bigger $to_db_version: " . $db->dbCompareVersion('>' . $to_db_version) . "
"; $db->dbSetEncoding('SJIS'); print "ENCODING TEST: " . $db->dbVersionInfo('client_encoding') . "/" . $db->dbGetEncoding() . "
"; $db->dbResetEncoding(); // TEST CACHE READS $res = $db->dbReturn("SELECT * FROM max_test"); print "DB RETURN ROWS: " . $db->dbGetNumRows() . "
"; while (is_array($res = $db->dbReturn("SELECT * FROM max_test", DbIo::USE_CACHE, true))) { print "UUD/TIME: " . $res['uid'] . "/" . $res['time'] . "
"; } print "CACHED DATA:
" . print_r($db->dbGetCursorExt(), true) . "

"; while (is_array($res = $db->dbReturn("SELECT * FROM max_test", DbIo::USE_CACHE))) { print "[CACHED] UID/TIME: " . $res['uid'] . "/" . $res['time'] . "
"; // print "****RES:
" . print_r($res, true) . "

"; } // print "CACHED REREAD DATA:
" . print_r($db->dbGetCursorExt(), true) . "

"; while (is_array($res = $db->dbReturn("SELECT * FROM max_test", DbIo::NO_CACHE))) { print "[NO CACHE] UID.TIME: " . $res['uid'] . "/" . $res['time'] . "
"; // print "****RES:
" . print_r($res, true) . "

"; } print "NO CACHED DATA:
" . print_r($db->dbGetCursorExt(), true) . "

"; // alternate check for valid data // while (($res = $db->dbReturn("SELECT * FROM max_test")) !== false) { // print "[CACHED] TIME: " . $res['time'] . "
"; // } // while (is_array($res = $db->dbReturn("SELECT * FROM max_test", DbIo::USE_CACHE))) { // print "UUD/TIME: " . $res['uid'] . "/" . $res['time'] . "
"; // } // dbReturn tests on separate page print "
"; print "dbReturn CACHE tests
"; print 'Class Test DB dbReturn
'; print "
"; print "
";

if (($dbh = $db->dbGetDbh()) instanceof \PgSql\Connection) {
	print "SOCKET: " . pg_socket($dbh) . "
"; } else { print "NO SOCKET
"; } // truncate test_foo table before testing print "TRUNCATE test_foo
"; $query = "TRUNCATE test_foo"; $db->dbExec($query); print "TRUNCATE test_foobar
"; $query = "TRUNCATE test_foobar"; $db->dbExec($query); $status = $db->dbExec("INSERT INTO test_foo (test, number_a) VALUES " . "('FOO TEST " . time() . "', 1) RETURNING test, number_a"); print "DIRECT INSERT STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "DB OBJECT:
" . print_r($status, true) . "
| " . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; var_dump($db->dbGetReturningExt()); // same as above but use an EOM string $some_time = time(); $query = <<dbExec($query); print "EOM STRING DIRECT INSERT STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "DB OBJECT:
" . print_r($status, true) . "
| " . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; var_dump($db->dbGetReturningExt()); // should throw deprecated error // $db->getReturningExt(); $last_insert_pk = $db->dbGetInsertPK(); print "DIRECT INSERT PREVIOUS INSERTED: " . print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo " . "WHERE test_foo_id = " . (int)$last_insert_pk), true) . "
"; $__last_insert_pk = (int)$last_insert_pk; $q = <<dbReturnRow($q), true) . "
"; print "LAST ERROR: " . $db->dbGetLastError() . "
"; print "
"; // PREPARED INSERT $db->dbPrepare("ins_test_foo", "INSERT INTO test_foo (test) VALUES ($1) RETURNING test"); $status = $db->dbExecute("ins_test_foo", ['BAR TEST ' . time()]); print "PREPARE INSERT[ins_test_foo] STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetPrepareCursorValue('ins_test_foo', 'query') . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "
"; print "PREPARE INSERT PREVIOUS INSERTED: " . print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo " . "WHERE test_foo_id = " . (int)$db->dbGetInsertPK()), true) . "
"; print "PREPARE CURSOR RETURN:
"; foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) { print "KEY: " . $key . ': ' . $db->dbGetPrepareCursorValue('ins_test_foo', $key) . "
"; } $query = <<dbPrepare("ins_test_foo_eom", $query); $status = $db->dbExecute("ins_test_foo_eom", ['EOM BAR TEST ' . time()]); print "EOM STRING PREPARE INSERT[ins_test_foo_eom] STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetPrepareCursorValue('ins_test_foo_eom', 'query') . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "
"; // returning test with multiple entries // $status = $db->db_exec( // "INSERT INTO test_foo (test) VALUES " // . "('BAR 1 " . time() . "'), " // . "('BAR 2 " . time() . "'), " // . "('BAR 3 " . time() . "') " // . "RETURNING test_foo_id" // ); $status = $db->dbExec( "INSERT INTO test_foo (test) VALUES " . "('BAR 1 " . time() . "'), " . "('BAR 2 " . time() . "'), " . "('BAR 3 " . time() . "') " . "RETURNING test_foo_id, test" ); print "DIRECT MULTIPLE INSERT WITH RETURN STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "PRIMARY KEYS: " . print_r($db->dbGetInsertPK(), true) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; $t_1 = time(); $t_2 = time(); $t_3 = time(); $query = <<dbExec($query); print "EOM STRING DIRECT MULTIPLE INSERT WITH RETURN STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "PRIMARY KEYS: " . print_r($db->dbGetInsertPK(), true) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; // no returning, but not needed ; $status = $db->dbExec("INSERT INTO test_foo (test) VALUES ('FOO; TEST " . time() . "')"); print "DIRECT INSERT NO RETURN STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; $last_insert_pk = $db->dbGetInsertPK(); // is_array read test $q = "SELECT test_foo_id, test FROM test_foo WHERE test_foo_id = " . (int)$last_insert_pk; if (is_array($s_res = $db->dbReturnRow($q)) && !empty($s_res['test'])) { print "WE HAVE DATA FOR: " . Support::printToString($last_insert_pk) . " WITH: " . $s_res['test'] . "
"; } // UPDATE WITH RETURNING $status = $db->dbExec("UPDATE test_foo SET test = 'SOMETHING DIFFERENT' " . "WHERE test_foo_id = " . (int)$last_insert_pk . " RETURNING test"); print "UPDATE WITH PK " . Support::printToString($last_insert_pk) . " RETURN STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; // INSERT WITH NO RETURNING $status = $db->dbExec("INSERT INTO test_foobar (type, integer) VALUES ('WITHOUT DATA', 456)"); print "INSERT WITH NO PRIMARY KEY NO RETURNING STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; $status = $db->dbExec("INSERT INTO test_foobar (type, integer) VALUES ('WITH DATA', 123) RETURNING type, integer"); print "INSERT WITH NO PRIMARY KEY WITH RETURNING STATUS: " . Support::printToString($status) . " |
" . "QUERY: " . $db->dbGetQuery() . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "
"; print "
"; // READ PREPARE $q_prep = "SELECT test_foo_id, test, some_bool, string_a, number_a, " . "number_a_numeric, some_time " . "FROM test_foo " . "WHERE test = $1 " . "ORDER BY test_foo_id DESC LIMIT 5"; if ($db->dbPrepare('sel_test_foo', $q_prep) === false) { print "Error in sel_test_foo prepare
"; } else { $max_rows = 6; // do not run this in dbFetchArray directly as // dbFetchArray(dbExecute(...)) // this will end in an endless loop $cursor = $db->dbExecute('sel_test_foo', []); $i = 1; while (($res = $db->dbFetchArray($cursor, true)) !== false) { print "DB PREP EXEC FETCH ARR: " . $i . ":
" . print_r($res, true) . "

"; $i++; } } // prepre a second time on normal connection if ($db->dbPrepare('sel_test_foo', $q_prep) === false) { print "Error prepareing
"; print "ERROR (dbPrepare on same query): " . $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/" . "
" . print_r($db->dbGetCombinedErrorHistory(), true) . "

"; } echo "
"; print "EOM STYLE STRINGS
"; $test_bar = $db->dbEscapeLiteral('SOMETHING DIFFERENT'); // Test EOM block $q = <<dbReturn($q))) { print "ROW:
" . print_r($res, true) . "

"; } echo "
"; // NOTE: try to replacate connection still exists if script is run a second time // open pg bouncer connection $db_pgb = new CoreLibs\DB\IO($DB_CONFIG['test_pgbouncer'] ?? [], $log); print "[PGB] DBINFO: " . $db_pgb->dbInfo() . "
"; if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) { print "[PGB] [1] Error in pgb_sel_test_foo prepare
"; } else { print "[PGB] [1] pgb_sel_test_foo prepare OK
"; } // second prepare if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) { print "[PGB] [2] Error in pgb_sel_test_foo prepare
"; } else { print "[PGB] [2] pgb_sel_test_foo prepare OK
"; } $db_pgb->dbClose(); # db write class test $table = 'test_foo'; print "TABLE META DATA: " . DgS::printAr(SetVarType::setArray( $db->dbShowTableMetaData($table) )) . "
"; // insert first, then use primary key to update $primary_key = ''; # unset $db_write_table = ['test', 'string_a', 'number_a', 'some_bool']; $object_fields_not_touch = []; $object_fields_not_update = []; $data = [ 'test' => 'dbWriteDataExt: BOOL TEST SOMETHING ' . time(), 'string_a' => 'SOME TEXT', 'number_a' => 5 ]; $primary_key = $db->dbWriteDataExt( $db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data ); print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key
"; $data = [ 'test' => 'dbWriteDataExt: BOOL TEST ON ' . time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1 ]; $primary_key = $db->dbWriteDataExt( $db_write_table, (int)$primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data ); print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key
"; $data = [ 'test' => 'dbWriteDataExt: BOOL TEST OFF ' . time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0 ]; $primary_key = $db->dbWriteDataExt( $db_write_table, (int)$primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data ); print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key
"; $data = [ 'test' => 'dbWriteDataExt: BOOL TEST UNSET ' . time() ]; $primary_key = $db->dbWriteDataExt( $db_write_table, (int)$primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data ); print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key
"; // return Array Test $query = "SELECT type, sdate, integer FROM foobar"; $data = $db->dbReturnArray($query, true); print "Rows: " . $db->dbGetNumRows() . ", Full foobar list:
" . print_r($data, true) . "

"; // trigger a warning print "WARNING NEXT
"; // trigger an error print "ERROR NEXT
"; $query = "INSERT invalid FROM invalid"; $data = $db->dbReturnArray($query); print "ERROR (INS ON dbExec): " . $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/" . "
" . print_r($db->dbGetCombinedErrorHistory(), true) . "

"; $query = "SELECT invalid FROM invalid"; $data = $db->dbReturnArray($query); print "ERROR (HARD ERROR): " . $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/" . "
" . print_r($db->dbGetCombinedErrorHistory(), true) . "

"; // Now a good query will fail $query = "SELECT type, sdate, integer FROM foobar"; $data = $db->dbReturnRow($query, true); print "GOOD SELECT AFTER ERROR: " . $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/" . "
" . print_r($db->dbGetCombinedErrorHistory(), true) . "

"; print "GOOD SELECT AFTER ERROR:
" . print_r($data, true) . "

"; /* set error id in dbPrepare dbExecute dbExecAsync dbWriteDataExt dbReturnArray dbReturnRow dbFetchArray (?) dbExec (if not set before) dbReturn dbShowTableMetaData */ // how to handle HARD errors # async test queries /* $db->dbExecAsync( "SELECT test FROM test_foo, (SELECT pg_sleep(10)) as sub " . "WHERE test_foo_id IN (27, 50, 67, 44, 10)" ); echo "WAITING FOR ASYNC: "; $chars = ['|', '/', '-', '\\']; while (($ret = $db->dbCheckAsync()) === true) { if ((list($_, $char) = each($chars)) === FALSE) { reset($chars); list($_, $char) = each($chars); } print $char; sleep(1); flush(); } print "
END STATUS: " . $ret . "
"; // while ($res = $db->dbFetchArray($ret)) while ($res = $db->dbFetchArray()) { echo "RES: " . $res['test'] . "
"; } # test async insert $db->dbExecAsync("INSERT INTO test_foo (Test) VALUES ('ASYNC TEST " . time() . "')"); echo "WAITING FOR ASYNC INSERT: "; while (($ret = $db->dbCheckAsync()) === true) { print " . "; sleep(1); flush(); } print "
END STATUS: " . $ret . " | PK: " . $db->insert_id . "
"; print "ASYNC PREVIOUS INSERTED: " . print_r( $db->dbReturnRow("SELECT test_foo_id, test FROM test_foo WHERE test_foo_id = " . $db->insert_id), true ) . "
"; */ /* $q = "Select * from test_foo"; $test_foo = $db->dbExecAsync($q); print "[ERR] Query: " . $q . "
"; print "[ERR] RESOURCE: $test_foo
"; while (($ret = $db->dbCheckAsync()) === true) { print "[ERR]: $ret
"; sleep(5); } */ // search path check $q = "SHOW search_path"; $cursor = $db->dbExec($q); $data = $db->dbFetchArray($cursor)['search_path'] ?? ''; print "RETURN DATA FOR search_path: " . $data . "
"; // print "RETURN DATA FOR search_path: " . DgS::printAr($data) . "
"; // insert something into test.schema_test and see if we get the PK back $status = $db->dbExec( "INSERT INTO test.schema_test (contents, id) VALUES " . "('TIME: " . (string)time() . "', " . (string)rand(1, 10) . ")" ); print "OTHER SCHEMA INSERT STATUS: " . Support::printToString($status) . " | PK NAME: " . $db->dbGetInsertPKName() . ", PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . "
"; print "NULL TEST DB READ
"; $q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'"; $res = $db->dbReturnRow($q); var_dump($res); print "RES: " . DgS::printAr(SetVarType::setArray($res)) . "
"; print "ISSET: " . isset($res['null_varchar']) . "
"; print "EMPTY: " . empty($res['null_varchar']) . "
"; // error message print $log->printErrorMsg(); print ""; // __END__