Update new xml query classes with xe 1.5

with improved query argument support and update and delete queries

git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0-DB@8378 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
mosmartin 2011-05-19 13:06:56 +00:00
parent 5f9a5249ac
commit 7dbe0626b6
39 changed files with 1619 additions and 540 deletions

View file

@ -0,0 +1,98 @@
<?php
class DBParser {
var $escape_char;
var $table_prefix;
function DBParser($escape_char, $table_prefix = "xe_"){
$this->escape_char = $escape_char;
$this->table_prefix = $table_prefix;
}
function getEscapeChar(){
return $this->escape_char;
}
function escape($name){
return $this->escape_char . $name . $this->escape_char;
}
function escapeString($name){
return "'".$name."'";
}
function parseTableName($name){
return $this->table_prefix . $name;
}
function parseColumnName($name){
return $this->escapeColumn($name);
}
function escapeColumn($column_name){
if($this->isUnqualifiedColumnName($column_name))
return $this->escape($column_name);
if($this->isQualifiedColumnName($column_name)){
list($table, $column) = explode('.', $column_name);
// $table can also be an alias, so the prefix should not be added
return $this->escape($table).'.'.$this->escape($column);
//return $this->escape($this->parseTableName($table)).'.'.$this->escape($column);
}
}
function isUnqualifiedColumnName($column_name){
if(strpos($column_name,'.')===false && strpos($column_name,'(')===false) return true;
return false;
}
function isQualifiedColumnName($column_name){
if(strpos($column_name,'.')!==false && strpos($column_name,'(')===false) return true;
return false;
}
function parseExpression($column_name){
$functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
foreach($functions as &$function){
if(strlen($function)==1) continue; // skip delimiters
$pos = strrpos("(", $function);
$matches = preg_split('/([a-zA-Z0-9_*]+)/', $function, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
$total_brackets = substr_count($function, "(");
$brackets = 0;
foreach($matches as &$match){
if($match == '(') {$brackets++; continue;}
if(strpos($match,')') !== false) continue;
if(in_array($match, array(',', '.'))) continue;
if($brackets == $total_brackets){
if(!is_numeric($match)) {
$match = $this->escapeColumnExpression($match);
}
}
}
$function = implode('', $matches);
}
return implode('', $functions);
}
function isStar($column_name){
if(substr($column_name,-1) == '*') return true;
return false;
}
/*
* Checks to see if expression is an aggregate star function
* like count(*)
*/
function isStarFunction($column_name){
if(strpos($column_name, "(*)")!==false) return true;
return false;
}
function escapeColumnExpression($column_name){
if($this->isStar($column_name)) return $column_name;
if($this->isStarFunction($column_name)){
return $column_name;
}
return $this->escapeColumn($column_name);
}
}

View file

@ -0,0 +1,160 @@
<?php
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/DeleteColumnsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TablesTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/group/GroupsTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/NavigationTag.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php');
class QueryParser {
var $query;
var $action;
var $query_id;
var $dbParser;
var $column_type;
function QueryParser($query, $dbParser){
$this->query = $query;
$this->action = $this->query->attrs->action;
$this->query_id = $this->query->attrs->id;
$this->dbParser = $dbParser;
}
function getQueryId(){
return $this->query->attrs->query_id ? $this->query->attrs->query_id : $this->query->attrs->id;
}
function getAction(){
return $this->query->attrs->action;
}
function getTableInfo($query_id, $table_name){
$column_type = array();
$id_args = explode('.', $query_id);
if(count($id_args)==2) {
$target = 'modules';
$module = $id_args[0];
$id = $id_args[1];
} elseif(count($id_args)==3) {
$target = $id_args[0];
if(!in_array($target, array('modules','addons','widgets'))) return;
$module = $id_args[1];
$id = $id_args[2];
}
// get column properties from the table
$table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $module, $table_name);
if(!file_exists($table_file)) {
$searched_list = FileHandler::readDir(_XE_PATH_.'modules');
$searched_count = count($searched_list);
for($i=0;$i<$searched_count;$i++) {
$table_file = sprintf('%s%s/%s/schemas/%s.xml', _XE_PATH_, 'modules', $searched_list[$i], $table_name);
if(file_exists($table_file)) break;
}
}
if(file_exists($table_file)) {
$table_xml = FileHandler::readFile($table_file);
$xml_parser = new XmlParser();
$table_obj = $xml_parser->parse($table_xml);
if($table_obj->table) {
if(isset($table_obj->table->column) && !is_array($table_obj->table->column))
{
$table_obj->table->column = array($table_obj->table->column);
}
foreach($table_obj->table->column as $k => $v) {
$column_type[$v->attrs->name] = $v->attrs->type;
}
}
}
return $column_type;
}
function setTableColumnTypes($tables){
$query_id = $this->getQueryId();
if(!isset($this->column_type[$query_id])){
$table_tags = $tables->getTables();
$column_type = array();
foreach($table_tags as $table_tag){
$tag_column_type = $this->getTableInfo($query_id, $table_tag->getTableName());
$column_type = array_merge($column_type, $tag_column_type);
}
$this->column_type[$query_id] = $column_type;
}
}
function toString(){
// TODO Add tags for update, insert ..
if($this->action == 'select'){
$columns = new SelectColumnsTag($this->query->columns->column, $this->dbParser);
}else if($this->action == 'insert'){
$columns = new InsertColumnsTag($this->query->columns->column, $this->dbParser);
}else if($this->action == 'update') {
$columns = new UpdateColumnsTag($this->query->columns->column, $this->dbParser);
}else if($this->action == 'delete') {
$columns = new DeleteColumnsTag($this->query->columns->column, $this->dbParser);
}
$tables = new TablesTag($this->query->tables->table, $this->dbParser);
$conditions = new ConditionsTag($this->query->conditions, $this->dbParser);
$groups = new GroupsTag($this->query->groups->group, $this->dbParser);
$navigation = new NavigationTag($this->query->navigation, $this->dbParser);
$this->setTableColumnTypes($tables);
$arguments = array();
$arguments = array_merge($arguments, $columns->getArguments());
$arguments = array_merge($arguments, $conditions->getArguments());
$arguments = array_merge($arguments, $navigation->getArguments());
//foreach($arguments as $argument){
// var_dump($argument);
// var_dump($this->column_type[$this->getQueryId()][$argument->getColumnName()]);
//}
$prebuff = '';
//$prebuff .= $columns->getValidatorString();
//$prebuff .= $conditions->getValidatorString();
//$prebuff .= $navigation->getValidatorString();
foreach($arguments as $argument){
if($argument->getArgumentName()){
$prebuff .= $argument->toString();
$prebuff .= sprintf("$%s_argument->escapeValue('%s');\n"
, $argument->getArgumentName()
, $this->column_type[$this->getQueryId()][$argument->getColumnName()] );
}
}
$prebuff .= "\n";
$buff = '';
$buff .= '$output->columns = ' . $columns->toString() . ';'.PHP_EOL;
$buff .= '$output->tables = ' . $tables->toString() .';'.PHP_EOL;
$buff .= '$output->conditions = '.$conditions->toString() .';'.PHP_EOL;
$buff .= '$output->groups = ' . $groups->toString() . ';';
$buff .= '$output->orderby = ' . $navigation->getOrderByString() .';';
return "<?php if(!defined('__ZBXE__')) exit();\n"
. "\$dbParser = new DBParser('".$this->dbParser->getEscapeChar()."');\n"
. sprintf('$output->query_id = "%s";%s', $this->query_id, "\n")
. sprintf('$output->action = "%s";%s', $this->action, "\n")
. $prebuff
. $buff
. 'return $output; ?>';
}
}
?>

