2010-12-02 23:34:41 +00:00
|
|
|
<?php
|
2012-10-09 13:30:11 -04:00
|
|
|
|
2017-08-11 12:27:06 -04:00
|
|
|
class XMLConnection
|
2010-12-02 23:34:41 +00:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
public $phptype = 'myxml';
|
|
|
|
|
public $caseFolding = true;
|
|
|
|
|
public $xmldoc = null;
|
|
|
|
|
public $xmlFile = '';
|
2010-12-02 23:34:41 +00:00
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/**
|
|
|
|
|
* XMLConnection
|
|
|
|
|
*
|
|
|
|
|
* @param string $file
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function XMLConnection($file)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
|
|
|
|
$this->xmldoc = new Xml_Document();
|
2017-12-04 13:25:35 +00:00
|
|
|
$this->xmldoc->parseXmlFile($file);
|
2012-10-09 13:30:11 -04:00
|
|
|
$this->xmlFile = $file;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* &query
|
|
|
|
|
* Actualy the only one supported query is simple SELECT.
|
|
|
|
|
*
|
|
|
|
|
* @param string $sql
|
|
|
|
|
* @return object(XMLResult) $result
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function &query($sql)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
if (! isset($this->xmldoc)) {
|
|
|
|
|
$err = new DB_Error("Error: Closed xmlConnection.");
|
2012-10-09 13:30:11 -04:00
|
|
|
return $err;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
if (1 === preg_match('/^\s*SELECT\s+([\w\W]+?)(?:\s+FROM\s+`?([^`]+?)`?)(?:\s+WHERE\s+([\w\W]+?))?(?:\s+GROUP\s+BY\s+([\w\W]+?))?(?:\s+ORDER\s+BY\s+([\w\W]+?))?(?:\s+BETWEEN\s+([\w\W]+?)\s+AND\s+([\w\W]+?))?(?:\s+LIMIT\s+(\d+)\s*,\s*(\d+))?\s*$/im', $sql, $matches)) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$sqlColumns = $matches[1];
|
2017-12-04 13:25:35 +00:00
|
|
|
$sqlFrom = isset($matches[2]) ? $matches[2] : '';
|
|
|
|
|
$sqlWhere = isset($matches[3]) ? $matches[3] : '';
|
|
|
|
|
$sqlGroupBy = isset($matches[4]) ? $matches[4] : '';
|
|
|
|
|
$sqlOrderBy = isset($matches[5]) ? $matches[5] : '';
|
|
|
|
|
$sqlLowLimit = isset($matches[8]) ? $matches[8] : '';
|
|
|
|
|
$sqlHighLimit = isset($matches[9]) ? $matches[9] : '';
|
2012-10-09 13:30:11 -04:00
|
|
|
/* Start Block: Fields list */
|
2017-12-04 13:25:35 +00:00
|
|
|
$count = preg_match_all('/\s*(\*|[\w\.]+)(?:\s+AS\s+([\w\.]+))?/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
|
|
|
|
|
$fieldsList = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
for ($r = 0; $r < $count; $r ++) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$name = (is_array($match[2][$r]) && $match[2][$r][0] !== '') ? $match[2][$r][0] : $match[1][$r][0];
|
2012-10-09 13:30:11 -04:00
|
|
|
$fieldsList[$name] = $match[1][$r][0];
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2012-10-22 15:45:47 -04:00
|
|
|
/* Start Block: Order list */
|
2017-12-04 13:25:35 +00:00
|
|
|
$count = preg_match_all('/\s*(\*|[\w\.]+)(\s+ASC|\s+DESC)?\s*,?/im', $sqlOrderBy, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
|
|
|
|
|
$orderList = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
for ($r = $count - 1; $r >= 0; $r --) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$direction = (is_array($match[2][$r]) && $match[2][$r][0] !== '') ? $match[2][$r][0] : 'ASC';
|
|
|
|
|
$direction = strtoupper($direction);
|
2012-10-09 13:30:11 -04:00
|
|
|
$orderList[$match[1][$r][0]] = $direction;
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$xmlFrom = '/' . str_replace('.', '/', $sqlFrom);
|
|
|
|
|
$node = $this->xmldoc->findNode($xmlFrom);
|
|
|
|
|
if (! isset($node)) {
|
2012-10-09 13:30:11 -04:00
|
|
|
//$err = new DB_Error( "$xmlFrom node not found in $dsn." );
|
2017-12-04 13:25:35 +00:00
|
|
|
throw new Exception("$xmlFrom node not found in " . $this->xmlFile . ".");
|
2012-10-09 13:30:11 -04:00
|
|
|
return $err;
|
|
|
|
|
} else {
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = $this->fetchChildren($node);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
/* Start Block: WHERE*/
|
|
|
|
|
if ($sqlWhere !== '') {
|
|
|
|
|
/*Start Block: Replace the operator */
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks = preg_split('/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE);
|
2012-10-09 13:30:11 -04:00
|
|
|
$sqlWhere = '';
|
2017-12-04 13:25:35 +00:00
|
|
|
for ($r = 0; $r < sizeof($blocks); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
if (($r % 2) === 0) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks[$r] = str_replace('=', '==', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('<>', '!=', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('AND', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('and', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('OR', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('or', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('NOT', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('not', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$sqlWhere .= $blocks[$r];
|
|
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
$sqlWhere = preg_replace_callback('/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array('XMLConnection','sqlWhereLike'
|
|
|
|
|
), $sqlWhere);
|
|
|
|
|
$sqlWhere = preg_replace_callback('/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array('XMLConnection','sqlString'
|
|
|
|
|
), $sqlWhere);
|
|
|
|
|
$newRes = array();
|
|
|
|
|
for ($r = 0; $r < sizeof($res); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$evalWhere = false;
|
2017-12-04 13:25:35 +00:00
|
|
|
@eval('$evalWhere = ' . $sqlWhere . ';');
|
2012-10-22 15:45:47 -04:00
|
|
|
if ($evalWhere) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$newRes[] = $res[$r];
|
2012-10-22 15:45:47 -04:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$res = $newRes;
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2012-10-22 15:45:47 -04:00
|
|
|
/* Start Block: Expands the resultant data according to fill an array
|
|
|
|
|
* with the required fields in the query.
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
for ($r = 0; $r < sizeof($res); $r ++) {
|
|
|
|
|
$res[$r] = $this->expandFields($res[$r], $fieldsList);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
/* End Block */
|
2012-10-22 15:45:47 -04:00
|
|
|
/* Start Block: ORDER BY*/
|
|
|
|
|
foreach ($orderList as $field => $direction) {
|
2017-12-04 13:25:35 +00:00
|
|
|
for ($i = 0; $i < sizeof($res); $i ++) {
|
|
|
|
|
for ($j = $i + 1; $j < sizeof($res); $j ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$condition = ($direction === 'ASC') ? ($res[$j] < $res[$i]) : ($res[$j] > $res[$i]);
|
|
|
|
|
if ($condition) {
|
|
|
|
|
$swap = $res[$i];
|
|
|
|
|
$res[$i] = $res[$j];
|
|
|
|
|
$res[$j] = $swap;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
/* End Block */
|
2012-10-22 15:45:47 -04:00
|
|
|
/* Start Block: Apply limits */
|
|
|
|
|
if ($sqlLowLimit != '' && $sqlHighLimit != '') {
|
2012-10-09 13:30:11 -04:00
|
|
|
$sqlLowLimit = (int) $sqlLowLimit;
|
|
|
|
|
$sqlHighLimit = (int) $sqlHighLimit;
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = array_slice($res, $sqlLowLimit, $sqlHighLimit);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$result = new XMLResult($res);
|
2012-10-09 13:30:11 -04:00
|
|
|
return $result;
|
2017-12-04 13:25:35 +00:00
|
|
|
} elseif (1 === preg_match('/^\s*DELETE\s+FROM\s+`?([^`]+?)`?(?:\s+WHERE\s+([\w\W]+?))?\s*$/im', $sql, $matches)) {
|
|
|
|
|
$sqlFrom = isset($matches[1]) ? $matches[1] : '';
|
|
|
|
|
$sqlWhere = isset($matches[2]) ? $matches[2] : '1';
|
2012-10-09 13:30:11 -04:00
|
|
|
/* Start Block: WHERE*/
|
2012-10-22 15:45:47 -04:00
|
|
|
/*Start Block: Replace the operator */
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks = preg_split('/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE);
|
2012-10-09 13:30:11 -04:00
|
|
|
$sqlWhere = '';
|
2017-12-04 13:25:35 +00:00
|
|
|
for ($r = 0; $r < sizeof($blocks); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
if (($r % 2) === 0) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks[$r] = str_replace('=', '==', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('<>', '!=', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('AND', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('and', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('OR', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('or', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('NOT', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('not', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$sqlWhere .= $blocks[$r];
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$sqlWhere = preg_replace_callback('/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array('XMLConnection','sqlWhereLike'
|
|
|
|
|
), $sqlWhere);
|
|
|
|
|
$sqlWhere = preg_replace_callback('/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array('XMLConnection','sqlString'
|
|
|
|
|
), $sqlWhere);
|
2010-12-02 23:34:41 +00:00
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/*Start Block: Removing fields */
|
2017-12-04 13:25:35 +00:00
|
|
|
$xmlFrom = '/' . str_replace('.', '/', $sqlFrom);
|
|
|
|
|
$node = $this->xmldoc->findNode($xmlFrom);
|
|
|
|
|
if (! isset($node)) {
|
|
|
|
|
$err = new DB_Error("$xmlFrom node not found!.");
|
2012-10-09 13:30:11 -04:00
|
|
|
return $err;
|
|
|
|
|
} else {
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = $this->fetchChildren($node);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
$newRes = array();
|
|
|
|
|
for ($r = 0; $r < sizeof($res); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$evalWhere = false;
|
2017-12-04 13:25:35 +00:00
|
|
|
@eval('$evalWhere = ' . $sqlWhere . ';');
|
2012-10-09 13:30:11 -04:00
|
|
|
if ($evalWhere) {
|
2017-12-04 13:25:35 +00:00
|
|
|
unset($node->children[$r]);
|
2012-10-09 13:30:11 -04:00
|
|
|
$newRes[] = $res[$r];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//Re-index
|
2017-12-04 13:25:35 +00:00
|
|
|
$node->children = array_values($node->children);
|
2012-10-09 13:30:11 -04:00
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$this->xmldoc->save($this->xmlFile);
|
|
|
|
|
$result = new XMLResult($newRes);
|
2012-10-09 13:30:11 -04:00
|
|
|
return $result;
|
2017-12-04 13:25:35 +00:00
|
|
|
} elseif (1 === preg_match('/^\s*INSERT\s+INTO\s+`?([^`]+?)`?\s*\(([\w\W]+?)\)\s+VALUES\s*\(([\w\W]+?)\)\s*$/im', $sql, $matches)) {
|
|
|
|
|
$sqlFrom = isset($matches[1]) ? $matches[1] : '';
|
|
|
|
|
$sqlColumns = isset($matches[2]) ? $matches[2] : '1';
|
|
|
|
|
$sqlValues = isset($matches[3]) ? $matches[3] : '1';
|
|
|
|
|
$xmlFrom = '/' . str_replace('.', '/', $sqlFrom);
|
|
|
|
|
$node = $this->xmldoc->findNode($xmlFrom);
|
2012-10-09 13:30:11 -04:00
|
|
|
/* Start Block: Fields list */
|
2017-12-04 13:25:35 +00:00
|
|
|
$count = preg_match_all('/([\w\.]+)/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
|
|
|
|
|
$fieldsList = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
for ($r = 0; $r < $count; $r ++) {
|
|
|
|
|
$fieldsList[] = $match[1][$r][0];
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2012-10-22 15:45:47 -04:00
|
|
|
/* Start Block: Fields Values */
|
2017-12-04 13:25:35 +00:00
|
|
|
$count = preg_match_all('/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)/im', $sqlValues, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
|
|
|
|
|
$fieldsValues = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
for ($r = 0; $r < $count; $r ++) {
|
2017-12-04 13:25:35 +00:00
|
|
|
if (substr($match[1][$r][0], 0, 1) === '"') {
|
|
|
|
|
$match[1][$r][0] = substr($match[1][$r][0], 1, - 1);
|
|
|
|
|
$match[1][$r][0] = str_replace('""', '"', $match[1][$r][0]);
|
|
|
|
|
$match[1][$r][0] = str_replace("''", "'", $match[1][$r][0]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
if (substr($match[1][$r][0], 0, 1) === "'") {
|
|
|
|
|
$match[1][$r][0] = substr($match[1][$r][0], 1, - 1);
|
|
|
|
|
$match[1][$r][0] = str_replace("''", "'", $match[1][$r][0]);
|
|
|
|
|
$match[1][$r][0] = str_replace('""', '"', $match[1][$r][0]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$fieldsValues[$fieldsList[$r]] = $match[1][$r][0];
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$AAA = getNames($this->xmldoc->children[0]->children);
|
|
|
|
|
$this->insertRow($node, $fieldsValues);
|
|
|
|
|
$DDD = getNames($this->xmldoc->children[0]->children);
|
|
|
|
|
$this->xmldoc->save($this->xmlFile);
|
|
|
|
|
$result = new XMLResult(array($fieldsValues
|
|
|
|
|
));
|
2012-10-09 13:30:11 -04:00
|
|
|
return $result;
|
2017-12-04 13:25:35 +00:00
|
|
|
} elseif (1 === preg_match('/^\s*UPDATE\s+`?([^`]+?)`?\s+SET\s+((?:(?:[a-z][\w\.]*)\s*=\s*(?:"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)\s*(?:,\s*)?)+)(?:\s+WHERE\s+([\w\W]+?))?\s*$/im', $sql, $matches)) {
|
|
|
|
|
$sqlFrom = isset($matches[1]) ? $matches[1] : '';
|
|
|
|
|
$sqlColumns = isset($matches[2]) ? $matches[2] : '';
|
|
|
|
|
$sqlWhere = isset($matches[3]) ? $matches[3] : '1';
|
|
|
|
|
$count = preg_match_all('/([a-z][\w\.]*)\s*=\s*("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
|
|
|
|
|
$fieldsValues = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
for ($r = 0; $r < $count; $r ++) {
|
2017-12-04 13:25:35 +00:00
|
|
|
if (substr($match[2][$r][0], 0, 1) === '"') {
|
|
|
|
|
$match[2][$r][0] = substr($match[2][$r][0], 1, - 1);
|
|
|
|
|
$match[2][$r][0] = str_replace('""', '"', $match[2][$r][0]);
|
|
|
|
|
$match[2][$r][0] = str_replace("''", "'", $match[2][$r][0]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
if (substr($match[2][$r][0], 0, 1) === "'") {
|
|
|
|
|
$match[2][$r][0] = substr($match[2][$r][0], 1, - 1);
|
|
|
|
|
$match[2][$r][0] = str_replace("''", "'", $match[2][$r][0]);
|
|
|
|
|
$match[2][$r][0] = str_replace('""', '"', $match[2][$r][0]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$fieldsValues[$match[1][$r][0]] = $match[2][$r][0];
|
|
|
|
|
}
|
|
|
|
|
/* Start Block: WHERE*/
|
2012-10-22 15:45:47 -04:00
|
|
|
/*Start Block: Replace the operator */
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks = preg_split('/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE);
|
2012-10-09 13:30:11 -04:00
|
|
|
$sqlWhere = '';
|
2017-12-04 13:25:35 +00:00
|
|
|
for ($r = 0; $r < sizeof($blocks); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
if (($r % 2) === 0) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$blocks[$r] = str_replace('=', '==', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('<>', '!=', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('AND', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('and', '&&', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('OR', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('or', '||', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('NOT', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = str_replace('not', '!', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r]);
|
|
|
|
|
$blocks[$r] = preg_replace('/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r]);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
$sqlWhere .= $blocks[$r];
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$sqlWhere = preg_replace_callback('/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array('XMLConnection','sqlWhereLike'
|
|
|
|
|
), $sqlWhere);
|
|
|
|
|
$sqlWhere = preg_replace_callback('/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array('XMLConnection','sqlString'
|
|
|
|
|
), $sqlWhere);
|
2012-10-09 13:30:11 -04:00
|
|
|
/*Start Block: Removing fields */
|
2017-12-04 13:25:35 +00:00
|
|
|
$xmlFrom = '/' . str_replace('.', '/', $sqlFrom);
|
|
|
|
|
$node = $this->xmldoc->findNode($xmlFrom);
|
|
|
|
|
if (! isset($node)) {
|
|
|
|
|
$err = new DB_Error("$xmlFrom node not found in $dsn.");
|
2012-10-09 13:30:11 -04:00
|
|
|
return $err;
|
|
|
|
|
} else {
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = $this->fetchChildren($node);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
$newRes = array();
|
|
|
|
|
for ($r = 0; $r < sizeof($res); $r ++) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$evalWhere = false;
|
2017-12-04 13:25:35 +00:00
|
|
|
@eval('$evalWhere = ' . $sqlWhere . ';');
|
2012-10-09 13:30:11 -04:00
|
|
|
if ($evalWhere) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$this->updateRow($node->children[$r], $fieldsValues);
|
|
|
|
|
$newRes[] = array_merge($res[$r], $fieldsValues);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/* End Block */
|
2017-12-04 13:25:35 +00:00
|
|
|
$nodeTEST = $this->xmldoc->findNode($xmlFrom);
|
|
|
|
|
$this->xmldoc->save($this->xmlFile);
|
|
|
|
|
$result = new XMLResult($newRes);
|
2012-10-09 13:30:11 -04:00
|
|
|
return $result;
|
2010-12-02 23:34:41 +00:00
|
|
|
} else {
|
2017-12-04 13:25:35 +00:00
|
|
|
echo($sql);
|
|
|
|
|
$err = new DB_Error("SQL Query is not well formed.");
|
2012-10-09 13:30:11 -04:00
|
|
|
return $err;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* sqlLike
|
|
|
|
|
*
|
|
|
|
|
* @param string $a
|
|
|
|
|
* @return void $b
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function sqlLike($a, $b)
|
2010-12-02 23:34:41 +00:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
$b = addcslashes($b, '[]()\/{}.?');
|
|
|
|
|
$b = str_replace("%", '.*', $b);
|
2012-10-09 13:30:11 -04:00
|
|
|
$b = '/^' . $b . '$/im';
|
2017-12-04 13:25:35 +00:00
|
|
|
return preg_match($b, $a);
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* expandFields
|
|
|
|
|
*
|
|
|
|
|
* @param string $resRow
|
|
|
|
|
* @param string $fieldsList
|
|
|
|
|
* @return array $res
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function expandFields($resRow, $fieldsList)
|
2010-12-02 23:34:41 +00:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
foreach ($fieldsList as $key => $value) {
|
|
|
|
|
if ($key === '*') {
|
2012-10-22 15:45:47 -04:00
|
|
|
foreach ($resRow as $k => $v) {
|
2012-10-09 13:30:11 -04:00
|
|
|
$res[$k] = $v;
|
2012-10-22 15:45:47 -04:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
} else {
|
2017-12-04 13:25:35 +00:00
|
|
|
$res[$key] = array_key_exists($value, $resRow) ? $resRow[$value] : null;
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
return $res;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* fetchNode
|
|
|
|
|
*
|
|
|
|
|
* @param object &$node
|
|
|
|
|
* @return array $res
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function fetchNode(&$node)
|
2010-12-02 23:34:41 +00:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = array('XMLNODE_NAME' => $node->name,'XMLNODE_TYPE' => $node->type,'XMLNODE_VALUE' => $node->value
|
2012-10-09 13:30:11 -04:00
|
|
|
);
|
|
|
|
|
foreach ($node->attributes as $name => $value) {
|
2012-10-22 15:45:47 -04:00
|
|
|
if ($this->caseFolding) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$name = strtoupper($name);
|
2012-10-22 15:45:47 -04:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
$res[$name] = $value;
|
|
|
|
|
}
|
|
|
|
|
return $res;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/**
|
|
|
|
|
* fetchChildren
|
|
|
|
|
*
|
|
|
|
|
* @param string &$node
|
|
|
|
|
* @return array $res
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function fetchChildren(&$node)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
$res = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
foreach ($node->children as $name => $child) {
|
2017-12-04 13:25:35 +00:00
|
|
|
$res[] = $this->fetchNode($child);
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
return $res;
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/**
|
|
|
|
|
* disconnect
|
|
|
|
|
*
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function disconnect()
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
unset($this->xmldoc);
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param array $match
|
|
|
|
|
* @return object(DB_Error) $err
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function sqlWhereLike($match)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
switch (substr($match[2], 0, 1)) {
|
2012-10-09 13:30:11 -04:00
|
|
|
case '"':
|
|
|
|
|
return ' $this->sqlLike( ' . $match[1] . ', ' . $match[2] . ' ) ';
|
|
|
|
|
break;
|
|
|
|
|
case "'":
|
|
|
|
|
return ' $this->sqlLike( ' . $match[1] . ', ' . $match[2] . ' ) ';
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-04 13:25:35 +00:00
|
|
|
$err = new DB_Error("XMLDB: Syntax error on $match[0]");
|
2012-10-09 13:30:11 -04:00
|
|
|
die();
|
|
|
|
|
return $err;
|
|
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2012-10-09 13:30:11 -04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* sqlString
|
|
|
|
|
*
|
|
|
|
|
* @param array $match
|
|
|
|
|
* @return object(DB_Error) $err
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function sqlString($match)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
switch (substr($match[0], 0, 1)) {
|
2012-10-09 13:30:11 -04:00
|
|
|
case '"':
|
2017-12-04 13:25:35 +00:00
|
|
|
$match[0] = substr($match[0], 1, - 1);
|
|
|
|
|
$match[0] = str_replace('""', '"', $match[0]);
|
|
|
|
|
$match[0] = str_replace("''", "'", $match[0]);
|
|
|
|
|
$match[0] = addcslashes($match[0], '\\\'');
|
2012-10-09 13:30:11 -04:00
|
|
|
return "'$match[0]'";
|
|
|
|
|
break;
|
|
|
|
|
case "'":
|
2017-12-04 13:25:35 +00:00
|
|
|
$match[0] = substr($match[0], 1, - 1);
|
|
|
|
|
$match[0] = str_replace("''", "'", $match[0]);
|
|
|
|
|
$match[0] = str_replace('""', '"', $match[0]);
|
|
|
|
|
$match[0] = addcslashes($match[0], '\\\'');
|
2012-10-09 13:30:11 -04:00
|
|
|
return "'$match[0]'";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-04 13:25:35 +00:00
|
|
|
$err = new DB_Error("XMLDB: Syntax error on $match[0]");
|
2012-10-09 13:30:11 -04:00
|
|
|
die();
|
|
|
|
|
return $err;
|
|
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/**
|
|
|
|
|
* insertRow
|
|
|
|
|
*
|
|
|
|
|
* @param string &$node
|
|
|
|
|
* @param object $values
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function insertRow(&$node, $values)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
2017-12-04 13:25:35 +00:00
|
|
|
$attributes = array();
|
2012-10-09 13:30:11 -04:00
|
|
|
foreach ($values as $field => $value) {
|
|
|
|
|
switch ($field) {
|
|
|
|
|
case 'XMLNODE_NAME':
|
|
|
|
|
case 'XMLNODE_TYPE':
|
|
|
|
|
case 'XMLNODE_VALUE':
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-04 13:25:35 +00:00
|
|
|
$attributes[strtolower($field)] = $value;
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
}
|
2017-12-04 13:25:35 +00:00
|
|
|
$values['XMLNODE_NAME'] = ! isset($values['XMLNODE_NAME']) ? '' : $values['XMLNODE_NAME'];
|
|
|
|
|
$values['XMLNODE_TYPE'] = ! isset($values['XMLNODE_TYPE']) ? 'open' : $values['XMLNODE_TYPE'];
|
|
|
|
|
$values['XMLNODE_VALUE'] = ! isset($values['XMLNODE_VALUE']) ? '' : $values['XMLNODE_VALUE'];
|
|
|
|
|
$node->addChildNode(new Xml_Node($values['XMLNODE_NAME'], $values['XMLNODE_TYPE'], $values['XMLNODE_VALUE'], $attributes));
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
2012-10-09 13:30:11 -04:00
|
|
|
/**
|
|
|
|
|
* updateRow
|
|
|
|
|
*
|
|
|
|
|
* @param string &$node
|
|
|
|
|
* @param object $values
|
|
|
|
|
* @return void
|
|
|
|
|
*/
|
2017-12-04 13:25:35 +00:00
|
|
|
public function updateRow(&$node, $values)
|
2012-10-09 13:30:11 -04:00
|
|
|
{
|
|
|
|
|
foreach ($values as $field => $value) {
|
|
|
|
|
switch ($field) {
|
|
|
|
|
case 'XMLNODE_NAME':
|
|
|
|
|
$node->name = $value;
|
|
|
|
|
break;
|
|
|
|
|
case 'XMLNODE_TYPE':
|
|
|
|
|
$node->type = $value;
|
|
|
|
|
break;
|
|
|
|
|
case 'XMLNODE_VALUE':
|
|
|
|
|
$node->value = $value;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-04 13:25:35 +00:00
|
|
|
$node->attributes[strtolower($field)] = $value;
|
2012-10-09 13:30:11 -04:00
|
|
|
}
|
|
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
}
|