summaryrefslogtreecommitdiff
path: root/test/it_dbi.t
diff options
context:
space:
mode:
Diffstat (limited to 'test/it_dbi.t')
-rwxr-xr-xtest/it_dbi.t364
1 files changed, 364 insertions, 0 deletions
diff --git a/test/it_dbi.t b/test/it_dbi.t
new file mode 100755
index 0000000..6a37637
--- /dev/null
+++ b/test/it_dbi.t
@@ -0,0 +1,364 @@
+#!/www/server/bin/php -qC
+<?php
+
+# Tests for it_dbi.class
+
+# Initialize DB
+$db = array('db' => "lib_search_ch", 'safety' => 0);
+$dbi = new it_dbi($db);
+$dbi->query('create temporary table it_dbi_test (
+ ID int not null auto_increment,
+ x int,
+ foo varchar(42),
+ dyncols LONGBLOB,
+ primary key(ID)
+);');
+
+$record = new it_dbi($db + array('table' => "it_dbi_test"));
+
+$record->insert(array('x' => 42, 'foo' => null));
+$record->insert(array('foo' => "bar"));
+$record->insert(array('x' => 64738, 'foo' => "q'uux"));
+
+is(
+ $record->ID,
+ 3,
+ "auto_increment"
+);
+
+$record->read(1);
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(1, 42, null),
+ "read"
+);
+
+is(
+ $record->select(),
+ 3,
+ "select without parameters select all"
+);
+
+is(
+ $record->select(array('foo <>' => ""), "LIMIT 1"),
+ 1,
+ "select with multiple parameters (LIMIT part)"
+);
+is(
+ $record->foo,
+ "bar",
+ "select with multiple parameters (foo part)"
+);
+is(
+ $record->select(array('ID IN' => array(2,3))),
+ 2,
+ "select with IN"
+);
+is(
+ $record->select(array('ID NI' => array(2,3))),
+ 2,
+ "select with NI"
+);
+is(
+ $record->select(array('ID NOT IN' => array(2,3))),
+ 1,
+ "select with NOT IN"
+);
+is(
+ $record->select(array('ID IN' => array())),
+ 0,
+ "select with empty IN"
+);
+is(
+ $record->select(array('ID NOT IN' => array())),
+ 3,
+ "select with empty NOT IN"
+);
+is(
+ $record->select(array('ID' => array(2,3))),
+ 2,
+ "select with implicit IN"
+);
+
+it_dbi::createclass(array('table' => "it_dbi_test", 'forcecreate' => true));
+
+$record = new it_dbi_test;
+is(
+ $record->x,
+ null,
+ "constructor of created class without argument"
+);
+
+$record = new it_dbi_test(2);
+is(
+ $record->ID,
+ 2,
+ "constructor of created class with id parameter"
+);
+
+$record = new it_dbi_test(array('x >' => 0), "ORDER BY x DESC");
+is(
+ $record->x,
+ 64738,
+ "constructor of created class with multiple select parameters"
+);
+
+$record = new it_dbi_test(array('foo' => 'bar'));
+is(
+ $record->ID,
+ 2,
+ "constructor of created class with single array parameter"
+);
+
+$record = new it_dbi($db + array('table' => "it_dbi_test"));
+is(
+ $record->x,
+ null,
+ "constructor without parameters"
+);
+
+$record = new it_dbi($db + array('table' => "it_dbi_test"), array('x >' => 0), "ORDER BY x DESC");
+is(
+ $record->x,
+ 64738,
+ "constructor with multiple select parameters"
+);
+
+$record->select(array('x' => 64738));
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(3, 64738, "q'uux"),
+ "select"
+);
+
+$record->update(array('x' => 17));
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(3, 17, "q'uux"),
+ "update"
+);
+
+is(
+ $record->update(array('x' => 18), array('x' => 17)),
+ 1,
+ "return affected rows"
+);
+
+is(
+ $record->update(array('x' => 18), array('x' => 17)),
+ 0,
+ "return zero affected rows"
+);
+
+$record->update(array('-x' => 'POW(2,2) * 10'));
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(3, 40, "q'uux"),
+ "update with function"
+);
+
+$record->update(array('foo' => "00"));
+$rand = $record->x;
+is (
+ $record->_set(array('x' => $rand, 'foo' => "0")),
+ "SET `foo`='0'",
+ 'update: _set optimization'
+);
+
+$record->update(array('foo' => NULL));
+is (
+ $record->_set(array('foo' => "")),
+ "SET `foo`=''",
+ 'update: _set optimization with NULL => ""'
+);
+$record->update(array('foo' => "bar"));
+$record->update(array('foo' => ""));
+is (
+ $record->_set(array('foo' => NULL)),
+ "SET `foo`=NULL",
+ 'update: _set optimization with "" => NULL'
+);
+
+$record->update(array('foo' => "bar"));
+$record->select(array('foo' => "bar"));
+$record->iterate();
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(2, null, "bar"),
+ "iterate record 2"
+);
+$record->update(array('foo' => "qux"));
+$record->iterate();
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(3, $rand, "bar"),
+ "iterate record 3"
+);
+$record->update(array('foo' => "quux"));
+
+$record->read(2);
+is(
+ array($record->_key, isset($record->x), $record->foo),
+ array(2, false, "qux"),
+ "iterate update record 2"
+);
+
+$record->read(3);
+is(
+ array($record->_key, $record->x, $record->foo),
+ array(3, $rand, "quux"),
+ "iterate update record 3"
+);
+
+is(
+ gettype($record->_key) . "/" . gettype($record->x) . "/" . gettype($record->_data['x']) . "/" . gettype($record->foo),
+ "integer/integer/integer/string",
+ "automatic type detection"
+);
+
+$count = 0;
+foreach (new it_dbi_test as $id => $record)
+{
+ $count++;
+ is($record->_key, $id, "Iterator id $id");
+}
+is($count, 3, "Iterator without select");
+
+$count = 0;
+foreach (new it_dbi_test(array('foo <>' => "")) as $id => $record)
+{
+ $count++;
+ is($record->_key, $id, "Iterator id $id");
+}
+is($count, 2, "Iterator with select");
+
+$count = 0;
+foreach ($record as $dummy_rec)
+ $count++;
+is($count, 2, "Iterator reused");
+
+$GLOBALS['debug_sqllog'] = true;
+@$record->store(array('ID' => 5, 'x' => 6));
+like(
+ $record->_sqllog[1]['query'],
+ "REPLACE",
+ "store => REPLACE for new entries"
+);
+$record->clear();
+@$record->read(5);
+is(
+ $record->x,
+ 6,
+ "saving with store"
+);
+
+$record->_sqllog = array();
+@$record->store(array('ID' => 5, 'x' => 7));
+like(
+ $record->_sqllog[1]['query'],
+ "UPDATE",
+ "store => UPDATE for existing entries"
+);
+$record->clear();
+@$record->read(5);
+is(
+ $record->x,
+ 7,
+ "updating with store"
+);
+
+$record->_sqllog = array();
+@$record->store(array('ID' => 5, 'x' => 7));
+is(
+ $record->_sqllog[1]['query'],
+ null, # Only SELECT, no UPDATE
+ "Optimized away UPDATE with same values"
+);
+$GLOBALS['debug_sqllog'] = false;
+
+# test latin1 (produces warnings on stderr for failing)
+
+$record = new it_dbi(array('table' => 'it_dbi_test', 'charset' => 'latin1'));
+$record->select(array('foo' => "\xc3\x28"));
+
+# Test field localization feature
+
+$dbi->query('create temporary table it_dbi_testlocalized (
+ ID int not null auto_increment,
+ foobar_de varchar(42),
+ foobar_fr varchar(42),
+ primary key(ID)
+);');
+
+$record = new it_dbi($db + array('table' => "it_dbi_testlocalized"));
+$record->insert(array('foobar_de' => "deutsch", 'foobar_fr' => "franz"));
+$record->insert(array('foobar_de' => "deutsch2", 'foobar_fr' => "franz2"));
+
+T_set_language('de');
+$record->select(array());
+$record->iterate();
+is(
+ array($record->_key, $record->foobar),
+ array(1, "deutsch"),
+ "localized field foobar_de"
+);
+$record->iterate();
+is(
+ array($record->_key, $record->foobar),
+ array(2, "deutsch2"),
+ "localized field foobar_de iterate"
+);
+
+T_set_language('fr');
+$record->read(1);
+is(
+ array($record->_key, $record->foobar),
+ array(1, "franz"),
+ "localized field foobar_fr"
+);
+
+#
+# Test saving/retrieving/matching values in dynamically created columns
+#
+$record = new it_dbi_test;
+$record->replace(['ID' => 5, 'key1' => "val1"]); is($record->key1, "val1");
+$record->update(['key2' => "val2"]); is($record->key1, "val1"); is($record->key2, "val2");
+$record->update(['-key3' => "2*2"]); is($record->key1, "val1"); is($record->key2, "val2"); is($record->key3, 4);
+$record->update(['key1' => "val0"]); is($record->key1, "val0"); is($record->key2, "val2"); is($record->key3, 4);
+$record->replace(['ID' => 6, 'key4' => "val4"]); is($record->key4, "val4");
+$record->select(['key2' => "val2"]); is($record->key2, "val2"); is($record->key4, null, "clear previous fields");
+
+#
+# Test tracked update
+#
+function allrecs()
+{
+ foreach (new it_dbi_test([0 => "ORDER BY ID"]) as $r)
+ $result[] = ['ID' => $r->ID, 'foo' => $r->foo];
+ return json_encode($result);
+}
+
+$record = new it_dbi_test;
+$record->delete(['WHERE 1' ]);
+$record->upsert(['ID' => 1, 'foo' => "a"]);
+$record->upsert(['ID' => 2, 'foo' => "b"]);
+$record->upsert(['ID' => 2, 'foo' => "B"]);
+is($record->delete_untouched(), 0, 'delete_untouched');
+is(allrecs(), '[{"ID":1,"foo":"a"},{"ID":2,"foo":"B"}]', 'data after delete_untouched');
+
+$record->upsert(['ID' => 1, 'foo' => "A"]);
+$record->upsert(['ID' => 3, 'foo' => "c"]);
+is($record->delete_untouched([ 'ID >' => 2 ]), 0, 'delete_untouched with query');
+is(allrecs(), '[{"ID":1,"foo":"A"},{"ID":2,"foo":"B"},{"ID":3,"foo":"c"}]', 'data after delete_untouched with query');
+
+$record->upsert(['ID' => 3, 'foo' => "C"]);
+is($record->delete_untouched(), 2, 'delete_untouched with query');
+is(allrecs(), '[{"ID":3,"foo":"C"}]', 'data after delete_untouched with query');
+
+$record->replace(['ID' => 4, 'foo' => "C"]);
+is($record->delete_untouched(), 1, 'delete_untouched after replace');
+is(allrecs(), '[{"ID":4,"foo":"C"}]', 'data after delete_untouched after replace');
+
+$record->upsert(['ID' => 4, 'foo' => "C"]);
+is($record->delete_untouched(), 0, 'delete_untouched after upsert without changes');
+is(allrecs(), '[{"ID":4,"foo":"C"}]', 'data after delete_untouched after upsert without changes');