View file

@ -0,0 +1,113 @@
<?php
class Argument {
var $value;
var $name;
var $isValid;
var $errorMessage;
function Argument($name, $value){
$this->name = $name;
$this->value = $value;
$this->isValid = true;
}
function getValue(){
return $this->value;
}
function isValid(){
return $this->isValid;
}
function getErrorMessage(){
return $this->errorMessage;
}
function ensureDefaultValue($default_value){
if(!isset($this->value))
$this->value = $default_value;
}
function escapeValue($column_type){
if(in_array($column_type, array('date', 'varchar', 'char')))
$this->value = '\''.$this->value.'\'';
}
function checkFilter($filter_type){
if(isset($this->value)){
$val = $this->value;
$key = $this->name;
switch($filter_type) {
case 'email' :
case 'email_address' :
if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'homepage' :
if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'userid' :
case 'user_id' :
if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'number' :
case 'numbers' :
if(is_array($val)) $val = join(',', $val);
if(!preg_match('/^(-?)[0-9]+(,\-?[0-9]+)*$/is', $val)){
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'alpha' :
if(!preg_match('/^[a-z]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key} ? $lang->{$key} : $key));
}
break;
case 'alpha_number' :
if(!preg_match('/^[0-9a-z]+$/is', $val)) {
$this->isValid = false;
$this->errorMessage = new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key));
}
break;
}
}
}
function checkMaxLength($length){
if($this->value && (strlen($this->value) > $length)){
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, $lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key);
}
}
function checkMinLength($length){
if($this->value && (strlen($this->value) > $length)){
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, $lang->filter->outofrange, $lang->{$key} ? $lang->{$key} : $key);
}
}
function checkNotNull(){
if(!isset($this->value)){
$this->isValid = false;
$key = $this->name;
$this->errorMessage = new Object(-1, $lang->filter->isnull, $lang->{$key} ? $lang->{$key} : $key);
}
}
}
?>

