diff --git a/XMLDB.php b/XMLDB.php index 1ea7aa0..dcac50c 100644 --- a/XMLDB.php +++ b/XMLDB.php @@ -38,9 +38,9 @@ class XMLDB{ * @param $createIfNotExist bool create the file if it doesn't exist */ public function __construct($file, $pk = "id", $createIfNotExist = false, $databaseName = "Database", $tableName = "table", $itemName = "item", $encoding = "utf-8"){ - ini_set("display_errors", "off"); + /*ini_set("display_errors", "off"); ini_set("log_errors", "on"); - ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/test/XMLDB/XMLDB.log'); + ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/test/XMLDB/XMLDB.log');*/ $this->_buffer = null; $this->_databaseName = $databaseName; $this->_itemName = $itemName; @@ -82,11 +82,15 @@ class XMLDB{ } } - public function createTable($name){ + public function createTable($name, $autoincrement = false, $aiDefaultValue = 0){ if($name == '*' || $this->tableAlreadyExists($name)) return false; - else - return $this->insert(array('name'=>$this->_tableName, 'attributes'=>array('name'=>$name))); + else{ + if($autoincrement) + return $this->insert(array('name'=>$this->_tableName, 'attributes'=>array('name'=>$name, 'autoincrement'=>'true', 'aivalue'=>$aiDefaultValue))); + else + return $this->insert(array('name'=>$this->_tableName, 'attributes'=>array('name'=>$name))); + } } public function dropTable($table){ @@ -102,6 +106,26 @@ class XMLDB{ return false; } + public function isTableAI($table){ + if($this->tableAlreadyExists($table)){ + $table = $this->selectTable($table); + $ai = $this->getAttribute('autoincrement', $table); + if($ai == 'true') + return true; + } + return false; + } + + private function updateTableAIValue($table){ + if($this->tableAlreadyExists($table)){ + $table = $this->selectTable($table); + $newValue = $table->item(0)->getAttribute('aivalue')+1; + $table->item(0)->setAttribute('aivalue', $newValue); + return $newValue; + } + return false; + } + public function pkAlreadyExists($pk, $table = '*'){ if($this->selectFromPK($table, $pk , 'count') > 0){ return true; @@ -140,6 +164,20 @@ class XMLDB{ return $this->_buffer; } + private function getNewIncrement($table){ + /* the old way + $field_count = $this->selectAllFromTable($table, 'count'); + $nb = 1; + $tableArray = $this->selectAllFromTable($table, 'array'); + //$test = $xmla->note; + for($i=0;$i<$field_count;$i++){ + if($nb <= (int)$tableArray[$i]['attributes'][$this->_primaryKey]) $nb = (int)$tableArray[$i]['attributes'][$this->_primaryKey]+1; + } + return $nb; + */ + return $this->updateTableAIValue($table); + } + /** * Saving the DB file */ @@ -223,6 +261,22 @@ class XMLDB{ return $element; } + public function getAttribute($attribute, $node){ + if($node->length == 1){ + return $node->item(0)->getAttribute($attribute); + }else{ + return false; + } + } + + public function getChildValue($child, $node){ + if($node->length == 1){ + $nodeArray = $this->requestToArray($node); + if(isset($nodeArray[0]['childs'][$child])) + return $nodeArray[0]['childs'][$child]; + } + return false; + } /** * Shortcuts for select @@ -230,14 +284,17 @@ class XMLDB{ public function selectTable($name, $format = 'node'){ return $this->select($name, null, null, null, $format); } + public function selectAllFromTable($name, $format = 'node'){ + return $this->select($name, null, null, null, $format, '/'.$this->_itemName); + } public function selectFromAttribute($table, $attributes, $format = 'array'){ - return $this->select($table, null, $attributes, null, $format); + return $this->select($table, null, $attributes, null, $format,'/'.$this->_itemName); } public function selectFromChildren($table, $childs, $format = 'array'){ - return $this->select($table, null, null, $childs, $format); + return $this->select($table, null, null, $childs, $format, '/'.$this->_itemName); } public function selectFromPK($table, $pk, $format = "array"){ - return $this->select($table, $pk, null, null, $format); + return $this->select($table, $pk, null, null, $format, '/'.$this->_itemName); } /** @@ -248,7 +305,7 @@ class XMLDB{ * @param $attributes array name/value of the attribute * @return array */ - private function select($from, $id = null, $attributes = null, $childs = null, $format = 'array'){ + private function select($from, $id = null, $attributes = null, $childs = null, $format = 'array', $item = ''){ if($id != null && !is_array($id)){ $attribute = '[@' . $this->_primaryKey . ' = "' . $id . '"]'; } @@ -263,7 +320,7 @@ class XMLDB{ if($from == '*') $request = $this->_xpath->query('//item'.$attribute.$child); else - $request = $this->_xpath->query('//' . $this->_tableName . '[@name = "'.$from.'"]/'.$this->_itemName.$attribute.$child); + $request = $this->_xpath->query('//' . $this->_tableName . '[@name = "'.$from.'"]'.$item.$attribute.$child); return $this->getResult($request, $format); } @@ -298,12 +355,18 @@ class XMLDB{ * @param $position string 'before' or 'after' * @return bool */ - public function insertItem($id, $attributes = null, $childs = null, $table){ + public function insertItem($id = null, $attributes = null, $childs = null, $table){ + if($id == null && $this->isTableAI($table)){ + $id = $this->getNewIncrement($table); + } + else if(($id == null && !$this->isTableAI($table)) || ($id != null && $this->isTableAI($table))) + return false; + if($attributes == null) $attributes = array($this->_primaryKey=>$id); else $attributes += array($this->_primaryKey=>$id); - if($this->tableAlreadyExists($table) && !$this->pkAlreadyExists($id)) + if($this->tableAlreadyExists($table) && !$this->pkAlreadyExists($id, $table)) return $this->insert(array('name'=>$this->_itemName, 'attributes'=>$attributes, 'childs'=>$childs), $table); return false; } @@ -343,8 +406,8 @@ class XMLDB{ * @param $forceInsert bool * @return bool */ - public function updateNodeAttribute($table, $oldAttribute, $newAttribute, $forceInsert = false){ - $request = $this->select($table, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node'); + public function updateItemAttribute($table, $oldAttribute, $newAttribute, $forceInsert = false){ + $request = $this->select($table, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node', '/'.$this->_itemName); if($request->length == 1){ if(!$forceInsert){ $request->item(0)->setAttribute($oldAttribute[0],$newAttribute[1]); @@ -363,8 +426,8 @@ class XMLDB{ * @param $value string new value of the node * @return bool */ - public function updateNodeValue($table, $attribute = null, $child = null, $value){ - $request = $this->select($table, null, array($attribute[0]=>$attribute[1]), null, 'node'); + public function updateItemValue($table, $attribute = null, $child = null, $value){ + $request = $this->select($table, null, array($attribute[0]=>$attribute[1]), null, 'node', '/'.$this->_itemName); //$request = $this->_xpath->query('//'.$node.'[@' . $attribute[0] . ' = "' . $attribute[1] . '"]'); if($request->length == 1){ $request = $request->item(0); diff --git a/XMLDBtestUnit.php b/XMLDBtestUnit.php index 8bc968d..f335963 100644 --- a/XMLDBtestUnit.php +++ b/XMLDBtestUnit.php @@ -25,7 +25,7 @@ class TestOfLogging extends UnitTestCase { $log->message('Trying to insert item "test" into "table1"'); $this->assertTrue($xmldbtest->insertItem('test', array('pwet'=>'cacahuete'), array('visibility'=>'true', 'x'=>'33'), 'table1')); $log->message('Trying to do several select'); - $this->assertEqual($xmldbtest->selectTable('table1', 'count'), 8); + $this->assertEqual($xmldbtest->selectAllFromTable('table1', 'count'), 8); $this->assertEqual($xmldbtest->selectFromPK('table1', 'weather', 'count'), 1); $this->assertEqual($xmldbtest->selectFromAttribute('table1', array('id'=>'weather'), 'count'),1); $this->assertEqual($xmldbtest->selectFromChildren('table1',array('visibility'=>'true'),'count'), 6); @@ -35,8 +35,8 @@ class TestOfLogging extends UnitTestCase { $this->assertFalse($xmldbtest->insertItem('test', null, array('visibility'=>'true', 'x'=>'33'), 'table1')); $this->assertTrue($xmldbtest->insertItem('test2', null, array('visibility'=>'true', 'x'=>'33'), 'table1')); $log->message('Trying to do several updates'); - $this->assertTrue($xmldbtest->updateNodeAttribute('table1', array('id', 'links'), array('id', 'zelda'))); - $this->assertTrue($xmldbtest->updateNodeValue('table1', array('id', 'notes'), null, 'booga!')); + $this->assertTrue($xmldbtest->updateItemAttribute('table1', array('id', 'links'), array('id', 'zelda'))); + $this->assertTrue($xmldbtest->updateItemValue('table1', array('id', 'notes'), null, 'booga!')); $log->message('Trying to delete the item "clock" from "table1"'); //var_dump($xmldbtest->selectFromPK('table1', 'clock', 'node'), true); //$this->assertTrue($xmldbtest->deleteNode($xmldbtest->selectFromPK('table1', 'clock', 'node'))); @@ -48,6 +48,36 @@ class TestOfLogging extends UnitTestCase { $log->message('Trying to erase a DB'); $xmldbtest1->dropDatabase(true); + $xmldbtest2 = new XMLDB('database2.xml'); + $this->assertTrue($xmldbtest2->isTableAI('table1')); + $this->assertTrue($xmldbtest2->insertItem(null, null, null,'table1')); + $this->assertEqual($xmldbtest2->getChildValue('sex', $xmldbtest2->selectFromPK('table1', '3', 'node')), 'M'); + $this->assertTrue($xmldbtest2->createTable('table3', true, 2)); + $personnes = array( + 3 => array( + 'nom' => 'Desmidt', + 'prenom' => 'clément' + ), + 4 => array( + 'nom' => 'Chou', + 'prenom' => 'Chen' + ), + 5 => array( + 'nom' => 'Votocek', + 'prenom' => 'Sophie' + ), + 6 => array( + 'nom' => 'Dupond', + 'prenom' => 'Jean' + ) + ); + foreach($personnes as $personne){ + $this->assertTrue($xmldbtest2->insertItem(null, null, $personne, 'table3')); + } + $this->assertTrue($xmldbtest2->deleteITem('table3', '4')); + $this->assertTrue($xmldbtest2->insertItem(null, null, array('visibility'=>'true', 'x'=>'31'), 'table3')); + //$this->assertTrue($xmldbtest2->insertItem(null, null, array('visibility'=>'true', 'x'=>'33'), 'table3')); + //$this->assertEqual($xmldbtest2->getAttribute('aivalue', $xmldbtest2->selectTable('table3')), 5); /*$log->message('Trying to select w/o anything'); $xmldbtest->select();*/ } diff --git a/database2.xml b/database2.xml new file mode 100644 index 0000000..0a61f22 --- /dev/null +++ b/database2.xml @@ -0,0 +1,16 @@ + + + + + Sophie + 27 + F + + + Clement + 28 + M + atheist + +
+