Added autoincrement ( Closes #1 )

Added getAttribute & getChildValue ( Closes #3 )
This commit is contained in:
Chouchen 2010-10-12 10:25:17 +00:00
parent 69b9eb42e2
commit f73fe22483
3 changed files with 128 additions and 19 deletions

View File

@ -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);

View File

@ -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();*/
}

16
database2.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<Database>
<table name="table1" autoincrement="true" aivalue="5">
<item id="1">
<name>Sophie</name>
<age>27</age>
<sex>F</sex>
</item>
<item id="3">
<name>Clement</name>
<age>28</age>
<sex>M</sex>
<religion>atheist</religion>
</item>
</table>
</Database>