View file

@ -0,0 +1,26 @@
<?php
class ConditionQueryArgument extends QueryArgument{
var $argument_name;
var $argument_validator;
var $column_name;
function ConditionQueryArgument($tag){
$this->argument_name = $tag->attrs->var;
$name = $tag->attrs->column;
if(strpos($name, '.') === false) $this->column_name = $name;
else {
list($prefix, $name) = explode('.', $name);
$this->column_name = $name;
}
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/ConditionQueryArgumentValidator.class.php');
$this->argument_validator = new ConditionQueryArgumentValidator($tag);
}
function getColumnName(){
return $this->column_name;
}
}
?>

View file

@ -0,0 +1,61 @@
<?php
class DefaultValue {
var $column_name;
var $value;
function DefaultValue($column_name, $value){
$this->column_name = $column_name;
$this->value = $value;
}
function isString(){
$str_pos = strpos($this->value, '(');
if($str_pos===false) return true;
return false;
}
function toString(){
if(!isset($this->value)) return;
$str_pos = strpos($this->value, '(');
if($str_pos===false) return '"'.$this->value.'"';
$func_name = substr($this->value, 0, $str_pos);
$args = substr($this->value, $str_pos+1, strlen($value)-1);
switch($func_name) {
case 'ipaddress' :
$val = '$_SERVER[\'REMOTE_ADDR\']';
break;
case 'unixtime' :
$val = 'time()';
break;
case 'curdate' :
$val = 'date("YmdHis")';
break;
case 'sequence' :
$val = '$this->getNextSequence()';
break;
case 'plus' :
$args = abs($args);
// TODO Make sure column name is escaped
$val = sprintf('"%s+%d"', $this->column_name, $args);
break;
case 'minus' :
$args = abs($args);
$val = sprintf('"%s-%d"', $this->column_name, $args);
break;
case 'multiply' :
$args = intval($args);
$val = sprintf('"%s*%d"', $this->column_name, $args);
break;
default :
$val = '"' . $this->value . '"';
}
return $val;
}
}
?>

View file

