diff options
-rw-r--r-- | it_dbi.class | 44 | ||||
-rwxr-xr-x | tests/it_dbi.t | 94 |
2 files changed, 110 insertions, 28 deletions
diff --git a/it_dbi.class b/it_dbi.class index 9c6e691..0926a1c 100644 --- a/it_dbi.class +++ b/it_dbi.class @@ -190,28 +190,16 @@ function _connect($p = array()) /** * INTERNAL: construct SQL SET clause of changed values from member vars and tags array. - * Merge current values into $tags. Modifies caller's array (callers rely on it)! */ -function _set(&$tags) +function _set($tags, $allfields = false) { - # DEPRECATED BEHAVIOUR: Add member vars to tags, considering unquoted fields - foreach (get_object_vars($this) as $field => $value) - # Don't use isset($tags[$field]) (would not handle null values correctly) - if (isset($this->_fields[$field]) && !array_key_exists('-'.$field, $tags) && !array_key_exists($field, $tags)) - { - $tags[$field] = $value; - if ($this->_data && ($value != $this->_data[$field])) - it::error("it_dbi::_set() would take value '$value' from this->$field:" . D($this, $tags)); - } - - # Create SQL $r = array(); - foreach((array)$tags as $key => $value) + foreach((array)$tags as $field => $value) { - if (substr($key, 0, 1) == '-') # Unquoted value (always added) - $r[] = substr($key, 1)."=$value"; - elseif (!isset($this->_data) || ($value !== $this->_data[$key])) # Add to SQL if value has changed - $r[] = "$key=".(isset($value) ? "'".mysql_real_escape_string($value, $this->_link)."'" : 'NULL'); + if (substr($field, 0, 1) == '-') # Unquoted value (always added) + $r[] = substr($field, 1)."=$value"; + else if ($allfields || ($value !== $this->_data[$field])) + $r[] = "$field=".(isset($value) ? "'".mysql_real_escape_string($value, $this->_link)."'" : 'NULL'); } return $r ? 'SET '.implode(', ', $r) : ''; @@ -362,8 +350,8 @@ function _write_pre_process(&$tags) */ function clear($pp = true) { - foreach ((array)$this->_fields as $key => $dummy) - unset($this->$key); + foreach ((array)$this->_fields as $field => $dummy) + unset($this->$field); unset($this->_data); unset($this->_key); $pp && $this->_read_post_process(); @@ -505,8 +493,8 @@ function iterate() if (!empty($this->_p['keyfield'])) $this->_key = $this->_data[$this->_p['keyfield']]; - foreach ($this->_data as $key => $value) - $this->$key = $value; + foreach ($this->_data as $field => $value) + $this->$field = $value; } else $this->clear(false); @@ -533,14 +521,10 @@ function insert($tags = array(), $command = "INSERT") /* Pre-processing, $tags is passed by reference and may be modified here */ $this->_write_pre_process($tags); - unset($this->_data); # All new value set - $set = $this->_set($tags); # Update $tags (!) and generate SQL - if ($this->_p['randomid'] && !isset($tags[$this->_p['keyfield']])) - { $tags[$this->_p['keyfield']] = md5(uniqid(mt_rand())); - $set = $this->_set($tags); # Generate new SQL containing ID - } + + $set = $this->_set($tags, true); if ($result = $this->query("$command INTO {$this->_p['table']} " . $set)) { @@ -548,6 +532,8 @@ function insert($tags = array(), $command = "INSERT") if (!$this->read($id) && $this->_p['safety']) $this->_fatal("insert(): can't read record back (key truncated?), id=\"$id\""); } + else + $this->clear(false); return $result; } @@ -582,6 +568,7 @@ function update($tags = array(), $query = null) $query = array($this->_p['keyfield'] => $this->_data[$this->_p['keyfield']]); if ($set = $this->_set($tags)) + { if ($result = $this->query("UPDATE {$this->_p['table']} $set " . $this->_where($query, $this->_link))) { if (array_key_exists($this->_p['keyfield'], $tags)) # Did we just update the key? @@ -590,6 +577,7 @@ function update($tags = array(), $query = null) if ($this->read($this->_key)) $this->_nofetch = false; # So we can do while(iterate()) update(); } + } return $result; } diff --git a/tests/it_dbi.t b/tests/it_dbi.t new file mode 100755 index 0000000..8ef8cab --- /dev/null +++ b/tests/it_dbi.t @@ -0,0 +1,94 @@ +#!/www/server/bin/php -qC +<?php + +# Tests for it_dbi.class + +require 'searchlib/search_test.class'; + +# Initialize DB +$db = array('db' => "lib_search_ch"); +$dbi = new it_dbi($db); +$dbi->query('create temporary table it_dbi_test ( + ID int not null auto_increment, + x int, + foo varchar(42), + 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" +); + +$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" +); + +$record->update(array('-x' => 'RAND() * 10')); +isnt( + array($record->_key, $record->x, $record->foo), + array(3, 17, "q'uux"), + "update" +); + +$rand = $record->x; +is ( + $record->_set(array('x' => $rand, 'foo' => "bar")), + "SET foo='bar'", + 'update: _set optimization' +); + +$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, $record->x, $record->foo), + array(2, null, "qux"), + "iterate update record 2" +); + +$record->read(3); +is( + array($record->_key, $record->x, $record->foo), + array(3, $rand, "quux"), + "iterate update record 3" +); |