mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-14 00:39:57 +09:00
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:
parent
5f9a5249ac
commit
7dbe0626b6
39 changed files with 1619 additions and 540 deletions
98
classes/xml/xmlquery/DBParser.class.php
Normal file
98
classes/xml/xmlquery/DBParser.class.php
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
160
classes/xml/xmlquery/QueryParser.class.php
Normal file
160
classes/xml/xmlquery/QueryParser.class.php
Normal 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; ?>';
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
113
classes/xml/xmlquery/argument/Argument.class.php
Normal file
113
classes/xml/xmlquery/argument/Argument.class.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
61
classes/xml/xmlquery/queryargument/DefaultValue.class.php
Normal file
61
classes/xml/xmlquery/queryargument/DefaultValue.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
52
classes/xml/xmlquery/queryargument/QueryArgument.class.php
Normal file
52
classes/xml/xmlquery/queryargument/QueryArgument.class.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
class Validator {
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
49
classes/xml/xmlquery/tags/condition/ConditionTag.class.php
Normal file
49
classes/xml/xmlquery/tags/condition/ConditionTag.class.php
Normal 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();
|
||||
}
|
||||
}
|
||||
?>
|
||||
51
classes/xml/xmlquery/tags/condition/ConditionsTag.class.php
Normal file
51
classes/xml/xmlquery/tags/condition/ConditionsTag.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
36
classes/xml/xmlquery/tags/group/GroupsTag.class.php
Normal file
36
classes/xml/xmlquery/tags/group/GroupsTag.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
49
classes/xml/xmlquery/tags/navigation/IndexTag.class.php
Normal file
49
classes/xml/xmlquery/tags/navigation/IndexTag.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
60
classes/xml/xmlquery/tags/navigation/NavigationTag.class.php
Normal file
60
classes/xml/xmlquery/tags/navigation/NavigationTag.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
60
classes/xml/xmlquery/tags/table/TableTag.class.php
Normal file
60
classes/xml/xmlquery/tags/table/TableTag.class.php
Normal 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) .'\'' : '');
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
33
classes/xml/xmlquery/tags/table/TablesTag.class.php
Normal file
33
classes/xml/xmlquery/tags/table/TablesTag.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
Loading…
Add table
Add a link
Reference in a new issue