@ -0,0 +1,52 @@
<?php
class QueryArgument {
var $argument_name;
var $argument_validator;
var $column_name;
function QueryArgument($tag){
$this->argument_name = $tag->attrs->var;
$name = $tag->attrs->name;
if(!$name) $name = $tag->attrs->column;
if(strpos($name, '.') === false) $this->column_name = $name;
else {
list($prefix, $name) = explode('.', $name);
$this->column_name = $name;
}
if(!$this->argument_name) $this->argument_name = $tag->attrs->name;
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php');
$this->argument_validator = new QueryArgumentValidator($tag);
}
function getArgumentName(){
return $this->argument_name;
}
function getColumnName(){
return $this->column_name;
}
function getValidatorString(){
return $this->argument_validator->toString();
}
function toString(){
$arg = sprintf("\n$%s_argument = new Argument('%s', %s);\n"
, $this->argument_name
, $this->argument_name
, '$args->'.$this->argument_name);
$arg .= $this->argument_validator->toString();
$arg .= sprintf("if(!$%s_argument->isValid()) return $%s_argument->getErrorMessage();\n"
, $this->argument_name
, $this->argument_name
);
return $arg;
}
}
?>

View file

@ -0,0 +1,20 @@
<?php
class ConditionQueryArgumentValidator extends QueryArgumentValidator {
function ConditionQueryArgumentValidator($tag){
parent::QueryArgumentValidator($tag);
}
function toString(){
if(!$this->argument_name) return '';
if(!isset($this->validator_string)){
$validator = parent::toString();
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/EscapeCheck.class.php');
$v = new EscapeCheck($this->argument_name);
$validator .= $v->toString();
$this->validator_string = $validator;
}
return $this->validator_string;
}
}
?>

View file

@ -0,0 +1,25 @@
<?php
class DefaultCheck extends Validator {
var $argument_name;
var $value;
function DefaultCheck($argument_name, $value) {
$this->argument_name = $argument_name;
$this->value = $value;
}
function toString(){
if(!isset($this->argument_name)) return '';
$value = $this->value->toString();
if($this->value->isString()) {
$value = "'".$value."'";
}
return 'if(!isset($args->'.$this->argument_name.')) $args->'.$this->argument_name.' = '.$value.';'."\n";
}
}
?>

View file

@ -0,0 +1,21 @@
<?php
// TODO This is temporary for when column types will be
// used to prepare input
class EscapeCheck {
var $argument_name;
function EscapeCheck($argument_name){
$this->argument_name = $argument_name;
}
function toString(){
return sprintf("if(is_string(\$args->%s) && !is_numeric(\$args->%s)) \$args->%s = \$dbParser->escapeString(\$args->%s);\n"
, $this->argument_name
, $this->argument_name
, $this->argument_name
, $this->argument_name);
}
}
?>

View file

@ -0,0 +1,16 @@
<?php
class FilterValidator extends Validator {
var $argument_name;
var $filter;
function FilterValidator($argument_name, $filter) {
$this->argument_name = $argument_name;
$this->filter = $filter;
}
function toString(){
return sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$this->argument_name, $this->argument_name,$this->argument_name,$this->filter,"\n");
}
}
?>

View file

@ -0,0 +1,22 @@
<?php
class MaxLengthValidator extends Validator {
var $argument_name;
var $value;
function MaxLengthValidator($argument_name, $value) {
$this->argument_name = $argument_name;
$this->value = $value;
}
function toString(){
return 'if($args->'
.$this->argument_name
.'&&strlen($args->'.$this->argument_name.')>'.$this->value
.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'
.$this->argument_name.'?$lang->'
.$this->argument_name.':\''.$this->argument_name.'\'));'."\n";
}
}
?>

View file

@ -0,0 +1,22 @@
<?php
class MinLengthValidator extends Validator{
var $argument_name;
var $value;
function MinLengthValidator($argument_name, $value) {
$this->argument_name = $argument_name;
$this->value = $value;
}
function toString(){
return 'if($args->'
.$this->argument_name
.'&&strlen($args->'.$this->argument_name.')<'.$this->value
.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'
.$this->argument_name.'?$lang->'
.$this->argument_name.':\''.$this->argument_name.'\'));'."\n";
}
}
?>

