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

@ -314,6 +314,16 @@
if($source_args) $args = @clone($source_args);
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/Expression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/SelectExpression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/table/Table.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/condition/ConditionGroup.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/condition/Condition.class.php');
require_once(_XE_PATH_.'classes/db/queryparts/expression/StarExpression.class.php');
$output = @include($cache_file);
if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output;

View file

@ -812,7 +812,65 @@
* to get a specific page list easily in select statement,\n
* a method, navigation, is used
**/
function _executeSelectAct ($output)
function _executeSelectAct($output){
$query = '';
$select = 'SELECT ';
foreach($output->columns as $column){
if($column->show())
$select .= $column->getExpression() . ', ';
}
$select = substr($select, 0, -2);
$from = 'FROM ';
$simple_table_count = 0;
foreach($output->tables as $table){
/*if($simple_table_count > 0) $from .= ', ';
$from .= $table->toString() . ' ';
if(!$table->isJoinTable()) $simple_table_count++;
*/
if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString() . ' ';
else $from .= ', '.$table->toString() . ' ';
$simple_table_count++;
}
$where = '';
if(count($output->conditions) > 0){
$where = 'WHERE ';
foreach($output->conditions as $conditionGroup){
$where .= $conditionGroup->toString();
}
}
$groupBy = '';
if($output->groups) if($output->groups[0] !== "")
$groupBy = 'GROUP BY ' . implode(', ', $output->groups);
$orderBy = '';
if(count($output->orderby) > 0){
$orderBy = 'ORDER BY ';
foreach($output->orderby as $order){
$orderBy .= $order->toString() .', ';
}
$orderBy = substr($orderBy, 0, -2);
}
$query = $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy;
//$query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, //$groupby_query.$orderby_query);
//$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
$result = $this->_query ($query);
if ($this->isError ()) return;
$data = $this->_fetch ($result);
$buff = new Object ();
$buff->data = $data;
return $buff;
}
/*function _executeSelectAct ($output)
{
// tables
$table_list = array ();
@ -1049,6 +1107,7 @@
return $buff;
}
*/
/**
* @brief displays the current stack trace. Fetch the result

View file

@ -0,0 +1,87 @@
<?php
class Condition {
var $column_name;
var $value;
var $operation;
var $pipe;
function Condition($column_name, $value, $operation, $pipe = ""){
$this->column_name = $column_name;
$this->value = $value;
$this->operation = $operation;
$this->pipe = $pipe;
}
function toString(){
return $this->pipe . ' ' . $this->getConditionPart($this->column_name, $this->value, $this->operation);
}
function getConditionPart($name, $value, $operation) {
switch($operation) {
case 'equal' :
case 'more' :
case 'excess' :
case 'less' :
case 'below' :
case 'like_tail' :
case 'like_prefix' :
case 'like' :
case 'in' :
case 'notin' :
case 'notequal' :
// if variable is not set or is not string or number, return
if(!isset($value)) return;
if($value === '') return;
if(!in_array(gettype($value), array('string', 'integer'))) return;
break;
case 'between' :
if(!is_array($value)) return;
if(count($value)!=2) return;
}
switch($operation) {
case 'equal' :
return $name.' = '.$value;
break;
case 'more' :
return $name.' >= '.$value;
break;
case 'excess' :
return $name.' > '.$value;
break;
case 'less' :
return $name.' <= '.$value;
break;
case 'below' :
return $name.' < '.$value;
break;
case 'like_tail' :
case 'like_prefix' :
case 'like' :
return $name.' like '.$value;
break;
case 'in' :
return $name.' in ('.$value.')';
break;
case 'notin' :
return $name.' not in ('.$value.')';
break;
case 'notequal' :
return $name.' <> '.$value;
break;
case 'notnull' :
return $name.' is not null';
break;
case 'null' :
return $name.' is null';
break;
case 'between' :
return $name.' between ' . $value[0] . ' and ' . $value[1];
break;
}
}
}
?>

View file

@ -0,0 +1,27 @@
<?php
class ConditionGroup {
var $conditions;
var $pipe;
function ConditionGroup($conditions, $pipe = ""){
$this->conditions = $conditions;
$this->pipe = $pipe;
}
function toString(){
if($this->pipe !== "")
$group = $this->pipe .'(';
else $group = '';
foreach($this->conditions as $condition){
$group .= $condition->toString() . ' ';
}
if($this->pipe !== "")
$group .= ')';
return $group;
}
}
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @class ClickCountExpression
* @author Arnia Software
* @brief
*
*/
class ClickCountExpression extends SelectExpression {
var $click_count;
function ClickCountExpression($column_name, $alias = NULL, $click_count = false){
parent::SelectExpression($column_name, $alias);
if(!is_bool($click_count)){
error_log("Click_count value for $column_name was not boolean", 0);
$this->click_count = false;
return;
}
$this->click_count = $click_count;
}
function show() {
return $this->click_count;
}
function getExpression(){
return "$this->column_name = $this->column_name + 1";
}
}
?>

