From 2fccf1207d49b4577088155c341353b1f6fcad67 Mon Sep 17 00:00:00 2001 From: Chouchen Date: Thu, 7 Oct 2010 15:57:56 +0000 Subject: [PATCH] Correction of a SVN manipulation -_-; --- XMLDB.log | 0 XMLDB.php | 213 ++++++++++++++++++++++++++++++++++++++++++++++ XMLDBtestUnit.php | 65 ++++++++++++++ config.xml | 63 ++++++++++++++ 4 files changed, 341 insertions(+) create mode 100644 XMLDB.log create mode 100644 XMLDB.php create mode 100644 XMLDBtestUnit.php create mode 100644 config.xml diff --git a/XMLDB.log b/XMLDB.log new file mode 100644 index 0000000..e69de29 diff --git a/XMLDB.php b/XMLDB.php new file mode 100644 index 0000000..174677c --- /dev/null +++ b/XMLDB.php @@ -0,0 +1,213 @@ +_primaryKey = $pk; + $this->_file = $file; + $this->_doc = new DOMDocument; + if(@$this->_doc->load($this->_file)) + $this->_xpath = new DOMXpath($this->_doc); + else{ + $this->_file = $file; + $this->_doc = null; + $this->xpath = null; + } + } + + public function isLoaded(){ + if($this->_doc != null) + return true; + else + return false; + } + + public function setPrimaryKey($pk){ + $this->_primaryKey = $pk; + } + + public function getPrimaryKey(){ + return $this->_primaryKey; + } + + public function getXPath(){ + return $this->_xpath; + } + + /** + * Saving the DB file + */ + public function save(){ + if($this->_doc != null && $this->_file != null){ + $this->_doc->save($this->_file); + return true; + }else{ + return false; + } + } + + /** + * Allows you to get an array of the node you're looking for based on a "where" search thanks to child or attribute value + * @param $from string Name of the node you're looking for + * @param $id string value of the primary key + * @param $childs array name/value of the child node + * @param $attributes array name/value of the attribute + * @return array + */ + // TODO other format + public function selectNode($from, $id = null, $attributes = null, $childs = null, $format = 'array'){ + if (!$from) { + throw new Exception('uhoh, no "where" statement?'); + } + if($id != null){ + $attribute .= '[@' . $this->_primaryKey . ' = "' . $id . '"]'; + } + if($attributes != null){ + foreach($attributes as $attributeName=>$attributeValue) + $attribute .= '[@' . $attributeName . ' = "' . $attributeValue . '"]'; + } + if($childs != null){ + foreach($childs as $childName=>$childValue) + $child .= '/' . $childName . '[.="' . $childValue . '"]'; + } + $request = $this->_xpath->query('//'.$from.$attribute.$child); + $requestLength = $request->length; + if($format == "array"){ + //$return = array('length'=>$requestLength, 'request'=>'//'.$from.$attribute.$child); + foreach($request as $element){ + if($childName != null && $childValue != null) + $element = $element->parentNode; + $elementValue = $element->attributes->item(0)->value; + $return[$elementValue]['attributes'] = array(); + $return[$elementValue]['childs'] = array(); + + //Retrieving Attributes + $attributes = $element->attributes; + $length = $attributes->length; + for ($i = 1; $i <= $length; $i++) { + $return[$elementValue]['attributes'][$attributes->item($i)->name] = $attributes->item($i)->value; + } + + // Retrivieving childs + $nodes = $element->childNodes; + $length = $nodes->length; + for ($i = 1; $i <= $length; $i++) { + $return[$elementValue]['childs'][$nodes->item($i)->nodeName] = $nodes->item($i)->nodeValue; + } + } + }else if($format == "node"){ + $return = $request; + } + return $return; + } + + /** + * Allows you to insert a node into your DB thanks to an array + * @param $node array + * @param $where string in which node you want to put it. By default, the root of the xml file + * @param $position string 'before' or 'after' + * @return bool + */ + + // TODO other $where and $position + public function insertNode($node, $where = null, $position = null){ + if(!is_array($node) || !isset($node['name'])) + return false; + + // Creating the node from an array + $element = $this->_doc->createElement($node['name']); + if(isset($node['attributes'])){ + foreach($node['attributes'] as $attributeName=>$attributeValue){ + $element->setAttribute($attributeName, $attributeValue); + } + } + if(isset($node['childs'])){ + foreach($node['childs'] as $childName=>$childValue){ + $newElement = $this->_doc->createElement($childName, $childValue); + $element->appendChild($newElement); + } + } + + // Inserting the node into the DB + if($where == null){ + $this->_doc->firstChild->appendChild($element); + } + return $this->save(); + } + + /** + * + * @param $node string + * @param $oldAttribute string name of the attribute you want to change + * @param $newAttribute array name/value of the attribute you want to add + * @param $forceInsert bool + * @return bool + */ + public function updateNodeAttribute($node, $oldAttribute, $newAttribute, $forceInsert = false){ + $request = $this->selectNode($node, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node'); + if($request->length == 1){ + if(!$forceInsert){ + $request->item(0)->setAttribute($oldAttribute[0],$newAttribute[1]); + }else{ + $request->item(0)->setAttribute($newAttribute[0],$newAttribute[1]); + } + return $this->save(); + } + else + return false; + } + + /** + * + * @param $node string + * @param $value string new value of the node + * @return bool + */ + public function updateNodeValue($node, $attribute = null, $child = null, $value){ + $request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node'); + //$request = $this->_xpath->query('//'.$node.'[@' . $attribute[0] . ' = "' . $attribute[1] . '"]'); + if($request->length == 1){ + $request = $request->item(0); + $newText = new DOMText($value); + $request->removeChild($request->firstChild); + $request->appendChild($newText); + return $this->save(); + } + else + return false; + } + + + public function deleteNode($node, $id = null, $attributes = null){ + if($id != null && $attributes != null) + return false; + if($id != null) + $request = $this->selectNode($node, $id, null, null, 'node')->item(0); + if($attributes != null) + $request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node')->item(0); + $request->parentNode->removeChild($request); + return $this->save(); + } + + + + + + + + +} \ No newline at end of file diff --git a/XMLDBtestUnit.php b/XMLDBtestUnit.php new file mode 100644 index 0000000..83dcd3d --- /dev/null +++ b/XMLDBtestUnit.php @@ -0,0 +1,65 @@ +isLoaded()){ + echo 'can\'t load test.xml
'; + $xmldbtest = new XMLDB('config.xml'); + if($xmldbtest->isLoaded()){ + // Testing selectNode($from, $attributeName = null, $attributeValue = null, $childName = null, $childValue = null) + echo 'Testing empty selectNode
'; + try { + $xmldbtest->selectNode(); + } + catch(Exception $e){ + echo $e->getMessage().'