View file

@ -0,0 +1,18 @@
<?php
class NotNullValidator extends Validator {
var $argument_name;
var $value;
function NotNullValidator($argument_name, $value) {
$this->argument_name = $argument_name;
$this->value = $value;
}
function toString(){
return 'if(!isset($args->'.$this->argument_name.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'
.$this->argument_name.'?$lang->'.$this->argument_name.':\''.$this->argument_name.'\'));'."\n";
}
}
?>

View file

@ -0,0 +1,62 @@
<?php
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/DefaultValue.class.php');
class QueryArgumentValidator {
var $argument_name;
var $default_value;
var $notnull;
var $filter;
var $min_length;
var $max_length;
var $validator_string;
function QueryArgumentValidator($tag){
$this->argument_name = $tag->attrs->var;
if(!$this->argument_name) $this->argument_name = $tag->attrs->name;
$this->default_value = $tag->attrs->default;
$this->notnull = $tag->attrs->notnull;
$this->filter = $tag->attrs->filter;
$this->min_length = $tag->attrs->min_length;
$this->max_length = $tag->attrs->max_length;
}
function toString(){
$validator = '';
if(isset($this->default_value)){
$this->default_value = new DefaultValue($this->argument_name, $this->default_value);
//$v = new DefaultCheck($this->argument_name, $this->default_value);
//$validator .= $v->toString();
$validator .= sprintf("$%s_argument->ensureDefaultValue(%s);\n"
, $this->argument_name
, $this->default_value->toString()
);
}
if($this->notnull){
$validator .= sprintf("$%s_argument->checkNotNull();\n"
, $this->argument_name
);
}
if($this->filter){
$validator .= sprintf("$%s_argument->checkFilter(%s);\n"
, $this->argument_name
, $this->filter
);
}
if($this->min_length){
$validator .= sprintf("$%s_argument->checkMinLength(%s);\n"
, $this->argument_name
, $this->min_length
);
}
if($this->max_length){
$validator .= sprintf("$%s_argument->checkMaxLength(%s);\n"
, $this->argument_name
, $this->max_length
);
}
return $validator;
}
}
?>

View file

@ -0,0 +1,7 @@
<?php
class Validator {
}
?>

View file

@ -0,0 +1,52 @@
<?php
class ConditionGroupTag {
var $dbParser;
var $conditions;
var $pipe;
function ConditionGroupTag($conditions, $dbParser, $pipe = ""){
$this->dbParser = $dbParser;
$this->pipe = $pipe;
if(!is_array($conditions)) $conditions = array($conditions);
if(count($conditions))require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php');
foreach($conditions as $condition){
$this->conditions[] = new ConditionTag($condition, $dbParser);
}
}
function getConditions(){
return $this->conditions;
}
function getConditionGroupString(){
$conditions_string = 'array('.PHP_EOL;
foreach($this->conditions as $condition)
$conditions_string .= $condition->getConditionString() . PHP_EOL . ',';
$conditions_string = substr($conditions_string, 0, -2);//remove ','
$conditions_string .= ')';
return sprintf("new ConditionGroup(%s%s)", $conditions_string, $this->pipe ? ','.$this->pipe : '');
}
function getArguments(){
$arguments = array();
foreach($this->conditions as $condition){
$arguments[] = $condition->getArgument();
}
return $arguments;
}
function getValidatorString(){
$validator = '';
foreach($this->conditions as $condition){
$validator .= $condition->getValidatorString();
}
return $validator;
}
}
?>

View file