View file

@ -0,0 +1,34 @@
<?php
/**
* @class DeleteExpression
* @author Arnia Software
* @brief
*
*/
class DeleteExpression extends Expression {
var $value;
function DeleteExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getExpression(){
return "$this->column_name = $this->value";
}
function getValue(){
// TODO Escape value according to column type instead of variable type
if(!is_numeric($this->value)) return "'".$this->value."'";
return $this->value;
}
function show(){
if(!$this->value) return false;
return true;
}
}
?>

View file

@ -0,0 +1,30 @@
<?php
/**
* @class Expression
* @author Corina
* @brief Represents an expression used in select/update/insert/delete statements
*
* Examples (expressions are inside double square brackets):
* select [[columnA]], [[columnB as aliasB]] from tableA
* update tableA set [[columnA = valueA]] where columnB = something
*
*/
class Expression {
var $column_name;
function Expression($column_name){
$this->column_name = $column_name;
}
function getColumnName(){
return $this->column_name;
}
function show() {
return false;
}
function getExpression() {
}
}

View file

@ -0,0 +1,28 @@
<?php
/**
* @class InsertExpression
* @author Arnia Software
* @brief
*
*/
class InsertExpression extends Expression {
var $value;
function InsertExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getValue(){
return $this->value;
}
function show(){
if(!isset($this->value)) return false;
return true;
}
}
?>

View file

@ -0,0 +1,32 @@
<?php
/**
* @class SelectExpression
* @author Arnia Software
* @brief Represents an expresion that appears in the select clause
*
* @remarks
* $column_name can be:
* - a table column name
* - an sql function - like count(*)
* - an sql expression - substr(column_name, 1, 8) or score1 + score2
* $column_name is already escaped
*/
class SelectExpression extends Expression {
var $column_alias;
function SelectExpression($column_name, $alias = NULL){
parent::Expression($column_name);
$this->column_alias = $alias;
}
function getExpression() {
return sprintf("%s%s", $this->column_name, $this->column_alias ? " as ".$this->column_alias : "");
}
function show() {
return true;
}
}
?>

View file

@ -0,0 +1,16 @@
<?php
/**
* @class StarExpression
* @author Corina
* @brief Represents the * in 'select * from ...' statements
*
*/
class StarExpression extends SelectExpression {
function StarExpression(){
parent::SelectExpression("*");
}
}
?>

View file

@ -0,0 +1,34 @@
<?php
/**
* @class UpdateExpression
* @author Arnia Software
* @brief
*
*/
class UpdateExpression extends Expression {
var $value;
function UpdateExpression($column_name, $value){
parent::Expression($column_name);
$this->value = $value;
}
function getExpression(){
return "$this->column_name = $this->value";
}
function getValue(){
// TODO Escape value according to column type instead of variable type
if(!is_numeric($this->value)) return "'".$this->value."'";
return $this->value;
}
function show(){
if(!$this->value) return false;
return true;
}
}
?>

View file

@ -0,0 +1,16 @@
<?php
class OrderByColumn {
var $column_name;
var $sort_order;
function OrderByColumn($column_name, $sort_order){
$this->column_name = $column_name;
$this->sort_order = $sort_order;
}
function toString(){
return $this->column_name . ' ' . $this->sort_order;
}
}
?>

View file

@ -0,0 +1,37 @@
<?php
/**
* @class JoinTable
* @author Arnia Software
* @brief
*
* @remarks
* $conditions in an array of Condition objects
*
*/
class JoinTable extends Table {
var $join_type;
var $conditions;
function JoinTable($name, $alias, $join_type, $conditions){
parent::Table($name, $alias);
$this->join_type = $join_type;
$this->conditions = $conditions;
}
function toString(){
$part = $this->join_type . ' ' . $this->name ;
$part .= $this->alias ? ' as ' . $this->alias : '';
$part .= ' on ';
foreach($this->conditions as $conditionGroup)
$part .= $conditionGroup->toString();
return $part;
}
function isJoinTable(){
return true;
}
}
?>

