Added basical functions
This commit is contained in:
parent
2fccf1207d
commit
0e49600951
229
XMLDB.php
229
XMLDB.php
@ -7,26 +7,72 @@ class XMLDB{
|
||||
// Primary key
|
||||
protected $_primaryKey;
|
||||
|
||||
// Selected table
|
||||
protected $_table;
|
||||
|
||||
// XPATH
|
||||
protected $_xpath;
|
||||
|
||||
// Content of the XML DB File
|
||||
protected $_doc;
|
||||
|
||||
public function __construct($file, $pk = "id"){
|
||||
/**
|
||||
* Constructor
|
||||
* @param $file string path to the file to read/create
|
||||
* @param $pk string name of the primary key
|
||||
* @param $createIfNotExist bool create the file if it doesn't exist
|
||||
*/
|
||||
public function __construct($file, $pk = "id", $createIfNotExist = false){
|
||||
ini_set("display_errors", "off");
|
||||
ini_set("log_errors", "on");
|
||||
ini_set('error_log', $_SERVER['DOCUMENT_ROOT'].'/test/XMLDB/XMLDB.log');
|
||||
$this->_primaryKey = $pk;
|
||||
$this->_file = $file;
|
||||
$this->_doc = new DOMDocument;
|
||||
if(@$this->_doc->load($this->_file))
|
||||
$this->_doc->preserveWhiteSpace = false;
|
||||
$this->_doc->formatOutput = true;
|
||||
if($this->_doc->load($this->_file)){
|
||||
$this->_xpath = new DOMXpath($this->_doc);
|
||||
else{
|
||||
$this->_file = $file;
|
||||
$this->_doc = null;
|
||||
$this->xpath = null;
|
||||
}
|
||||
else{
|
||||
if($createIfNotExist){
|
||||
$this->createDatabase($file);
|
||||
}else{
|
||||
$this->_file = null;
|
||||
$this->_doc = null;
|
||||
$this->xpath = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function createDatabase($file){
|
||||
$this->_file = $file;
|
||||
$this->_doc = DOMDocument::loadXML('<?xml version="1.0" encoding="utf-8"?>
|
||||
<Database>
|
||||
</Database>');
|
||||
$this->_xpath = new DOMXpath($this->_doc);
|
||||
return $this->save();
|
||||
}
|
||||
|
||||
public function createTable($name){
|
||||
if($name == '*' || $this->tableAlreadyExists($name))
|
||||
return false;
|
||||
else
|
||||
return $this->insertNode(array('name'=>'table', 'attributes'=>array('name'=>$name)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function tableAlreadyExists($tableName){
|
||||
if($this->selectTable($tableName, 'count') >= 1)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public function selectTable($name, $format = 'node'){
|
||||
return $this->select($name, null, null, null, $format);
|
||||
}
|
||||
|
||||
public function isLoaded(){
|
||||
@ -36,6 +82,10 @@ class XMLDB{
|
||||
return false;
|
||||
}
|
||||
|
||||
public function count($from, $id = null, $attributes = null, $childs = null){
|
||||
return $this->select($from, $id, $attributes, $childs, 'count');
|
||||
}
|
||||
|
||||
public function setPrimaryKey($pk){
|
||||
$this->_primaryKey = $pk;
|
||||
}
|
||||
@ -53,6 +103,8 @@ class XMLDB{
|
||||
*/
|
||||
public function save(){
|
||||
if($this->_doc != null && $this->_file != null){
|
||||
$this->_doc->preserveWhiteSpace = false;
|
||||
$this->_doc->formatOutput = true;
|
||||
$this->_doc->save($this->_file);
|
||||
return true;
|
||||
}else{
|
||||
@ -60,20 +112,60 @@ class XMLDB{
|
||||
}
|
||||
}
|
||||
|
||||
// TODO checking $request
|
||||
public function requestToArray($request){
|
||||
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;
|
||||
}
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcuts for select
|
||||
*/
|
||||
public function selectFromAttribute($table, $attributes, $format = 'array'){
|
||||
return $this->select($table, null, $attributes, null, $format);
|
||||
}
|
||||
|
||||
public function selectFromChilds($table, $childs, $format = 'array'){
|
||||
return $this->select($table, null, null, $childs, $format);
|
||||
}
|
||||
|
||||
public function selectFromPK($table, $pk, $format = "array"){
|
||||
return $this->select($table, $pk, null, null, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 $from string Name of the table
|
||||
* @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'){
|
||||
public function select($from, $id = null, $attributes = null, $childs = null, $format = 'array'){
|
||||
if (!$from) {
|
||||
throw new Exception('uhoh, no "where" statement?');
|
||||
throw new Exception('uhoh, no table selected');
|
||||
}
|
||||
if($id != null){
|
||||
if($id != null && count($id) == 1){
|
||||
$attribute .= '[@' . $this->_primaryKey . ' = "' . $id . '"]';
|
||||
}
|
||||
if($attributes != null){
|
||||
@ -82,49 +174,65 @@ class XMLDB{
|
||||
}
|
||||
if($childs != null){
|
||||
foreach($childs as $childName=>$childValue)
|
||||
$child .= '/' . $childName . '[.="' . $childValue . '"]';
|
||||
$child .= '[' . $childName . '="' . $childValue . '"]';
|
||||
/*$child .= '/' . $childName . '[.="' . $childValue . '"]';
|
||||
if(count($childs)>1){
|
||||
$child = str_replace('/', '', $child);
|
||||
$child = '/'.$child;
|
||||
}*/
|
||||
}
|
||||
$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;
|
||||
if($from == '*')
|
||||
$request = $this->_xpath->query('//item'.$attribute.$child);
|
||||
else
|
||||
$request = $this->_xpath->query('//table[@name = "'.$from.'"]/item'.$attribute.$child);
|
||||
|
||||
switch($format){
|
||||
case "node":
|
||||
$return = $request;
|
||||
break;
|
||||
case "count":
|
||||
$return = $request->length;
|
||||
break;
|
||||
case "array":
|
||||
default:
|
||||
$return = $this->requestToArray($request);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as above, but user can build his own xpath
|
||||
*/
|
||||
public function select_xpath($from, $xpath, $format = 'array'){
|
||||
if (!$from || !$xpath) {
|
||||
throw new Exception('uhoh, no table selected');
|
||||
}
|
||||
$request = $this->_xpath->query('//table[@name = "'.$from.'"]/'.$xpath);
|
||||
switch($format){
|
||||
case "node":
|
||||
$return = $request;
|
||||
break;
|
||||
case "count":
|
||||
$return = $request->length;
|
||||
break;
|
||||
case "array":
|
||||
default:
|
||||
$return = $this->requestToArray($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 $node array with 'name' 'attributes' and 'childs'
|
||||
* @param $table 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){
|
||||
public function insertNode($node, $table = null, $position = null){
|
||||
if(!is_array($node) || !isset($node['name']))
|
||||
return false;
|
||||
|
||||
@ -143,22 +251,31 @@ class XMLDB{
|
||||
}
|
||||
|
||||
// Inserting the node into the DB
|
||||
if($where == null){
|
||||
// case : creation of a new table
|
||||
if($table == null){
|
||||
$this->_doc->firstChild->appendChild($element);
|
||||
}else{
|
||||
// case : insertion into the end of table
|
||||
//TODO checking if PK already exists
|
||||
$request = $this->_xpath->query('//table[@name = "'.$table.'"]');
|
||||
if($request->length != 1){
|
||||
return false;
|
||||
}
|
||||
$request->item(0)->appendChild($element);
|
||||
}
|
||||
return $this->save();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param $node string
|
||||
* @param $table 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');
|
||||
public function updateNodeAttribute($table, $oldAttribute, $newAttribute, $forceInsert = false){
|
||||
$request = $this->select($table, null, array($oldAttribute[0]=>$oldAttribute[1]), null, 'node');
|
||||
if($request->length == 1){
|
||||
if(!$forceInsert){
|
||||
$request->item(0)->setAttribute($oldAttribute[0],$newAttribute[1]);
|
||||
@ -173,12 +290,12 @@ class XMLDB{
|
||||
|
||||
/**
|
||||
*
|
||||
* @param $node string
|
||||
* @param $table 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');
|
||||
public function updateNodeValue($table, $attribute = null, $child = null, $value){
|
||||
$request = $this->select($table, 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);
|
||||
@ -192,22 +309,22 @@ class XMLDB{
|
||||
}
|
||||
|
||||
|
||||
public function deleteNode($node, $id = null, $attributes = null){
|
||||
public function deleteNode($table, $id = null, $attributes = null){
|
||||
if($id != null && $attributes != null)
|
||||
return false;
|
||||
if($id != null)
|
||||
$request = $this->selectNode($node, $id, null, null, 'node')->item(0);
|
||||
$request = $this->select($table, $id, null, null, 'node')->item(0);
|
||||
if($attributes != null)
|
||||
$request = $this->selectNode($node, null, array($attribute[0]=>$attribute[1]), null, 'node')->item(0);
|
||||
$request = $this->select($table, null, array($attribute[0]=>$attribute[1]), null, 'node')->item(0);
|
||||
$request->parentNode->removeChild($request);
|
||||
return $this->save();
|
||||
}
|
||||
|
||||
public function moveNode($node, $from, $to){
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -1,59 +1,88 @@
|
||||
<?
|
||||
require_once 'XMLDB.php';
|
||||
echo 'Creating new DB (should be "ok" creating a new file "test")<br/>';
|
||||
if($xmldbtest1 = new XMLDB('test.xml', 'id', true))
|
||||
echo "ok";
|
||||
else
|
||||
echo "ko";
|
||||
echo '<br/>Creating new table (should be "ok" adding table1 in test)<br/>';
|
||||
if($xmldbtest1->createTable('table1'))
|
||||
echo "ok";
|
||||
else
|
||||
echo "ko";
|
||||
|
||||
echo '<br/>loading an inexistant DB (error)<br/>';
|
||||
$xmldbtest = new XMLDB('text.xml');
|
||||
if(!$xmldbtest->isLoaded()){
|
||||
echo 'can\'t load test.xml<br/>';
|
||||
$xmldbtest = new XMLDB('config.xml');
|
||||
echo '<br/><br/>can\'t load test.xml<br/>';
|
||||
$xmldbtest = new XMLDB('database.xml');
|
||||
if($xmldbtest->isLoaded()){
|
||||
// Testing selectNode($from, $attributeName = null, $attributeValue = null, $childName = null, $childValue = null)
|
||||
echo 'Testing empty selectNode <br/>';
|
||||
// Testing select($from, $attributeName = null, $attributeValue = null, $childName = null, $childValue = null)
|
||||
echo 'Testing empty select (exception)<br/>';
|
||||
try {
|
||||
$xmldbtest->selectNode();
|
||||
$xmldbtest->select();
|
||||
}
|
||||
catch(Exception $e){
|
||||
echo $e->getMessage().'<br/><br/>';
|
||||
}
|
||||
|
||||
echo 'Testing selectNode <br/>';
|
||||
$result = $xmldbtest->selectNode('item');
|
||||
echo '<br/>Creating new table name "*" (should be "ko" table already exist)<br/>';
|
||||
if($xmldbtest->createTable('*'))
|
||||
echo "ok";
|
||||
else
|
||||
echo "ko";
|
||||
|
||||
echo '<br/>Creating new table (should be "ko" table already exist)<br/>';
|
||||
if($xmldbtest->createTable('table1'))
|
||||
echo "ok";
|
||||
else
|
||||
echo "ko";
|
||||
echo '<br/>Testing insertNode at XML root (should insert an item named "test" into table1)<br/>';
|
||||
if($xmldbtest->insertNode(array('name'=>'item', 'attributes'=>array('id'=>'test'), 'childs'=>array('visibility'=>'true', 'x'=>'33')), 'table1'))
|
||||
echo "ok<br/><br/>";
|
||||
else
|
||||
echo "ko<br/><br/>";
|
||||
|
||||
echo 'Testing select (should give 8 results - 7 from the file + 1 we created earlier)<br/>';
|
||||
$result = $xmldbtest->select('table1');
|
||||
echo count($result).' results <br/><br/>';
|
||||
|
||||
echo 'Testing selectNode id=weather with pk<br/>';
|
||||
$result = $xmldbtest->selectNode('item', 'weather');
|
||||
echo 'Testing select id=weather with pk (should find 1 result)<br/>';
|
||||
$result = $xmldbtest->selectFromPK('table1', 'weather');
|
||||
echo count($result).' results <br/><br/>';
|
||||
|
||||
echo 'Testing selectNode id=weather<br/>';
|
||||
$result = $xmldbtest->selectNode('item', null, array('id'=>'weather'));
|
||||
echo 'Testing select id=weather (should find 1 result)<br/>';
|
||||
$result = $xmldbtest->select('table1', null, array('id'=>'weather'));
|
||||
echo count($result).' results <br/><br/>';
|
||||
|
||||
echo 'Testing selectNode visibility = true<br/>';
|
||||
$result = $xmldbtest->selectNode('item', null,null,array('visibility'=>'true'));
|
||||
echo 'Testing select visibility = true (should throw 6 results - 5 from the base file + 1 we created)<br/>';
|
||||
$result = $xmldbtest->select('table1', null,null,array('visibility'=>'true'));
|
||||
echo count($result).' results<br/><br/>';
|
||||
|
||||
echo 'Testing select visibility = true on all tables (should find 8 results - 7 from the base file + 1 we created)<br/>';
|
||||
$result = $xmldbtest->select('*', null,null,array('visibility'=>'true'));
|
||||
echo count($result).' results <br/><br/>';
|
||||
|
||||
echo 'Testing selectNode visibility = true and x = 32<br/>';
|
||||
$result = $xmldbtest->selectNode('item', null ,null,array('visibility'=>'true', 'x'=>'32'));
|
||||
echo count($result).' results <br/><br/>';
|
||||
echo 'Testing select visibility = true and x = 32 (experimental - should find 1)<br/>';
|
||||
$result = $xmldbtest->selectFromChilds('table1',array('visibility'=>'true', 'x'=>'32'));
|
||||
echo count($result).' results<br/><br/>';
|
||||
|
||||
echo '<br/>Testing insertNode at XML root<br/>';
|
||||
if($xmldbtest->insertNode(array('name'=>'item', 'attributes'=>array('id'=>'test'), 'childs'=>array('visibility'=>'true', 'x'=>'33'))))
|
||||
echo "ok<br/><br/>";
|
||||
else
|
||||
echo "ko<br/><br/>";
|
||||
|
||||
|
||||
echo '<br/>Testing updatingNodeAttribute with no insert <br/>';
|
||||
if($xmldbtest->updateNodeAttribute('item', array('id', 'links'), array('id', 'zelda')))
|
||||
echo '<br/>Testing updatingNodeAttribute with no insert (should be ok and change the item "links" into "zelda" haha)<br/>';
|
||||
if($xmldbtest->updateNodeAttribute('table1', array('id', 'links'), array('id', 'zelda')))
|
||||
echo "ok<br/><br/>";
|
||||
else
|
||||
echo "ko<br/><br/>";
|
||||
|
||||
echo '<br/>Testing updateNodeValue via attribute<br/>';
|
||||
if($xmldbtest->updateNodeValue('item', array('id', 'notes'), null, 'booga!'))
|
||||
echo '<br/>Testing updateNodeValue via attribute (should be ok - inserting "booga!" into the item named "notes")<br/>';
|
||||
if($xmldbtest->updateNodeValue('table1', array('id', 'notes'), null, 'booga!'))
|
||||
echo "ok<br/><br/>";
|
||||
else
|
||||
echo "ko<br/><br/>";
|
||||
|
||||
echo '<br/>Testing deleteNode via pk<br/>';
|
||||
if($xmldbtest->deleteNode('item', 'test', null))
|
||||
echo '<br/>Testing deleteNode via pk (should be ok - deleting the item clock into table1)<br/>';
|
||||
if($xmldbtest->deleteNode('table1', 'clock', null))
|
||||
echo "ok<br/><br/>";
|
||||
else
|
||||
echo "ko<br/><br/>";
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Config>
|
||||
<Database>
|
||||
<table name="table1">
|
||||
<item id="clock">
|
||||
<visibility>false</visibility>
|
||||
<x>950</x>
|
||||
@ -30,6 +31,8 @@
|
||||
<x>32</x>
|
||||
<y>-2</y>
|
||||
</item>
|
||||
</table>
|
||||
<table name="table2">
|
||||
<item id="clockAdvanced">
|
||||
<visibility>false</visibility>
|
||||
<x>80</x>
|
||||
@ -60,4 +63,5 @@
|
||||
<item id="gmap">
|
||||
<visibility>true</visibility>
|
||||
</item>
|
||||
</Config>
|
||||
</table>
|
||||
</Database>
|
Loading…
Reference in New Issue
Block a user