'; + } + + echo 'Testing selectNode
'; + $result = $xmldbtest->selectNode('item'); + echo count($result).' results

'; + + echo 'Testing selectNode id=weather with pk
'; + $result = $xmldbtest->selectNode('item', 'weather'); + echo count($result).' results

'; + + echo 'Testing selectNode id=weather
'; + $result = $xmldbtest->selectNode('item', null, array('id'=>'weather')); + echo count($result).' results

'; + + echo 'Testing selectNode visibility = true
'; + $result = $xmldbtest->selectNode('item', null,null,array('visibility'=>'true')); + echo count($result).' results

'; + + echo 'Testing selectNode visibility = true and x = 32
'; + $result = $xmldbtest->selectNode('item', null ,null,array('visibility'=>'true', 'x'=>'32')); + echo count($result).' results

'; + + echo '
Testing insertNode at XML root
'; + if($xmldbtest->insertNode(array('name'=>'item', 'attributes'=>array('id'=>'test'), 'childs'=>array('visibility'=>'true', 'x'=>'33')))) + echo "ok

"; + else + echo "ko

"; + + echo '
Testing updatingNodeAttribute with no insert
'; + if($xmldbtest->updateNodeAttribute('item', array('id', 'links'), array('id', 'zelda'))) + echo "ok

"; + else + echo "ko

"; + + echo '
Testing updateNodeValue via attribute
'; + if($xmldbtest->updateNodeValue('item', array('id', 'notes'), null, 'booga!')) + echo "ok

"; + else + echo "ko

"; + + echo '
Testing deleteNode via pk
'; + if($xmldbtest->deleteNode('item', 'test', null)) + echo "ok

"; + else + echo "ko

"; + + }else{ + exit("can't load config.xml either"); + } +} + diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..f71ae76 --- /dev/null +++ b/config.xml @@ -0,0 +1,63 @@ + + + + false + 950 + 42 + + + true + Paris + 605 + 648 + + + true + + + true + + + true + + + false + 478 + 73 + + + true + 32 + -2 + + + false + 80 + 10 + Times New Roman, serif + 20px + %A %d %B %Y - %H:%M:%S + #000 + + + false + 478 + 73 + + + false + 0 + 600 + + + true + 500 + 10 + + + false + + + true + +