@ -0,0 +1,49 @@
<?php
/**
* @class ConditionTag
* @author Corina
* @brief Models the <condition> tag inside an XML Query file. Base class.
*
*/
class ConditionTag {
var $dbParser;
var $operation;
var $column_name;
var $pipe;
var $argument_name;
var $argument;
var $default_column;
function ConditionTag($condition, $dbParser){
$this->dbParser = $dbParser;
$this->operation = $condition->attrs->operation;
$this->pipe = $condition->attrs->pipe;
$this->column_name = $this->dbParser->parseColumnName($condition->attrs->column);
// TODO fix this hack - should use default value for query argument
$this->argument_name = $condition->attrs->var;
$this->default_column = $this->dbParser->parseColumnName($condition->attrs->default);
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
$this->argument = new QueryArgument($condition);
}
function getArgument(){
return $this->argument;
}
function getConditionString(){
return sprintf("new Condition('%s',%s,%s%s)"
, $this->column_name
, $this->argument_name ? '$' . $this->argument_name . '_argument->getValue()' : "'" . $this->default_column . "'"
, '"'.$this->operation.'"'
, $this->pipe ? ", '" . $this->pipe . "'" : ''
);
}
function getValidatorString(){
return $this->argument->getValidatorString();
}
}
?>

View file

@ -0,0 +1,51 @@
<?php
class ConditionsTag {
var $dbParser;
var $condition_groups;
function ConditionsTag($xml_conditions, $dbParser){
$this->dbParser = $dbParser;
$this->condition_groups = array();
$xml_condition_list = $xml_conditions->condition;
if($xml_condition_list){
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php');
$this->condition_groups[] = new ConditionGroupTag($xml_condition_list, $this->dbParser);
}
$xml_groups = $xml_conditions->group;
if($xml_groups){
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php');
foreach($xml_groups as $group){
$this->condition_groups[] = new ConditionGroupTag($group->condition, $this->dbParser, $group->pipe);
}
}
}
function toString(){
$output_conditions = 'array(' . PHP_EOL;
foreach($this->condition_groups as $condition){
$output_conditions .= $condition->getConditionGroupString() . PHP_EOL . ',';
}
$output_conditions = substr($output_conditions, 0, -1);
$output_conditions .= ')';
return $output_conditions;
}
function getArguments(){
$arguments = array();
foreach($this->condition_groups as $condition){
$arguments = array_merge($arguments, $condition->getArguments());
}
return $arguments;
}
function getValidatorString(){
$validator = '';
foreach($this->condition_groups as $condition){
$validator .= $condition->getValidatorString();
}
return $validator;
}
}
?>

View file

@ -0,0 +1,36 @@
<?php
class GroupsTag {
var $groups;
var $dbParser;
function GroupsTag($xml_groups, $dbParser){
$this->dbParser = $dbParser;
$this->groups = array();
if($xml_groups) {
if(!is_array($xml_groups)) $xml_groups = array($xml_groups);
for($i=0;$i<count($xml_groups);$i++) {
$group = $xml_groups[$i];
$column = trim($group->attrs->column);
if(!$column) continue;
$column = $this->dbParser->parseExpression($column);
$this->groups[] = $column;
}
}
}
function toString(){
$output = 'array(' . PHP_EOL;
foreach($this->groups as $group){
$output .= "'" . $group . "' ,";
}
$output = substr($output, 0, -1);
$output .= ')';
return $output;
}
}
?>

View file

@ -0,0 +1,49 @@
<?php
class IndexTag {
var $dbParser;
var $argument_name;
var $argument;
var $default;
var $sort_order;
var $sort_order_argument;
function IndexTag($index, $dbParser){
$this->dbParser = $dbParser;
$this->argument_name = $index->attrs->var;
$index->attrs->default = $this->dbParser->parseExpression($index->attrs->default);
$this->default = $index->attrs->default;
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
$this->argument = new QueryArgument($index);
$this->sort_order = $index->attrs->order;
if(!in_array($this->sort_order, array("asc", "desc"))){
$arg->var = $this->sort_order;
$arg->default = '"asc"';
$this->sort_order_argument = new QueryArgument($arg);
$this->sort_order = "\$args->".$this->sort_order;
}
//else $this->sort_order = '"'.$this->sort_order.'"';
}
function toString(){
return sprintf("new OrderByColumn(\$%s_argument->getValue(), %s)", $this->argument_name, $this->sort_order);
}
function getArguments(){
$arguments = array();
$arguments[] = $this->argument;
if($this->sort_order_argument)
$arguments[] = $this->sort_order_argument;
return $arguments;
}
function getValidatorString(){
$validator = $this->argument->getValidatorString();
if($this->sort_order_argument)
$validator .= $this->sort_order_argument->getValidatorString();
return $validator;
}
}
?>