View file

@ -0,0 +1,26 @@
<?php
class Table {
var $name;
var $alias;
function Table($name, $alias = NULL){
$this->name = $name;
$this->alias = $alias;
}
function toString(){
return sprintf("%s%s", $this->name, $this->alias ? ' as ' . $this->alias : '');
}
function getName(){
return $this->name;
}
function isJoinTable(){
if(in_array($tableName,array('left join','left outer join','right join','right outer join'))) return true;
return false;
}
}
?>

View file

@ -151,6 +151,7 @@ class HTMLDisplayHandler {
$oContext->addJsFile('./common/js/x.min.js', false, '', -100000);
$oContext->addJsFile('./common/js/xe.min.js', false, '', -100000);
$oContext->addCSSFile('./common/css/xe.min.css', false, 'all', '', -100000);
$oContext->addJsFile('./common/js/xml_handler.js', false, '', -100000);
}
// for admin page, add admin css

View file

@ -1,558 +1,54 @@
<?php
/**
* @class XmlQueryParser
* @class NewXmlQueryParser
* @author NHN (developers@xpressengine.com)
* @brief case to parse XE xml query
* @version 0.1
*
* @todo need to support extend query such as subquery, union
* @todo include info about column types for parsing user input
**/
class XmlQueryParser extends XmlParser {
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
require_once(_XE_PATH_.'classes/xml/xmlquery/QueryParser.class.php');
var $default_list = array();
var $notnull_list = array();
var $filter_list = array();
/**
* @brief parse a xml query file and save the result as a new file specified by cache_file
* @param[in] $query_id name of query
* @param[in] $xml_file file path of a xml query file to be loaded
* @param[in] $cache_file file path of a cache file to store resultant php code after parsing xml query
* @return Nothing is requred.
* @remarks {there should be a way to report an error}
**/
class NewXmlQueryParser extends XmlParser {
var $dbParser;
function parse($query_id, $xml_file, $cache_file) {
// parse the query xml file. Return if get no result
// Read xml file
$xml_obj = $this->getXmlFileContent($xml_file);
// insert, update, delete, select action
$action = strtolower($xml_obj->query->attrs->action);
if(!$action) return;
//$oDB = &DB::getParser();
//$dbParser = $oDB->getParser();
$dbParser = getDBParser();
$parser = new QueryParser($xml_obj->query, $dbParser);
FileHandler::writeFile($cache_file, $parser->toString());
}
// singleton
function getDBParser(){
if(!$this->dbParser){
//$oDB = &DB::getParser();
//$dbParser = $oDB->getParser();
$this->dbParser = new DBParser('`');
}
return $this->dbParser;
}
function getXmlFileContent($xml_file){
$buff = FileHandler::readFile($xml_file);
$xml_obj = parent::parse($buff);
if(!$xml_obj) return;
unset($buff);
$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];
}
// actions like insert, update, delete, select and so on
$action = strtolower($xml_obj->query->attrs->action);
if(!$action) return;
// get the table list(converting an array code)
$tables = $xml_obj->query->tables->table;
$output->left_tables = array();
$left_conditions = array();
if(!$tables) return;
if(!is_array($tables)) $tables = array($tables);
foreach($tables as $key => $val) {
// get the name of tables and aliases
$table_name = $val->attrs->name;
$alias = $val->attrs->alias;
if(!$alias) $alias = $table_name;
$output->tables[$alias] = $table_name;
if(in_array($val->attrs->type,array('left join','left outer join','right join','right outer join')) && count($val->conditions)){
$output->left_tables[$alias] = $val->attrs->type;
$left_conditions[$alias] = $val->conditions;
}
// 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);
$table_obj = parent::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) {
$buff .= sprintf('$output->column_type["%s"] = "%s";%s', $v->attrs->name, $v->attrs->type, "\n");
}
}
}
}
// Column list
$columns = $xml_obj->query->columns->column;
$out = $this->_setColumn($columns);
$output->columns = $out->columns;
$conditions = $xml_obj->query->conditions;
$out = $this->_setConditions($conditions);
$output->conditions = $out->conditions;
foreach($output->left_tables as $key => $val){
if($left_conditions[$key]){
$out = $this->_setConditions($left_conditions[$key]);
$output->left_conditions[$key] = $out->conditions;
}
}
$group_list = $xml_obj->query->groups->group;
$out = $this->_setGroup($group_list);
$output->groups = $out->groups;
//priority arrange
$priority = $xml_obj->query->priority;
if($priority) $output->priority['type'] = $priority->attrs->type;
//index hint arrange
$index_hint = $xml_obj->query->index_hint;
if($index_hint)
{
$output->index_hint['name'] = $index_hint->attrs->name;
$output->index_hint['type'] = $index_hint->attrs->type;
}
// Navigation
$out = $this->_setNavigation($xml_obj);
$output->order = $out->order;
$output->list_count = $out->list_count;
$output->page_count = $out->page_count;
$output->page = $out->page;
$column_count = count($output->columns);
$priority_count = count($output->priority);
$index_hint_count = count($output->index_hint);
$condition_count = count($output->conditions);
$buff .= '$output->tables = array( ';
foreach($output->tables as $key => $val) {
if(!array_key_exists($key,$output->left_tables)){
$buff .= sprintf('"%s"=>"%s",', $key, $val);
}
}
$buff .= ' );'."\n";
// generates a php script
$buff .= '$output->_tables = array( ';
foreach($output->tables as $key => $val) {
$buff .= sprintf('"%s"=>"%s",', $key, $val);
}
$buff .= ' );'."\n";
if(count($output->left_tables)){
$buff .= '$output->left_tables = array( ';
foreach($output->left_tables as $key => $val) {
$buff .= sprintf('"%s"=>"%s",', $key, $val);
}
$buff .= ' );'."\n";
}
// column info
if($column_count) {
$buff .= '$output->columns = array ( ';
$buff .= $this->_getColumn($output->columns);
$buff .= ' );'."\n";
}
//priority arrange
if($priority_count) {
$priority_str .= '$output->priority = array("type"=>"%s");'."\n";
$buff .= vsprintf($priority_str, $output->priority);
}
// index arrange
if($index_hint_count) {
$index_hint_str .= '$output->index_hint = array("name"=>"%s", "type"=>"%s");'."\n";
$buff .= vsprintf($index_hint_str, $output->index_hint);
}
// get conditions
if($condition_count) {
$buff .= '$output->conditions = array ( ';
$buff .= $this->_getConditions($output->conditions);
$buff .= ' );'."\n";
}
// get conditions
if(count($output->left_conditions)) {
$buff .= '$output->left_conditions = array ( ';
foreach($output->left_conditions as $key => $val){
$buff .= "'{$key}' => array ( ";
$buff .= $this->_getConditions($val);
$buff .= "),\n";
}
$buff .= ' );'."\n";
}
// get arguments
$arg_list = $this->getArguments();
if($arg_list)
{
foreach($arg_list as $arg)
{
$pre_buff .= 'if(is_object($args->'.$arg.')){ $args->'.$arg.' = array_values(get_method_vars($args->'.$arg.')); }'. "\n";
$pre_buff .= 'if(is_array($args->'.$arg.') && count($args->'.$arg.')==0){ unset($args->'.$arg.'); };'."\n";
}
}
// order
if($output->order) {
$buff .= '$output->order = array(';
foreach($output->order as $key => $val) {
$buff .= sprintf('array($args->%s?$args->%s:"%s",in_array($args->%s,array("asc","desc"))?$args->%s:("%s"?"%s":"asc")),', $val->var, $val->var, $val->default, $val->order, $val->order, $val->order, $val->order);
}
$buff .= ');'."\n";
}
// list_count
if($output->list_count) {
$buff .= sprintf('$output->list_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->list_count->var, $output->list_count->var, $output->list_count->var, $output->list_count->default,"\n");
}
// page_count
if($output->page_count) {
$buff .= sprintf('$output->page_count = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page_count->var, $output->page_count->var, $output->page_count->var, $output->list_count->default,"\n");
}
// page order
if($output->page) {
$buff .= sprintf('$output->page = array("var"=>"%s", "value"=>$args->%s?$args->%s:"%s");%s', $output->page->var, $output->page->var, $output->page->var, $output->list->default,"\n");
}
// group by
if($output->groups) {
$buff .= sprintf('$output->groups = array("%s");%s', implode('","',$output->groups),"\n");
}
// minlength check
if(count($minlength_list)) {
foreach($minlength_list as $key => $val) {
$pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')<'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n";
}
}
// maxlength check
if(count($maxlength_list)) {
foreach($maxlength_list as $key => $val) {
$pre_buff .= 'if($args->'.$key.'&&strlen($args->'.$key.')>'.$val.') return new Object(-1, sprintf($lang->filter->outofrange, $lang->'.$key.'?$lang->'.$key.':\''.$key.'\'));'."\n";
}
}
// filter check
if(count($this->filter_list)) {
foreach($this->filter_list as $key => $val) {
$pre_buff .= sprintf('if(isset($args->%s)) { unset($_output); $_output = $this->checkFilter("%s",$args->%s,"%s"); if(!$_output->toBool()) return $_output; } %s',$val->var, $val->var,$val->var,$val->filter,"\n");
}
}
// default check
if(count($this->default_list)) {
foreach($this->default_list as $key => $val) {
$pre_buff .= 'if(!isset($args->'.$key.')) $args->'.$key.' = '.$val.';'."\n";
}
}
// not null check
if(count($this->notnull_list)) {
foreach($this->notnull_list as $key => $val) {
$pre_buff .= 'if(!isset($args->'.$val.')) return new Object(-1, sprintf($lang->filter->isnull, $lang->'.$val.'?$lang->'.$val.':\''.$val.'\'));'."\n";
}
}
$buff = "<?php if(!defined('__ZBXE__')) exit();\n"
. sprintf('$output->query_id = "%s";%s', $query_id, "\n")
. sprintf('$output->action = "%s";%s', $action, "\n")
. $pre_buff
. $buff
. 'return $output; ?>';
// Save
FileHandler::writeFile($cache_file, $buff);
return $xml_obj;
}
/**
* @brief transfer given column information to object->columns
* @param[in] column information
* @result Returns $object
*/
function _setColumn($columns){
if(!$columns) {
$output->column[] = array("*" => "*");
} else {
if(!is_array($columns)) $columns = array($columns);
foreach($columns as $key => $val) {
$name = $val->attrs->name;
/*
if(strpos('.',$name)===false && count($output->tables)==1) {
$tmp = array_values($output->tables);
$name = sprintf('%s.%s', $tmp[0], $val->attrs->name);
}
*/
$output->columns[] = array(
"name" => $name,
"var" => $val->attrs->var,
"default" => $val->attrs->default,
"notnull" => $val->attrs->notnull,
"filter" => $val->attrs->filter,
"minlength" => $val->attrs->minlength,
"maxlength" => $val->attrs->maxlength,
"alias" => $val->attrs->alias,
"click_count" => $val->attrs->click_count,
);
}
}
return $output;
}
/**
* @brief transfer condition information to $object->conditions
* @param[in] SQL condition information
* @result Returns $output
*/
function _setConditions($conditions){
// Conditional clause
$condition = $conditions->condition;
if($condition) {
$obj->condition = $condition;
unset($condition);
$condition = array($obj);
}
$condition_group = $conditions->group;
if($condition_group && !is_array($condition_group)) $condition_group = array($condition_group);
if($condition && $condition_group) $cond = array_merge($condition, $condition_group);
elseif($condition_group) $cond = $condition_group;
else $cond = $condition;
if($cond) {
foreach($cond as $key => $val) {
unset($cond_output);
if($val->attrs->pipe) $cond_output->pipe = $val->attrs->pipe;
else $cond_output->pipe = null;
if(!$val->condition) continue;
if(!is_array($val->condition)) $val->condition = array($val->condition);
foreach($val->condition as $k => $v) {
$obj = $v->attrs;
if(!$obj->alias) $obj->alias = $obj->column;
$cond_output->condition[] = $obj;
}
$output->conditions[] = $cond_output;
}
}
return $output;
}
/**
* @brief transfer condition information to $object->groups
* @param[in] SQL group information
* @result Returns $output
*/
function _setGroup($group_list){
// group list
if($group_list) {
if(!is_array($group_list)) $group_list = array($group_list);
for($i=0;$i<count($group_list);$i++) {
$group = $group_list[$i];
$column = trim($group->attrs->column);
if(!$column) continue;
$group_column_list[] = $column;
}
if(count($group_column_list)) $output->groups = $group_column_list;
}
return $output;
}
/**
* @brief transfer pagnation information to $output
* @param[in] $xml_obj xml object containing Navigation information
* @result Returns $output
*/
function _setNavigation($xml_obj){
$navigation = $xml_obj->query->navigation;
if($navigation) {
$order = $navigation->index;
if($order) {
if(!is_array($order)) $order = array($order);
foreach($order as $order_info) {
$output->order[] = $order_info->attrs;
}
}
$list_count = $navigation->list_count->attrs;
$output->list_count = $list_count;
$page_count = $navigation->page_count->attrs;
$output->page_count = $page_count;
$page = $navigation->page->attrs;
$output->page = $page ;
}
return $output;
}
/**
* @brief retrieve column information from $output->colums to generate corresponding php code
* @param[in] $column
* @remarks the name of this method is misleading.
* @result Returns string buffer containing php code
*/
function _getColumn($columns){
$buff = '';
$str = '';
$print_vars = array();
foreach($columns as $key => $val) {
$str = 'array("name"=>"%s","alias"=>"%s"';
$print_vars = array();
$print_vars[] = $val['name'];
$print_vars[] = $val['alias'];
$val['default'] = $this->getDefault($val['name'], $val['default']);
if($val['var'] && strpos($val['var'],'.')===false) {
if($val['default']){
$str .= ',"value"=>$args->%s?$args->%s:%s';
$print_vars[] = $val['var'];
$print_vars[] = $val['var'];
$print_vars[] = $val['default'];
}else{
$str .= ',"value"=>$args->%s';
$print_vars[] = $val['var'];
}
} else {
if($val['default']){
$str .= ',"value"=>%s';
$print_vars[] = $val['default'];
}
}
if($val['click_count']){
$str .= ',"click_count"=>$args->%s';
$print_vars[] = $val['click_count'];
}
$str .= '),%s';
$print_vars[] = "\n";
$buff .= vsprintf($str, $print_vars);
}
return $buff;
}
/**
* @brief retrieve condition information from $output->condition to generate corresponding php code
* @param[in] $conditions array containing Query conditions
* @remarks the name of this method is misleading.
* @return Returns string buffer containing php code
*/
function _getConditions($conditions){
$buff = '';
foreach($conditions as $key => $val) {
$buff .= sprintf('array("pipe"=>"%s",%s"condition"=>array(', $val->pipe,"\n");
foreach($val->condition as $k => $v) {
$v->default = $this->getDefault($v->column, $v->default);
if($v->var) {
if(strpos($v->var,".")===false) {
if($v->default) $this->default_list[$v->var] = $v->default;
if($v->filter) $this->filter_list[] = $v;
if($v->notnull) $this->notnull_list[] = $v->var;
if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s?$args->%s:%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->var, $v->default, $v->pipe, $v->operation, "\n");
else $buff .= sprintf('array("column"=>"%s", "value"=>$args->%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n");
$this->addArguments($v->var);
} else {
$buff .= sprintf('array("column"=>"%s", "value"=>"%s","pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->var, $v->pipe, $v->operation, "\n");
}
} else {
if($v->default) $buff .= sprintf('array("column"=>"%s", "value"=>%s,"pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->default ,$v->pipe, $v->operation,"\n");
else $buff .= sprintf('array("column"=>"%s", "pipe"=>"%s","operation"=>"%s",),%s', $v->column, $v->pipe, $v->operation,"\n");
}
}
$buff .= ')),'."\n";
}
return $buff;
}
function addArguments($args_name)
{
$this->args[] = $args_name;
}
function getArguments()
{
return $this->args;
}
/**
* @brief returns predefined default values correspoding to given parameters
* @param[in] $name
* @param[in] $value
* @return Returns a default value for specified field
*/
function getDefault($name, $value) {
$db_info = Context::getDBInfo ();
if(!isset($value)) return;
$str_pos = strpos($value, '(');
if($str_pos===false) return '"'.$value.'"';
$func_name = substr($value, 0, $str_pos);
$args = substr($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);
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"+%d"', $name, $args);
} else {
$val = sprintf('"%s+%d"', $name, $args);
}
break;
case 'minus' :
$args = abs($args);
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"-%d"', $name, $args);
} else {
$val = sprintf('"%s-%d"', $name, $args);
}
break;
case 'multiply' :
$args = intval($args);
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"*%d"', $name, $args);
} else {
$val = sprintf('"%s*%d"', $name, $args);
}
break;
}
return $val;
}
}
?>

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;
}
}
?>