View file

@ -0,0 +1,60 @@
<?php
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php');
class NavigationTag {
var $dbParser;
var $order;
var $list_count;
var $page_count;
var $page;
function NavigationTag($xml_navigation, $dbParser){
$this->order = array();
if($xml_navigation) {
$order = $xml_navigation->index;
if($order) {
if(!is_array($order)) $order = array($order);
foreach($order as $order_info) {
$this->order[] = new IndexTag($order_info, $dbParser);
}
}
$list_count = $xml_navigation->list_count->attrs;
$this->list_count = $list_count;
$page_count = $xml_navigation->page_count->attrs;
$this->page_count = $page_count;
$page = $xml_navigation->page->attrs;
$this->page = $page ;
}
}
function getOrderByString(){
$output = 'array(' . PHP_EOL;
foreach($this->order as $order){
$output .= $order->toString() . PHP_EOL . ',';
}
$output = substr($output, 0, -1);
$output .= ')';
return $output;
}
function getArguments(){
$arguments = array();
foreach($this->order as $order){
$arguments = array_merge($order->getArguments(), $arguments);
}
return $arguments;
}
function getValidatorString(){
$validator = '';
foreach ($this->order as $order){
$validator .= $order->getValidatorString();
}
return $validator;
}
}
?>

View file

@ -0,0 +1,60 @@
<?php
/**
*
* @class TableTag
* @author Arnia Sowftare
* @brief Models the <table> tag inside an XML Query file
*
*/
class TableTag {
var $unescaped_name;
var $name;
var $alias;
var $join_type;
var $conditions;
var $dbParser;
function TableTag($table, $dbParser){
$this->dbParser = $dbParser;
$this->unescaped_name = $table->attrs->name;
$this->name = $this->dbParser->parseTableName($table->attrs->name);
$this->alias = $table->attrs->alias;
//if(!$this->alias) $this->alias = $alias;
$this->join_type = $table->attrs->type;
$this->conditions = $table->conditions;
}
function isJoinTable(){
if(in_array($this->join_type,array('left join','left outer join','right join','right outer join'))
&& count($this->conditions)) return true;
return false;
}
function getTableAlias(){
return $this->alias;
}
function getTableName(){
return $this->unescaped_name;
}
function getTableString(){
if($this->isJoinTable()){
$conditionsTag = new ConditionsTag($this->conditions, $this->dbParser);
return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)'
, $this->dbParser->escape($this->name)
, $this->dbParser->escape($this->alias)
, $this->join_type, $conditionsTag->toString());
}
return sprintf('new Table(\'%s\'%s)'
, $this->dbParser->escape($this->name)
, $this->alias ? ', \'' . $this->dbParser->escape($this->alias) .'\'' : '');
}
}
?>

View file

@ -0,0 +1,33 @@
<?php
class TablesTag {
var $dbParser;
var $tables;
function TablesTag($xml_tables, $dbParser){
$this->dbParser = $dbParser;
$this->tables = array();
if(!is_array($xml_tables)) $xml_tables = array($xml_tables);
if(count($xml_tables)) require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php');
foreach($xml_tables as $table){
$this->tables[] = new TableTag($table, $this->dbParser);
}
}
function getTables(){
return $this->tables;
}
function toString(){
$output_tables = 'array(' . PHP_EOL;
foreach($this->tables as $table){
$output_tables .= $table->getTableString() . PHP_EOL . ',';
}
$output_tables = substr($output_tables, 0, -1);
$output_tables .= ')';
return $output_tables;
}
}
?>