mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-07 02:31:40 +09:00
Merged 1.5.0-DB branch into 1.5.0 - added new DB classes.
git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8697 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
commit
c9203dc356
105 changed files with 6279 additions and 3467 deletions
|
|
@ -357,13 +357,32 @@
|
|||
|
||||
if($source_args) $args = @clone($source_args);
|
||||
|
||||
$output = @include($cache_file);
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/Argument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/SortArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/ConditionArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/XmlQueryParser.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/expression/UpdateExpression.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');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/order/OrderByColumn.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/limit/Limit.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/Query.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/Subquery.class.php');
|
||||
|
||||
|
||||
$output = include($cache_file);
|
||||
|
||||
if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output;
|
||||
$output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array();
|
||||
|
||||
|
||||
// execute appropriate query
|
||||
switch($output->action) {
|
||||
switch($output->getAction()) {
|
||||
case 'insert' :
|
||||
$this->resetCountCache($output->tables);
|
||||
$output = $this->_executeInsertAct($output);
|
||||
|
|
@ -377,11 +396,12 @@
|
|||
$output = $this->_executeDeleteAct($output);
|
||||
break;
|
||||
case 'select' :
|
||||
// TODO Add property for Query object for Arg_columns
|
||||
$output->arg_columns = is_array($arg_columns)?$arg_columns:array();
|
||||
$output = $this->_executeSelectAct($output);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if($this->isError()) $output = $this->getError();
|
||||
else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object();
|
||||
$output->add('_query', $this->query);
|
||||
|
|
@ -390,232 +410,6 @@
|
|||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief check $val with $filter_type
|
||||
* @param[in] $key key value
|
||||
* @param[in] $val value of $key
|
||||
* @param[in] $filter_type type of filter to check $val
|
||||
* @return object
|
||||
* @remarks this function is to be used from XmlQueryParser
|
||||
**/
|
||||
function checkFilter($key, $val, $filter_type) {
|
||||
global $lang;
|
||||
|
||||
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)) return 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)) return 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)) return 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)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key} ? $lang->{$key} : $key));
|
||||
break;
|
||||
case 'alpha' :
|
||||
if(!preg_match('/^[a-z]+$/is', $val)) return 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)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key} ? $lang->{$key} : $key));
|
||||
break;
|
||||
}
|
||||
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns type of column
|
||||
* @param[in] $column_type_list list of column type
|
||||
* @param[in] $name name of column type
|
||||
* @return column type of $name
|
||||
* @remarks columns are usually like a.b, so it needs another function
|
||||
**/
|
||||
function getColumnType($column_type_list, $name) {
|
||||
if(strpos($name, '.') === false) return $column_type_list[$name];
|
||||
list($prefix, $name) = explode('.', $name);
|
||||
return $column_type_list[$name];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns the value of condition
|
||||
* @param[in] $name name of condition
|
||||
* @param[in] $value value of condition
|
||||
* @param[in] $operation operation this is used in condition
|
||||
* @param[in] $type type of condition
|
||||
* @param[in] $column_type type of column
|
||||
* @return well modified $value
|
||||
* @remarks if $operation is like or like_prefix, $value itself will be modified
|
||||
* @remarks if $type is not 'number', call addQuotes() and wrap with ' '
|
||||
**/
|
||||
function getConditionValue($name, $value, $operation, $type, $column_type) {
|
||||
if(!in_array($operation,array('in','notin','between')) && $type == 'number') {
|
||||
if(is_array($value)){
|
||||
$value = join(',',$value);
|
||||
}
|
||||
if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value;
|
||||
return $value;
|
||||
}
|
||||
|
||||
if(!is_array($value) && strpos($name, '.') !== false && strpos($value, '.') !== false) {
|
||||
list($table_name, $column_name) = explode('.', $value);
|
||||
if($column_type[$column_name]) return $value;
|
||||
}
|
||||
|
||||
switch($operation) {
|
||||
case 'like_prefix' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = $value.'%';
|
||||
break;
|
||||
case 'like_tail' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = '%'.$value;
|
||||
break;
|
||||
case 'like' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = '%'.$value.'%';
|
||||
break;
|
||||
case 'notin' :
|
||||
if(is_array($value))
|
||||
{
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type=='number') return join(',',$value);
|
||||
else return "'". join("','",$value)."'";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
break;
|
||||
case 'in' :
|
||||
if(is_array($value))
|
||||
{
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type=='number') return join(',',$value);
|
||||
else return "'". join("','",$value)."'";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
break;
|
||||
case 'between' :
|
||||
if(!is_array($value)) $value = array($value);
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type!='number')
|
||||
{
|
||||
foreach($value as $k=>$v)
|
||||
{
|
||||
$value[$k] = "'".$v."'";
|
||||
}
|
||||
}
|
||||
|
||||
return $value;
|
||||
break;
|
||||
default:
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
}
|
||||
|
||||
return "'".$this->addQuotes($value)."'";
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns part of condition
|
||||
* @param[in] $name name of condition
|
||||
* @param[in] $value value of condition
|
||||
* @param[in] $operation operation that is used in condition
|
||||
* @return detail condition
|
||||
**/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns condition key
|
||||
* @param[in] $output result of query
|
||||
* @return array of conditions of $output
|
||||
**/
|
||||
function getConditionList($output) {
|
||||
$conditions = array();
|
||||
if(count($output->conditions)) {
|
||||
foreach($output->conditions as $key => $val) {
|
||||
if($val['condition']) {
|
||||
foreach($val['condition'] as $k => $v) {
|
||||
$conditions[] = $v['column'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $conditions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns counter cache data
|
||||
|
|
@ -720,30 +514,260 @@
|
|||
$this->_query($query);
|
||||
}
|
||||
|
||||
function addQuotesArray($arr)
|
||||
{
|
||||
if(is_array($arr))
|
||||
{
|
||||
foreach($arr as $k => $v)
|
||||
{
|
||||
$arr[$k] = $this->addQuotes($v);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$arr = $this->addQuotes($arr);
|
||||
}
|
||||
function getSelectSql($query, $with_values = true){
|
||||
$select = $query->getSelectString($with_values);
|
||||
if($select == '') return new Object(-1, "Invalid query");
|
||||
$select = 'SELECT ' .$select;
|
||||
|
||||
return $arr;
|
||||
$from = $query->getFromString($with_values);
|
||||
if($from == '') return new Object(-1, "Invalid query");
|
||||
$from = ' FROM '.$from;
|
||||
|
||||
$where = $query->getWhereString($with_values);
|
||||
if($where != '') $where = ' WHERE ' . $where;
|
||||
|
||||
$groupBy = $query->getGroupByString();
|
||||
if($groupBy != '') $groupBy = ' GROUP BY ' . $groupBy;
|
||||
|
||||
$orderBy = $query->getOrderByString();
|
||||
if($orderBy != '') $orderBy = ' ORDER BY ' . $orderBy;
|
||||
|
||||
$limit = $query->getLimitString();
|
||||
if($limit != '') $limit = ' LIMIT ' . $limit;
|
||||
|
||||
return $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Just like numbers, and operations needed to remove the rest
|
||||
function getDeleteSql($query, $with_values = true){
|
||||
$sql = 'DELETE ';
|
||||
|
||||
// TODO Add support for deleting based on alias, for both simple FROM and multi table join FROM clause
|
||||
$tables = $query->getTables();
|
||||
|
||||
$sql .= $tables[0]->getAlias();
|
||||
|
||||
$from = $query->getFromString($with_values);
|
||||
if($from == '') return new Object(-1, "Invalid query");
|
||||
$sql .= ' FROM '.$from;
|
||||
|
||||
$where = $query->getWhereString($with_values);
|
||||
if($where != '') $sql .= ' WHERE ' . $where;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function getUpdateSql($query, $with_values = true){
|
||||
$columnsList = $query->getSelectString($with_values);
|
||||
if($columnsList == '') return new Object(-1, "Invalid query");
|
||||
|
||||
$tableName = $query->getFirstTableName();
|
||||
if($tableName == '') return new Object(-1, "Invalid query");
|
||||
|
||||
$where = $query->getWhereString($with_values);
|
||||
if($where != '') $where = ' WHERE ' . $where;
|
||||
|
||||
return "UPDATE $tableName SET $columnsList ".$where;
|
||||
}
|
||||
|
||||
function getInsertSql($query, $with_values = true){
|
||||
$tableName = $query->getFirstTableName();
|
||||
$values = $query->getInsertString($with_values);
|
||||
|
||||
return "INSERT INTO $tableName \n $values";
|
||||
}
|
||||
|
||||
// HACK This is needed because on installation, the XmlQueryParer is used without any configured database
|
||||
// TODO Change this or make sure the query cache files created before db.config exists are deleted
|
||||
function getParser(){
|
||||
return new DBParser('"');
|
||||
}
|
||||
|
||||
|
||||
// TO BE REMOVED - Used for query compare
|
||||
/**
|
||||
* @brief returns type of column
|
||||
* @param[in] $column_type_list list of column type
|
||||
* @param[in] $name name of column type
|
||||
* @return column type of $name
|
||||
* @remarks columns are usually like a.b, so it needs another function
|
||||
**/
|
||||
function _filterNumber(&$value)
|
||||
{
|
||||
$value = preg_replace('/[^\d\w\+\-\*\/\.\(\)]/', '', $value);
|
||||
if(!$value) $value = 0;
|
||||
}
|
||||
function getColumnType($column_type_list, $name) {
|
||||
if(strpos($name, '.') === false) return $column_type_list[$name];
|
||||
list($prefix, $name) = explode('.', $name);
|
||||
return $column_type_list[$name];
|
||||
}
|
||||
/**
|
||||
* @brief returns the value of condition
|
||||
* @param[in] $name name of condition
|
||||
* @param[in] $value value of condition
|
||||
* @param[in] $operation operation this is used in condition
|
||||
* @param[in] $type type of condition
|
||||
* @param[in] $column_type type of column
|
||||
* @return well modified $value
|
||||
* @remarks if $operation is like or like_prefix, $value itself will be modified
|
||||
* @remarks if $type is not 'number', call addQuotes() and wrap with ' '
|
||||
**/
|
||||
function getConditionValue($name, $value, $operation, $type, $column_type) {
|
||||
if(!in_array($operation,array('in','notin','between')) && $type == 'number') {
|
||||
if(is_array($value)){
|
||||
$value = join(',',$value);
|
||||
}
|
||||
if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value;
|
||||
return $value;
|
||||
}
|
||||
|
||||
if(!is_array($value) && strpos($name, '.') !== false && strpos($value, '.') !== false) {
|
||||
list($table_name, $column_name) = explode('.', $value);
|
||||
if($column_type[$column_name]) return $value;
|
||||
}
|
||||
|
||||
switch($operation) {
|
||||
case 'like_prefix' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = $value.'%';
|
||||
break;
|
||||
case 'like_tail' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = '%'.$value;
|
||||
break;
|
||||
case 'like' :
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
$value = '%'.$value.'%';
|
||||
break;
|
||||
case 'notin' :
|
||||
if(is_array($value))
|
||||
{
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type=='number') return join(',',$value);
|
||||
else return "'". join("','",$value)."'";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
break;
|
||||
case 'in' :
|
||||
if(is_array($value))
|
||||
{
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type=='number') return join(',',$value);
|
||||
else return "'". join("','",$value)."'";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
break;
|
||||
case 'between' :
|
||||
if(!is_array($value)) $value = array($value);
|
||||
$value = $this->addQuotesArray($value);
|
||||
if($type!='number')
|
||||
{
|
||||
foreach($value as $k=>$v)
|
||||
{
|
||||
$value[$k] = "'".$v."'";
|
||||
}
|
||||
}
|
||||
|
||||
return $value;
|
||||
break;
|
||||
default:
|
||||
if(!is_array($value)) $value = preg_replace('/(^\'|\'$){1}/', '', $value);
|
||||
}
|
||||
|
||||
return "'".$this->addQuotes($value)."'";
|
||||
}
|
||||
/**
|
||||
* @brief returns part of condition
|
||||
* @param[in] $name name of condition
|
||||
* @param[in] $value value of condition
|
||||
* @param[in] $operation operation that is used in condition
|
||||
* @return detail condition
|
||||
**/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns condition key
|
||||
* @param[in] $output result of query
|
||||
* @return array of conditions of $output
|
||||
**/
|
||||
function getConditionList($output) {
|
||||
$conditions = array();
|
||||
if(count($output->conditions)) {
|
||||
foreach($output->conditions as $key => $val) {
|
||||
if($val['condition']) {
|
||||
foreach($val['condition'] as $k => $v) {
|
||||
$conditions[] = $v['column'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $conditions;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
$this->_setDBInfo();
|
||||
$this->_connect();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief create an instance of this class
|
||||
*/
|
||||
|
|
@ -190,7 +190,7 @@
|
|||
{
|
||||
if (!$query || !$this->isConnected ()) return;
|
||||
|
||||
// Notify to start a query execution
|
||||
// Notify to start a query execution
|
||||
$this->actStart ($query);
|
||||
|
||||
// Execute the query
|
||||
|
|
@ -207,16 +207,18 @@
|
|||
$this->actFinish ();
|
||||
|
||||
// Return the result
|
||||
return $result;
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Fetch the result
|
||||
**/
|
||||
function _fetch($result)
|
||||
function _fetch($result, $arrayIndexEndValue = NULL)
|
||||
{
|
||||
if (!$this->isConnected() || $this->isError() || !$result) return;
|
||||
|
||||
// TODO Improve this piece of code
|
||||
// This code trims values from char type columns
|
||||
$col_types = cubrid_column_types ($result);
|
||||
$col_names = cubrid_column_names ($result);
|
||||
$max = count ($col_types);
|
||||
|
|
@ -234,14 +236,16 @@
|
|||
}
|
||||
}
|
||||
|
||||
$output[] = $tmp;
|
||||
if($arrayIndexEndValue) $output[$arrayIndexEndValue--] = $tmp;
|
||||
else $output[] = $tmp;
|
||||
}
|
||||
|
||||
unset ($char_type_fields);
|
||||
|
||||
if ($result) cubrid_close_request($result);
|
||||
|
||||
if (count ($output) == 1) return $output[0];
|
||||
if($arrayIndexEndValue !== null && count($output) == 1) return $output[$arrayIndexEndValue + 1];
|
||||
else if (count($output) == 1) return $output[0];
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
|
@ -445,7 +449,6 @@
|
|||
if (!file_exists ($file_name)) return;
|
||||
// read xml file
|
||||
$buff = FileHandler::readFile ($file_name);
|
||||
|
||||
return $this->_createTable ($buff);
|
||||
}
|
||||
|
||||
|
|
@ -561,132 +564,19 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the condition
|
||||
**/
|
||||
function getCondition ($output)
|
||||
{
|
||||
if (!$output->conditions) return;
|
||||
$condition = $this->_getCondition ($output->conditions, $output->column_type, $output);
|
||||
if ($condition) $condition = ' where '.$condition;
|
||||
|
||||
return $condition;
|
||||
}
|
||||
|
||||
function _getCondition ($conditions, $column_type, &$output)
|
||||
{
|
||||
$condition = '';
|
||||
|
||||
foreach ($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
|
||||
foreach ($val['condition'] as $v) {
|
||||
if (!isset ($v['value'])) continue;
|
||||
if ($v['value'] === '') continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue;
|
||||
|
||||
$name = $v['column'];
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
$type = $this->getColumnType ($column_type, $name);
|
||||
$pipe = $v['pipe'];
|
||||
$value = $this->getConditionValue ($name, $value, $operation, $type, $column_type);
|
||||
|
||||
if (!$value) {
|
||||
$value = $v['value'];
|
||||
if (strpos ($value, '(')) {
|
||||
$valuetmp = $value;
|
||||
}
|
||||
elseif (strpos ($value, ".") === false) {
|
||||
$valuetmp = $value;
|
||||
}
|
||||
else {
|
||||
$valuetmp = '"'.str_replace('.', '"."', $value).'"';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$tmp = explode('.',$value);
|
||||
|
||||
if (count($tmp)==2) {
|
||||
$table = $tmp[0];
|
||||
$column = $tmp[1];
|
||||
|
||||
if ($column_type[$column] && (in_array ($table, $output->tables) ||
|
||||
array_key_exists($table, $output->tables))) {
|
||||
$valuetmp = sprintf('"%s"."%s"', $table, $column);
|
||||
}
|
||||
else {
|
||||
$valuetmp = $value;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$valuetmp = $value;
|
||||
}
|
||||
}
|
||||
|
||||
if (strpos ($name, '(') > 0) {
|
||||
$nametmp = $name;
|
||||
}
|
||||
elseif (strpos ($name, ".") === false) {
|
||||
$nametmp = '"'.$name.'"';
|
||||
}
|
||||
else {
|
||||
$nametmp = '"'.str_replace('.', '"."', $name).'"';
|
||||
}
|
||||
$str = $this->getConditionPart ($nametmp, $valuetmp, $operation);
|
||||
if ($sub_condition) $sub_condition .= ' '.$pipe.' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
|
||||
if ($sub_condition) {
|
||||
if ($condition && $val['pipe']) {
|
||||
$condition .= ' '.$val['pipe'].' ';
|
||||
}
|
||||
$condition .= '('.$sub_condition.')';
|
||||
}
|
||||
}
|
||||
|
||||
return $condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief handles insertAct
|
||||
**/
|
||||
function _executeInsertAct ($output)
|
||||
function _executeInsertAct($queryObject)
|
||||
{
|
||||
// tables
|
||||
foreach ($output->tables as $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'"';
|
||||
}
|
||||
|
||||
// columns
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
//if ($this->getColumnType ($output->column_type, $name) != 'number')
|
||||
if ($output->column_type[$name] != 'number') {
|
||||
if (!is_null($value)) {
|
||||
$value = "'" . $this->addQuotes($value) ."'";
|
||||
}
|
||||
else {
|
||||
if ($val['notnull']=='notnull') {
|
||||
$value = "''";
|
||||
}
|
||||
else {
|
||||
//$value = 'null';
|
||||
$value = "''";
|
||||
}
|
||||
}
|
||||
}
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = '"'.$name.'"';
|
||||
$value_list[] = $value;
|
||||
}
|
||||
|
||||
$query = sprintf ("insert into %s (%s) values (%s);", implode(',', $table_list), implode(',', $column_list), implode(',', $value_list));
|
||||
$query = $this->getInsertSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
|
||||
$result = $this->_query ($query);
|
||||
if ($result && !$this->transaction_started) {
|
||||
@cubrid_commit ($this->fd);
|
||||
|
|
@ -698,109 +588,29 @@
|
|||
/**
|
||||
* @brief handles updateAct
|
||||
**/
|
||||
function _executeUpdateAct ($output)
|
||||
function _executeUpdateAct($queryObject)
|
||||
{
|
||||
// tables
|
||||
foreach ($output->tables as $key => $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"';
|
||||
}
|
||||
$query = $this->getUpdateSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
$check_click_count = true;
|
||||
$result = $this->_query($query);
|
||||
|
||||
// columns
|
||||
foreach ($output->columns as $key => $val) {
|
||||
if (!isset ($val['value'])) continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
|
||||
if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') {
|
||||
$check_click_count = false;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < $key; $i++) {
|
||||
// not allows to define the same property repeatedly in a single query in CUBRID
|
||||
if ($output->columns[$i]['name'] == $name) break;
|
||||
}
|
||||
if ($i < $key) continue; // ignore the rest of properties if duplicated property found
|
||||
|
||||
if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) {
|
||||
$column_list[] = $name.' = '.$value;
|
||||
}
|
||||
else {
|
||||
if ($output->column_type[$name] != 'number') {
|
||||
$check_column = false;
|
||||
$value = "'".$this->addQuotes ($value)."'";
|
||||
}
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = sprintf ("\"%s\" = %s", $name, $value);
|
||||
}
|
||||
}
|
||||
|
||||
// conditional clause
|
||||
$condition = $this->getCondition ($output);
|
||||
|
||||
$check_click_count_condition = false;
|
||||
if ($check_click_count) {
|
||||
foreach ($output->conditions as $val) {
|
||||
if ($val['pipe'] == 'or') {
|
||||
$check_click_count_condition = false;
|
||||
break;
|
||||
}
|
||||
|
||||
foreach ($val['condition'] as $v) {
|
||||
if ($v['operation'] == 'equal') {
|
||||
$check_click_count_condition = true;
|
||||
}
|
||||
else {
|
||||
if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) {
|
||||
$check_click_count_condition = true;
|
||||
}
|
||||
else {
|
||||
$check_click_count_condition = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($v['pipe'] == 'or') {
|
||||
$check_click_count_condition = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) {
|
||||
foreach ($output->columns as $v) {
|
||||
$incr_columns[] = 'incr("'.$v['name'].'")';
|
||||
}
|
||||
|
||||
$query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition);
|
||||
}
|
||||
else {
|
||||
$query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition);
|
||||
}
|
||||
|
||||
$result = $this->_query ($query);
|
||||
if ($result && !$this->transaction_started) @cubrid_commit ($this->fd);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief handles deleteAct
|
||||
**/
|
||||
function _executeDeleteAct ($output)
|
||||
function _executeDeleteAct($queryObject)
|
||||
{
|
||||
// tables
|
||||
foreach ($output->tables as $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'"';
|
||||
}
|
||||
$query = $this->getDeleteSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
// Conditional clauses
|
||||
$condition = $this->getCondition ($output);
|
||||
|
||||
$query = sprintf ("delete from %s %s", implode (',',$table_list), $condition);
|
||||
$result = $this->_query ($query);
|
||||
|
||||
if ($result && !$this->transaction_started) @cubrid_commit ($this->fd);
|
||||
|
||||
return $result;
|
||||
|
|
@ -810,454 +620,73 @@
|
|||
* @brief Handle selectAct
|
||||
*
|
||||
* to get a specific page list easily in select statement,\n
|
||||
* a method, navigation, is used
|
||||
* a method, navigation, is used
|
||||
**/
|
||||
function _executeSelectAct ($output)
|
||||
{
|
||||
// tables
|
||||
$table_list = array ();
|
||||
foreach ($output->tables as $key => $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"';
|
||||
}
|
||||
$left_join = array ();
|
||||
// why???
|
||||
$left_tables = (array) $output->left_tables;
|
||||
// TODO Rewrite with Query object as input
|
||||
function _executeSelectAct($queryObject){
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
foreach ($left_tables as $key => $val) {
|
||||
$condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output);
|
||||
if ($condition) {
|
||||
$left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')';
|
||||
}
|
||||
}
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
|
||||
$column_list = array ();
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
|
||||
$click_count = '%s';
|
||||
if ($val['click_count'] && count ($output->conditions) > 0) {
|
||||
$click_count = 'incr(%s)';
|
||||
}
|
||||
|
||||
$alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null;
|
||||
$_alias = $val['alias'];
|
||||
|
||||
if ($name == '*') {
|
||||
$column_list[] = $name;
|
||||
}
|
||||
elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) {
|
||||
$name = sprintf ($click_count,$name);
|
||||
if ($alias) {
|
||||
$column_list[$alias] = sprintf('"%s" as %s', $name, $alias);
|
||||
}
|
||||
else {
|
||||
$column_list[] = sprintf ('"%s"', $name);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (strpos ($name, '.') != false) {
|
||||
list ($prefix, $name) = explode('.', $name);
|
||||
if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) {
|
||||
if ($now_matchs == 1) {
|
||||
$tmpval = explode ("(", $prefix);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$prefix = implode ("(", $tmpval);
|
||||
$tmpval = explode (")", $name);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$name = implode (")", $tmpval);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$prefix = sprintf ('"%s"', $prefix);
|
||||
$name = ($name == '*') ? $name : sprintf('"%s"',$name);
|
||||
}
|
||||
$xtmp = null;
|
||||
$now_matchs = null;
|
||||
if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : '');
|
||||
else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name));
|
||||
}
|
||||
elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) {
|
||||
if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) {
|
||||
$open_pos = strpos ($name, "(");
|
||||
$close_pos = strpos ($name, ")");
|
||||
|
||||
if (preg_match ("/,/", $name)) {
|
||||
$tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos));
|
||||
$tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1));
|
||||
$tmpval = null;
|
||||
$tmpval = explode (',', $tmp_params);
|
||||
|
||||
foreach ($tmpval as $tmp_param) {
|
||||
$tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param;
|
||||
}
|
||||
|
||||
$tmpval = implode (',', $tmp_param_list);
|
||||
$name = sprintf ('%s(%s)', $tmp_func_name, $tmpval);
|
||||
}
|
||||
else {
|
||||
$name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1));
|
||||
}
|
||||
}
|
||||
|
||||
if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : '');
|
||||
else $column_list[] = sprintf ($click_count, $name);
|
||||
}
|
||||
else {
|
||||
if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : '');
|
||||
else $column_list[] = sprintf($click_count, $name);
|
||||
}
|
||||
}
|
||||
$columns = implode (',', $column_list);
|
||||
}
|
||||
|
||||
$condition = $this->getCondition ($output);
|
||||
|
||||
$output->column_list = $column_list;
|
||||
if ($output->list_count && $output->page) {
|
||||
return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output));
|
||||
}
|
||||
|
||||
if ($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
//if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
if (count ($output->groups)) {
|
||||
foreach ($output->groups as $key => $value) {
|
||||
if (strpos ($value, '.')) {
|
||||
$tmp = explode ('.', $value);
|
||||
$tmp[0] = sprintf ('"%s"', $tmp[0]);
|
||||
$tmp[1] = sprintf ('"%s"', $tmp[1]);
|
||||
$value = implode ('.', $tmp);
|
||||
}
|
||||
elseif (strpos ($value, '(')) {
|
||||
$value = $value;
|
||||
}
|
||||
else {
|
||||
$value = sprintf ('"%s"', $value);
|
||||
}
|
||||
$output->groups[$key] = $value;
|
||||
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
if($column_list[$value]) $output->arg_columns[] = $column_list[$value];
|
||||
}
|
||||
}
|
||||
$groupby_query = sprintf ('group by %s', implode(',', $output->groups));
|
||||
}
|
||||
|
||||
|
||||
// apply when using list_count
|
||||
if ($output->list_count['value']) {
|
||||
$start_count = 0;
|
||||
$list_count = $output->list_count['value'];
|
||||
|
||||
if ($output->order) {
|
||||
foreach ($output->order as $val) {
|
||||
if (strpos ($val[0], '.')) {
|
||||
$tmpval = explode ('.', $val[0]);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$val[0] = implode ('.', $tmpval);
|
||||
}
|
||||
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
|
||||
elseif ($val[0] == 'count') $val[0] = 'count (*)';
|
||||
else $val[0] = sprintf ('"%s"', $val[0]);
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
}
|
||||
if (count($index_list))
|
||||
$orderby_query = ' order by '.implode(',', $index_list);
|
||||
$orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
if (count ($output->groups)) {
|
||||
$orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
if ($condition) {
|
||||
$orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
$orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ($output->order) {
|
||||
foreach ($output->order as $val) {
|
||||
if (strpos ($val[0], '.')) {
|
||||
$tmpval = explode ('.', $val[0]);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$val[0] = implode ('.', $tmpval);
|
||||
}
|
||||
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
|
||||
elseif ($val[0] == 'count') $val[0] = 'count (*)';
|
||||
else $val[0] = sprintf ('"%s"', $val[0]);
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
|
||||
if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key];
|
||||
}
|
||||
|
||||
if (count ($index_list)) {
|
||||
$orderby_query = ' order by '.implode(',', $index_list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'"')===false && strpos($col,' ')==false) $col = '"'.$col.'"';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief displays the current stack trace. Fetch the result
|
||||
**/
|
||||
function backtrace ()
|
||||
{
|
||||
$output = "<div style='text-align: left;'>\n";
|
||||
$output .= "<b>Backtrace:</b><br />\n";
|
||||
$backtrace = debug_backtrace ();
|
||||
|
||||
foreach ($backtrace as $bt) {
|
||||
$args = '';
|
||||
foreach ($bt['args'] as $a) {
|
||||
if (!empty ($args)) {
|
||||
$args .= ', ';
|
||||
}
|
||||
switch (gettype ($a)) {
|
||||
case 'integer':
|
||||
case 'double':
|
||||
$args .= $a;
|
||||
break;
|
||||
case 'string':
|
||||
$a = htmlspecialchars (substr ($a, 0, 64)).
|
||||
((strlen ($a) > 64) ? '...' : '');
|
||||
$args .= "\"$a\"";
|
||||
break;
|
||||
case 'array':
|
||||
$args .= 'Array ('. count ($a).')';
|
||||
break;
|
||||
case 'object':
|
||||
$args .= 'Object ('.get_class ($a).')';
|
||||
break;
|
||||
case 'resource':
|
||||
$args .= 'Resource ('.strstr ($a, '#').')';
|
||||
break;
|
||||
case 'boolean':
|
||||
$args .= $a ? 'True' : 'False';
|
||||
break;
|
||||
case 'NULL':
|
||||
$args .= 'Null';
|
||||
break;
|
||||
default:
|
||||
$args .= 'Unknown';
|
||||
}
|
||||
}
|
||||
$output .= "<br />\n";
|
||||
$output .= "<b>file:</b> ".$bt['line']." - ". $bt['file']."<br />\n";
|
||||
$output .= "<b>call:</b> ".$bt['class']. $bt['type'].$bt['function'].$args."<br />\n";
|
||||
}
|
||||
$output .= "</div>\n";
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief paginates when navigation info exists in the query xml
|
||||
*
|
||||
* it is convenient although its structure is not good .. -_-;
|
||||
**/
|
||||
function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once (_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups)) {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if (!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if (!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if (!$page) $page = 1;
|
||||
|
||||
// total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $list_count) + 1;
|
||||
}
|
||||
else {
|
||||
$total_page = 1;
|
||||
}
|
||||
|
||||
// check the page variables
|
||||
if ($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page - 1) * $list_count;
|
||||
|
||||
if ($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
//if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) {
|
||||
foreach ($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
if (count ($output->groups)) {
|
||||
foreach ($output->groups as $key => $value) {
|
||||
if (strpos ($value, '.')) {
|
||||
$tmp = explode ('.', $value);
|
||||
$tmp[0] = sprintf ('"%s"', $tmp[0]);
|
||||
$tmp[1] = sprintf ('"%s"', $tmp[1]);
|
||||
$value = implode ('.', $tmp);
|
||||
}
|
||||
elseif (strpos ($value, '(')) $value = $value;
|
||||
else $value = sprintf ('"%s"', $value);
|
||||
$output->groups[$key] = $value;
|
||||
}
|
||||
|
||||
$groupby_query = sprintf (' group by %s', implode (',', $output->groups));
|
||||
}
|
||||
|
||||
if ($output->order) {
|
||||
foreach ($output->order as $val) {
|
||||
if (strpos ($val[0], '.')) {
|
||||
$tmpval = explode ('.', $val[0]);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$val[0] = implode ('.', $tmpval);
|
||||
}
|
||||
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
|
||||
elseif ($val[0] == 'count') $val[0] = 'count (*)';
|
||||
else $val[0] = sprintf ('"%s"', $val[0]);
|
||||
$index_list[] = sprintf ('%s %s', $val[0], $val[1]);
|
||||
}
|
||||
|
||||
if (count ($index_list)) {
|
||||
$orderby_query = ' order by '.implode(',', $index_list);
|
||||
}
|
||||
|
||||
$orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
if (count($output->groups)) {
|
||||
$orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
if ($condition) {
|
||||
$orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
else {
|
||||
$orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'"')===false && strpos($col,' ')==false) $col = '"'.$col.'"';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$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):'';
|
||||
$query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result = $this->_query ($query);
|
||||
|
||||
if ($this->isError ()) {
|
||||
if ($this->isError ())
|
||||
return $this->queryError($queryObject);
|
||||
else
|
||||
return $this->queryPageLimit($queryObject, $result);
|
||||
}
|
||||
|
||||
function queryError($queryObject){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array ();
|
||||
$buff->page_navigation = new PageHandler (/*$total_count*/0, /*$total_page*/1, /*$page*/1, /*$page_count*/10);//default page handler values
|
||||
return $buff;
|
||||
}else
|
||||
return;
|
||||
}
|
||||
|
||||
function queryPageLimit($queryObject, $result){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result_count = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result_count);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else $total_page = 1;
|
||||
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
$data = $this->_fetch($result, $virtual_no);
|
||||
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count);
|
||||
}else{
|
||||
$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array ();
|
||||
|
||||
$buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count);
|
||||
|
||||
return $buff;
|
||||
$buff->data = $data;
|
||||
}
|
||||
|
||||
$virtual_no = $total_count - ($page - 1) * $list_count;
|
||||
while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) {
|
||||
if ($tmp) {
|
||||
foreach ($tmp as $k => $v) {
|
||||
$tmp->{$k} = rtrim($v);
|
||||
}
|
||||
}
|
||||
$data[$virtual_no--] = $tmp;
|
||||
}
|
||||
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count);
|
||||
|
||||
return $buff;
|
||||
}
|
||||
|
||||
function getParser(){
|
||||
return new DBParser('"');
|
||||
}
|
||||
}
|
||||
|
||||
return new DBCubrid;
|
||||
|
|
|
|||
|
|
@ -291,7 +291,7 @@
|
|||
// Notify to start a query execution
|
||||
$this->actStart($query);
|
||||
// Execute the query statement
|
||||
$result = ibase_query($this->fd, $query);
|
||||
$result = @ibase_query($this->fd, $query);
|
||||
}
|
||||
else {
|
||||
// Notify to start a query execution
|
||||
|
|
@ -592,6 +592,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
if($auto_increment_list)
|
||||
foreach($auto_increment_list as $increment) {
|
||||
$schema = sprintf('CREATE GENERATOR GEN_%s_ID;', $table_name);
|
||||
$output = $this->_query($schema);
|
||||
|
|
@ -616,161 +617,32 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return conditional clause
|
||||
**/
|
||||
function getCondition($output) {
|
||||
if(!$output->conditions) return;
|
||||
$condition = $this->_getCondition($output->conditions,$output->column_type,$output->_tables);
|
||||
if($condition) $condition = ' where '.$condition;
|
||||
return $condition;
|
||||
}
|
||||
|
||||
function getLeftCondition($conditions,$column_type,$tables){
|
||||
return $this->_getCondition($conditions,$column_type,$tables);
|
||||
}
|
||||
|
||||
|
||||
function _getCondition($conditions,$column_type,$tables) {
|
||||
$condition = '';
|
||||
foreach($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
foreach($val['condition'] as $v) {
|
||||
if(!isset($v['value'])) continue;
|
||||
if($v['value'] === '') continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue;
|
||||
|
||||
$name = $v['column'];
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
$type = $this->getColumnType($column_type,$name);
|
||||
$pipe = $v['pipe'];
|
||||
|
||||
$value = $this->getConditionValue('"'.$name.'"', $value, $operation, $type, $column_type);
|
||||
if(!$value) $value = $v['value'];
|
||||
|
||||
$name = $this->autoQuotes($name);
|
||||
$value = $this->autoValueQuotes($value, $tables);
|
||||
|
||||
$str = $this->getConditionPart($name, $value, $operation);
|
||||
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
if($sub_condition) {
|
||||
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
|
||||
$condition .= '('.$sub_condition.')';
|
||||
}
|
||||
}
|
||||
|
||||
return $condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle the insertAct
|
||||
**/
|
||||
function _executeInsertAct($output) {
|
||||
// tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'"';
|
||||
}
|
||||
// Columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
|
||||
$value = str_replace("'", "`", $value);
|
||||
|
||||
if($output->column_type[$name]=="text" || $output->column_type[$name]=="bigtext"){
|
||||
if(!isset($val['value'])) continue;
|
||||
$blh = ibase_blob_create($this->fd);
|
||||
ibase_blob_add($blh, $value);
|
||||
$value = ibase_blob_close($blh);
|
||||
}
|
||||
else if($output->column_type[$name]!='number') {
|
||||
// if(!$value) $value = 'null';
|
||||
}
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = '"'.$name.'"';
|
||||
$value_list[] = $value;
|
||||
$questions[] = "?";
|
||||
}
|
||||
|
||||
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $questions));
|
||||
|
||||
$result = $this->_query($query, $value_list);
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
return $result;
|
||||
function _executeInsertAct($queryObject) {
|
||||
$query = $this->getInsertSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief handles updateAct
|
||||
**/
|
||||
function _executeUpdateAct($output) {
|
||||
// Tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'"';
|
||||
}
|
||||
// Columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
if(!isset($val['value'])) continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
|
||||
$value = str_replace("'", "`", $value);
|
||||
|
||||
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
|
||||
else {
|
||||
if($output->column_type[$name]=="text" || $output->column_type[$name]=="bigtext"){
|
||||
$blh = ibase_blob_create($this->fd);
|
||||
ibase_blob_add($blh, $value);
|
||||
$value = ibase_blob_close($blh);
|
||||
}
|
||||
else if($output->column_type[$name]=='number' ||
|
||||
$output->column_type[$name]=='bignumber' ||
|
||||
$output->column_type[$name]=='float') {
|
||||
// put double-quotes on column name if an expression is entered
|
||||
preg_match("/(?i)[a-z][a-z0-9_]+/", $value, $matches);
|
||||
|
||||
foreach($matches as $key => $val) {
|
||||
$value = str_replace($val, "\"".$val."\"", $value);
|
||||
}
|
||||
|
||||
if($matches != null) {
|
||||
$column_list[] = sprintf("\"%s\" = %s", $name, $value);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$values[] = $value;
|
||||
$column_list[] = sprintf('"%s" = ?', $name);
|
||||
}
|
||||
}
|
||||
// conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("update %s set %s %s;", implode(',',$table_list), implode(',',$column_list), $condition);
|
||||
$result = $this->_query($query, $values);
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
return $result;
|
||||
function _executeUpdateAct($queryObject) {
|
||||
$query = $this->getUpdateSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief handles deleteAct
|
||||
**/
|
||||
function _executeDeleteAct($output) {
|
||||
// Tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '"'.$this->prefix.$val.'"';
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("delete from %s %s;", implode(',',$table_list), $condition);
|
||||
|
||||
$result = $this->_query($query);
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
return $result;
|
||||
function _executeDeleteAct($queryObject) {
|
||||
$query = $this->getDeleteSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -779,265 +651,113 @@
|
|||
* In order to get a list of pages easily when selecting \n
|
||||
* it supports a method as navigation
|
||||
**/
|
||||
function _executeSelectAct($output) {
|
||||
// Tables
|
||||
$table_list = array();
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = sprintf("\"%s%s\" as \"%s\"", $this->prefix, $val, $key);
|
||||
}
|
||||
|
||||
$left_join = array();
|
||||
// why???
|
||||
$left_tables= (array)$output->left_tables;
|
||||
|
||||
foreach($left_tables as $key => $val) {
|
||||
$condition = $this->getLeftCondition($output->left_conditions[$key],$output->column_type,$output->_tables);
|
||||
if($condition){
|
||||
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as "'.$key.'" on (' . $condition . ')';
|
||||
}
|
||||
}
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
|
||||
$column_list = array();
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if($val['click_count']) $click_count[] = $val['name'];
|
||||
|
||||
if($alias == "")
|
||||
$column_list[] = $this->autoQuotes($name);
|
||||
else
|
||||
$column_list[$alias] = sprintf("%s as \"%s\"", $this->autoQuotes($name), $alias);
|
||||
}
|
||||
$columns = implode(',',$column_list);
|
||||
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$output->column_list = $column_list;
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
|
||||
// query added in the condition to use an index when ordering by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and "%s" < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where "%s" < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
// apply when using list_count
|
||||
if($output->list_count['value']) $limit = sprintf('FIRST %d', $output->list_count['value']);
|
||||
else $limit = '';
|
||||
|
||||
|
||||
if($output->groups) {
|
||||
foreach($output->groups as $key => $val) {
|
||||
$group_list[] = $this->autoQuotes($val);
|
||||
if($column_list[$val]) $output->arg_columns[] = $column_list[$val];
|
||||
}
|
||||
if(count($group_list)) $groupby_query = sprintf(" group by %s", implode(",",$group_list));
|
||||
}
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = sprintf(" order by %s", implode(",",$index_list));
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
if(strpos($col,'"')===false && strpos($col,' ')==false) $columns[] = '"'.$col.'"';
|
||||
else $columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
$query .= ";";
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query($query);
|
||||
if($this->isError()) {
|
||||
if(!$this->transaction_started) @ibase_rollback($this->fd);
|
||||
return;
|
||||
}
|
||||
|
||||
$data = $this->_fetch($result, $output);
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
|
||||
if(count($click_count)>0 && count($output->conditions)>0){
|
||||
$_query = '';
|
||||
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
|
||||
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
|
||||
$this->_query($_query);
|
||||
}
|
||||
|
||||
$buff = new Object();
|
||||
$buff->data = $data;
|
||||
return $buff;
|
||||
function _executeSelectAct($queryObject) {
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
|
||||
if(is_a($query, 'Object')) return;
|
||||
$query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query ($query);
|
||||
|
||||
if ($this->isError ()) return $this->queryError($queryObject);
|
||||
else return $this->queryPageLimit($queryObject, $result);
|
||||
}
|
||||
|
||||
function queryError($queryObject) {
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
$buff->page_navigation = new PageHandler(/* $total_count */0, /* $total_page */1, /* $page */1, /* $page_count */10); //default page handler values
|
||||
}else
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief paginates when navigation info exists in the query xml
|
||||
*
|
||||
* it is convenient although its structure is not good .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
|
||||
$query_groupby = '';
|
||||
if ($output->groups) {
|
||||
foreach ($output->groups as $key => $val){
|
||||
$group_list[] = $this->autoQuotes($val);
|
||||
if($column_list[$val]) $output->arg_columns[] = $column_list[$val];
|
||||
}
|
||||
if (count($group_list)) $query_groupby = sprintf(" GROUP BY %s", implode(", ", $group_list));
|
||||
function queryPageLimit($queryObject, $result) {
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE ' . $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
/*
|
||||
// modified to get the number of rows by SELECT query with group by clause
|
||||
// activate the commented codes when you confirm it works correctly
|
||||
//
|
||||
$count_condition = strlen($query_groupby) ? sprintf('%s group by %s', $condition, $query_groupby) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
// total number of rows
|
||||
$count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):'';
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
$count_query .= ( __DEBUG_QUERY__ & 1 && $output->query_id) ? sprintf(' ' . $this->comment_syntax, $this->query_id) : '';
|
||||
$result_count = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result_count);
|
||||
$total_count = (int) $count_output->count;
|
||||
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if(!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if(!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if(!$page) $page = 1;
|
||||
// total pages
|
||||
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
|
||||
else $total_page = 1;
|
||||
// check the page variables
|
||||
if($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page-1)*$list_count;
|
||||
// query added in the condition to use an index when ordering by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and "%s" < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where "%s" < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$limit = sprintf('FIRST %d SKIP %d ', $list_count, $start_count);
|
||||
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf("%s %s", $this->autoQuotes($val[0]), $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = sprintf(" ORDER BY %s", implode(",",$index_list));
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
if(strpos($col,'"')===false && strpos($col,' ')==false) $columns[] = '"'.$col.'"';
|
||||
else $columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf('SELECT %s %s FROM %s %s %s, %s', $limit, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
$query .= ";";
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query($query);
|
||||
if($this->isError()) {
|
||||
if(!$this->transaction_started) @ibase_rollback($this->fd);
|
||||
|
||||
$buff = new Object();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
|
||||
$virtual_no = $total_count - ($page-1)*$list_count;
|
||||
while($tmp = ibase_fetch_object($result)) {
|
||||
foreach($tmp as $key => $val){
|
||||
$type = $output->column_type[$key];
|
||||
// $key value is an alias when type value is null. get type by finding the actual column name
|
||||
if($type == null && $output->columns && count($output->columns)) {
|
||||
foreach($output->columns as $cols) {
|
||||
if($cols['alias'] == $key) {
|
||||
// checks if the format is table.column or a regular expression
|
||||
preg_match("/\w+[.](\w+)/", $cols['name'], $matches);
|
||||
if($matches) {
|
||||
$type = $output->column_type[$matches[1]];
|
||||
}
|
||||
else {
|
||||
$type = $output->column_type[$cols['name']];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(($type == "text" || $type == "bigtext") && $tmp->{$key}) {
|
||||
$blob_data = ibase_blob_info($tmp->{$key});
|
||||
$blob_hndl = ibase_blob_open($tmp->{$key});
|
||||
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);
|
||||
ibase_blob_close($blob_hndl);
|
||||
}
|
||||
}
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else
|
||||
$total_page = 1;
|
||||
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
while ($tmp = ibase_fetch_object($result))
|
||||
$data[$virtual_no--] = $tmp;
|
||||
}
|
||||
|
||||
if (!$this->transaction_started)
|
||||
@ibase_commit($this->fd);
|
||||
|
||||
if(!$this->transaction_started) @ibase_commit($this->fd);
|
||||
|
||||
$buff = new Object();
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count);
|
||||
}else {
|
||||
$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
|
||||
function getParser() {
|
||||
return new DBParser('"');
|
||||
}
|
||||
|
||||
function getSelectSql($query, $with_values = true) {
|
||||
|
||||
if ($query->getLimit()) {
|
||||
$list_count = $query->getLimit()->list_count->getValue();
|
||||
if(!$query->getLimit()->page) $page = 1;
|
||||
else $page = $query->getLimit()->page->getValue();
|
||||
|
||||
$start_count = ($page - 1) * $list_count;
|
||||
$limit = sprintf('SELECT FIRST %d SKIP %d ', $list_count, $start_count);
|
||||
}
|
||||
|
||||
$select = $query->getSelectString($with_values);
|
||||
if ($select == '')
|
||||
return new Object(-1, "Invalid query");
|
||||
|
||||
if ($query->getLimit())
|
||||
$select = $limit . ' ' . $select;
|
||||
else
|
||||
$select = 'SELECT ' . $select;
|
||||
$from = $query->getFromString($with_values);
|
||||
if ($from == '')
|
||||
return new Object(-1, "Invalid query");
|
||||
$from = ' FROM ' . $from;
|
||||
|
||||
$where = $query->getWhereString($with_values);
|
||||
if ($where != '')
|
||||
$where = ' WHERE ' . $where;
|
||||
|
||||
$groupBy = $query->getGroupByString();
|
||||
if ($groupBy != '')
|
||||
$groupBy = ' GROUP BY ' . $groupBy;
|
||||
|
||||
$orderBy = $query->getOrderByString();
|
||||
if ($orderBy != '')
|
||||
$orderBy = ' ORDER BY ' . $orderBy;
|
||||
|
||||
return $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return new DBFireBird;
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
var $prefix = 'xe'; // / <prefix of XE tables(One more XE can be installed on a single DB)
|
||||
var $param = array();
|
||||
var $comment_syntax = '/* %s */';
|
||||
|
||||
|
||||
/**
|
||||
* @brief column type used in mssql
|
||||
*
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
$this->_setDBInfo();
|
||||
$this->_connect();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief create an instance of this class
|
||||
*/
|
||||
|
|
@ -70,7 +70,7 @@
|
|||
$this->password = $db_info->db_password;
|
||||
$this->database = $db_info->db_database;
|
||||
$this->prefix = $db_info->db_table_prefix;
|
||||
|
||||
|
||||
if(!substr($this->prefix,-1)!='_') $this->prefix .= '_';
|
||||
}
|
||||
|
||||
|
|
@ -85,12 +85,11 @@
|
|||
//sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
|
||||
//sqlsrv_configure( 'LogSubsystems', SQLSRV_LOG_SYSTEM_ALL );
|
||||
|
||||
$this->conn = sqlsrv_connect( $this->hostname,
|
||||
$this->conn = sqlsrv_connect( $this->hostname,
|
||||
array( 'Database' => $this->database,'UID'=>$this->userid,'PWD'=>$this->password ));
|
||||
|
||||
|
||||
// Check connections
|
||||
|
||||
|
||||
// Check connections
|
||||
if($this->conn){
|
||||
$this->is_connected = true;
|
||||
$this->password = md5($this->password);
|
||||
|
|
@ -104,7 +103,7 @@
|
|||
**/
|
||||
function close() {
|
||||
if($this->is_connected == false) return;
|
||||
|
||||
|
||||
$this->commit();
|
||||
sqlsrv_close($this->conn);
|
||||
$this->conn = null;
|
||||
|
|
@ -113,10 +112,11 @@
|
|||
/**
|
||||
* @brief handles quatation of the string variables from the query
|
||||
**/
|
||||
// TODO See what to do about this
|
||||
function addQuotes($string) {
|
||||
if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
|
||||
//if(!is_numeric($string)) $string = str_replace("'","''",$string);
|
||||
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
|
|
@ -126,7 +126,7 @@
|
|||
function begin() {
|
||||
if($this->is_connected == false || $this->transaction_started) return;
|
||||
if(sqlsrv_begin_transaction( $this->conn ) === false) return;
|
||||
|
||||
|
||||
$this->transaction_started = true;
|
||||
}
|
||||
|
||||
|
|
@ -135,7 +135,7 @@
|
|||
**/
|
||||
function rollback() {
|
||||
if($this->is_connected == false || !$this->transaction_started) return;
|
||||
|
||||
|
||||
$this->transaction_started = false;
|
||||
sqlsrv_rollback( $this->conn );
|
||||
}
|
||||
|
|
@ -145,8 +145,8 @@
|
|||
**/
|
||||
function commit($force = false) {
|
||||
if(!$force && ($this->is_connected == false || !$this->transaction_started)) return;
|
||||
|
||||
$this->transaction_started = false;
|
||||
|
||||
$this->transaction_started = false;
|
||||
sqlsrv_commit( $this->conn );
|
||||
}
|
||||
|
||||
|
|
@ -159,24 +159,40 @@
|
|||
* object if a row returned \n
|
||||
* return\n
|
||||
**/
|
||||
|
||||
// TODO Support array arguments in sql server
|
||||
/*
|
||||
* $query_emp="select name from employee where id in (?,?,?)";
|
||||
$params_emp= Array(1,2,3);
|
||||
$res_emp = sqlsrv_query($conn, $query_emp, $params_emp);
|
||||
*
|
||||
*/
|
||||
|
||||
function _query($query) {
|
||||
if($this->is_connected == false || !$query) return;
|
||||
|
||||
$_param = array();
|
||||
|
||||
|
||||
if(count($this->param)){
|
||||
foreach($this->param as $k => $o){
|
||||
if($o['type'] == 'number'){
|
||||
$_param[] = &$o['value'];
|
||||
if($o->getType() == 'number'){
|
||||
$value = $o->getUnescapedValue();
|
||||
if(is_array($value)) $_param = array_merge($_param, $value);
|
||||
else $_param[] = $o->getUnescapedValue();
|
||||
}else{
|
||||
$_param[] = array(&$o['value'], SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8'));
|
||||
$value = $o->getUnescapedValue();
|
||||
if(is_array($value)) {
|
||||
foreach($value as $v)
|
||||
$_param[] = array($v, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8'));
|
||||
}
|
||||
else $_param[] = array($value, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Notify to start a query execution
|
||||
$this->actStart($query);
|
||||
|
||||
|
||||
// Run the query statement
|
||||
$result = false;
|
||||
if(count($_param)){
|
||||
|
|
@ -185,9 +201,9 @@
|
|||
$result = @sqlsrv_query($this->conn, $query);
|
||||
}
|
||||
// Error Check
|
||||
|
||||
|
||||
if(!$result) $this->setError(print_r(sqlsrv_errors(),true));
|
||||
|
||||
|
||||
// Notify to complete a query execution
|
||||
$this->actFinish();
|
||||
$this->param = array();
|
||||
|
|
@ -198,23 +214,27 @@
|
|||
/**
|
||||
* @brief Fetch results
|
||||
**/
|
||||
function _fetch($result) {
|
||||
function _fetch($result, $arrayIndexEndValue = NULL) {
|
||||
if(!$this->isConnected() || $this->isError() || !$result) return;
|
||||
|
||||
|
||||
$c = sqlsrv_num_fields($result);
|
||||
$m = null;
|
||||
$output = array();
|
||||
|
||||
|
||||
while(sqlsrv_fetch($result)){
|
||||
if(!$m) $m = sqlsrv_field_metadata($result);
|
||||
unset($row);
|
||||
for($i=0;$i<$c;$i++){
|
||||
$row->{$m[$i]['Name']} = sqlsrv_get_field( $result, $i, SQLSRV_PHPTYPE_STRING( 'utf-8' ));
|
||||
$row->{$m[$i]['Name']} = sqlsrv_get_field( $result, $i, SQLSRV_PHPTYPE_STRING( 'utf-8' ));
|
||||
}
|
||||
$output[] = $row;
|
||||
if($arrayIndexEndValue) $output[$arrayIndexEndValue--] = $row;
|
||||
else $output[] = $row;
|
||||
}
|
||||
|
||||
if(count($output)==1) return $output[0];
|
||||
if(count($output)==1) {
|
||||
if(isset($arrayIndexEndValue)) return $output;
|
||||
else return $output[0];
|
||||
}
|
||||
return $output;
|
||||
|
||||
}
|
||||
|
|
@ -225,12 +245,12 @@
|
|||
function getNextSequence() {
|
||||
$query = sprintf("insert into %ssequence (seq) values (ident_incr('%ssequence'))", $this->prefix, $this->prefix);
|
||||
$this->_query($query);
|
||||
|
||||
|
||||
$query = sprintf("select ident_current('%ssequence')+1 as sequence", $this->prefix);
|
||||
$result = $this->_query($query);
|
||||
$tmp = $this->_fetch($result);
|
||||
|
||||
|
||||
|
||||
return $tmp->sequence;
|
||||
}
|
||||
|
||||
|
|
@ -239,9 +259,9 @@
|
|||
**/
|
||||
function isTableExists($target_name) {
|
||||
$query = sprintf("select name from sysobjects where name = '%s%s' and xtype='U'", $this->prefix, $this->addQuotes($target_name));
|
||||
$result = $this->_query($query);
|
||||
$result = $this->_query($query);
|
||||
$tmp = $this->_fetch($result);
|
||||
|
||||
|
||||
if(!$tmp) return false;
|
||||
return true;
|
||||
}
|
||||
|
|
@ -386,11 +406,11 @@
|
|||
if($unique) $unique_list[$unique][] = $name;
|
||||
else if($index) $index_list[$index][] = $name;
|
||||
}
|
||||
|
||||
|
||||
$schema = sprintf('create table [%s] (xe_seq int identity(1,1),%s%s)', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"));
|
||||
$output = $this->_query($schema);
|
||||
if(!$output) return false;
|
||||
|
||||
|
||||
if(count($unique_list)) {
|
||||
foreach($unique_list as $key => $val) {
|
||||
$query = sprintf("create unique index %s on %s (%s);", $key, $table_name, '['.implode('],[',$val).']');
|
||||
|
|
@ -408,506 +428,143 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return conditional clause
|
||||
**/
|
||||
function getCondition($output) {
|
||||
if(!$output->conditions) return;
|
||||
$condition = $this->_getCondition($output->conditions,$output->column_type);
|
||||
if($condition) $condition = ' where '.$condition;
|
||||
return $condition;
|
||||
}
|
||||
|
||||
function getLeftCondition($conditions,$column_type){
|
||||
return $this->_getCondition($conditions,$column_type);
|
||||
}
|
||||
|
||||
|
||||
function _getCondition($conditions,$column_type) {
|
||||
$condition = '';
|
||||
|
||||
foreach($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
foreach($val['condition'] as $v) {
|
||||
if(!isset($v['value'])) continue;
|
||||
if($v['value'] === '') continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double'))) continue;
|
||||
|
||||
$name = $v['column'];
|
||||
if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name);
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
|
||||
$type = $this->getColumnType($column_type,$name);
|
||||
$pipe = $v['pipe'];
|
||||
|
||||
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
|
||||
if(!$value) $value = $v['value'];
|
||||
$str = $this->getConditionPart($name, $value, $operation);
|
||||
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
if($sub_condition) {
|
||||
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
|
||||
$condition .= '('.$sub_condition.')';
|
||||
}
|
||||
}
|
||||
return $condition;
|
||||
}
|
||||
|
||||
|
||||
function getConditionValue($name, $value, $operation, $type, $column_type) {
|
||||
|
||||
if($type == 'number') {
|
||||
if(strpos($value,',')===false && strpos($value,'(')===false){
|
||||
|
||||
if(is_integer($value)){
|
||||
$this->param[] = array('type'=>'number','value'=>(int)$value);
|
||||
return '?';
|
||||
}else{
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) {
|
||||
list($table_name, $column_name) = explode('.',$value);
|
||||
if($column_type[$column_name]){
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
switch($operation) {
|
||||
case 'like_prefix' :
|
||||
$value = preg_replace('/(^\'|\'$){1}/','',$value);
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
|
||||
|
||||
$value = "? + '%'";
|
||||
break;
|
||||
case 'like_tail' :
|
||||
$value = preg_replace('/(^\'|\'$){1}/','',$value);
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
|
||||
|
||||
$value = "'%' + ?";
|
||||
break;
|
||||
case 'like' :
|
||||
$value = preg_replace('/(^\'|\'$){1}/','',$value);
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
|
||||
|
||||
$value = "'%' + ? + '%'";
|
||||
break;
|
||||
case 'notin' :
|
||||
preg_match_all('/,?\'([^\']*)\'/',$value,$match);
|
||||
$val = array();
|
||||
foreach($match[1] as $k => $v){
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>trim($v));
|
||||
$val[] ='?';
|
||||
}
|
||||
$value = join(',',$val);
|
||||
break;
|
||||
case 'in' :
|
||||
preg_match_all('/,?\'([^\']*)\'/',$value,$match);
|
||||
$val = array();
|
||||
foreach($match[1] as $k => $v){
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>trim($v));
|
||||
$val[] ='?';
|
||||
}
|
||||
$value = join(',',$val);
|
||||
break;
|
||||
default:
|
||||
$value = preg_replace('/(^\'|\'$){1}/','',$value);
|
||||
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
|
||||
$value = '?';
|
||||
break;
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle the insertAct
|
||||
**/
|
||||
function _executeInsertAct($output) {
|
||||
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '['.$this->prefix.$val.']';
|
||||
}
|
||||
// List columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
|
||||
if($output->column_type[$name]!='number') {
|
||||
$value = $this->addQuotes($value);
|
||||
if(!$value) $value = '';
|
||||
} elseif(is_numeric($value)){
|
||||
if(!$value) $value = '';
|
||||
$value = (int)$value;
|
||||
} elseif(!$value){
|
||||
$value = '';
|
||||
}
|
||||
// sql injection 문제로 xml 선언이 number인 경우이면서 넘어온 값이 숫자형이 아니면 숫자형으로 강제 형변환
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = '['.$name.']';
|
||||
$value_list[] = '?';
|
||||
|
||||
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
|
||||
}
|
||||
|
||||
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
|
||||
|
||||
// TODO Lookup _filterNumber against sql injection - see if it is still needed and how to integrate
|
||||
function _executeInsertAct($queryObject) {
|
||||
$query = $this->getInsertSql($queryObject, false);
|
||||
$this->param = $queryObject->getArguments();
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle updateAct
|
||||
**/
|
||||
function _executeUpdateAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '['.$this->prefix.$val.']';
|
||||
}
|
||||
|
||||
// List columns
|
||||
|
||||
foreach($output->columns as $key => $val) {
|
||||
if(!isset($val['value'])) continue;
|
||||
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
if(strpos($name,'.')!==false&&strpos($value,'.')!==false){
|
||||
$column_list[] = $name.' = '.$value;
|
||||
} else {
|
||||
if($output->column_type[$name]!='number'){
|
||||
$value = $this->addQuotes($value);
|
||||
if(!$value) $value = '';
|
||||
|
||||
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
|
||||
$column_list[] = sprintf("[%s] = ?", $name);
|
||||
}elseif(!$value || is_numeric($value)){
|
||||
$value = (int)$value;
|
||||
|
||||
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
|
||||
$column_list[] = sprintf("[%s] = ?", $name);
|
||||
}else{
|
||||
if(!$value) $value = '';
|
||||
$this->_filterNumber($value);
|
||||
$column_list[] = sprintf("[%s] = %s", $name, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition);
|
||||
|
||||
function _executeUpdateAct($queryObject) {
|
||||
$query = $this->getUpdateSql($queryObject, false);
|
||||
$this->param = $queryObject->getArguments();
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle deleteAct
|
||||
**/
|
||||
function _executeDeleteAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '['.$this->prefix.$val.']';
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
|
||||
|
||||
function _executeDeleteAct($queryObject) {
|
||||
$query = $this->getDeleteSql($queryObject, false);
|
||||
$this->param = $queryObject->getArguments();
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
function getSelectSql($query){
|
||||
$with_value = false;
|
||||
|
||||
//$limitOffset = $query->getLimit()->getOffset();
|
||||
//if($limitOffset)
|
||||
// TODO Implement Limit with offset with subquery
|
||||
$limit = '';$limitCount = '';
|
||||
if($query->getLimit())
|
||||
$limitCount = $query->getLimit()->getLimit();
|
||||
if($limitCount != '') $limit = 'SELECT TOP ' . $limitCount;
|
||||
|
||||
$select = $query->getSelectString($with_values);
|
||||
if($select == '') return new Object(-1, "Invalid query");
|
||||
if($limit != '')
|
||||
$select = $limit.' '.$select;
|
||||
else
|
||||
$select = 'SELECT ' .$select;
|
||||
|
||||
$from = $query->getFromString($with_values);
|
||||
if($from == '') return new Object(-1, "Invalid query");
|
||||
$from = ' FROM '.$from;
|
||||
|
||||
$where = $query->getWhereString($with_values);
|
||||
if($where != '') $where = ' WHERE ' . $where;
|
||||
|
||||
$groupBy = $query->getGroupByString();
|
||||
if($groupBy != '') $groupBy = ' GROUP BY ' . $groupBy;
|
||||
|
||||
$orderBy = $query->getOrderByString();
|
||||
if($orderBy != '') $orderBy = ' ORDER BY ' . $orderBy;
|
||||
|
||||
|
||||
|
||||
return $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle selectAct
|
||||
*
|
||||
* In order to get a list of pages easily when selecting \n
|
||||
* it supports a method as navigation
|
||||
**/
|
||||
function _executeSelectAct($output) {
|
||||
// List tables
|
||||
$table_list = array();
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '['.$this->prefix.$val.'] as '.$key;
|
||||
}
|
||||
function _executeSelectAct($queryObject) {
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
|
||||
$left_join = array();
|
||||
// why???
|
||||
$left_tables= (array)$output->left_tables;
|
||||
if(strpos($query, "substr")) $query = str_replace ("substr", "substring", $query);
|
||||
|
||||
foreach($left_tables as $key => $val) {
|
||||
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
|
||||
if($condition){
|
||||
$left_join[] = $val . ' ['.$this->prefix.$output->_tables[$key].'] as '.$key . ' on (' . $condition . ')';
|
||||
}
|
||||
}
|
||||
// TODO Decide if we continue to pass parameters like this
|
||||
$this->param = $queryObject->getArguments();
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query($query);
|
||||
|
||||
$column_list = array();
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name);
|
||||
$alias = $val['alias'];
|
||||
if($val['click_count']) $click_count[] = $val['name'];
|
||||
|
||||
if(substr($name,-1) == '*') {
|
||||
$column_list[] = $name;
|
||||
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
|
||||
if($alias) $column_list[$alias] = sprintf('[%s] as [%s]', $name, $alias);
|
||||
else $column_list[] = sprintf('[%s]',$name);
|
||||
} else {
|
||||
if($alias) $column_list[$alias] = sprintf('%s as [%s]', $name, $alias);
|
||||
else $column_list[] = sprintf('%s',$name);
|
||||
}
|
||||
}
|
||||
$columns = implode(',',$column_list);
|
||||
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$output->column_list = $column_list;
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->groups)){
|
||||
foreach($output->groups as $k => $v ){
|
||||
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
|
||||
if($column_list[$v]) $output->arg_columns[] = $column_list[$v];
|
||||
}
|
||||
$groupby_query = sprintf(' group by %s', implode(',',$output->groups));
|
||||
}
|
||||
|
||||
if($output->order && !preg_match('/count\(\*\)/i',$columns) ) {
|
||||
foreach($output->order as $key => $val) {
|
||||
if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]);
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'[')===false && strpos($col,' ')==false) $col = '['.$col.']';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("%s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
// Apply when using list_count
|
||||
if($output->list_count['value']) $query = sprintf('select top %d %s', $output->list_count['value'], $query);
|
||||
else $query = "select ".$query;
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query($query);
|
||||
if($this->isError()) return;
|
||||
|
||||
if(count($click_count)>0 && count($output->conditions)>0){
|
||||
$_query = '';
|
||||
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
|
||||
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
|
||||
$this->_query($_query);
|
||||
}
|
||||
|
||||
$data = $this->_fetch($result);
|
||||
|
||||
$buff = new Object();
|
||||
$buff->data = $data;
|
||||
return $buff;
|
||||
if ($this->isError ()) return $this->queryError($queryObject);
|
||||
else return $this->queryPageLimit($queryObject, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Paging is handled if navigation information exists in the query xml
|
||||
*
|
||||
* It is quite convenient although its structure is not good at all .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
function getParser(){
|
||||
return new DBParser("[", "]");
|
||||
}
|
||||
|
||||
$column_list = $output->column_list;
|
||||
function queryError($queryObject){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array ();
|
||||
$buff->page_navigation = new PageHandler (/*$total_count*/0, /*$total_page*/1, /*$page*/1, /*$page_count*/10);//default page handler values
|
||||
return $buff;
|
||||
}else
|
||||
return;
|
||||
}
|
||||
|
||||
// Get a total count
|
||||
if(count($output->groups)){
|
||||
foreach($output->groups as $k => $v ){
|
||||
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
|
||||
if($column_list[$v]) $output->arg_columns[] = $column_list[$v];
|
||||
function queryPageLimit($queryObject, $result){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
$count_condition = sprintf('%s group by %s', $condition, implode(', ', $output->groups));
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result_count = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result_count);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else $total_page = 1;
|
||||
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
$data = $this->_fetch($result, $virtual_no);
|
||||
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page, $queryObject->getLimit()->page_count);
|
||||
}else{
|
||||
$count_condition = $condition;
|
||||
$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->data = $data;
|
||||
}
|
||||
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
|
||||
$param = $this->param;
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):'';
|
||||
$result = $this->_query($count_query);
|
||||
|
||||
$this->param = $param;
|
||||
$count_output = $this->_fetch($result);
|
||||
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if(!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if(!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if(!$page) $page = 1;
|
||||
// Get a total page
|
||||
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
|
||||
else $total_page = 1;
|
||||
// Check Page variables
|
||||
if($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page-1)*$list_count;
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
$conditions = $this->getConditionList($output);
|
||||
if($output->order) {
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add group by clause
|
||||
if(count($output->groups)){
|
||||
foreach($output->groups as $k => $v ){
|
||||
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
|
||||
if($column_list[$v]) $output->arg_columns[] = $column_list[$v];
|
||||
}
|
||||
|
||||
$group = sprintf('group by %s', implode(',',$output->groups));
|
||||
}
|
||||
|
||||
// Add order by clause
|
||||
$order_targets = array();
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
if(preg_match('/^substr\(/i',$val[0])) $name = preg_replace('/^substr\(/i','substring(',$val[0]);
|
||||
$order_targets[$val[0]] = $val[1];
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $order .= 'order by '.implode(',',$index_list);
|
||||
}
|
||||
if(!count($order_targets)) {
|
||||
if(in_array('list_order',$conditions)) $order_targets['list_order'] = 'asc';
|
||||
else $order_targets['xe_seq'] = 'desc';
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'[')===false && strpos($col,' ')==false) $col = '['.$col.']';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
if($start_count<1) {
|
||||
$query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order);
|
||||
|
||||
} else {
|
||||
foreach($order_targets as $k => $v) {
|
||||
$first_columns[] = sprintf('%s(%s) as %s', $v=='asc'?'max':'min', $k, $k);
|
||||
$first_sub_columns[] = $k;
|
||||
}
|
||||
|
||||
// Fetch values to sort
|
||||
$param = $this->param;
|
||||
$first_query = sprintf("select %s from (select top %d %s from %s %s %s %s %s) xet", implode(',',$first_columns), $start_count, implode(',',$first_sub_columns), implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order);
|
||||
$result = $this->_query($first_query);
|
||||
$this->param = $param;
|
||||
$tmp = $this->_fetch($result);
|
||||
|
||||
|
||||
|
||||
// Re-execute a query by using fetched values
|
||||
$sub_cond = array();
|
||||
foreach($order_targets as $k => $v) {
|
||||
$sub_cond[] = sprintf("%s %s '%s'", $k, $v=='asc'?'>':'<', $tmp->{$k});
|
||||
}
|
||||
$sub_condition = ' and( '.implode(' and ',$sub_cond).' )';
|
||||
|
||||
if($condition) $condition .= $sub_condition;
|
||||
else $condition = ' where '.$sub_condition;
|
||||
$query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order);
|
||||
}
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$result = $this->_query($query);
|
||||
|
||||
if($this->isError()) {
|
||||
$buff = new Object();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
|
||||
$virtual_no = $total_count - ($page-1)*$list_count;
|
||||
|
||||
$output = $this->_fetch($result);
|
||||
if(!is_array($output)) $output = array($output);
|
||||
|
||||
foreach($output as $k => $v) {
|
||||
$data[$virtual_no--] = $v;
|
||||
}
|
||||
|
||||
$buff = new Object();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@
|
|||
**/
|
||||
function addQuotes($string) {
|
||||
if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
|
||||
if(!is_numeric($string)) $string = @mysql_real_escape_string($string, $this->fd);
|
||||
if(!is_numeric($string)) $string = @mysql_escape_string($string);
|
||||
return $string;
|
||||
}
|
||||
|
||||
|
|
@ -152,7 +152,7 @@
|
|||
// Notify to start a query execution
|
||||
$this->actStart($query);
|
||||
// Run the query statement
|
||||
$result = @mysql_query($query, $this->fd);
|
||||
$result = mysql_query($query, $this->fd);
|
||||
// Error Check
|
||||
if(mysql_error($this->fd)) $this->setError(mysql_errno($this->fd), mysql_error($this->fd));
|
||||
// Notify to complete a query execution
|
||||
|
|
@ -164,12 +164,16 @@
|
|||
/**
|
||||
* @brief Fetch results
|
||||
**/
|
||||
function _fetch($result) {
|
||||
function _fetch($result, $arrayIndexEndValue = NULL) {
|
||||
if(!$this->isConnected() || $this->isError() || !$result) return;
|
||||
while($tmp = $this->db_fetch_object($result)) {
|
||||
$output[] = $tmp;
|
||||
if($arrayIndexEndValue) $output[$arrayIndexEndValue--] = $tmp;
|
||||
else $output[] = $tmp;
|
||||
}
|
||||
if(count($output)==1){
|
||||
if(isset($arrayIndexEndValue)) return $output;
|
||||
else return $output[0];
|
||||
}
|
||||
if(count($output)==1) return $output[0];
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
|
@ -374,141 +378,46 @@
|
|||
if(!$output) return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return conditional clause
|
||||
**/
|
||||
function getCondition($output) {
|
||||
if(!$output->conditions) return;
|
||||
$condition = $this->_getCondition($output->conditions,$output->column_type);
|
||||
if($condition) $condition = ' where '.$condition;
|
||||
return $condition;
|
||||
}
|
||||
|
||||
function getLeftCondition($conditions,$column_type){
|
||||
return $this->_getCondition($conditions,$column_type);
|
||||
}
|
||||
|
||||
|
||||
function _getCondition($conditions,$column_type) {
|
||||
$condition = '';
|
||||
foreach($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
foreach($val['condition'] as $v) {
|
||||
if(!isset($v['value'])) continue;
|
||||
if($v['value'] === '') continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue;
|
||||
|
||||
$name = $v['column'];
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
$type = $this->getColumnType($column_type,$name);
|
||||
$pipe = $v['pipe'];
|
||||
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
|
||||
if(!$value) $value = $v['value'];
|
||||
$str = $this->getConditionPart($name, $value, $operation);
|
||||
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
if($sub_condition) {
|
||||
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
|
||||
$condition .= '('.$sub_condition.')';
|
||||
}
|
||||
}
|
||||
return $condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle the insertAct
|
||||
**/
|
||||
function _executeInsertAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '`'.$this->prefix.$val.'`';
|
||||
}
|
||||
// List columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
|
||||
if($output->column_type[$name]!='number') {
|
||||
|
||||
if(!is_null($value)){
|
||||
$value = "'" . $this->addQuotes($value) ."'";
|
||||
}else{
|
||||
if($val['notnull']=='notnull') {
|
||||
$value = "''";
|
||||
} else {
|
||||
//$value = 'null';
|
||||
$value = "''";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//elseif(!$value || is_numeric($value)) $value = (int)$value;
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = '`'.$name.'`';
|
||||
$value_list[] = $value;
|
||||
}
|
||||
|
||||
function _executeInsertAct($queryObject) {
|
||||
// TODO See what priority does
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
//$priority = '';
|
||||
//if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("insert %s into %s (%s) values (%s);", $priority, implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
|
||||
$query = $this->getInsertSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle updateAct
|
||||
**/
|
||||
function _executeUpdateAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
|
||||
}
|
||||
// List columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
if(!isset($val['value'])) continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
|
||||
else {
|
||||
if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'";
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = sprintf("`%s` = %s", $name, $value);
|
||||
}
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
function _executeUpdateAct($queryObject) {
|
||||
// TODO See what proiority does
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("update %s %s set %s %s", $priority, implode(',',$table_list), implode(',',$column_list), $condition);
|
||||
//$priority = '';
|
||||
//if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = $this->getUpdateSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle deleteAct
|
||||
**/
|
||||
function _executeDeleteAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '`'.$this->prefix.$val.'`';
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("delete %s from %s %s", $priority, implode(',',$table_list), $condition);
|
||||
|
||||
function _executeDeleteAct($queryObject) {
|
||||
$query = $this->getDeleteSql($queryObject);
|
||||
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
//priority setting
|
||||
// TODO Check what priority does
|
||||
//$priority = '';
|
||||
//if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
|
|
@ -518,261 +427,19 @@
|
|||
* In order to get a list of pages easily when selecting \n
|
||||
* it supports a method as navigation
|
||||
**/
|
||||
function _executeSelectAct($output) {
|
||||
// List tables
|
||||
$table_list = array();
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
|
||||
}
|
||||
|
||||
$left_join = array();
|
||||
// why???
|
||||
$left_tables= (array)$output->left_tables;
|
||||
|
||||
foreach($left_tables as $key => $val) {
|
||||
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
|
||||
if($condition){
|
||||
$left_join[] = $val . ' `'.$this->prefix.$output->_tables[$key].'` as '.$key . ' on (' . $condition . ')';
|
||||
}
|
||||
}
|
||||
function _executeSelectAct($queryObject) {
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
|
||||
$column_list = array();
|
||||
foreach($output->columns as $key => $val)
|
||||
{
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if($val['click_count']) $click_count[] = $val['name'];
|
||||
|
||||
if(substr($name,-1) == '*')
|
||||
{
|
||||
$column_list[] = $name;
|
||||
}
|
||||
else if(strpos($name,'.')===false && strpos($name,'(')===false)
|
||||
{
|
||||
if($alias)
|
||||
{
|
||||
$col = sprintf('`%s` as `%s`', $name, $alias);
|
||||
$column_list[$alias] = $col;
|
||||
}
|
||||
else
|
||||
{
|
||||
$column_list[] = sprintf('`%s`',$name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if($alias)
|
||||
{
|
||||
$col = sprintf('%s as `%s`', $name, $alias);
|
||||
$column_list[$alias] = $col;
|
||||
}
|
||||
else
|
||||
{
|
||||
$column_list[] = sprintf('%s',$name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$columns = implode(',',$column_list);
|
||||
$output->column_list = $column_list;
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
if(count($output->index_hint))
|
||||
$index_hint = sprintf(' %s index (%s) ', $output->index_hint['type'], $output->index_hint['name']);
|
||||
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output);
|
||||
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(count($output->groups))
|
||||
{
|
||||
$groupby_query = sprintf(' group by %s', implode(',',$output->groups));
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
foreach($output->groups as $group)
|
||||
{
|
||||
if($column_list[$group]) $output->arg_columns[] = $column_list[$group];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query .= ' order by '.implode(',',$index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'`')===false && strpos($col,' ')==false) $col = '`'.$col.'`';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
|
||||
|
||||
// Apply when using list_count
|
||||
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
$result = $this->_query($query);
|
||||
if($this->isError()) return;
|
||||
if(count($click_count) && count($output->conditions)){
|
||||
$_query = '';
|
||||
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
|
||||
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
|
||||
$this->_query($_query);
|
||||
}
|
||||
|
||||
$data = $this->_fetch($result);
|
||||
|
||||
$buff = new Object();
|
||||
$buff->data = $data;
|
||||
|
||||
return $buff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Paging is handled if navigation information exists in the query xml
|
||||
*
|
||||
* It is quite convenient although its structure is not good at all .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
|
||||
// Get a total count
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):'';
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if(!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if(!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if(!$page) $page = 1;
|
||||
// Get a total page
|
||||
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
|
||||
else $total_page = 1;
|
||||
// Check Page variables
|
||||
if($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page-1)*$list_count;
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->groups)){
|
||||
$groupby_query = sprintf(' group by %s', implode(',',$output->groups));
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
foreach($output->groups as $group)
|
||||
{
|
||||
if($column_list[$group]) $output->arg_columns[] = $column_list[$group];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->order)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = array();
|
||||
foreach($output->arg_columns as $col){
|
||||
unset($tmpCol);
|
||||
$tmpCol = explode('.', $col);
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[1];
|
||||
|
||||
if(strpos($col,'`')===false && strpos($col,' ')==false) $col = '`'.$col.'`';
|
||||
if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col;
|
||||
|
||||
$columns[] = $col;
|
||||
}
|
||||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
|
||||
$query = sprintf('%s limit %d, %d', $query, $start_count, $list_count);
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
$result = $this->_query($query);
|
||||
if($this->isError()) {
|
||||
$buff = new Object();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
|
||||
$virtual_no = $total_count - ($page-1)*$list_count;
|
||||
$data = array();
|
||||
while($tmp = $this->db_fetch_object($result)) {
|
||||
$data[$virtual_no--] = $tmp;
|
||||
}
|
||||
$buff = new Object();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
// TODO Add support for click count
|
||||
// TODO Add code for pagination
|
||||
|
||||
$result = $this->_query ($query);
|
||||
if ($this->isError ()) return $this->queryError($queryObject);
|
||||
else return $this->queryPageLimit($queryObject, $result);
|
||||
}
|
||||
|
||||
function db_insert_id()
|
||||
|
|
@ -784,6 +451,58 @@
|
|||
{
|
||||
return mysql_fetch_object($result);
|
||||
}
|
||||
|
||||
function getParser(){
|
||||
return new DBParser('`');
|
||||
}
|
||||
|
||||
function queryError($queryObject){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()){
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array ();
|
||||
$buff->page_navigation = new PageHandler (/*$total_count*/0, /*$total_page*/1, /*$page*/1, /*$page_count*/10);//default page handler values
|
||||
return $buff;
|
||||
}else
|
||||
return;
|
||||
}
|
||||
|
||||
function queryPageLimit($queryObject, $result){
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result_count = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result_count);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else $total_page = 1;
|
||||
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
$data = $this->_fetch($result, $virtual_no);
|
||||
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count);
|
||||
}else{
|
||||
$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->data = $data;
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
}
|
||||
|
||||
return new DBMysql;
|
||||
|
|
|
|||
|
|
@ -226,15 +226,19 @@ class DBPostgresql extends DB
|
|||
/**
|
||||
* @brief Fetch results
|
||||
**/
|
||||
function _fetch($result)
|
||||
// TODO This is duplicate code - maybe we can find away to abastract the driver
|
||||
function _fetch($result, $arrayIndexEndValue = NULL)
|
||||
{
|
||||
if (!$this->isConnected() || $this->isError() || !$result)
|
||||
return;
|
||||
while ($tmp = pg_fetch_object($result)) {
|
||||
$output[] = $tmp;
|
||||
if($arrayIndexEndValue) $output[$arrayIndexEndValue--] = $tmp;
|
||||
else $output[] = $tmp;
|
||||
}
|
||||
if (count($output) == 1)
|
||||
return $output[0];
|
||||
if(count($output)==1){
|
||||
if(isset($arrayIndexEndValue)) return $output;
|
||||
else return $output[0];
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
|
@ -493,428 +497,137 @@ class DBPostgresql extends DB
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return conditional clause
|
||||
**/
|
||||
function getCondition($output)
|
||||
{
|
||||
if (!$output->conditions)
|
||||
return;
|
||||
$condition = $this->_getCondition($output->conditions, $output->column_type);
|
||||
if ($condition)
|
||||
$condition = ' where ' . $condition;
|
||||
return $condition;
|
||||
}
|
||||
|
||||
function getLeftCondition($conditions, $column_type)
|
||||
{
|
||||
return $this->_getCondition($conditions, $column_type);
|
||||
}
|
||||
|
||||
|
||||
function _getCondition($conditions, $column_type)
|
||||
{
|
||||
$condition = '';
|
||||
foreach ($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
foreach ($val['condition'] as $v) {
|
||||
if (!isset($v['value']))
|
||||
continue;
|
||||
if ($v['value'] === '')
|
||||
continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue;
|
||||
continue;
|
||||
|
||||
$name = $v['column'];
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
$type = $this->getColumnType($column_type, $name);
|
||||
$pipe = $v['pipe'];
|
||||
|
||||
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
|
||||
if (!$value)
|
||||
$value = $v['value'];
|
||||
$str = $this->getConditionPart($name, $value, $operation);
|
||||
if ($sub_condition)
|
||||
$sub_condition .= ' ' . $pipe . ' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
if ($sub_condition) {
|
||||
if ($condition && $val['pipe'])
|
||||
$condition .= ' ' . $val['pipe'] . ' ';
|
||||
$condition .= '(' . $sub_condition . ')';
|
||||
}
|
||||
}
|
||||
return $condition;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief Handle the insertAct
|
||||
**/
|
||||
function _executeInsertAct($output)
|
||||
function _executeInsertAct($queryObject)
|
||||
{
|
||||
// List tables
|
||||
foreach ($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix . $val;
|
||||
}
|
||||
// List columns
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
if ($output->column_type[$name] != 'number') {
|
||||
$value = "'" . $this->addQuotes($value) . "'";
|
||||
if (!$value)
|
||||
$value = 'null';
|
||||
}
|
||||
// sql injection 문제로 xml 선언이 number인 경우이면서 넘어온 값이 숫자형이 아니면 숫자형으로 강제 형변환
|
||||
// elseif (!$value || is_numeric($value)) $value = (int)$value;
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = $name;
|
||||
$value_list[] = $value;
|
||||
}
|
||||
|
||||
$query = sprintf("insert into %s (%s) values (%s);", implode(',', $table_list),
|
||||
implode(',', $column_list), implode(',', $value_list));
|
||||
$query = $this->getInsertSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle updateAct
|
||||
**/
|
||||
function _executeUpdateAct($output)
|
||||
function _executeUpdateAct($queryObject)
|
||||
{
|
||||
// List tables
|
||||
foreach ($output->tables as $key => $val) {
|
||||
//$table_list[] = $this->prefix.$val.' as '.$key;
|
||||
$table_list[] = $this->prefix . $val;
|
||||
}
|
||||
// List columns
|
||||
foreach ($output->columns as $key => $val) {
|
||||
if (!isset($val['value']))
|
||||
continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
if (strpos($name, '.') !== false && strpos($value, '.') !== false)
|
||||
$column_list[] = $name . ' = ' . $value;
|
||||
else {
|
||||
if ($output->column_type[$name] != 'number')
|
||||
$value = "'" . $this->addQuotes($value) . "'";
|
||||
// sql injection 문제로 xml 선언이 number인 경우이면서 넘어온 값이 숫자형이 아니면 숫자형으로 강제 형변환
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = sprintf("%s = %s", $name, $value);
|
||||
}
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("update %s set %s %s", implode(',', $table_list), implode(',',
|
||||
$column_list), $condition);
|
||||
|
||||
$query = $this->getUpdateSql($queryObject);
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle deleteAct
|
||||
**/
|
||||
function _executeDeleteAct($output)
|
||||
function _executeDeleteAct($queryObject)
|
||||
{
|
||||
// List tables
|
||||
foreach ($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix . $val;
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("delete from %s %s", implode(',', $table_list), $condition);
|
||||
|
||||
$query = $this->getDeleteSql($queryObject);
|
||||
|
||||
if(is_a($query, 'Object')) return;
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* override
|
||||
* @param $queryObject
|
||||
*/
|
||||
function getSelectSql($query){
|
||||
$select = $query->getSelectString();
|
||||
if($select == '') return new Object(-1, "Invalid query");
|
||||
$select = 'SELECT ' .$select;
|
||||
|
||||
$from = $query->getFromString();
|
||||
if($from == '') return new Object(-1, "Invalid query");
|
||||
$from = ' FROM '.$from;
|
||||
|
||||
$where = $query->getWhereString();
|
||||
if($where != '') $where = ' WHERE ' . $where;
|
||||
|
||||
$groupBy = $query->getGroupByString();
|
||||
if($groupBy != '') $groupBy = ' GROUP BY ' . $groupBy;
|
||||
|
||||
$orderBy = $query->getOrderByString();
|
||||
if($orderBy != '') $orderBy = ' ORDER BY ' . $orderBy;
|
||||
|
||||
$limit = $query->getLimitString();
|
||||
if($limit != '') $limit = ' LIMIT ' . $query->getLimit()->getLimit() . ' OFFSET ' . $query->getLimit()->getOffset();
|
||||
|
||||
return $select . ' ' . $from . ' ' . $where . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle selectAct
|
||||
*
|
||||
* In order to get a list of pages easily when selecting \n
|
||||
* it supports a method as navigation
|
||||
**/
|
||||
function _executeSelectAct($output)
|
||||
function _executeSelectAct($queryObject)
|
||||
{
|
||||
// List tables
|
||||
$table_list = array();
|
||||
foreach ($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix . $val . ' as ' . $key;
|
||||
}
|
||||
|
||||
$left_join = array();
|
||||
// why???
|
||||
$left_tables = (array )$output->left_tables;
|
||||
|
||||
foreach ($left_tables as $key => $val) {
|
||||
$condition = $this->_getCondition($output->left_conditions[$key], $output->
|
||||
column_type);
|
||||
if ($condition) {
|
||||
$left_join[] = $val . ' ' . $this->prefix . $output->_tables[$key] . ' as ' . $key .
|
||||
' on (' . $condition . ')';
|
||||
}
|
||||
}
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
|
||||
$column_list = array();
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if($val['click_count']) $click_count[] = $val['name'];
|
||||
|
||||
if (substr($name, -1) == '*') {
|
||||
$column_list[] = $name;
|
||||
} elseif (strpos($name, '.') === false && strpos($name, '(') === false) {
|
||||
if ($alias)
|
||||
$column_list[$alias] = sprintf('%s as %s', $name, $alias);
|
||||
else
|
||||
$column_list[] = sprintf('%s', $name);
|
||||
} else {
|
||||
if ($alias)
|
||||
$column_list[$alias] = sprintf('%s as %s', $name, $alias);
|
||||
else
|
||||
$column_list[] = sprintf('%s', $name);
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
|
||||
if(is_a($query, 'Object')) return;
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
// TODO Add support for click count
|
||||
// TODO Add code for pagination
|
||||
|
||||
$result = $this->_query ($query);
|
||||
if ($this->isError ()) {
|
||||
if ($limit && $output->limit->isPageHandler()){
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array ();
|
||||
$buff->page_navigation = new PageHandler (/*$total_count*/0, /*$total_page*/1, /*$page*/1, /*$page_count*/10);//default page handler values
|
||||
return $buff;
|
||||
}else
|
||||
return;
|
||||
}
|
||||
}
|
||||
$columns = implode(',', $column_list);
|
||||
|
||||
$condition = $this->getCondition($output);
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE '. $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
$output->column_list = $column_list;
|
||||
if ($output->list_count && $output->page)
|
||||
return $this->_getNavigationData($table_list, $columns, $left_join, $condition,
|
||||
$output);
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if ($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if (!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach ($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if (!in_array($col, array('list_order', 'update_order')))
|
||||
continue;
|
||||
if ($condition)
|
||||
$condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else
|
||||
$condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
|
||||
$result_count = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result_count);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else $total_page = 1;
|
||||
|
||||
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
$data = $this->_fetch($result, $virtual_no);
|
||||
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count);
|
||||
}else{
|
||||
$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->data = $data;
|
||||
}
|
||||
|
||||
if (count($output->groups)) {
|
||||
/*
|
||||
var_dump("= column output start = ");
|
||||
var_dump(sizeof ($output->columns) . " = end length == ");
|
||||
var_dump($output->columns);
|
||||
var_dump("= column output end = " . "\n");
|
||||
var_dump($output->groups);
|
||||
var_dump("=== " . "\n");
|
||||
var_dump(debug_backtrace());
|
||||
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
} */
|
||||
$group_list = array();
|
||||
foreach ($output->groups as $gkey => $gval) {
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if (trim($name) == trim($gval)) {
|
||||
$group_list[] = $alias;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if($column_list[$gval]) $output->arg_columns[] = $column_list[$gval];
|
||||
|
||||
}
|
||||
$groupby_query = sprintf(' group by %s', implode(',', $group_list));
|
||||
// var_dump($query);
|
||||
}
|
||||
|
||||
if ($output->order) {
|
||||
foreach ($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if (count($index_list)) $orderby_query = ' order by ' . implode(',', $index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = join(',',$output->arg_columns);
|
||||
}
|
||||
|
||||
$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;
|
||||
|
||||
if(count($click_count)>0 && count($output->conditions)>0){
|
||||
$_query = '';
|
||||
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
|
||||
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
|
||||
$this->_query($_query);
|
||||
}
|
||||
|
||||
|
||||
$data = $this->_fetch($result);
|
||||
|
||||
$buff = new Object();
|
||||
$buff->data = $data;
|
||||
return $buff;
|
||||
return $buff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Paging is handled if navigation information exists in the query xml
|
||||
*
|
||||
* It is quite convenient although its structure is not good at all .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output)
|
||||
{
|
||||
require_once (_XE_PATH_ . 'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
/*
|
||||
// Modified to find total number of SELECT queries having group by clause
|
||||
// If it works correctly, uncomment the following codes
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if ($total_count === false) {
|
||||
$count_query = sprintf('select count(*) as count from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// Get a total count
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',', $table_list), implode(' ', $left_join), $condition);
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):'';
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if (!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if (!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if (!$page)
|
||||
$page = 1;
|
||||
|
||||
// Get a total page
|
||||
if ($total_count) $total_page = (int)(($total_count - 1) / $list_count) + 1;
|
||||
else $total_page = 1;
|
||||
|
||||
// Check Page variables
|
||||
if ($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page - 1) * $list_count;
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if ($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if (!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach ($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if (!in_array($col, array('list_order', 'update_order')))
|
||||
continue;
|
||||
if ($condition)
|
||||
$condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else
|
||||
$condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (count($output->groups)) {
|
||||
/*
|
||||
var_dump("= column output start = ");
|
||||
var_dump(sizeof ($output->columns) . " = end length == ");
|
||||
var_dump($output->columns);
|
||||
var_dump("= column output end = " . "\n");
|
||||
var_dump($output->groups);
|
||||
var_dump("=== " . "\n");
|
||||
var_dump(debug_backtrace());
|
||||
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
} */
|
||||
$group_list = array();
|
||||
foreach ($output->groups as $gkey => $gval) {
|
||||
foreach ($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if (trim($name) == trim($gval)) {
|
||||
$group_list[] = $alias;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if($column_list[$gval]) $output->arg_columns[] = $column_list[$gval];
|
||||
|
||||
}
|
||||
$groupby_query = sprintf(' group by %s', implode(',', $group_list));
|
||||
// var_dump($query);
|
||||
}
|
||||
|
||||
if ($output->order) {
|
||||
foreach ($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if (count($index_list)) $orderby_query = ' order by ' . implode(',', $index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = join(',',$output->arg_columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s", $columns, implode(',', $table_list), implode(' ', $left_join), $condition);
|
||||
$query = sprintf('%s offset %d limit %d', $query, $start_count, $list_count);
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
$result = $this->_query($query);
|
||||
if ($this->isError()) {
|
||||
$buff = new Object();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
|
||||
$virtual_no = $total_count - ($page - 1) * $list_count;
|
||||
while ($tmp = pg_fetch_object($result)) {
|
||||
$data[$virtual_no--] = $tmp;
|
||||
}
|
||||
|
||||
$buff = new Object();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
|
||||
function getParser(){
|
||||
return new DBParser('"');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -425,7 +425,7 @@
|
|||
}
|
||||
// sql injection 문제로 xml 선언이 number인 경우이면서 넘어온 값이 숫자형이 아니면 숫자형으로 강제 형변환
|
||||
// elseif(!$value || is_numeric($value)) $value = (int)$value;
|
||||
else $this->_filterNumber($value);
|
||||
else $this->_filterNumber(&$value);
|
||||
|
||||
$column_list[] = $name;
|
||||
$value_list[] = $value;
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
else {
|
||||
if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'";
|
||||
// sql injection 문제로 xml 선언이 number인 경우이면서 넘어온 값이 숫자형이 아니면 숫자형으로 강제 형변환
|
||||
else $this->_filterNumber($value);
|
||||
else $this->_filterNumber(&$value);
|
||||
|
||||
$column_list[] = sprintf("%s = %s", $name, $value);
|
||||
}
|
||||
|
|
@ -473,7 +473,7 @@
|
|||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
foreach($table_list as $key => $val) {
|
||||
$condition = preg_replace('/'.$key.'\\./i', $val.'.', $condition);
|
||||
$condition = eregi_replace($key.'\\.', $val.'.', $condition);
|
||||
}
|
||||
// List columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
|
|
|
|||
|
|
@ -399,389 +399,118 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return conditional clause(where)
|
||||
**/
|
||||
function getCondition($output) {
|
||||
if(!$output->conditions) return;
|
||||
$condition = $this->_getCondition($output->conditions,$output->column_type);
|
||||
if($condition) $condition = ' where '.$condition;
|
||||
return $condition;
|
||||
}
|
||||
/**
|
||||
* @brief insertAct
|
||||
* */
|
||||
function _executeInsertAct($queryObject) {
|
||||
$query = $this->getInsertSql($queryObject);
|
||||
if (is_a($query, 'Object'))
|
||||
return;
|
||||
|
||||
function getLeftCondition($conditions,$column_type){
|
||||
return $this->_getCondition($conditions,$column_type);
|
||||
}
|
||||
$this->_prepare($query);
|
||||
|
||||
$val_count = count($val_list);
|
||||
for ($i = 0; $i < $val_count; $i++)
|
||||
$this->_bind($val_list[$i]);
|
||||
|
||||
function _getCondition($conditions,$column_type) {
|
||||
$condition = '';
|
||||
foreach($conditions as $val) {
|
||||
$sub_condition = '';
|
||||
foreach($val['condition'] as $v) {
|
||||
if(!isset($v['value'])) continue;
|
||||
if($v['value'] === '') continue;
|
||||
if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue;
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
$name = $v['column'];
|
||||
$operation = $v['operation'];
|
||||
$value = $v['value'];
|
||||
$type = $this->getColumnType($column_type,$name);
|
||||
$pipe = $v['pipe'];
|
||||
/**
|
||||
* @brief updateAct
|
||||
* */
|
||||
function _executeUpdateAct($queryObject) {
|
||||
$query = $this->getUpdateSql($queryObject);
|
||||
if (is_a($query, 'Object'))
|
||||
return;
|
||||
|
||||
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
|
||||
if(!$value) $value = $v['value'];
|
||||
$str = $this->getConditionPart($name, $value, $operation);
|
||||
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
|
||||
$sub_condition .= $str;
|
||||
}
|
||||
if($sub_condition) {
|
||||
if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' ';
|
||||
$condition .= '('.$sub_condition.')';
|
||||
}
|
||||
}
|
||||
return $condition;
|
||||
}
|
||||
$this->_prepare($query);
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief insertAct
|
||||
**/
|
||||
function _executeInsertAct($output) {
|
||||
// list tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix.$val;
|
||||
}
|
||||
// list columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
/**
|
||||
* @brief deleteAct
|
||||
* */
|
||||
function _executeDeleteAct($queryObject) {
|
||||
$query = $this->getDeleteSql($queryObject);
|
||||
if (is_a($query, 'Object'))
|
||||
return;
|
||||
|
||||
$key_list[] = $name;
|
||||
$this->_prepare($query);
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
if($output->column_type[$name]!='number') $val_list[] = $this->addQuotes($value);
|
||||
else {
|
||||
$this->_filterNumber($value);
|
||||
$val_list[] = $value;
|
||||
}
|
||||
/**
|
||||
* @brief selectAct
|
||||
*
|
||||
* To fetch a list of the page conveniently when selecting, \n
|
||||
* navigation method supported
|
||||
* */
|
||||
function _executeSelectAct($queryObject) {
|
||||
$query = $this->getSelectSql($queryObject);
|
||||
if (is_a($query, 'Object'))
|
||||
return;
|
||||
|
||||
$prepare_list[] = '?';
|
||||
}
|
||||
$this->_prepare($query);
|
||||
$data = $this->_execute();
|
||||
if ($this->isError())
|
||||
return;
|
||||
|
||||
$query = sprintf("INSERT INTO %s (%s) VALUES (%s);", implode(',',$table_list), implode(',',$key_list), implode(',',$prepare_list));
|
||||
if ($this->isError())
|
||||
return $this->queryError($queryObject);
|
||||
else
|
||||
return $this->queryPageLimit($queryObject, $data);
|
||||
}
|
||||
|
||||
$this->_prepare($query);
|
||||
|
||||
$val_count = count($val_list);
|
||||
for($i=0;$i<$val_count;$i++) $this->_bind($val_list[$i]);
|
||||
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief updateAct
|
||||
**/
|
||||
function _executeUpdateAct($output) {
|
||||
$table_count = count(array_values($output->tables));
|
||||
// If a target table is one
|
||||
if($table_count == 1) {
|
||||
// list tables
|
||||
list($target_table) = array_values($output->tables);
|
||||
$target_table = $this->prefix.$target_table;
|
||||
// list columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
if(!isset($val['value'])) continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
|
||||
else {
|
||||
if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'";
|
||||
else $this->_filterNumber($value);
|
||||
|
||||
$column_list[] = sprintf("%s = %s", $name, $value);
|
||||
}
|
||||
}
|
||||
// List where cluase
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("update %s set %s %s", $target_table, implode(',',$column_list), $condition);
|
||||
// If tables to update are morea than two (In sqlite, it is possible to update a single table only. Let me know if you know a better way)
|
||||
} elseif($table_count == 2) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[$val] = $this->prefix.$key;
|
||||
}
|
||||
list($source_table, $target_table) = array_values($table_list);
|
||||
// List where cluase
|
||||
$condition = $this->getCondition($output);
|
||||
foreach($table_list as $key => $val) {
|
||||
$condition = preg_replace('/'.$key.'\\./i', $val.'.', $condition);
|
||||
}
|
||||
// List columns
|
||||
foreach($output->columns as $key => $val) {
|
||||
if(!isset($val['value'])) continue;
|
||||
$name = $val['name'];
|
||||
$value = $val['value'];
|
||||
list($s_prefix, $s_column) = explode('.',$name);
|
||||
list($t_prefix, $t_column) = explode('.',$value);
|
||||
|
||||
$s_table = $table_list[$s_prefix];
|
||||
$t_table = $table_list[$t_prefix];
|
||||
$column_list[] = sprintf(' %s = (select %s from %s %s) ', $s_column, $t_column, $t_table, $condition);
|
||||
}
|
||||
|
||||
$query = sprintf('update %s set %s where exists(select * from %s %s)', $source_table, implode(',', $column_list), $target_table, $condition);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->_prepare($query);
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief deleteAct
|
||||
**/
|
||||
function _executeDeleteAct($output) {
|
||||
// List tables
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix.$val;
|
||||
}
|
||||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
|
||||
|
||||
$this->_prepare($query);
|
||||
return $this->_execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief selectAct
|
||||
*
|
||||
* To fetch a list of the page conveniently when selecting, \n
|
||||
* navigation method supported
|
||||
**/
|
||||
function _executeSelectAct($output) {
|
||||
// List tables
|
||||
$table_list = array();
|
||||
foreach($output->tables as $key => $val) {
|
||||
$table_list[] = $this->prefix.$val.' as '.$key;
|
||||
}
|
||||
|
||||
$left_join = array();
|
||||
// why???
|
||||
$left_tables= (array)$output->left_tables;
|
||||
|
||||
foreach($left_tables as $key => $val) {
|
||||
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
|
||||
if($condition){
|
||||
$left_join[] = $val . ' '.$this->prefix.$output->_tables[$key].' as '.$key . ' on (' . $condition . ')';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$click_count = array();
|
||||
if(!$output->columns){
|
||||
$output->columns = array(array('name'=>'*'));
|
||||
}
|
||||
|
||||
$column_list = array();
|
||||
foreach($output->columns as $key => $val) {
|
||||
$name = $val['name'];
|
||||
$alias = $val['alias'];
|
||||
if($val['click_count']) $click_count[] = $val['name'];
|
||||
|
||||
if(substr($name,-1) == '*') {
|
||||
$column_list[] = $name;
|
||||
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
|
||||
if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias);
|
||||
else $column_list[] = sprintf('%s',$name);
|
||||
} else {
|
||||
if($alias) $column_list[$alias] = sprintf('%s as %s', $name, $alias);
|
||||
else $column_list[] = sprintf('%s',$name);
|
||||
}
|
||||
}
|
||||
$columns = implode(',',$column_list);
|
||||
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$output->column_list = $column_list;
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
|
||||
// add the condition to the query to use an index for ordering by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->groups)){
|
||||
$groupby_query = sprintf(' group by %s', implode(',',$output->groups));
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
foreach($output->groups as $group)
|
||||
{
|
||||
if($column_list[$group]) $output->arg_columns[] = $column_list[$group];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = join(',',$output->arg_columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
// apply when using list_count
|
||||
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
|
||||
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
$this->_prepare($query);
|
||||
$data = $this->_execute();
|
||||
if($this->isError()) return;
|
||||
|
||||
if(count($click_count)>0 && count($output->conditions)>0){
|
||||
$_query = '';
|
||||
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
|
||||
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
|
||||
$this->_query($_query);
|
||||
}
|
||||
|
||||
$buff = new Object();
|
||||
$buff->data = $data;
|
||||
return $buff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Paging is handled if navigation information exists in the query xml
|
||||
*
|
||||
* It is quite convenient although its structure is not good at all .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
/*
|
||||
// Modified to find total number of SELECT queries having group by clause
|
||||
// If it works correctly, uncomment the following codes
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
// Get a total count
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id . ' count(*)'):'';
|
||||
$this->_prepare($count_query);
|
||||
$count_output = $this->_execute();
|
||||
$total_count = (int)$count_output->count;
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
if(!$list_count) $list_count = 20;
|
||||
$page_count = $output->page_count['value'];
|
||||
if(!$page_count) $page_count = 10;
|
||||
$page = $output->page['value'];
|
||||
if(!$page) $page = 1;
|
||||
// Get a total page
|
||||
if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1;
|
||||
else $total_page = 1;
|
||||
// Check Page variables
|
||||
if($page > $total_page) $page = $total_page;
|
||||
$start_count = ($page-1)*$list_count;
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$col = $val[0];
|
||||
if(!in_array($col, array('list_order','update_order'))) continue;
|
||||
if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col);
|
||||
else $condition = sprintf(' where %s < 2100000000 ', $col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(count($output->groups)){
|
||||
$groupby_query = sprintf(' group by %s', implode(',',$output->groups));
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
foreach($output->groups as $group)
|
||||
{
|
||||
if($column_list[$group]) $output->arg_columns[] = $column_list[$group];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
|
||||
if(count($output->arg_columns) && $column_list[$val[0]]) $output->arg_columns[] = $column_list[$val[0]];
|
||||
}
|
||||
if(count($index_list)) $orderby_query = ' order by '.implode(',',$index_list);
|
||||
}
|
||||
|
||||
if(count($output->arg_columns))
|
||||
{
|
||||
$columns = join(',',$output->arg_columns);
|
||||
}
|
||||
|
||||
// Return the result
|
||||
$buff = new Object();
|
||||
function queryError($queryObject) {
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
$buff = new Object ();
|
||||
$buff->total_count = 0;
|
||||
$buff->total_page = 0;
|
||||
$buff->page = 1;
|
||||
$buff->data = array();
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
$buff->page_navigation = new PageHandler(/* $total_count */0, /* $total_page */1, /* $page */1, /* $page_count */10); //default page handler values
|
||||
return $buff;
|
||||
}else
|
||||
return;
|
||||
}
|
||||
|
||||
// Query Execution
|
||||
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
$query = sprintf('%s limit %d, %d', $query, $start_count, $list_count);
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
$this->_prepare($query);
|
||||
|
||||
if($this->isError()) {
|
||||
$this->setError($this->handler->errorCode(), print_r($this->handler->errorInfo(),true));
|
||||
$this->actFinish();
|
||||
return $buff;
|
||||
function queryPageLimit($queryObject, $data) {
|
||||
if ($queryObject->getLimit() && $queryObject->getLimit()->isPageHandler()) {
|
||||
// Total count
|
||||
$count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($queryObject->getWhereString() === '' ? '' : ' WHERE ' . $queryObject->getWhereString()));
|
||||
if ($queryObject->getGroupByString() != '') {
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
}
|
||||
|
||||
$this->stmt->execute();
|
||||
$count_query .= ( __DEBUG_QUERY__ & 1 && $output->query_id) ? sprintf(' ' . $this->comment_syntax, $this->query_id) : '';
|
||||
$this->_prepare($count_query);
|
||||
$count_output = $this->_execute();
|
||||
$total_count = (int) $count_output->count;
|
||||
|
||||
if($this->stmt->errorCode() != '00000') {
|
||||
$this->setError($this->stmt->errorCode(), print_r($this->stmt->errorInfo(),true));
|
||||
// Total pages
|
||||
if ($total_count) {
|
||||
$total_page = (int) (($total_count - 1) / $queryObject->getLimit()->list_count) + 1;
|
||||
} else
|
||||
$total_page = 1;
|
||||
|
||||
$this->_prepare($this->getSelectSql($queryObject));
|
||||
$this->stmt->execute();
|
||||
if ($this->stmt->errorCode() != '00000') {
|
||||
$this->setError($this->stmt->errorCode(), print_r($this->stmt->errorInfo(), true));
|
||||
$this->actFinish();
|
||||
return $buff;
|
||||
}
|
||||
|
||||
$output = null;
|
||||
$virtual_no = $total_count - ($page-1)*$list_count;
|
||||
while($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
$virtual_no = $total_count - ($queryObject->getLimit()->page - 1) * $queryObject->getLimit()->list_count;
|
||||
//$data = $this->_fetch($result, $virtual_no);
|
||||
while ($tmp = $this->stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
unset($obj);
|
||||
foreach($tmp as $key => $val) {
|
||||
foreach ($tmp as $key => $val) {
|
||||
$pos = strpos($key, '.');
|
||||
if($pos) $key = substr($key, $pos+1);
|
||||
if ($pos)
|
||||
$key = substr($key, $pos + 1);
|
||||
$obj->{$key} = $val;
|
||||
}
|
||||
$data[$virtual_no--] = $obj;
|
||||
|
|
@ -790,16 +519,21 @@
|
|||
$this->stmt = null;
|
||||
$this->actFinish();
|
||||
|
||||
$buff = new Object();
|
||||
$buff = new Object ();
|
||||
$buff->total_count = $total_count;
|
||||
$buff->total_page = $total_page;
|
||||
$buff->page = $page;
|
||||
$buff->page = $queryObject->getLimit()->page->getValue();
|
||||
$buff->data = $data;
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $queryObject->getLimit()->page->getValue(), $queryObject->getLimit()->page_count);
|
||||
}else {
|
||||
//$data = $this->_fetch($result);
|
||||
$buff = new Object ();
|
||||
$buff->data = $data;
|
||||
|
||||
$buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
|
||||
return $buff;
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return new DBSqlite3_pdo;
|
||||
?>
|
||||
|
|
|
|||
296
classes/db/queryparts/Query.class.php
Normal file
296
classes/db/queryparts/Query.class.php
Normal file
|
|
@ -0,0 +1,296 @@
|
|||
<?php
|
||||
|
||||
class Query extends Object {
|
||||
var $queryID;
|
||||
var $action;
|
||||
|
||||
var $columns;
|
||||
var $tables;
|
||||
var $conditions;
|
||||
var $groups;
|
||||
var $orderby;
|
||||
var $limit;
|
||||
|
||||
var $arguments = null;
|
||||
|
||||
var $columnList = null;
|
||||
|
||||
function Query($queryID = null
|
||||
, $action = null
|
||||
, $columns = null
|
||||
, $tables = null
|
||||
, $conditions = null
|
||||
, $groups = null
|
||||
, $orderby = null
|
||||
, $limit = null){
|
||||
$this->queryID = $queryID;
|
||||
$this->action = $action;
|
||||
|
||||
if(!isset($tables)) return;
|
||||
$this->columns = $this->setColumns($columns);
|
||||
$this->tables = $this->setTables($tables);
|
||||
$this->conditions = $this->setConditions($conditions);
|
||||
$this->groups = $this->setGroups($groups);
|
||||
$this->orderby = $this->setOrder($orderby);
|
||||
$this->limit = $this->setLimit($limit);
|
||||
}
|
||||
|
||||
function show(){
|
||||
return true;
|
||||
}
|
||||
|
||||
function setQueryId($queryID){
|
||||
$this->queryID = $queryID;
|
||||
}
|
||||
|
||||
function setAction($action){
|
||||
$this->action = $action;
|
||||
}
|
||||
|
||||
function setColumnList($columnList){
|
||||
$this->columnList = $columnList;
|
||||
}
|
||||
|
||||
function setColumns($columns){
|
||||
if(!isset($columns) || count($columns) === 0){
|
||||
$this->columns = array(new StarExpression());
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($columns)) $columns = array($columns);
|
||||
|
||||
$this->columns = $columns;
|
||||
}
|
||||
|
||||
function setTables($tables){
|
||||
if(!isset($tables) || count($tables) === 0){
|
||||
$this->setError(true);
|
||||
$this->setMessage("You must provide at least one table for the query.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($tables)) $tables = array($tables);
|
||||
|
||||
$this->tables = $tables;
|
||||
}
|
||||
|
||||
function setConditions($conditions){
|
||||
if(!isset($conditions) || count($conditions) === 0) return;
|
||||
if(!is_array($conditions)) $conditions = array($conditions);
|
||||
|
||||
$this->conditions = $conditions;
|
||||
}
|
||||
|
||||
function setGroups($groups){
|
||||
if(!isset($groups) || count($groups) === 0) return;
|
||||
if(!is_array($groups)) $groups = array($groups);
|
||||
|
||||
$this->groups = $groups;
|
||||
}
|
||||
|
||||
function setOrder($order){
|
||||
if(!isset($order) || count($order) === 0) return;
|
||||
if(!is_array($order)) $order = array($order);
|
||||
|
||||
$this->orderby = $order;
|
||||
}
|
||||
|
||||
function setLimit($limit = NULL){
|
||||
if(!isset($limit)) return;
|
||||
$this->limit = $limit;
|
||||
}
|
||||
|
||||
// START Fluent interface
|
||||
function select($columns= null){
|
||||
$this->action = 'select';
|
||||
$this->setColumns($columns);
|
||||
return $this;
|
||||
}
|
||||
|
||||
function from($tables){
|
||||
$this->setTables($tables);
|
||||
return $this;
|
||||
}
|
||||
|
||||
function where($conditions){
|
||||
$this->setConditions($conditions);
|
||||
return $this;
|
||||
}
|
||||
|
||||
function groupBy($groups){
|
||||
$this->setGroups($groups);
|
||||
return $this;
|
||||
}
|
||||
|
||||
function orderBy($order){
|
||||
$this->setOrder($order);
|
||||
return $this;
|
||||
}
|
||||
|
||||
function limit($limit){
|
||||
$this->setLimit($limit);
|
||||
return $this;
|
||||
}
|
||||
// END Fluent interface
|
||||
|
||||
function getAction(){
|
||||
return $this->action;
|
||||
}
|
||||
|
||||
function getSelectString($with_values = true){
|
||||
if(isset($this->columnList)){
|
||||
$selectColumns = array();
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
|
||||
foreach($this->columnList as $columnName){
|
||||
$columnName = $dbParser->escapeColumn($columnName);
|
||||
$selectColumns[] = new SelectExpression($columnName);
|
||||
}
|
||||
}
|
||||
else
|
||||
$selectColumns = $this->columns;
|
||||
|
||||
$select = '';
|
||||
foreach($selectColumns as $column){
|
||||
if($column->show())
|
||||
if(is_a($column, 'Subquery')){
|
||||
$select .= $column->toString($with_values) . ' as '. $column->getAlias() .', ';
|
||||
}
|
||||
else
|
||||
$select .= $column->getExpression($with_values) . ', ';
|
||||
}
|
||||
if(trim($select) == '') return '';
|
||||
$select = substr($select, 0, -2);
|
||||
return $select;
|
||||
}
|
||||
|
||||
function getUpdateString($with_values = true){
|
||||
return $this->getSelectString($with_values);
|
||||
}
|
||||
|
||||
function getInsertString($with_values = true){
|
||||
$columnsList = '';
|
||||
$valuesList = '';
|
||||
foreach($this->columns as $column){
|
||||
if($column->show()){
|
||||
$columnsList .= $column->getColumnName() . ', ';
|
||||
$valuesList .= $column->getValue($with_values) . ', ';
|
||||
}
|
||||
}
|
||||
$columnsList = substr($columnsList, 0, -2);
|
||||
$valuesList = substr($valuesList, 0, -2);
|
||||
|
||||
return "($columnsList) \n VALUES ($valuesList)";
|
||||
}
|
||||
|
||||
function getTables(){
|
||||
return $this->tables;
|
||||
}
|
||||
|
||||
// from table_a
|
||||
// from table_a inner join table_b on x=y
|
||||
// from (select * from table a) as x
|
||||
// from (select * from table t) as x inner join table y on y.x
|
||||
function getFromString($with_values = true){
|
||||
$from = '';
|
||||
$simple_table_count = 0;
|
||||
foreach($this->tables as $table){
|
||||
if($table->isJoinTable() || !$simple_table_count) $from .= $table->toString($with_values) . ' ';
|
||||
else $from .= ', '.$table->toString($with_values) . ' ';
|
||||
|
||||
if(is_a($table, 'Subquery')) $from .= $table->getAlias() ? ' as ' . $table->getAlias() . ' ' : ' ';
|
||||
|
||||
$simple_table_count++;
|
||||
}
|
||||
if(trim($from) == '') return '';
|
||||
return $from;
|
||||
}
|
||||
|
||||
function getWhereString($with_values = true){
|
||||
$where = '';
|
||||
if(count($this->conditions) > 0){
|
||||
$condition_count = 0;
|
||||
foreach($this->conditions as $conditionGroup){
|
||||
$condition_string = $conditionGroup->toString($with_values);
|
||||
if($condition_string !== '') $condition_count++;
|
||||
if($condition_count === 1){
|
||||
$conditionGroup->setPipe("");
|
||||
$condition_string = $conditionGroup->toString($with_values);
|
||||
}
|
||||
$where .= $condition_string;
|
||||
}
|
||||
if(trim($where) == '') return '';
|
||||
|
||||
}
|
||||
return $where;
|
||||
}
|
||||
|
||||
function getGroupByString(){
|
||||
$groupBy = '';
|
||||
if($this->groups) if($this->groups[0] !== "")
|
||||
$groupBy = implode(', ', $this->groups);
|
||||
return $groupBy;
|
||||
}
|
||||
|
||||
function getOrderByString(){
|
||||
if(count($this->orderby) === 0) return '';
|
||||
$orderBy = '';
|
||||
foreach($this->orderby as $order){
|
||||
$orderBy .= $order->toString() .', ';
|
||||
}
|
||||
$orderBy = substr($orderBy, 0, -2);
|
||||
return $orderBy;
|
||||
}
|
||||
|
||||
function getLimit(){
|
||||
return $this->limit;
|
||||
}
|
||||
|
||||
function getLimitString(){
|
||||
$limit = '';
|
||||
if(count($this->limit) > 0){
|
||||
$limit = '';
|
||||
$limit .= $this->limit->toString();
|
||||
}
|
||||
return $limit;
|
||||
}
|
||||
|
||||
function getFirstTableName(){
|
||||
return $this->tables[0]->getName();
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
if(!isset($this->arguments)){
|
||||
$this->arguments = array();
|
||||
|
||||
// Column arguments
|
||||
if(count($this->columns) > 0){ // The if is for delete statements, all others must have columns
|
||||
foreach($this->columns as $column){
|
||||
if($column->show()){
|
||||
$arg = $column->getArgument();
|
||||
if($arg) $this->arguments[] = $arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Condition arguments
|
||||
if(count($this->conditions) > 0)
|
||||
foreach($this->conditions as $conditionGroup){
|
||||
$args = $conditionGroup->getArguments();
|
||||
if(count($args) > 0) $this->arguments = array_merge($this->arguments, $args);
|
||||
}
|
||||
|
||||
// Navigation arguments
|
||||
if(count($this->orderby) > 0)
|
||||
foreach($this->orderby as $order){
|
||||
$args = $order->getArguments();
|
||||
if(count($args) > 0) $this->arguments = array_merge($this->arguments, $args);
|
||||
}
|
||||
}
|
||||
return $this->arguments;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
38
classes/db/queryparts/Subquery.class.php
Normal file
38
classes/db/queryparts/Subquery.class.php
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
class Subquery extends Query {
|
||||
var $alias;
|
||||
var $join_type;
|
||||
|
||||
function Subquery($alias, $columns, $tables, $conditions, $groups, $orderby, $limit, $join_type = null){
|
||||
$this->alias = $alias;
|
||||
|
||||
$this->queryID = null;
|
||||
$this->action = "select";
|
||||
|
||||
$this->columns = $columns;
|
||||
$this->tables = $tables;
|
||||
$this->conditions = $conditions;
|
||||
$this->groups = $groups;
|
||||
$this->orderby = $orderby;
|
||||
$this->limit = $limit;
|
||||
$this->join_type = $join_type;
|
||||
}
|
||||
|
||||
function getAlias(){
|
||||
return $this->alias;
|
||||
}
|
||||
|
||||
function isJoinTable(){
|
||||
if($this->join_type) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function toString($with_values = true){
|
||||
$oDB = &DB::getInstance();
|
||||
return '(' .$oDB->getSelectSql($this, $with_values) . ')';
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
140
classes/db/queryparts/condition/Condition.class.php
Normal file
140
classes/db/queryparts/condition/Condition.class.php
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
<?php
|
||||
|
||||
class Condition {
|
||||
var $column_name;
|
||||
var $argument;
|
||||
var $operation;
|
||||
var $pipe;
|
||||
|
||||
var $_value;
|
||||
|
||||
function Condition($column_name, $argument, $operation, $pipe = ""){
|
||||
$this->column_name = $column_name;
|
||||
$this->argument = $argument;
|
||||
$this->operation = $operation;
|
||||
$this->pipe = $pipe;
|
||||
if($this->hasArgument())
|
||||
$this->_value = $argument->getValue();
|
||||
else if(is_a($this->argument, 'Subquery'))
|
||||
$this->_value = $argument->toString();
|
||||
else
|
||||
$this->_value = $argument;
|
||||
}
|
||||
|
||||
function hasArgument(){
|
||||
return is_a($this->argument, 'Argument');
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
if($this->hasArgument()) return $this->argument;
|
||||
return null;
|
||||
}
|
||||
|
||||
function toString($withValue = true){
|
||||
if(!$this->show()) return '';
|
||||
if($withValue)
|
||||
return $this->toStringWithValue();
|
||||
return $this->toStringWithoutValue();
|
||||
}
|
||||
|
||||
function toStringWithoutValue(){
|
||||
if($this->hasArgument()){
|
||||
$value = $this->argument->getUnescapedValue();
|
||||
|
||||
if(is_array($value)){
|
||||
$q = '';
|
||||
foreach ($value as $v) $q .= '?,';
|
||||
if($q !== '') $q = substr($q, 0, -1);
|
||||
$q = '(' . $q . ')';
|
||||
}
|
||||
else $q = '?';
|
||||
return $this->pipe . ' ' . $this->getConditionPart($q);
|
||||
}
|
||||
else return $this->toString();
|
||||
}
|
||||
|
||||
function toStringWithValue(){
|
||||
return $this->pipe . ' ' . $this->getConditionPart($this->_value);
|
||||
}
|
||||
|
||||
function setPipe($pipe){
|
||||
$this->pipe = $pipe;
|
||||
}
|
||||
|
||||
function show(){
|
||||
if($this->hasArgument() && !$this->argument->isValid()) return false;
|
||||
if($this->hasArgument() && ($this->_value === '\'\'')) return false;
|
||||
if(is_array($this->_value) && count($this->_value) === 1 && $this->_value[0] === '') return false;
|
||||
switch($this->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($this->_value)) return false;
|
||||
if($this->_value === '') return false;
|
||||
if(!in_array(gettype($this->_value), array('string', 'integer'))) return false;
|
||||
break;
|
||||
case 'between' :
|
||||
if(!is_array($this->_value)) return false;
|
||||
if(count($this->_value)!=2) return false;
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function getConditionPart($value) {
|
||||
$name = $this->column_name;
|
||||
$operation = $this->operation;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
50
classes/db/queryparts/condition/ConditionGroup.class.php
Normal file
50
classes/db/queryparts/condition/ConditionGroup.class.php
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
class ConditionGroup {
|
||||
var $conditions;
|
||||
var $pipe;
|
||||
|
||||
function ConditionGroup($conditions, $pipe = "") {
|
||||
$this->conditions = $conditions;
|
||||
$this->pipe = $pipe;
|
||||
}
|
||||
|
||||
function setPipe($pipe){
|
||||
$this->pipe = $pipe;
|
||||
}
|
||||
|
||||
function toString($with_value = true){
|
||||
if($this->pipe !== "")
|
||||
$group = $this->pipe .' (';
|
||||
else $group = '';
|
||||
|
||||
$cond_indx = 0;
|
||||
|
||||
foreach($this->conditions as $condition){
|
||||
if($condition->show()){
|
||||
if($cond_indx === 0) $condition->setPipe("");
|
||||
$group .= $condition->toString($with_value) . ' ';
|
||||
$cond_indx++;
|
||||
}
|
||||
}
|
||||
// If the group has no conditions in it, return ''
|
||||
if($cond_indx === 0) return '';
|
||||
|
||||
if($this->pipe !== "")
|
||||
$group .= ')';
|
||||
|
||||
return $group;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$args = array();
|
||||
foreach($this->conditions as $condition){
|
||||
if($condition->show()){
|
||||
$arg = $condition->getArgument();
|
||||
if($arg) $args[] = $arg;
|
||||
}
|
||||
}
|
||||
return $args;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
35
classes/db/queryparts/expression/DeleteExpression.class.php
Normal file
35
classes/db/queryparts/expression/DeleteExpression.class.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
/**
|
||||
* @class DeleteExpression
|
||||
* @author Arnia Software
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
|
||||
// TODO Fix this class
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
30
classes/db/queryparts/expression/Expression.class.php
Normal file
30
classes/db/queryparts/expression/Expression.class.php
Normal 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() {
|
||||
}
|
||||
}
|
||||
35
classes/db/queryparts/expression/InsertExpression.class.php
Normal file
35
classes/db/queryparts/expression/InsertExpression.class.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class InsertExpression
|
||||
* @author Arnia Software
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
|
||||
class InsertExpression extends Expression {
|
||||
var $argument;
|
||||
|
||||
function InsertExpression($column_name, $argument){
|
||||
parent::Expression($column_name);
|
||||
$this->argument = $argument;
|
||||
}
|
||||
|
||||
function getValue($with_values = true){
|
||||
if($with_values)
|
||||
return $this->argument->getValue();
|
||||
return '?';
|
||||
}
|
||||
|
||||
function show(){
|
||||
$value = $this->argument->getValue();
|
||||
if(!isset($value)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return $this->argument;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
36
classes/db/queryparts/expression/SelectExpression.class.php
Normal file
36
classes/db/queryparts/expression/SelectExpression.class.php
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
<?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;
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
?>
|
||||
20
classes/db/queryparts/expression/StarExpression.class.php
Normal file
20
classes/db/queryparts/expression/StarExpression.class.php
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class StarExpression
|
||||
* @author Corina
|
||||
* @brief Represents the * in 'select * from ...' statements
|
||||
*
|
||||
*/
|
||||
|
||||
class StarExpression extends SelectExpression {
|
||||
|
||||
function StarExpression(){
|
||||
parent::SelectExpression("*");
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
?>
|
||||
56
classes/db/queryparts/expression/UpdateExpression.class.php
Normal file
56
classes/db/queryparts/expression/UpdateExpression.class.php
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
/**
|
||||
* @class UpdateExpression
|
||||
* @author Arnia Software
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
|
||||
class UpdateExpression extends Expression {
|
||||
var $argument;
|
||||
|
||||
function UpdateExpression($column_name, $argument){
|
||||
parent::Expression($column_name);
|
||||
$this->argument = $argument;
|
||||
}
|
||||
|
||||
function getExpression($with_value = true){
|
||||
if($with_value)
|
||||
return $this->getExpressionWithValue();
|
||||
return $this->getExpressionWithoutValue();
|
||||
}
|
||||
|
||||
function getExpressionWithValue(){
|
||||
$value = $this->argument->getValue();
|
||||
$operation = $this->argument->getColumnOperation();
|
||||
if(isset($operation))
|
||||
return "$this->column_name = $this->column_name $operation $value";
|
||||
return "$this->column_name = $value";
|
||||
}
|
||||
|
||||
function getExpressionWithoutValue(){
|
||||
$operation = $this->argument->getColumnOperation();
|
||||
if(isset($operation))
|
||||
return "$this->column_name = $this->column_name $operation ?";
|
||||
return "$this->column_name = ?";
|
||||
}
|
||||
|
||||
function getValue(){
|
||||
// TODO Escape value according to column type instead of variable type
|
||||
$value = $this->argument->getValue();
|
||||
if(!is_numeric($value)) return "'".$value."'";
|
||||
return $value;
|
||||
}
|
||||
|
||||
function show(){
|
||||
if(!$this->argument->getValue()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return $this->argument;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
35
classes/db/queryparts/limit/Limit.class.php
Normal file
35
classes/db/queryparts/limit/Limit.class.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
class Limit {
|
||||
var $start;
|
||||
var $list_count;
|
||||
var $page_count;
|
||||
var $page;
|
||||
|
||||
function Limit($list_count, $page= NULL, $page_count= NULL){
|
||||
$this->list_count = $list_count;
|
||||
if ($page){
|
||||
$this->start = ($page-1)*$list_count->getValue();
|
||||
$this->page_count = $page_count;
|
||||
$this->page = $page;
|
||||
}
|
||||
}
|
||||
|
||||
function isPageHandler(){//in case you choose to use query limit in other cases than page select
|
||||
if ($this->page)return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
function getOffset(){
|
||||
return $this->start;
|
||||
}
|
||||
|
||||
function getLimit(){
|
||||
return $this->list_count->getValue();
|
||||
}
|
||||
|
||||
function toString(){
|
||||
if ($this->page) return $this->start . ' , ' . $this->list_count->getValue();
|
||||
else return $this->list_count->getValue();
|
||||
}
|
||||
}
|
||||
?>
|
||||
27
classes/db/queryparts/order/OrderByColumn.class.php
Normal file
27
classes/db/queryparts/order/OrderByColumn.class.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?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(){
|
||||
$result = is_a($this->column_name, 'Argument') ? $this->column_name->getValue() : $this->column_name;
|
||||
$result .= ' ';
|
||||
$result .= is_a($this->sort_order, 'Argument') ? $this->sort_order->getValue() : $this->sort_order;
|
||||
return $result;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$args = array();
|
||||
if(is_a($this->column_name, 'Argument'))
|
||||
$args[]= $this->column_name;
|
||||
if(is_a($this->sort_order, 'Argument'))
|
||||
$args[] = $this->sort_order;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
37
classes/db/queryparts/table/JoinTable.class.php
Normal file
37
classes/db/queryparts/table/JoinTable.class.php
Normal 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($with_value = true){
|
||||
$part = $this->join_type . ' ' . $this->name ;
|
||||
$part .= $this->alias ? ' as ' . $this->alias : '';
|
||||
$part .= ' on ';
|
||||
foreach($this->conditions as $conditionGroup)
|
||||
$part .= $conditionGroup->toString($with_value);
|
||||
return $part;
|
||||
}
|
||||
|
||||
function isJoinTable(){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
30
classes/db/queryparts/table/Table.class.php
Normal file
30
classes/db/queryparts/table/Table.class.php
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
class Table {
|
||||
var $name;
|
||||
var $alias;
|
||||
|
||||
function Table($name, $alias = NULL){
|
||||
$this->name = $name;
|
||||
$this->alias = $alias;
|
||||
}
|
||||
|
||||
function toString(){
|
||||
//return $this->name;
|
||||
return sprintf("%s%s", $this->name, $this->alias ? ' as ' . $this->alias : '');
|
||||
}
|
||||
|
||||
function getName(){
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
function getAlias(){
|
||||
return $this->alias;
|
||||
}
|
||||
|
||||
function isJoinTable(){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -179,12 +179,10 @@ class HTMLDisplayHandler {
|
|||
if(Context::get('module')=='admin' || strpos(Context::get('act'),'Admin')>0){
|
||||
if(__DEBUG__) {
|
||||
$oContext->addCSSFile('./modules/admin/tpl/css/admin.css', false, 'all', '', 100000);
|
||||
//$oContext->addJsFile('./modules/admin/tpl/js/admin.js');
|
||||
$oContext->addJsFile('http://svn.xpressengine.com/internal/etc/xeAdmin/js/admin.js');
|
||||
$oContext->addJsFile('./modules/admin/tpl/js/admin.js');
|
||||
} else {
|
||||
$oContext->addCSSFile('./modules/admin/tpl/css/admin.min.css', false, 'all', '',10000);
|
||||
//$oContext->addJsFile('./modules/admin/tpl/js/admin.js');
|
||||
$oContext->addJsFile('http://svn.xpressengine.com/internal/etc/xeAdmin/js/admin.js');
|
||||
$oContext->addJsFile('./modules/admin/tpl/js/admin.js');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,558 +1,70 @@
|
|||
<?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
|
||||
**/
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/QueryParser.class.php');
|
||||
|
||||
class XmlQueryParser extends XmlParser {
|
||||
|
||||
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}
|
||||
**/
|
||||
static $dbParser = null;
|
||||
var $db_type;
|
||||
|
||||
function XmlQueryParser($db_type = NULL){
|
||||
$this->db_type = $db_type;
|
||||
}
|
||||
|
||||
function &getInstance($db_type = NULL){
|
||||
static $theInstance = null;
|
||||
if(!isset($theInstance)){
|
||||
$theInstance = new XmlQueryParser($db_type);
|
||||
}
|
||||
return $theInstance;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
$parser = new QueryParser($xml_obj->query);
|
||||
|
||||
FileHandler::writeFile($cache_file, $parser->toString());
|
||||
}
|
||||
|
||||
// singleton
|
||||
function &getDBParser(){
|
||||
if(!$self->dbParser){
|
||||
is_a($this,'XmlQueryParser')?$self=&$this:$self=&XmlQueryParser::getInstance();
|
||||
if(isset($self->db_type))
|
||||
$oDB = &DB::getInstance($self->db_type);
|
||||
else
|
||||
$oDB = &DB::getInstance();
|
||||
$self->dbParser = $oDB->getParser();
|
||||
}
|
||||
return $self->dbParser;
|
||||
}
|
||||
|
||||
function setDBParser($value){
|
||||
$self->dbParser = $value;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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;
|
||||
return $xml_obj;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
108
classes/xml/xmlquery/DBParser.class.php
Normal file
108
classes/xml/xmlquery/DBParser.class.php
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
<?php
|
||||
class DBParser {
|
||||
var $escape_char_left;
|
||||
var $escape_char_right;
|
||||
var $table_prefix;
|
||||
|
||||
function DBParser($escape_char_left, $escape_char_right = "", $table_prefix = "xe_"){
|
||||
$this->escape_char_left = $escape_char_left;
|
||||
if ($escape_char_right !== "")$this->escape_char_right = $escape_char_right;
|
||||
else $this->escape_char_right = $escape_char_left;
|
||||
$this->table_prefix = $table_prefix;
|
||||
}
|
||||
|
||||
function getEscapeChar($leftOrRight){
|
||||
if ($leftOrRight === 'left')return $this->escape_char_left;
|
||||
else return $this->escape_char_right;
|
||||
}
|
||||
|
||||
function escape($name){
|
||||
return $this->escape_char_left . $name . $this->escape_char_right;
|
||||
}
|
||||
|
||||
function escapeString($name){
|
||||
return "'".$this->escapeStringValue($name)."'";
|
||||
}
|
||||
|
||||
function escapeStringValue($value){
|
||||
if($value == "*") return $value;
|
||||
if (is_string($value)) return $value = str_replace("'","''",$value);
|
||||
return $value;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
74
classes/xml/xmlquery/QueryParser.class.php
Normal file
74
classes/xml/xmlquery/QueryParser.class.php
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<?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/table/TablesTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionsTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/JoinConditionsTag.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');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/query/QueryTag.class.php');
|
||||
|
||||
class QueryParser {
|
||||
var $queryTag;
|
||||
|
||||
function QueryParser($query, $isSubQuery = false){
|
||||
$this->queryTag = new QueryTag($query, $isSubQuery);
|
||||
}
|
||||
|
||||
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 toString(){
|
||||
return "<?php if(!defined('__ZBXE__')) exit();\n"
|
||||
.$this->queryTag->toString()
|
||||
. 'return $query; ?>';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
173
classes/xml/xmlquery/argument/Argument.class.php
Normal file
173
classes/xml/xmlquery/argument/Argument.class.php
Normal file
|
|
@ -0,0 +1,173 @@
|
|||
<?php
|
||||
|
||||
class Argument {
|
||||
var $value;
|
||||
var $name;
|
||||
var $type;
|
||||
|
||||
var $isValid;
|
||||
var $errorMessage;
|
||||
|
||||
var $column_operation;
|
||||
|
||||
function Argument($name, $value){
|
||||
$this->value = $value;
|
||||
$this->name = $name;
|
||||
$this->isValid = true;
|
||||
}
|
||||
|
||||
function getType(){
|
||||
if(isset($this->type)) return $this->type;
|
||||
if(is_string($this->value)) return 'column_name';
|
||||
return 'number';
|
||||
}
|
||||
|
||||
function setColumnType($value){
|
||||
$this->type = $value;
|
||||
}
|
||||
|
||||
function setColumnOperation($operation){
|
||||
$this->column_operation = $operation;
|
||||
}
|
||||
|
||||
function getName(){
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
function getValue(){
|
||||
$value = $this->getEscapedValue();
|
||||
return $this->toString($value);
|
||||
}
|
||||
|
||||
function getColumnOperation(){
|
||||
return $this->column_operation;
|
||||
}
|
||||
|
||||
function getEscapedValue(){
|
||||
return $this->escapeValue($this->value);
|
||||
}
|
||||
|
||||
function getUnescapedValue(){
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
function toString($value){
|
||||
if(is_array($value)) return '('.implode(',', $value).')';
|
||||
return $value;
|
||||
}
|
||||
|
||||
function escapeValue($value){
|
||||
if($this->getType() == 'column_name'){
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
return $dbParser->parseExpression($value);
|
||||
}
|
||||
if(!isset($value)) return null;
|
||||
if(in_array($this->type, array('date', 'varchar', 'char','text', 'bigtext'))){
|
||||
if(!is_array($value))
|
||||
$value = $this->_escapeStringValue ($value);
|
||||
else {
|
||||
$total = count($value);
|
||||
for($i = 0; $i < $total; $i++)
|
||||
$value[$i] = $this->_escapeStringValue($value[$i]);
|
||||
//$value[$i] = '\''.$value[$i].'\'';
|
||||
}
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
function _escapeStringValue($value){
|
||||
$db = &DB::getInstance();
|
||||
$value = $db->addQuotes($value);
|
||||
return '\''.$value.'\'';
|
||||
|
||||
}
|
||||
|
||||
function isValid(){
|
||||
return $this->isValid;
|
||||
}
|
||||
|
||||
function getErrorMessage(){
|
||||
return $this->errorMessage;
|
||||
}
|
||||
|
||||
function ensureDefaultValue($default_value){
|
||||
if(!isset($this->value) || $this->value == '')
|
||||
$this->value = $default_value;
|
||||
}
|
||||
|
||||
function checkFilter($filter_type){
|
||||
if(isset($this->value) && $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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
56
classes/xml/xmlquery/argument/ConditionArgument.class.php
Normal file
56
classes/xml/xmlquery/argument/ConditionArgument.class.php
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
class ConditionArgument extends Argument {
|
||||
var $operation;
|
||||
|
||||
|
||||
function ConditionArgument($name, $value, $operation){
|
||||
if(isset($value) && in_array($operation, array('in', 'not in', 'between')) && !is_array($value)){
|
||||
$value = explode(',', $value);
|
||||
}
|
||||
parent::Argument($name, $value);
|
||||
$this->operation = $operation;
|
||||
|
||||
if($this->type !== 'date'){
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
$this->value = $dbParser->escapeStringValue($this->value);
|
||||
}
|
||||
}
|
||||
|
||||
function createConditionValue(){
|
||||
if(!isset($this->value)) return;
|
||||
|
||||
$name = $this->column_name;
|
||||
$operation = $this->operation;
|
||||
$value = $this->value;
|
||||
|
||||
switch($operation) {
|
||||
case 'like_prefix' :
|
||||
$this->value = $value.'%';
|
||||
break;
|
||||
case 'like_tail' :
|
||||
$this->value = '%'.$value;
|
||||
break;
|
||||
case 'like' :
|
||||
$this->value = '%'.$value.'%';
|
||||
break;
|
||||
case 'in':
|
||||
if(!is_array($value)) $this->value = array($value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getType(){
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
function setColumnType($column_type){
|
||||
if(!isset($this->value)) return;
|
||||
if($column_type === '') return;
|
||||
|
||||
$this->type = $column_type;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
11
classes/xml/xmlquery/argument/SortArgument.class.php
Normal file
11
classes/xml/xmlquery/argument/SortArgument.class.php
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
class SortArgument extends Argument {
|
||||
|
||||
function getValue(){
|
||||
return $this->getUnescapedValue();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
97
classes/xml/xmlquery/queryargument/DefaultValue.class.php
Normal file
97
classes/xml/xmlquery/queryargument/DefaultValue.class.php
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<?php
|
||||
|
||||
class DefaultValue {
|
||||
var $column_name;
|
||||
var $value;
|
||||
var $is_sequence = false;
|
||||
var $is_operation = false;
|
||||
var $operation = '';
|
||||
|
||||
function DefaultValue($column_name, $value){
|
||||
$dbParser = &XmlQueryParser::getDBParser();
|
||||
$this->column_name = $dbParser->parseColumnName($column_name);
|
||||
$this->value = $value;
|
||||
$this->value = $this->_setValue();
|
||||
}
|
||||
|
||||
function isString(){
|
||||
$str_pos = strpos($this->value, '(');
|
||||
if($str_pos===false) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function isSequence(){
|
||||
return $this->is_sequence;
|
||||
}
|
||||
|
||||
function isOperation(){
|
||||
return $this->is_operation;
|
||||
}
|
||||
|
||||
function getOperation(){
|
||||
return $this->operation;
|
||||
}
|
||||
|
||||
function _setValue(){
|
||||
if(!isset($this->value)) return;
|
||||
|
||||
// If value contains comma separated values and does not contain paranthesis
|
||||
// -> default value is an array
|
||||
if(strpos($this->value, ',') !== false && strpos($this->value, '(') === false) {
|
||||
return sprintf('array(%s)', $this->value);
|
||||
}
|
||||
|
||||
$str_pos = strpos($this->value, '(');
|
||||
// // TODO Replace this with parseExpression
|
||||
if($str_pos===false) return '\''.$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' :
|
||||
$this->is_sequence = true;
|
||||
$val = '$sequence';
|
||||
break;
|
||||
case 'plus' :
|
||||
$args = abs($args);
|
||||
$this->is_operation = true;
|
||||
$this->operation = '+';
|
||||
$val = sprintf('%d', $args);
|
||||
break;
|
||||
case 'minus' :
|
||||
$args = abs($args);
|
||||
$this->is_operation = true;
|
||||
$this->operation = '-';
|
||||
$val = sprintf('%d', $args);
|
||||
break;
|
||||
case 'multiply' :
|
||||
$args = intval($args);
|
||||
$this->is_operation = true;
|
||||
$this->operation = '*';
|
||||
$val = sprintf('%d', $args);
|
||||
break;
|
||||
default :
|
||||
$val = '\'' . $this->value . '\'';
|
||||
//$val = $this->value;
|
||||
}
|
||||
|
||||
return $val;
|
||||
}
|
||||
|
||||
function toString(){
|
||||
return $this->value;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
87
classes/xml/xmlquery/queryargument/QueryArgument.class.php
Normal file
87
classes/xml/xmlquery/queryargument/QueryArgument.class.php
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
class QueryArgument {
|
||||
var $argument_name;
|
||||
var $variable_name;
|
||||
var $argument_validator;
|
||||
var $column_name;
|
||||
var $operation;
|
||||
|
||||
static $number_of_arguments = 0;
|
||||
|
||||
function QueryArgument($tag){
|
||||
$this->argument_name = $tag->attrs->var;
|
||||
if(!$this->argument_name) $this->argument_name = $tag->attrs->name;
|
||||
if(!$this->argument_name) $this->argument_name = str_replace('.', '_',$tag->attrs->column);
|
||||
|
||||
$this->variable_name = $this->argument_name;
|
||||
|
||||
self::$number_of_arguments++;
|
||||
$this->argument_name .= self::$number_of_arguments;
|
||||
|
||||
$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($tag->attrs->operation) $this->operation = $tag->attrs->operation;
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php');
|
||||
$this->argument_validator = new QueryArgumentValidator($tag, $this);
|
||||
|
||||
}
|
||||
|
||||
function getArgumentName(){
|
||||
return $this->argument_name;
|
||||
}
|
||||
|
||||
function getColumnName(){
|
||||
return $this->column_name;
|
||||
}
|
||||
|
||||
function getValidatorString(){
|
||||
return $this->argument_validator->toString();
|
||||
}
|
||||
|
||||
function isConditionArgument(){
|
||||
if($this->operation) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function toString(){
|
||||
if($this->isConditionArgument())
|
||||
$arg = sprintf("\n$%s_argument = new ConditionArgument('%s', %s, '%s');\n"
|
||||
, $this->argument_name
|
||||
, $this->argument_name
|
||||
, '$args->'.$this->variable_name
|
||||
, $this->operation
|
||||
);
|
||||
|
||||
else
|
||||
$arg = sprintf("\n$%s_argument = new Argument('%s', %s);\n"
|
||||
, $this->argument_name
|
||||
, $this->argument_name
|
||||
, '$args->'.$this->variable_name);
|
||||
|
||||
|
||||
$arg .= $this->argument_validator->toString();
|
||||
|
||||
if($this->isConditionArgument()){
|
||||
$arg .= sprintf("$%s_argument->createConditionValue();\n"
|
||||
, $this->argument_name
|
||||
);
|
||||
}
|
||||
|
||||
$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 SortQueryArgument extends QueryArgument{
|
||||
function toString(){
|
||||
$arg = sprintf("\n$%s_argument = new SortArgument('%s', %s);\n"
|
||||
, $this->argument_name
|
||||
, $this->argument_name
|
||||
, '$args->'.$this->variable_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,70 @@
|
|||
<?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;
|
||||
|
||||
var $argument;
|
||||
|
||||
function QueryArgumentValidator($tag, $argument){
|
||||
$this->argument = $argument;
|
||||
$this->argument_name = $this->argument->getArgumentName();
|
||||
|
||||
$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);
|
||||
if($this->default_value->isSequence())
|
||||
$validator .= '$db = &DB::getInstance(); $sequence = $db->getNextSequence(); ';
|
||||
if($this->default_value->isOperation())
|
||||
$validator .= sprintf("$%s_argument->setColumnOperation('%s');\n"
|
||||
, $this->argument_name
|
||||
, $this->default_value->getOperation()
|
||||
);
|
||||
$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 {
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
19
classes/xml/xmlquery/tags/column/ColumnTag.class.php
Normal file
19
classes/xml/xmlquery/tags/column/ColumnTag.class.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* @class ColumnTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file
|
||||
*
|
||||
* Since the <column> tag supports different attributes depending on
|
||||
* the type of query (select, update, insert, delete) this is only
|
||||
* the base class for the classes that will model each type <column> tag.
|
||||
*
|
||||
**/
|
||||
|
||||
class ColumnTag {
|
||||
var $name;
|
||||
|
||||
function ColumnTag($name){
|
||||
$this->name = $name;
|
||||
}
|
||||
}
|
||||
32
classes/xml/xmlquery/tags/column/InsertColumnTag.class.php
Normal file
32
classes/xml/xmlquery/tags/column/InsertColumnTag.class.php
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
/**
|
||||
* @class InsertColumnTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file whose action is 'insert'
|
||||
*
|
||||
**/
|
||||
|
||||
|
||||
class InsertColumnTag extends ColumnTag {
|
||||
var $argument;
|
||||
|
||||
function InsertColumnTag($column) {
|
||||
parent::ColumnTag($column->attrs->name);
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
$this->name = $dbParser->parseColumnName($this->name);
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
$this->argument = new QueryArgument($column);
|
||||
}
|
||||
|
||||
function getExpressionString(){
|
||||
return sprintf('new InsertExpression(\'%s\', $%s_argument)'
|
||||
, $this->name
|
||||
, $this->argument->argument_name);
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return $this->argument;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
49
classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php
Normal file
49
classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
/**
|
||||
* @class InsertColumnsTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file whose action is 'insert'
|
||||
*
|
||||
**/
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTag.class.php');
|
||||
|
||||
class InsertColumnsTag{
|
||||
var $columns;
|
||||
|
||||
function InsertColumnsTag($xml_columns) {
|
||||
$this->columns = array();
|
||||
|
||||
if(!$xml_columns)
|
||||
return;
|
||||
|
||||
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
|
||||
|
||||
foreach($xml_columns as $column){
|
||||
if($column->name === 'query') $this->columns[] = new QueryTag($column, true);
|
||||
else $this->columns[] = new InsertColumnTag($column);
|
||||
}
|
||||
}
|
||||
|
||||
function toString(){
|
||||
$output_columns = 'array(' . PHP_EOL;
|
||||
foreach($this->columns as $column){
|
||||
$output_columns .= $column->getExpressionString() . PHP_EOL . ',';
|
||||
}
|
||||
$output_columns = substr($output_columns, 0, -1);
|
||||
$output_columns .= ')';
|
||||
return $output_columns;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
foreach($this->columns as $column){
|
||||
$arguments[] = $column->getArgument();
|
||||
}
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
34
classes/xml/xmlquery/tags/column/SelectColumnTag.class.php
Normal file
34
classes/xml/xmlquery/tags/column/SelectColumnTag.class.php
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class SelectColumnTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file whose action is 'select'
|
||||
*
|
||||
**/
|
||||
|
||||
class SelectColumnTag extends ColumnTag{
|
||||
var $alias;
|
||||
var $click_count;
|
||||
|
||||
function SelectColumnTag($column){
|
||||
parent::ColumnTag($column->attrs->name);
|
||||
if(!$this->name) $this->name = "*";
|
||||
if($this->name != "*") {
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
$this->name = $dbParser->parseExpression($this->name);
|
||||
}
|
||||
|
||||
$this->alias = $column->attrs->alias;
|
||||
$this->click_count = $column->attrs->click_count;
|
||||
}
|
||||
|
||||
function getExpressionString(){
|
||||
if($this->name == '*') return "new StarExpression()";
|
||||
if($this->click_count)
|
||||
return sprintf('new ClickCountExpression(%s, %s, $args->%s)', $this->name, $this->alias,$this->click_count);
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': '');
|
||||
}
|
||||
}
|
||||
?>
|
||||
60
classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php
Normal file
60
classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnTag.class.php');
|
||||
|
||||
class SelectColumnsTag {
|
||||
var $columns;
|
||||
|
||||
function SelectColumnsTag($xml_columns_tag){
|
||||
$xml_columns = $xml_columns_tag->column;
|
||||
$xml_queries = $xml_columns_tag->query;
|
||||
|
||||
$this->columns = array();
|
||||
|
||||
if(!$xml_columns) {
|
||||
$this->columns[] = new SelectColumnTag("*");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
|
||||
|
||||
foreach($xml_columns as $column){
|
||||
$this->columns[] = new SelectColumnTag($column);
|
||||
}
|
||||
|
||||
|
||||
if(!$xml_queries) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($xml_queries)) $xml_queries = array($xml_queries);
|
||||
|
||||
foreach($xml_queries as $column){
|
||||
$this->columns[] = new QueryTag($column, true);
|
||||
}
|
||||
}
|
||||
|
||||
function toString(){
|
||||
$output_columns = 'array(' . PHP_EOL;
|
||||
foreach($this->columns as $column){
|
||||
if(is_a($column, 'QueryTag'))
|
||||
$output_columns .= $column->toString() . PHP_EOL . ',';
|
||||
else
|
||||
$output_columns .= $column->getExpressionString() . PHP_EOL . ',';
|
||||
}
|
||||
$output_columns = substr($output_columns, 0, -1);
|
||||
$output_columns .= ')';
|
||||
return $output_columns;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
foreach($this->columns as $column){
|
||||
if(is_a($column, 'QueryTag'))
|
||||
$arguments = array_merge($arguments, $column->getArguments());
|
||||
}
|
||||
return $arguments;
|
||||
}
|
||||
}
|
||||
?>
|
||||
34
classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php
Normal file
34
classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class UpdateColumnTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file whose action is 'update'
|
||||
*
|
||||
**/
|
||||
|
||||
|
||||
|
||||
class UpdateColumnTag extends ColumnTag {
|
||||
var $argument;
|
||||
|
||||
function UpdateColumnTag($column) {
|
||||
parent::ColumnTag($column->attrs->name);
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
$this->name = $dbParser->parseColumnName($this->name);
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
$this->argument = new QueryArgument($column);
|
||||
}
|
||||
|
||||
function getExpressionString(){
|
||||
return sprintf('new UpdateExpression(\'%s\', $%s_argument)'
|
||||
, $this->name
|
||||
, $this->argument->argument_name);
|
||||
}
|
||||
|
||||
function getArgument(){
|
||||
return $this->argument;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
47
classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php
Normal file
47
classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class UpdateColumnsTag
|
||||
* @author Arnia Software
|
||||
* @brief Models the <column> tag inside an XML Query file whose action is 'update'
|
||||
*
|
||||
**/
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php');
|
||||
|
||||
class UpdateColumnsTag{
|
||||
var $columns;
|
||||
|
||||
function UpdateColumnsTag($xml_columns) {
|
||||
$this->columns = array();
|
||||
|
||||
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
|
||||
|
||||
foreach($xml_columns as $column){
|
||||
if($column->name === 'query') $this->columns[] = new QueryTag($column, true);
|
||||
else $this->columns[] = new UpdateColumnTag($column);
|
||||
}
|
||||
}
|
||||
|
||||
function toString(){
|
||||
$output_columns = 'array(' . PHP_EOL;
|
||||
foreach($this->columns as $column){
|
||||
$output_columns .= $column->getExpressionString() . PHP_EOL . ',';
|
||||
}
|
||||
$output_columns = substr($output_columns, 0, -1);
|
||||
$output_columns .= ')';
|
||||
return $output_columns;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
foreach($this->columns as $column){
|
||||
$arguments[] = $column->getArgument();
|
||||
}
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
class ConditionGroupTag {
|
||||
var $conditions;
|
||||
var $pipe;
|
||||
|
||||
function ConditionGroupTag($conditions, $pipe = ""){
|
||||
$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){
|
||||
//if($condition->node_name === 'query') $this->conditions[] = new QueryTag($condition, true);
|
||||
$this->conditions[] = new ConditionTag($condition);
|
||||
}
|
||||
}
|
||||
|
||||
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 = array_merge($arguments, $condition->getArguments());
|
||||
}
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
69
classes/xml/xmlquery/tags/condition/ConditionTag.class.php
Normal file
69
classes/xml/xmlquery/tags/condition/ConditionTag.class.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class ConditionTag
|
||||
* @author Corina
|
||||
* @brief Models the <condition> tag inside an XML Query file. Base class.
|
||||
*
|
||||
*/
|
||||
|
||||
class ConditionTag {
|
||||
var $operation;
|
||||
var $column_name;
|
||||
|
||||
var $pipe;
|
||||
var $argument_name;
|
||||
var $argument;
|
||||
var $default_column;
|
||||
|
||||
var $query;
|
||||
function ConditionTag($condition){
|
||||
$this->operation = $condition->attrs->operation;
|
||||
$this->pipe = $condition->attrs->pipe;
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
$this->column_name = $dbParser->parseColumnName($condition->attrs->column);
|
||||
|
||||
$isColumnName = strpos($condition->attrs->default, '.');
|
||||
$isColumnName = $isColumnName || strpos($condition->attrs->var, '.');
|
||||
|
||||
if($condition->node_name == 'query'){
|
||||
$this->query = new QueryTag($condition, true);
|
||||
$this->default_column = $this->query->toString();
|
||||
}
|
||||
else if(($condition->attrs->var && !$isColumnName) || $isColumnName === false){
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
|
||||
$this->argument = new QueryArgument($condition);
|
||||
$this->argument_name = $this->argument->getArgumentName();
|
||||
}
|
||||
else {
|
||||
if($condition->attrs->default)
|
||||
$this->default_column = "'" . $dbParser->parseColumnName($condition->attrs->default) . "'" ;
|
||||
else
|
||||
$this->default_column = "'" . $dbParser->parseColumnName($condition->attrs->var) . "'" ;
|
||||
}
|
||||
}
|
||||
|
||||
function setPipe($pipe){
|
||||
$this->pipe = $pipe;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
if($this->query)
|
||||
$arguments = array_merge($arguments, $this->query->getArguments());
|
||||
if($this->argument)
|
||||
$arguments[] = $this->argument;
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
function getConditionString(){
|
||||
return sprintf("new Condition('%s',%s,%s%s)"
|
||||
, $this->column_name
|
||||
, $this->default_column ? $this->default_column: '$' . $this->argument_name . '_argument'
|
||||
, '"'.$this->operation.'"'
|
||||
, $this->pipe ? ", '" . $this->pipe . "'" : ''
|
||||
);
|
||||
}
|
||||
}
|
||||
?>
|
||||
50
classes/xml/xmlquery/tags/condition/ConditionsTag.class.php
Normal file
50
classes/xml/xmlquery/tags/condition/ConditionsTag.class.php
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
class ConditionsTag {
|
||||
var $condition_groups;
|
||||
|
||||
function ConditionsTag($xml_conditions){
|
||||
$this->condition_groups = array();
|
||||
|
||||
$xml_condition_list = array();
|
||||
if($xml_conditions->condition)
|
||||
$xml_condition_list = $xml_conditions->condition;
|
||||
|
||||
if($xml_conditions->query){
|
||||
if(!is_array($xml_condition_list)) $xml_condition_list = array($xml_condition_list);
|
||||
if(!is_array($xml_conditions->query)) $xml_conditions->query = array($xml_conditions->query);
|
||||
$xml_condition_list = array_merge($xml_condition_list, $xml_conditions->query);
|
||||
}
|
||||
if($xml_condition_list){
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php');
|
||||
$this->condition_groups[] = new ConditionGroupTag($xml_condition_list);
|
||||
}
|
||||
|
||||
$xml_groups = $xml_conditions->group;
|
||||
if($xml_groups){
|
||||
if(!is_array($xml_groups)) $xml_groups = array($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, $group->attrs->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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
<?php
|
||||
|
||||
class JoinConditionsTag extends ConditionsTag {
|
||||
|
||||
function JoinConditionsTag($xml_conditions){
|
||||
parent::ConditionsTag($xml_conditions);
|
||||
$this->condition_groups[0]->conditions[0]->setPipe("");
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
35
classes/xml/xmlquery/tags/group/GroupsTag.class.php
Normal file
35
classes/xml/xmlquery/tags/group/GroupsTag.class.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
class GroupsTag {
|
||||
var $groups;
|
||||
|
||||
function GroupsTag($xml_groups){
|
||||
$this->groups = array();
|
||||
|
||||
if($xml_groups) {
|
||||
if(!is_array($xml_groups)) $xml_groups = array($xml_groups);
|
||||
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
for($i=0;$i<count($xml_groups);$i++) {
|
||||
$group = $xml_groups[$i];
|
||||
$column = trim($group->attrs->column);
|
||||
if(!$column) continue;
|
||||
|
||||
$column = $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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
45
classes/xml/xmlquery/tags/navigation/IndexTag.class.php
Normal file
45
classes/xml/xmlquery/tags/navigation/IndexTag.class.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
class IndexTag {
|
||||
var $argument_name;
|
||||
var $argument;
|
||||
var $default;
|
||||
var $sort_order;
|
||||
var $sort_order_argument;
|
||||
|
||||
function IndexTag($index){
|
||||
$this->argument_name = $index->attrs->var;
|
||||
|
||||
// Sort index - column by which to sort
|
||||
//$dbParser = XmlQueryParser::getDBParser();
|
||||
//$index->attrs->default = $dbParser->parseExpression($index->attrs->default);
|
||||
$this->default = $index->attrs->default;
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/SortQueryArgument.class.php');
|
||||
$this->argument = new QueryArgument($index);
|
||||
|
||||
// Sort order - asc / desc
|
||||
$this->sort_order = $index->attrs->order;
|
||||
if(!in_array($this->sort_order, array("asc", "desc"))){
|
||||
$arg->attrs->var = $this->sort_order;
|
||||
$arg->attrs->default = 'asc';
|
||||
$this->sort_order_argument = new SortQueryArgument($arg);
|
||||
$this->sort_order = '$'.$this->sort_order_argument->getArgumentName().'_argument';
|
||||
}
|
||||
else $this->sort_order = '"'.$this->sort_order.'"';
|
||||
}
|
||||
|
||||
function toString(){
|
||||
return sprintf("new OrderByColumn(\$%s_argument, %s)", $this->argument->getArgumentName(), $this->sort_order);
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
$arguments[] = $this->argument;
|
||||
if($this->sort_order_argument)
|
||||
$arguments[] = $this->sort_order_argument;
|
||||
return $arguments;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
33
classes/xml/xmlquery/tags/navigation/LimitTag.class.php
Normal file
33
classes/xml/xmlquery/tags/navigation/LimitTag.class.php
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
class LimitTag {
|
||||
var $arguments;
|
||||
var $page;
|
||||
var $page_count;
|
||||
var $list_count;
|
||||
|
||||
function LimitTag($index){
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
|
||||
if($index->page->attrs && $index->page_count->attrs){
|
||||
$this->page = $index->page->attrs;
|
||||
$this->page_count = $index->page_count->attrs;
|
||||
$this->arguments[] = new QueryArgument($index->page);
|
||||
$this->arguments[] = new QueryArgument($index->page_count);
|
||||
}
|
||||
|
||||
$this->list_count = new QueryArgument($index->list_count);
|
||||
$this->arguments[] = $this->list_count;
|
||||
}
|
||||
|
||||
function toString(){
|
||||
$name = $this->list_count->getArgumentName();
|
||||
if ($this->page)return sprintf("new Limit(\$%s_argument, \$%s_argument, \$%s_argument)",$name, $name, $name);
|
||||
else return sprintf("new Limit(\$%s_argument)", $name);
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
return $this->arguments;
|
||||
}
|
||||
}
|
||||
?>
|
||||
62
classes/xml/xmlquery/tags/navigation/NavigationTag.class.php
Normal file
62
classes/xml/xmlquery/tags/navigation/NavigationTag.class.php
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/LimitTag.class.php');
|
||||
|
||||
class NavigationTag {
|
||||
var $order;
|
||||
var $list_count;
|
||||
var $page_count;
|
||||
var $page;
|
||||
var $limit;
|
||||
|
||||
function NavigationTag($xml_navigation){
|
||||
$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);
|
||||
}
|
||||
}
|
||||
|
||||
if($xml_navigation->page->attrs || $xml_navigation->list_count->attrs)
|
||||
$this->limit = new LimitTag($xml_navigation);
|
||||
|
||||
$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 getLimitString(){
|
||||
if ($this->limit) return $this->limit->toString();
|
||||
else return "";
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
foreach($this->order as $order){
|
||||
$arguments = array_merge($order->getArguments(), $arguments);
|
||||
}
|
||||
if($this->limit) $arguments = array_merge($this->limit->getArguments(), $arguments);
|
||||
return $arguments;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
181
classes/xml/xmlquery/tags/query/QueryTag.class.php
Normal file
181
classes/xml/xmlquery/tags/query/QueryTag.class.php
Normal file
|
|
@ -0,0 +1,181 @@
|
|||
<?php
|
||||
|
||||
class QueryTag {
|
||||
var $action;
|
||||
var $query_id;
|
||||
var $column_type;
|
||||
var $query;
|
||||
|
||||
//xml tags
|
||||
var $columns;
|
||||
var $tables;
|
||||
var $conditions;
|
||||
var $groups;
|
||||
var $navigation;
|
||||
var $arguments;
|
||||
var $preBuff;
|
||||
var $buff;
|
||||
var $isSubQuery;
|
||||
|
||||
var $join_type;
|
||||
var $alias;
|
||||
|
||||
function QueryTag($query, $isSubQuery = false){
|
||||
$this->action = $query->attrs->action;
|
||||
$this->query_id = $query->attrs->id;
|
||||
$this->query = $query;
|
||||
$this->isSubQuery = $isSubQuery;
|
||||
if($this->isSubQuery) $this->action = 'select';
|
||||
$this->alias = $query->attrs->alias;
|
||||
$this->join_type = $query->attrs->join_type;
|
||||
|
||||
$this->getColumns();
|
||||
$tables = $this->getTables();
|
||||
$this->setTableColumnTypes($tables);
|
||||
$this->getConditions();
|
||||
$this->getGroups();
|
||||
$this->getNavigation();
|
||||
$this->getPrebuff();
|
||||
$this->getBuff();
|
||||
}
|
||||
|
||||
function show(){
|
||||
return true;
|
||||
}
|
||||
|
||||
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 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){
|
||||
if(is_a($table_tag, 'TableTag')){
|
||||
$tag_column_type = QueryParser::getTableInfo($query_id, $table_tag->getTableName());
|
||||
$column_type = array_merge($column_type, $tag_column_type);
|
||||
}
|
||||
}
|
||||
$this->column_type[$query_id] = $column_type;
|
||||
}
|
||||
}
|
||||
|
||||
function getColumns(){
|
||||
if($this->action == 'select'){
|
||||
return $this->columns = new SelectColumnsTag($this->query->columns);
|
||||
}else if($this->action == 'insert'){
|
||||
return $this->columns = new InsertColumnsTag($this->query->columns->column);
|
||||
}else if($this->action == 'update') {
|
||||
return $this->columns = new UpdateColumnsTag($this->query->columns->column);
|
||||
}else if($this->action == 'delete') {
|
||||
return $this->columns = null;
|
||||
}
|
||||
}
|
||||
|
||||
function getPrebuff(){
|
||||
// TODO Check if this work with arguments in join clause
|
||||
$arguments = $this->getArguments();
|
||||
|
||||
$prebuff = '';
|
||||
foreach($arguments as $argument){
|
||||
if(isset($argument) && $argument->getArgumentName()){
|
||||
$prebuff .= $argument->toString();
|
||||
$column_type = $this->column_type[$this->getQueryId()][$argument->getColumnName()];
|
||||
if(isset($column_type))
|
||||
$prebuff .= sprintf("$%s_argument->setColumnType('%s');\n"
|
||||
, $argument->getArgumentName()
|
||||
, $column_type );
|
||||
}
|
||||
}
|
||||
$prebuff .= "\n";
|
||||
|
||||
return $this->preBuff = $prebuff;
|
||||
}
|
||||
|
||||
function getBuff(){
|
||||
$buff = '';
|
||||
if($this->isSubQuery){
|
||||
$buff = 'new Subquery(';
|
||||
$buff .= "'\"" . $this->alias . '"\', ';
|
||||
$buff .= ($this->columns ? $this->columns->toString() : 'null' ). ', '.PHP_EOL;
|
||||
$buff .= $this->tables->toString() .','.PHP_EOL;
|
||||
$buff .= $this->conditions->toString() .',' .PHP_EOL;
|
||||
$buff .= $this->groups->toString() . ',' .PHP_EOL;
|
||||
$buff .= $this->navigation->getOrderByString() .','.PHP_EOL;
|
||||
$limit = $this->navigation->getLimitString() ;
|
||||
$buff .= $limit ? $limit : 'null' . PHP_EOL;
|
||||
$buff .= $this->join_type ? "'" . $this->join_type . "'" : '';
|
||||
$buff .= ')';
|
||||
|
||||
$this->buff = $buff;
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
$buff .= '$query = new Query();'.PHP_EOL;
|
||||
$buff .= sprintf('$query->setQueryId("%s");%s', $this->query_id, "\n");
|
||||
$buff .= sprintf('$query->setAction("%s");%s', $this->action, "\n");
|
||||
$buff .= $this->preBuff;
|
||||
if($this->columns)
|
||||
$buff .= '$query->setColumns(' . $this->columns->toString() . ');'.PHP_EOL;
|
||||
|
||||
$buff .= '$query->setTables(' . $this->tables->toString() .');'.PHP_EOL;
|
||||
$buff .= '$query->setConditions('.$this->conditions->toString() .');'.PHP_EOL;
|
||||
$buff .= '$query->setGroups(' . $this->groups->toString() . ');'.PHP_EOL;
|
||||
$buff .= '$query->setOrder(' . $this->navigation->getOrderByString() .');'.PHP_EOL;
|
||||
$buff .= '$query->setLimit(' . $this->navigation->getLimitString() .');'.PHP_EOL;
|
||||
|
||||
$this->buff = $buff;
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
function getTables(){
|
||||
return $this->tables = new TablesTag($this->query->tables);
|
||||
}
|
||||
|
||||
function getConditions(){
|
||||
return $this->conditions = new ConditionsTag($this->query->conditions);
|
||||
}
|
||||
|
||||
function getGroups(){
|
||||
return $this->groups = new GroupsTag($this->query->groups->group);
|
||||
}
|
||||
|
||||
function getNavigation(){
|
||||
return $this->navigation = new NavigationTag($this->query->navigation);
|
||||
}
|
||||
|
||||
function toString(){
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
function getTableString(){
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
function getConditionString(){
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
function getExpressionString(){
|
||||
return $this->buff;
|
||||
}
|
||||
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
if($this->columns)
|
||||
$arguments = array_merge($arguments, $this->columns->getArguments());
|
||||
$arguments = array_merge($arguments, $this->tables->getArguments());
|
||||
$arguments = array_merge($arguments, $this->conditions->getArguments());
|
||||
$arguments = array_merge($arguments, $this->navigation->getArguments());
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
88
classes/xml/xmlquery/tags/table/TableTag.class.php
Normal file
88
classes/xml/xmlquery/tags/table/TableTag.class.php
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class TableTag
|
||||
* @author Arnia Sowftare
|
||||
* @brief Models the <table> tag inside an XML Query file
|
||||
*
|
||||
* @abstract
|
||||
* Example
|
||||
* <table name="modules" />
|
||||
* <table name="documents" alias="doc" />
|
||||
* Attributes
|
||||
* name - name of the table - table prefix will be automatically added
|
||||
* alias - table alias. If no value is specified, the table name will be set as default alias
|
||||
* join_type - in case the table is part of a join clause, this specifies the type of join: left, right etc.
|
||||
* - permitted values: 'left join','left outer join','right join','right outer join'
|
||||
* Children
|
||||
* Can have children of type <conditions>
|
||||
*/
|
||||
|
||||
class TableTag {
|
||||
var $unescaped_name;
|
||||
var $name;
|
||||
var $alias;
|
||||
var $join_type;
|
||||
var $conditions;
|
||||
var $conditionsTag;
|
||||
/**
|
||||
* @brief Initialises Table Tag properties
|
||||
* @param XML <table> tag $table
|
||||
*/
|
||||
function TableTag($table){
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
|
||||
$this->unescaped_name = $table->attrs->name;
|
||||
$this->name = $dbParser->parseTableName($table->attrs->name);
|
||||
|
||||
$this->alias = $table->attrs->alias;
|
||||
if(!$this->alias) $this->alias = $table->attrs->name;
|
||||
|
||||
$this->join_type = $table->attrs->type;
|
||||
|
||||
$this->conditions = $table->conditions;
|
||||
|
||||
if($this->isJoinTable())
|
||||
$this->conditionsTag = new JoinConditionsTag($this->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;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns string for printing in PHP query cache file
|
||||
* The string contains code for instantiation of either
|
||||
* a Table or a JoinTable object
|
||||
* @return string
|
||||
*/
|
||||
function getTableString(){
|
||||
$dbParser = XmlQueryParser::getDBParser();
|
||||
if($this->isJoinTable()){
|
||||
return sprintf('new JoinTable(\'%s\', \'%s\', "%s", %s)'
|
||||
, $dbParser->escape($this->name)
|
||||
, $dbParser->escape($this->alias)
|
||||
, $this->join_type, $this->conditionsTag->toString());
|
||||
}
|
||||
return sprintf('new Table(\'%s\'%s)'
|
||||
, $dbParser->escape($this->name)
|
||||
, $this->alias ? ', \'' . $dbParser->escape($this->alias) .'\'' : '');
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
if(!isset($this->conditionsTag)) return array();
|
||||
return $this->conditionsTag->getArguments();
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
64
classes/xml/xmlquery/tags/table/TablesTag.class.php
Normal file
64
classes/xml/xmlquery/tags/table/TablesTag.class.php
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @class TablesTag
|
||||
* @author Arnia Sowftare
|
||||
* @brief Models the <tables> tag inside an XML Query file
|
||||
*
|
||||
* @abstract
|
||||
* Example
|
||||
* <tables>
|
||||
* <table name="documents" alias="doc" />
|
||||
* </tables>
|
||||
* Attributes
|
||||
* None.
|
||||
* Children
|
||||
* Can have children of type <table> or <query>
|
||||
*/
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php');
|
||||
|
||||
class TablesTag {
|
||||
var $tables;
|
||||
|
||||
function TablesTag($xml_tables_tag){
|
||||
$this->tables = array();
|
||||
|
||||
$xml_tables = $xml_tables_tag->table;
|
||||
if(!is_array($xml_tables)) $xml_tables = array($xml_tables);
|
||||
|
||||
foreach($xml_tables as $tag){
|
||||
if($tag->attrs->query == 'true'){
|
||||
$this->tables[] = new QueryTag($tag, true);
|
||||
}
|
||||
else {
|
||||
$this->tables[] = new TableTag($tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getTables(){
|
||||
return $this->tables;
|
||||
}
|
||||
|
||||
function toString(){
|
||||
$output_tables = 'array(' . PHP_EOL;
|
||||
foreach($this->tables as $table){
|
||||
if(is_a($table, 'QueryTag'))
|
||||
$output_tables .= $table->toString() . PHP_EOL . ',';
|
||||
else
|
||||
$output_tables .= $table->getTableString() . PHP_EOL . ',';
|
||||
}
|
||||
$output_tables = substr($output_tables, 0, -1);
|
||||
$output_tables .= ')';
|
||||
return $output_tables;
|
||||
}
|
||||
|
||||
function getArguments(){
|
||||
$arguments = array();
|
||||
foreach($this->tables as $table)
|
||||
$arguments = array_merge($arguments, $table->getArguments());
|
||||
return $arguments;
|
||||
}
|
||||
}
|
||||
?>
|
||||
23
test-phpUnit/Helper.class.php
Normal file
23
test-phpUnit/Helper.class.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
class Helper {
|
||||
static function cleanString($query){
|
||||
$query = trim(preg_replace('/\s+/', ' ',$query));
|
||||
$query = preg_replace('/\t+/', '',$query);
|
||||
$query = str_replace(" , ", ', ', $query);
|
||||
$query = str_replace(" ,", ',', $query);
|
||||
$query = str_replace("( ", '(', $query);
|
||||
$query = str_replace(" )", ')', $query);
|
||||
$query = str_replace(array("\r", "\r\n", "\n"), '*', $query);
|
||||
$query = strtolower($query);
|
||||
return $query;
|
||||
}
|
||||
|
||||
static function getXmlObject($xml_file){
|
||||
$xmlParser = XmlQueryParser::getInstance();
|
||||
return $xmlParser->getXmlFileContent($xml_file);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
320
test-phpUnit/QueryTester.class.php
Normal file
320
test-phpUnit/QueryTester.class.php
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
<?php
|
||||
|
||||
// Only supports queries inside modules for now
|
||||
|
||||
class QueryTester {
|
||||
|
||||
function QueryTester(){
|
||||
|
||||
}
|
||||
|
||||
function getQueryPath($type, $name, $query_name){
|
||||
return _XE_PATH_ . $type ."/".$name."/queries/" . $query_name . ".xml";
|
||||
}
|
||||
|
||||
function getNewParserOutput($xml_file){
|
||||
$newXmlQueryParser = new XmlQueryParser();
|
||||
$xml_obj = $newXmlQueryParser->getXmlFileContent($xml_file);
|
||||
$parser = new QueryParser($xml_obj->query);
|
||||
return $parser->toString();
|
||||
}
|
||||
|
||||
function getOldParserOutput($query_id, $xml_file){
|
||||
$cache_file = _TEST_PATH_ . "cache/".$query_id.'.cache.php';
|
||||
$parser = new OldXmlQueryParser();
|
||||
$parser->parse($query_id, $xml_file, $cache_file);
|
||||
$buff = FileHandler::readFile($cache_file);
|
||||
return $buff;
|
||||
}
|
||||
|
||||
function cleanOutputAndAddArgs($outputString, $argsString = ''){
|
||||
$outputString = str_replace("<?php if(!defined('__ZBXE__')) exit();", "", $outputString);
|
||||
$outputString = str_replace("?>", "", $outputString);
|
||||
$outputString = $argsString . $outputString;
|
||||
return $outputString;
|
||||
}
|
||||
|
||||
function getXmlFileContent($xml_file){
|
||||
return FileHandler::readFile($xml_file);
|
||||
}
|
||||
|
||||
function printOutput($output){
|
||||
if(is_object($output)) {
|
||||
var_dump($output); return;
|
||||
}
|
||||
$output = htmlspecialchars($output);
|
||||
|
||||
$output = preg_replace('/select/i', 'SELECT', $output);
|
||||
$output = preg_replace('/from/i', '<br/>FROM', $output);
|
||||
$output = preg_replace('/where/i', '<br/>WHERE', $output);
|
||||
$output = preg_replace('/group by/i', '<br/>GROUP BY', $output);
|
||||
$output = preg_replace('/order by/i', '<br/>ORDER BY', $output);
|
||||
|
||||
$output = str_replace("\n", "<br/>", $output);
|
||||
|
||||
echo '<pre class=prettyprint>'
|
||||
.$output
|
||||
.'</pre>';
|
||||
}
|
||||
|
||||
function getNewParserOutputString($xml_file, $argsString){
|
||||
$outputString = '';
|
||||
$outputString = $this->getNewParserOutput($xml_file);
|
||||
$outputString = $this->cleanOutputAndAddArgs($outputString, $argsString);
|
||||
return $outputString;
|
||||
}
|
||||
|
||||
function getNewParserQuery($outputString){
|
||||
//echo $outputString;
|
||||
//exit(0);
|
||||
$output = eval($outputString);
|
||||
if(is_a($output, 'Object'))
|
||||
if(!$output->toBool()) return("Date incorecte! Query-ul nu a putut fi executat.");
|
||||
$db = new DBCubrid();
|
||||
if($output->getAction() == 'select')
|
||||
return $db->getSelectSql($output);
|
||||
else if($output->getAction() == 'insert')
|
||||
return $db->getInsertSql($output);
|
||||
else if($output->getAction() == 'update')
|
||||
return $db->getUpdateSql($output);
|
||||
else if($output->getAction() == 'delete')
|
||||
return $db->getDeleteSql($output);
|
||||
}
|
||||
|
||||
function testNewParser($xml_file, $escape_char, $argsString, $show_output_string){
|
||||
$outputString = $this->getNewParserOutputString($xml_file, $escape_char, $argsString);
|
||||
$query = $this->getNewParserQuery($outputString);
|
||||
|
||||
echo '<tr>';
|
||||
if($show_output_string){
|
||||
echo '<td>';
|
||||
$this->printOutput($outputString);
|
||||
echo '</td>';
|
||||
}
|
||||
|
||||
echo '<td>';
|
||||
$this->printOutput($query);
|
||||
echo '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
|
||||
function getOldParserOutputString($query_id, $xml_file, $argsString){
|
||||
$outputString = $this->getOldParserOutput($query_id, $xml_file);
|
||||
$outputString = $this->cleanOutputAndAddArgs($outputString, $argsString);
|
||||
return $outputString;
|
||||
}
|
||||
|
||||
function getOldParserQuery($outputString){
|
||||
$output = eval($outputString);
|
||||
if(is_a($output, 'Object'))
|
||||
if(!$output->toBool()) exit("Date incorecte! Query-ul nu a putut fi executat.");
|
||||
|
||||
/* SQL Server
|
||||
*
|
||||
$db = new DBMssql(false);
|
||||
if($output->action == "select")
|
||||
return $db->_executeSelectAct($output);
|
||||
else if($output->action == "insert")
|
||||
return $db->_executeInsertAct($output);
|
||||
else if($output->action == "delete")
|
||||
return $db->_executeDeleteAct($output);
|
||||
else if($output->action == "update")
|
||||
return $db->_executeUpdateAct($output);
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mysql
|
||||
*/
|
||||
$db = new DBMysql(false);
|
||||
if($output->action == "select")
|
||||
$db->_executeSelectAct($output);
|
||||
else if($output->action == "insert")
|
||||
$db->_executeInsertAct($output);
|
||||
else if($output->action == "delete")
|
||||
$db->_executeDeleteAct($output);
|
||||
else if($output->action == "update")
|
||||
$db->_executeUpdateAct($output);
|
||||
return $db->getLatestQuery();
|
||||
}
|
||||
|
||||
function testOldParser($query_id, $xml_file, $argsString, $show_output_string){
|
||||
$outputString = $this->getOldParserOutputString($query_id, $xml_file, $argsString);
|
||||
$query = $this->getOldParserQuery($outputString);
|
||||
|
||||
|
||||
echo '<tr>';
|
||||
if($show_output_string){
|
||||
echo '<td>';
|
||||
$this->printOutput($outputString);
|
||||
echo '</td>';
|
||||
}
|
||||
|
||||
echo '<td>';
|
||||
$this->printOutput($query);
|
||||
echo '</td>';
|
||||
echo '</tr>';
|
||||
}
|
||||
|
||||
function showXmlInputFile($xml_file){
|
||||
echo '<tr colspan=2>';
|
||||
echo '<td>';
|
||||
$xml_file_content = $this->getXmlFileContent($xml_file);
|
||||
$this->printOutput($xml_file_content);
|
||||
echo '</td></tr>';
|
||||
}
|
||||
|
||||
function test($query_id, $xml_file, $argsString, $show_output_string, $escape_char = '"'){
|
||||
echo "<h3>$query_id</h3>";
|
||||
echo '<table border=1 cellpadding=5 cellspacing=0 width=50%>';
|
||||
|
||||
$this->showXmlInputFile($xml_file);
|
||||
|
||||
$this->testNewParser($xml_file, $escape_char, $argsString, $show_output_string);
|
||||
|
||||
//$this->testOldParser($query_id, $xml_file, $argsString, $show_output_string);
|
||||
|
||||
echo '</table>';
|
||||
}
|
||||
|
||||
function test_addon_getAddonInfo($show_output_string = false){
|
||||
$argsString = '$args->addon = "captcha";';
|
||||
$this->test("modules.addon.getAddonInfo"
|
||||
, $this->getQueryPath("modules", "addon", "getAddonInfo")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_addon_getAddons($show_output_string = false){
|
||||
$argsString = '';
|
||||
$this->test("modules.addon.getAddons"
|
||||
, $this->getQueryPath("modules", "addon", "getAddons")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_admin_getCommentCount($show_output_string = false){
|
||||
$argsString = '';
|
||||
$this->test("modules.admin.getCommentCount"
|
||||
, $this->getQueryPath("modules", "admin", "getCommentCount")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_admin_getCommentDeclaredStatus($show_output_string = false){
|
||||
$argsString = '$args->date = "20110411";';
|
||||
$this->test("modules.admin.getCommentDeclaredStatus"
|
||||
, $this->getQueryPath("modules", "admin", "getCommentDeclaredStatus")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_module_getDefaultModules($show_output_string = false){
|
||||
$argsString = '';
|
||||
$this->test("modules.module.getDefaultModules"
|
||||
, $this->getQueryPath("modules", "module", "getDefaultModules")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_module_getModuleCategories($show_output_string = false){
|
||||
$argsString = '';
|
||||
$this->test("modules.module.getModuleCategories"
|
||||
, $this->getQueryPath("modules", "module", "getModuleCategories")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_module_getNonuniqueDomains($show_output_string = false){
|
||||
$argsString = '';
|
||||
$this->test("modules.module.getNonuniqueDomains"
|
||||
, $this->getQueryPath("modules", "module", "getNonuniqueDomains")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_module_getAdminId($show_output_string = false){
|
||||
$argsString = '$args->module_srl = 23;';
|
||||
$this->test("modules.module.getAdminId"
|
||||
, $this->getQueryPath("modules", "module", "getAdminId")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
function test_module_getSiteInfo($show_output_string = false){
|
||||
$argsString = '$args->site_srl = 0;';
|
||||
$this->test("modules.module.getSiteInfo"
|
||||
, $this->getQueryPath("modules", "module", "getSiteInfo")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
function test_module_insertModule($show_output_string = false){
|
||||
$argsString = ' $args->module_category_srl = 0;
|
||||
$args->browser_title = "test";
|
||||
$args->layout_srl = 0;
|
||||
$args->mlayout_srl = 0;
|
||||
$args->module = "page";
|
||||
$args->mid = "test";
|
||||
$args->site_srl = 0;
|
||||
$args->module_srl = 47374;';
|
||||
$this->test("modules.module.insertModule"
|
||||
, $this->getQueryPath("modules", "module", "insertModule")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
function test_module_updateModule($show_output_string = false){
|
||||
$argsString = ' $args->module_category_srl = 0;
|
||||
$args->browser_title = "test";
|
||||
$args->layout_srl = 0;
|
||||
$args->mlayout_srl = 0;
|
||||
$args->module = "page";
|
||||
$args->mid = "test";
|
||||
$args->use_mobile = "";
|
||||
$args->site_srl = 0;
|
||||
$args->module_srl = 47374;';
|
||||
$this->test("modules.module.updateModule"
|
||||
, $this->getQueryPath("modules", "module", "updateModule")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
function test_admin_deleteActionForward($show_output_string = false){
|
||||
$argsString = '$args->module = "page";
|
||||
$args->type = "page";
|
||||
$args->act = "tata";';
|
||||
$this->test("modules.admin.deleteActionForward"
|
||||
, $this->getQueryPath("modules", "module", "deleteActionForward")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_member_getAutologin($show_output_string = false){
|
||||
$argsString = '$args->autologin_key = 10;';
|
||||
$this->test("modules.member.getAutologin"
|
||||
, $this->getQueryPath("modules", "member", "getAutologin")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
function test_opage_getOpageList($show_output_string = false){
|
||||
$argsString = '$args->s_title = "yuhuu";
|
||||
$args->module = 12;';
|
||||
$this->test("modules.opage.getOpageList"
|
||||
, $this->getQueryPath("modules", "opage", "getOpageList")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
function test_getPageList($show_output_string = false){
|
||||
$argsString = '$args->sort_index = "module_srl";
|
||||
$args->page_count = 10;
|
||||
$args->s_module_category_srl = 0;
|
||||
$args->s_mid = "test";
|
||||
$args->s_browser_title = "caca";';
|
||||
|
||||
$this->test("modules.page.getPageList"
|
||||
, $this->getQueryPath("modules", "page", "getPageList")
|
||||
, $argsString
|
||||
, $show_output_string);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for Condition.
|
||||
*/
|
||||
class ConditionTest extends CubridTest {
|
||||
|
||||
/**
|
||||
* Checks equal operation
|
||||
*/
|
||||
public function testConditionString_Equal_WithoutPipe_NumericValue() {
|
||||
$member_srl_argument = new ConditionArgument('"member_srl"', 20, 'equal');
|
||||
|
||||
$tag = new Condition('"member_srl"', $member_srl_argument, 'equal');
|
||||
|
||||
$this->assertEquals(' "member_srl" = 20', $tag->toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks equal operation
|
||||
*/
|
||||
public function testConditionString_Equal_WithPipe_NumericValue() {
|
||||
$member_srl_argument = new ConditionArgument('"member_srl"', 20, 'equal');
|
||||
|
||||
$tag = new Condition('"member_srl"', $member_srl_argument, 'equal', 'and');
|
||||
|
||||
$this->assertEquals('and "member_srl" = 20', $tag->toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks condition returns nothing when argument is not valid
|
||||
*/
|
||||
public function testConditionString_InvalidArgument() {
|
||||
$member_srl_argument = new ConditionArgument('"member_srl"', null, 'equal');
|
||||
$member_srl_argument->checkNotNull();
|
||||
|
||||
$tag = new Condition('"member_srl"', $member_srl_argument, 'equal', 'and');
|
||||
|
||||
$this->assertEquals('', $tag->toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks "in" operation
|
||||
*/
|
||||
public function testConditionString_In_VarcharArray() {
|
||||
$member_srl_argument = new ConditionArgument('"member_srl"', array('a', 'b', 'c'), 'in');
|
||||
$member_srl_argument->createConditionValue();
|
||||
$member_srl_argument->setColumnType('varchar');
|
||||
|
||||
$tag = new Condition('"member_srl"', $member_srl_argument, 'in');
|
||||
|
||||
$this->assertEquals(' "member_srl" in (\'a\',\'b\',\'c\')', $tag->toString());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
42
test-phpUnit/classes/db/queryparts/table/TableTest.php
Normal file
42
test-phpUnit/classes/db/queryparts/table/TableTest.php
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for Table.
|
||||
*/
|
||||
class TableTest extends CubridTest
|
||||
{
|
||||
/**
|
||||
* @var Table
|
||||
*/
|
||||
protected $object;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->object = new Table('"xe_member"', '"m"');
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
}
|
||||
|
||||
public function testToString()
|
||||
{
|
||||
$this->assertEquals('"xe_member" as "m"', $this->object->toString());
|
||||
}
|
||||
|
||||
public function testGetName()
|
||||
{
|
||||
$this->assertEquals('"xe_member"', $this->object->getName());
|
||||
}
|
||||
|
||||
public function testGetAlias()
|
||||
{
|
||||
$this->assertEquals('"m"', $this->object->getAlias());
|
||||
}
|
||||
|
||||
public function testIsJoinTable()
|
||||
{
|
||||
$this->assertEquals(false, $this->object->isJoinTable());
|
||||
}
|
||||
}
|
||||
?>
|
||||
249
test-phpUnit/classes/xml/xmlquery/argument/ArgumentTest.php
Normal file
249
test-phpUnit/classes/xml/xmlquery/argument/ArgumentTest.php
Normal file
|
|
@ -0,0 +1,249 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for Argument.
|
||||
* Generated by PHPUnit on 2011-07-07 at 16:51:29.
|
||||
*/
|
||||
class ArgumentTest extends CubridTest {
|
||||
|
||||
/**
|
||||
* @todo Implement testGetType().
|
||||
*/
|
||||
public function testGetType() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testSetColumnType().
|
||||
*/
|
||||
public function testSetColumnType() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testGetName().
|
||||
*/
|
||||
public function testGetName() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testGetValue().
|
||||
*/
|
||||
public function testGetValue() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testGetUnescapedValue().
|
||||
*/
|
||||
public function testGetUnescapedValue() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testToString().
|
||||
*/
|
||||
public function testToString() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testEscapeValue().
|
||||
*/
|
||||
public function testEscapeValue() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testIsValid().
|
||||
*/
|
||||
public function testIsValid() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testGetErrorMessage().
|
||||
*/
|
||||
public function testGetErrorMessage() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testEnsureDefaultValue().
|
||||
*/
|
||||
public function testEnsureDefaultValue() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testCheckFilter().
|
||||
*/
|
||||
public function testCheckFilter() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testCheckMaxLength().
|
||||
*/
|
||||
public function testCheckMaxLength() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testCheckMinLength().
|
||||
*/
|
||||
public function testCheckMinLength() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument is valid after a notnull check when value is not null
|
||||
*/
|
||||
public function testCheckNotNullWhenNotNull() {
|
||||
$member_srl_argument = new ConditionArgument('member_srl', 20, 'equal');
|
||||
$member_srl_argument->checkNotNull();
|
||||
|
||||
$this->assertEquals(true, $member_srl_argument->isValid());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument becomes invalid after a notnull check when value is null
|
||||
*/
|
||||
public function testCheckNotNullWhenNull() {
|
||||
$member_srl_argument = new ConditionArgument('member_srl', null, 'equal');
|
||||
$member_srl_argument->checkNotNull();
|
||||
|
||||
$this->assertEquals(false, $member_srl_argument->isValid());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument value stays the same when both user value and default value are given
|
||||
*/
|
||||
public function testCheckDefaultValueWhenNotNull() {
|
||||
$member_srl_argument = new ConditionArgument('member_srl', 20, 'equal');
|
||||
$member_srl_argument->ensureDefaultValue(25);
|
||||
|
||||
$this->assertEquals(20, $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that argument value gets set when user value is null and default value is specified
|
||||
*/
|
||||
public function testCheckDefaultValueWhenNull() {
|
||||
$member_srl_argument = new ConditionArgument('member_srl', null, 'equal');
|
||||
$member_srl_argument->ensureDefaultValue(25);
|
||||
|
||||
$this->assertEquals(25, $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks like prefix operation
|
||||
*/
|
||||
public function testCreateConditionValue_LikePrefix() {
|
||||
$member_srl_argument = new ConditionArgument('"mid"', 'forum', 'like_prefix');
|
||||
$member_srl_argument->createConditionValue();
|
||||
|
||||
$this->assertEquals('forum%', $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks like tail operation
|
||||
*/
|
||||
public function testCreateConditionValue_LikeTail() {
|
||||
$member_srl_argument = new ConditionArgument('"mid"', 'forum', 'like_tail');
|
||||
$member_srl_argument->createConditionValue();
|
||||
|
||||
$this->assertEquals('%forum', $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks like operation
|
||||
*/
|
||||
public function testCreateConditionValue_Like() {
|
||||
$member_srl_argument = new ConditionArgument('"mid"', 'forum', 'like');
|
||||
$member_srl_argument->createConditionValue();
|
||||
|
||||
$this->assertEquals('%forum%', $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks in operation
|
||||
*/
|
||||
public function testCreateConditionValue_In_StringValues() {
|
||||
$member_srl_argument = new ConditionArgument('"mid"', array('forum', 'board'), 'in');
|
||||
$member_srl_argument->createConditionValue();
|
||||
$member_srl_argument->setColumnType('varchar');
|
||||
|
||||
$this->assertEquals('(\'forum\',\'board\')', $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks in operation
|
||||
*/
|
||||
public function testCreateConditionValue_In_NumericValues() {
|
||||
$member_srl_argument = new ConditionArgument('"module_srl"', array(3, 21), 'in');
|
||||
$member_srl_argument->setColumnType('number');
|
||||
$member_srl_argument->createConditionValue();
|
||||
|
||||
$this->assertEquals('(3,21)', $member_srl_argument->getValue());
|
||||
}
|
||||
|
||||
public function testEnsureDefaultValueWithEmptyString(){
|
||||
$homepage_argument = new Argument('homepage', '');
|
||||
$homepage_argument->ensureDefaultValue('');
|
||||
$homepage_argument->checkFilter('homepage');
|
||||
if(!$homepage_argument->isValid()) return $homepage_argument->getErrorMessage();
|
||||
$homepage_argument->setColumnType('varchar');
|
||||
|
||||
|
||||
$this->assertEquals('\'\'', $homepage_argument->getValue());
|
||||
}
|
||||
|
||||
public function testDefaultValue() {
|
||||
$default = new DefaultValue("var", '');
|
||||
$this->assertEquals('\'\'', $default->toString());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for ConditionArgument.
|
||||
*/
|
||||
class ConditionArgumentTest extends CubridTest {
|
||||
|
||||
function testIn(){
|
||||
$args->document_srl = 1234;
|
||||
$document_srl_argument = new ConditionArgument('document_srl', $args->document_srl, 'in');
|
||||
$document_srl_argument->checkNotNull();
|
||||
$document_srl_argument->createConditionValue();
|
||||
if(!$document_srl_argument->isValid()) return $document_srl_argument->getErrorMessage();
|
||||
$document_srl_argument->setColumnType('number');
|
||||
|
||||
$condition = new Condition('"extra_vars"."document_srl"',$document_srl_argument,"in", 'and');
|
||||
$this->assertEquals('and "extra_vars"."document_srl" in (1234)', $condition->toString());
|
||||
}
|
||||
|
||||
function testZeroValue(){
|
||||
$args->site_srl = 0;
|
||||
$site_srl_argument = new ConditionArgument('site_srl', $args->site_srl, 'equal');
|
||||
$site_srl_argument->checkNotNull();
|
||||
$site_srl_argument->createConditionValue();
|
||||
if(!$site_srl_argument->isValid()) return $site_srl_argument->getErrorMessage();
|
||||
$site_srl_argument->setColumnType('number');
|
||||
|
||||
$condition = new Condition('"sites"."site_srl"',$site_srl_argument,"equal");
|
||||
$this->assertEquals(' "sites"."site_srl" = 0', $condition->toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testCreateConditionValue().
|
||||
*/
|
||||
public function testCreateConditionValue() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testGetType().
|
||||
*/
|
||||
public function testGetType() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Implement testSetColumnType().
|
||||
*/
|
||||
public function testSetColumnType() {
|
||||
// Remove the following lines when you implement this test.
|
||||
$this->markTestIncomplete(
|
||||
'This test has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for QueryArgument.
|
||||
*/
|
||||
class QueryArgumentTest extends CubridTest {
|
||||
|
||||
var $xmlPath = "data/";
|
||||
|
||||
function QueryArgumentTest(){
|
||||
$this->xmlPath = str_replace('QueryArgumentTest.php', '', str_replace('\\', '/', __FILE__)) . $this->xmlPath;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1 @@
|
|||
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" />
|
||||
|
|
@ -0,0 +1 @@
|
|||
<index var="sort_index" default="list_order" order="order_type" />
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Test class for ConditionTag.
|
||||
*/
|
||||
class ConditionTagTest extends CubridTest {
|
||||
|
||||
var $xmlPath = "data/";
|
||||
|
||||
function ConditionTagTest(){
|
||||
$this->xmlPath = str_replace('ConditionTagTest.php', '', str_replace('\\', '/', __FILE__)) . $this->xmlPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <condition> tag:
|
||||
* <condition operation="equal" column="user_id" var="user_id" />
|
||||
*/
|
||||
function testConditionStringWithArgument(){
|
||||
$xml_file = $this->xmlPath . "condition1.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new ConditionTag($xml_obj->condition);
|
||||
$arguments = $tag->getArguments();
|
||||
|
||||
$expected = "new Condition('\"user_id\"',\$" . $arguments[0]->getArgumentName() . "_argument,\"equal\")";
|
||||
$actual = $tag->getConditionString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
|
||||
$this->assertEquals(1, count($arguments));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a condition tag for joins - that uses no argument
|
||||
* <condition operation="equal" column="comments.user_id" default="member.user_id" filter="userid" />
|
||||
*/
|
||||
function testConditionStringWithoutArgument(){
|
||||
$xml_file = $this->xmlPath . "condition3.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new ConditionTag($xml_obj->condition);
|
||||
|
||||
$expected = "new Condition('\"comments\".\"user_id\"','\"member\".\"user_id\"',\"equal\")";
|
||||
$actual = $tag->getConditionString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
$arguments = $tag->getArguments();
|
||||
$this->assertEquals(0, count($arguments));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tests a <condition> tag with pipe:
|
||||
* <condition operation="equal" column="type" var="type" notnull="notnull" pipe="and" />
|
||||
*/
|
||||
function testConditionStringWithPipe(){
|
||||
$xml_file = $this->xmlPath . "condition2.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new ConditionTag($xml_obj->condition);
|
||||
$arguments = $tag->getArguments();
|
||||
|
||||
$expected = "new Condition('\"type\"',\$" . $arguments[0]->getArgumentName() . "_argument,\"equal\", 'and')";
|
||||
$actual = $tag->getConditionString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
|
||||
$this->assertEquals(1, count($arguments));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that even if the column name is given in the var attribute, it knows it's just a name and not an argument
|
||||
* <condition operation="equal" column="modules.module_srl" var="documents.module_srl" pipe="and" />
|
||||
*/
|
||||
function testConditionStringWithoutArgumentAndDefaultValueInsideVar(){
|
||||
$xml_file = $this->xmlPath . "condition4.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new ConditionTag($xml_obj->condition);
|
||||
|
||||
$expected = "new Condition('\"modules\".\"module_srl\"','\"documents\".\"module_srl\"',\"equal\", 'and')";
|
||||
$actual = $tag->getConditionString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
$arguments = $tag->getArguments();
|
||||
$this->assertEquals(0, count($arguments));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1 @@
|
|||
<condition operation="equal" column="user_id" var="user_id" />
|
||||
|
|
@ -0,0 +1 @@
|
|||
<condition operation="equal" column="type" var="type" notnull="notnull" pipe="and" />
|
||||
|
|
@ -0,0 +1 @@
|
|||
<condition operation="equal" column="comments.user_id" default="member.user_id" filter="userid" />
|
||||
|
|
@ -0,0 +1 @@
|
|||
<condition operation="equal" column="modules.module_srl" var="documents.module_srl" pipe="and" />
|
||||
134
test-phpUnit/classes/xml/xmlquery/tags/table/TableTagTest.php
Normal file
134
test-phpUnit/classes/xml/xmlquery/tags/table/TableTagTest.php
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
/**
|
||||
* Test class for TableTag.
|
||||
*/
|
||||
class TableTagTest extends CubridTest {
|
||||
|
||||
var $xmlPath = "data/";
|
||||
|
||||
function TableTagTest(){
|
||||
$this->xmlPath = str_replace('TableTagTest.php', '', str_replace('\\', '/', __FILE__)) . $this->xmlPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <table> tag:
|
||||
* <table name="modules" />
|
||||
*/
|
||||
function testTableTagWithName(){
|
||||
$xml_file = $this->xmlPath . "table_name.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$expected = "new Table('\"xe_modules\"', '\"modules\"')";
|
||||
$actual = $tag->getTableString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a <table> tag with name and alias
|
||||
* <table name="modules" alias="mod" />
|
||||
*/
|
||||
function testTableTagWithNameAndAlias(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$expected = "new Table('\"xe_modules\"', '\"mod\"')";
|
||||
$actual = $tag->getTableString();
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a <table> tag used for joins
|
||||
* <table name="module_categories" alias="module_categories" type="left join">
|
||||
* <conditions>
|
||||
* <condition operation="equal" column="module_categories.module_category_srl" default="modules.module_category_srl" />
|
||||
* </conditions>
|
||||
* </table>
|
||||
*
|
||||
*/
|
||||
function testTableTagWithJoinCondition(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias_type.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$actual = $tag->getTableString();
|
||||
|
||||
$expected = 'new JoinTable(\'"xe_module_categories"\', \'"module_categories"\', "left join", array(
|
||||
new ConditionGroup(array(
|
||||
new Condition(\'"module_categories"."module_category_srl"\',\'"modules"."module_category_srl"\',"equal")
|
||||
))
|
||||
))';
|
||||
$actual = Helper::cleanString($actual);
|
||||
$expected = Helper::cleanString($expected);
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* If a table tag has the type attribute and condition children
|
||||
* it means it is meant to be used inside a join
|
||||
*/
|
||||
function testTagWithTypeIsJoinTable(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias_type.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$this->assertEquals(true, $tag->isJoinTable());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that a simple table tag is not a join table
|
||||
*/
|
||||
function testTagWithoutTypeIsNotJoinTable(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$this->assertEquals(false, $tag->isJoinTable());
|
||||
}
|
||||
|
||||
/**
|
||||
* If no alias is specified, test that table name is used
|
||||
*/
|
||||
function testTableAliasWhenAliasNotSpecified(){
|
||||
$xml_file = $this->xmlPath . "table_name.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$this->assertEquals("modules", $tag->getTableAlias());
|
||||
}
|
||||
|
||||
/**
|
||||
* If alias is specified, test that it is used
|
||||
*/
|
||||
function testTableAliasWhenAliasSpecified(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$this->assertEquals("mod", $tag->getTableAlias());
|
||||
}
|
||||
|
||||
/**
|
||||
* Table name propery should returned unescaped and unprefixed table name
|
||||
* (The one in the XML file)
|
||||
*/
|
||||
function testTableName(){
|
||||
$xml_file = $this->xmlPath . "table_name_alias.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
|
||||
$tag = new TableTag($xml_obj->table);
|
||||
|
||||
$this->assertEquals("modules", $tag->getTableName());
|
||||
}
|
||||
|
||||
}
|
||||
114
test-phpUnit/classes/xml/xmlquery/tags/table/TablesTagTest.php
Normal file
114
test-phpUnit/classes/xml/xmlquery/tags/table/TablesTagTest.php
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
/**
|
||||
* Test class for TablesTag.
|
||||
*/
|
||||
class TablesTagTest extends CubridTest {
|
||||
|
||||
var $xmlPath = "data/";
|
||||
|
||||
function TablesTagTest(){
|
||||
$this->xmlPath = str_replace('TablesTagTest.php', '', str_replace('\\', '/', __FILE__)) . $this->xmlPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <tables> tag:
|
||||
* <tables>
|
||||
* <table name="member" />
|
||||
* </tables>
|
||||
*/
|
||||
function testTablesTagWithOneTable(){
|
||||
$xml_file = $this->xmlPath . "tables_one_table.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new TablesTag($xml_obj->tables);
|
||||
|
||||
$expected = "array(new Table('\"xe_member\"', '\"member\"'))";
|
||||
$actual = $tag->toString();
|
||||
|
||||
$this->_testCachedOutput($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <tables> tag:
|
||||
* <tables>
|
||||
* <table name="member_group" alias="a" />
|
||||
* <table name="member_group_member" alias="b" />
|
||||
* </tables>
|
||||
*/
|
||||
function testTablesTagWithTwoTablesNoJoin(){
|
||||
$xml_file = $this->xmlPath . "tables_two_tables_no_join.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new TablesTag($xml_obj->tables);
|
||||
|
||||
$expected = "array(
|
||||
new Table('\"xe_member_group\"', '\"a\"')
|
||||
,new Table('\"xe_member_group_member\"', '\"b\"')
|
||||
)";
|
||||
$actual = $tag->toString();
|
||||
|
||||
$this->_testCachedOutput($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <tables> tag:
|
||||
* <tables>
|
||||
* <table name="files" alias="files" />
|
||||
* <table name="member" alias="member" type="left join">
|
||||
* <conditions>
|
||||
* <condition operation="equal" column="files.member_srl" default="member.member_srl" />
|
||||
* </conditions>
|
||||
* </table>
|
||||
* </tables>
|
||||
*/
|
||||
function testTablesTagWithTwoTablesWithJoin(){
|
||||
$xml_file = $this->xmlPath . "tables_two_tables_with_join.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new TablesTag($xml_obj->tables);
|
||||
|
||||
$expected = "array(
|
||||
new Table('\"xe_files\"', '\"files\"')
|
||||
,new JoinTable('\"xe_member\"'
|
||||
, '\"member\"'
|
||||
, \"left join\"
|
||||
, array(
|
||||
new ConditionGroup(
|
||||
array(
|
||||
new Condition(
|
||||
'\"files\".\"member_srl\"'
|
||||
,'\"member\".\"member_srl\"'
|
||||
,\"equal\"
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)";
|
||||
$actual = $tag->toString();
|
||||
|
||||
$this->_testCachedOutput($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a simple <tables> tag:
|
||||
* <tables>
|
||||
* <table name="files" alias="files" />
|
||||
* <table name="member" alias="member" type="left join">
|
||||
* <conditions>
|
||||
* <condition operation="equal" column="files.member_srl" default="member.member_srl" />
|
||||
* </conditions>
|
||||
* </table>
|
||||
* </tables>
|
||||
*/
|
||||
function testGetTables(){
|
||||
$xml_file = $this->xmlPath . "tables_two_tables_with_join.xml";
|
||||
$xml_obj = Helper::getXmlObject($xml_file);
|
||||
$tag = new TablesTag($xml_obj->tables);
|
||||
|
||||
$tables = $tag->getTables();
|
||||
|
||||
$this->assertEquals(2, count($tables));
|
||||
$this->assertTrue(is_a($tables[0], 'TableTag'));
|
||||
$this->assertTrue(is_a($tables[1], 'TableTag'));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
<table name="modules" />
|
||||
|
|
@ -0,0 +1 @@
|
|||
<table name="modules" alias="mod" />
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<table name="module_categories" alias="module_categories" type="left join">
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_categories.module_category_srl" default="modules.module_category_srl" />
|
||||
</conditions>
|
||||
</table>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
<tables>
|
||||
<table name="member" />
|
||||
</tables>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<tables>
|
||||
<table name="member_group" alias="a" />
|
||||
<table name="member_group_member" alias="b" />
|
||||
</tables>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<tables>
|
||||
<table name="files" alias="files" />
|
||||
<table name="member" alias="member" type="left join">
|
||||
<conditions>
|
||||
<condition operation="equal" column="files.member_srl" default="member.member_srl" />
|
||||
</conditions>
|
||||
</table>
|
||||
</tables>
|
||||
53
test-phpUnit/config/config.inc.php
Normal file
53
test-phpUnit/config/config.inc.php
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
error_reporting(E_ALL ^ E_NOTICE);
|
||||
define('_XE_PATH_', str_replace('test-phpUnit/config/config.inc.php', '', str_replace('\\', '/', __FILE__)));
|
||||
define('_TEST_PATH_', _XE_PATH_ . 'test-phpUnit/');
|
||||
|
||||
if(!defined('__DEBUG__')) define('__DEBUG__', 4);
|
||||
define('__ZBXE__', true);
|
||||
|
||||
require_once(_XE_PATH_.'test-phpUnit/Helper.class.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/QueryTester.class.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/db/DBTest.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/db/CubridTest.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/db/CubridOnlineTest.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/db/MssqlTest.php');
|
||||
require_once(_XE_PATH_.'test-phpUnit/db/MssqlOnlineTest.php');
|
||||
|
||||
require_once(_XE_PATH_.'config/config.inc.php');
|
||||
// require_once(_XE_PATH_.'classes/object/Object.class.php');
|
||||
// require_once(_XE_PATH_.'classes/handler/Handler.class.php');
|
||||
// require_once(_XE_PATH_.'classes/context/Context.class.php');
|
||||
// require_once(_XE_PATH_.'classes/file/FileHandler.class.php');
|
||||
// require_once(_XE_PATH_.'classes/xml/XmlParser.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/XmlQueryParser.class.php');
|
||||
//
|
||||
|
||||
require_once(_XE_PATH_.'classes/db/DB.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/DBCubrid.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/DBMssql.class.php');
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/DBParser.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/Argument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/SortArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/argument/ConditionArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/DefaultValue.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/expression/UpdateExpression.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');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/order/OrderByColumn.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/limit/Limit.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/Query.class.php');
|
||||
require_once(_XE_PATH_.'classes/db/queryparts/Subquery.class.php');
|
||||
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
|
||||
require_once(_XE_PATH_.'classes/xml/xmlquery/queryargument/SortQueryArgument.class.php');
|
||||
?>
|
||||
41
test-phpUnit/db/CubridOnlineTest.php
Normal file
41
test-phpUnit/db/CubridOnlineTest.php
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Base class for tests for CUBRID SQL syntax
|
||||
*/
|
||||
|
||||
class CubridOnlineTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $backupGlobals = FALSE;
|
||||
protected $backupStaticAttributes = FALSE;
|
||||
protected $preserveGlobalState = FALSE;
|
||||
|
||||
/**
|
||||
* Prepare runtime context - tell DB class that current DB is CUBRID
|
||||
*/
|
||||
protected function setUp() {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$db_info->db_type = 'cubrid';
|
||||
$db_info->db_port = '33000';
|
||||
$db_info->db_hostname = '10.0.0.206';
|
||||
$db_info->db_userid = 'dba';
|
||||
$db_info->db_password = 'arniarules';
|
||||
$db_info->db_database = 'xe15QA';
|
||||
$db_info->db_table_prefix = 'xe';
|
||||
|
||||
$oContext->setDbInfo($db_info);
|
||||
|
||||
// remove cache dir
|
||||
FileHandler::removeDir( _XE_PATH_ . 'files/cache');
|
||||
}
|
||||
|
||||
/**
|
||||
* Free resources - reset static DB and QueryParser
|
||||
*/
|
||||
protected function tearDown() {
|
||||
unset($GLOBALS['__DB__']);
|
||||
XmlQueryParser::setDBParser(null);
|
||||
}
|
||||
}
|
||||
?>
|
||||
29
test-phpUnit/db/CubridTest.php
Normal file
29
test-phpUnit/db/CubridTest.php
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Base class for tests for CUBRID SQL syntax
|
||||
*/
|
||||
|
||||
class CubridTest extends DBTest {
|
||||
|
||||
/**
|
||||
* Prepare runtime context - tell DB class that current DB is CUBRID
|
||||
*/
|
||||
protected function setUp() {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$db_info->db_type = 'cubrid';
|
||||
$db_info->db_table_prefix = 'xe';
|
||||
|
||||
$oContext->setDbInfo($db_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Free resources - reset static DB and QueryParser
|
||||
*/
|
||||
protected function tearDown() {
|
||||
unset($GLOBALS['__DB__']);
|
||||
XmlQueryParser::setDBParser(null);
|
||||
}
|
||||
}
|
||||
?>
|
||||
69
test-phpUnit/db/DBTest.php
Normal file
69
test-phpUnit/db/DBTest.php
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<?php
|
||||
class DBTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
function _testQuery($xml_file, $argsString, $expected, $methodName, $columnList = null){
|
||||
echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL;
|
||||
echo $xml_file;
|
||||
echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL;
|
||||
|
||||
$tester = new QueryTester();
|
||||
$outputString = $tester->getNewParserOutputString($xml_file, $argsString);
|
||||
echo $outputString;
|
||||
$output = eval($outputString);
|
||||
|
||||
if(!is_a($output, 'Query')){
|
||||
if(!$output->toBool()) $querySql = "Date incorecte! Query-ul nu a putut fi executat.";
|
||||
}else {
|
||||
$db = &DB::getInstance();
|
||||
if($columnList) $output->setColumnList($columnList);
|
||||
$querySql = $db->{$methodName}($output);
|
||||
|
||||
// Remove whitespaces, tabs and all
|
||||
$querySql = Helper::cleanString($querySql);
|
||||
$expected = Helper::cleanString($expected);
|
||||
}
|
||||
$this->assertEquals($expected, $querySql);
|
||||
}
|
||||
|
||||
function _testPreparedQuery($xml_file, $argsString, $expected, $methodName, $expectedArgs = NULL){
|
||||
echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL;
|
||||
echo $xml_file;
|
||||
echo PHP_EOL . ' ----------------------------------- ' .PHP_EOL;
|
||||
|
||||
$tester = new QueryTester();
|
||||
$outputString = $tester->getNewParserOutputString($xml_file, $argsString);
|
||||
echo $outputString;
|
||||
$output = eval($outputString);
|
||||
|
||||
if(!is_a($output, 'Query')){
|
||||
if(!$output->toBool()) $querySql = "Date incorecte! Query-ul nu a putut fi executat.";
|
||||
}else {
|
||||
$db = &DB::getInstance();
|
||||
$querySql = $db->{$methodName}($output, false);
|
||||
$queryArguments = $output->getArguments();
|
||||
|
||||
// Remove whitespaces, tabs and all
|
||||
$querySql = Helper::cleanString($querySql);
|
||||
$expected = Helper::cleanString($expected);
|
||||
}
|
||||
|
||||
// Test
|
||||
$this->assertEquals($expected, $querySql);
|
||||
|
||||
// Test query arguments
|
||||
$argCount = count($expectedArgs);
|
||||
for($i = 0; $i < $argCount; $i++){
|
||||
$this->assertEquals($expectedArgs[$i], $queryArguments[$i]->getEscapedValue());
|
||||
}
|
||||
}
|
||||
|
||||
function _testCachedOutput($expected, $actual){
|
||||
$expected = Helper::cleanString($expected);
|
||||
$actual = Helper::cleanString($actual);
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
110
test-phpUnit/db/ExpressionParserTest.php
Normal file
110
test-phpUnit/db/ExpressionParserTest.php
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
class ExpressionParserTest extends PHPUnit_Framework_TestCase {
|
||||
/* Escape char for:
|
||||
* CUBRID ""
|
||||
* MySql ``
|
||||
* SqlServer []
|
||||
*/
|
||||
var $dbLeftEscapeChar = '[';
|
||||
var $dbRightEscapeChar = ']';
|
||||
|
||||
function _test($column_name, $alias, $expected){
|
||||
$expressionParser = new DBParser($this->dbLeftEscapeChar,$this->dbRightEscapeChar);
|
||||
$actual = $expressionParser->parseExpression($column_name);
|
||||
if($alias) $actual .= " as $alias";
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
function testStarExpressionIsNotEscaped(){
|
||||
$this->_test("*", NULL, '*');
|
||||
}
|
||||
|
||||
function testSimpleColumnNameGetsEscaped(){
|
||||
$this->_test("member_srl", NULL
|
||||
, $this->dbLeftEscapeChar.'member_srl'.$this->dbRightEscapeChar );
|
||||
}
|
||||
|
||||
function testUnqualifiedAliasedColumnNameGetsEscaped(){
|
||||
$this->_test("member_srl", "id"
|
||||
, $this->dbLeftEscapeChar.'member_srl'.$this->dbRightEscapeChar.' as id');
|
||||
}
|
||||
|
||||
function testQualifiedColumnNameGetsEscaped(){
|
||||
$this->_test("xe_members.member_srl", NULL
|
||||
, $this->dbLeftEscapeChar.'xe_members'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'member_srl'.$this->dbRightEscapeChar);
|
||||
}
|
||||
|
||||
function testQualifiedAliasedColumnNameGetsEscaped(){
|
||||
$this->_test("xe_members.member_srl","id"
|
||||
,$this->dbLeftEscapeChar.'xe_members'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'member_srl'.$this->dbRightEscapeChar.' as id');
|
||||
}
|
||||
|
||||
function testCountDoesntGetEscaped(){
|
||||
$this->_test("count(*)", NULL, 'count(*)');
|
||||
}
|
||||
|
||||
function testAliasedCountDoesntGetEscaped(){
|
||||
$this->_test("count(*)", "count", 'count(*) as count');
|
||||
}
|
||||
|
||||
function testUnqualifiedColumnExpressionWithOneParameterLessFunction(){
|
||||
$this->_test("substring(regdate)", NULL
|
||||
, 'substring('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.')');
|
||||
}
|
||||
|
||||
function testAliasedUnqualifiedColumnExpressionWithOneParameterLessFunction(){
|
||||
$this->_test("substring(regdate)", "regdate"
|
||||
, 'substring('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.') as regdate');
|
||||
}
|
||||
|
||||
function testQualifiedColumnExpressionWithOneParameterLessFunction(){
|
||||
$this->_test("substring(xe_member.regdate)", NULL
|
||||
, 'substring('.$this->dbLeftEscapeChar.'xe_member'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.')');
|
||||
}
|
||||
|
||||
function testAliasedQualifiedColumnExpressionWithOneParameterLessFunction(){
|
||||
$this->_test("substring(xe_member.regdate)", "regdate"
|
||||
, 'substring('.$this->dbLeftEscapeChar.'xe_member'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.') as regdate');
|
||||
}
|
||||
|
||||
function testUnqualifiedColumnExpressionWithTwoParameterLessFunctions(){
|
||||
$this->_test("lpad(rpad(regdate))", NULL
|
||||
, 'lpad(rpad('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.'))');
|
||||
}
|
||||
|
||||
function testAliasedUnqualifiedColumnExpressionWithTwoParameterLessFunctions(){
|
||||
$this->_test("lpad(rpad(regdate))", "regdate"
|
||||
, 'lpad(rpad('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.')) as regdate');
|
||||
}
|
||||
|
||||
function testQualifiedColumnExpressionWithTwoParameterLessFunctions(){
|
||||
$this->_test("lpad(rpad(xe_member.regdate))", NULL
|
||||
, 'lpad(rpad('.$this->dbLeftEscapeChar.'xe_member'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.'))');
|
||||
}
|
||||
|
||||
function testAliasedQualifiedColumnExpressionWithTwoParameterLessFunctions(){
|
||||
$this->_test("lpad(rpad(xe_member.regdate))", "regdate"
|
||||
, 'lpad(rpad('.$this->dbLeftEscapeChar.'xe_member'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.')) as regdate');
|
||||
}
|
||||
|
||||
function testColumnAddition(){
|
||||
$this->_test("score1 + score2", "total"
|
||||
, $this->dbLeftEscapeChar.'score1'.$this->dbRightEscapeChar.' + '.$this->dbLeftEscapeChar.'score2'.$this->dbRightEscapeChar.' as total');
|
||||
}
|
||||
|
||||
function testMultipleParameterFunction(){
|
||||
$this->_test("substring(regdate, 1, 8)", NULL
|
||||
, 'substring('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.', 1, 8)');
|
||||
$this->_test("substring(regdate, 1, 8)", "regdate"
|
||||
, 'substring('.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.', 1, 8) as regdate');
|
||||
$this->_test("substring(xe_member.regdate, 1, 8)", NULL
|
||||
, 'substring('.$this->dbLeftEscapeChar.'xe_member'.$this->dbRightEscapeChar.'.'.$this->dbLeftEscapeChar.'regdate'.$this->dbRightEscapeChar.', 1, 8)');
|
||||
}
|
||||
|
||||
function testFunctionAddition(){
|
||||
$this->_test("abs(score) + abs(totalscore)", NULL
|
||||
, 'abs('.$this->dbLeftEscapeChar.'score'.$this->dbRightEscapeChar.') + abs('.$this->dbLeftEscapeChar.'totalscore'.$this->dbRightEscapeChar.')');
|
||||
}
|
||||
}
|
||||
41
test-phpUnit/db/MssqlOnlineTest.php
Normal file
41
test-phpUnit/db/MssqlOnlineTest.php
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Base class for tests for MSSQL SQL syntax
|
||||
*/
|
||||
|
||||
class MssqlOnlineTest extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $backupGlobals = FALSE;
|
||||
protected $backupStaticAttributes = FALSE;
|
||||
protected $preserveGlobalState = FALSE;
|
||||
|
||||
/**
|
||||
* Prepare runtime context - tell DB class that current DB is CUBRID
|
||||
*/
|
||||
protected function setUp() {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$db_info->db_type = 'mssql';
|
||||
$db_info->db_port = '3306';
|
||||
$db_info->db_hostname = 'PHENOMII\SQL2008EXPRESS';
|
||||
$db_info->db_userid = 'dba';
|
||||
$db_info->db_password = 'arniarules';
|
||||
$db_info->db_database = 'xe-15-db';
|
||||
$db_info->db_table_prefix = 'xe';
|
||||
|
||||
$oContext->setDbInfo($db_info);
|
||||
|
||||
// remove cache dir
|
||||
FileHandler::removeDir( _XE_PATH_ . 'files/cache');
|
||||
}
|
||||
|
||||
/**
|
||||
* Free resources - reset static DB and QueryParser
|
||||
*/
|
||||
protected function tearDown() {
|
||||
unset($GLOBALS['__DB__']);
|
||||
XmlQueryParser::setDBParser(null);
|
||||
}
|
||||
}
|
||||
?>
|
||||
24
test-phpUnit/db/MssqlTest.php
Normal file
24
test-phpUnit/db/MssqlTest.php
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
class MssqlTest extends DBTest {
|
||||
|
||||
protected function setUp() {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$db_info->db_type = 'mssql';
|
||||
$db_info->db_table_prefix = 'xe';
|
||||
|
||||
$oContext->setDbInfo($db_info);
|
||||
}
|
||||
|
||||
protected function tearDown() {
|
||||
unset($GLOBALS['__DB__']);
|
||||
XmlQueryParser::setDBParser(null);
|
||||
}
|
||||
}
|
||||
?>
|
||||
21
test-phpUnit/db/xml_query/cubrid/CubridDeleteTest.php
Normal file
21
test-phpUnit/db/xml_query/cubrid/CubridDeleteTest.php
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
class CubridDeleteTest extends CubridTest {
|
||||
|
||||
function _test($xml_file, $argsString, $expected){
|
||||
$this->_testQuery($xml_file, $argsString, $expected, 'getDeleteSql');
|
||||
}
|
||||
|
||||
function test_module_deleteActionForward(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/deleteActionForward.xml";
|
||||
$argsString = '$args->module = "page";
|
||||
$args->type = "page";
|
||||
$args->act = "tata";';
|
||||
$expected = 'delete "action_forward" from "xe_action_forward" as "action_forward"
|
||||
where "module" = \'page\'
|
||||
and "type" = \'page\'
|
||||
and "act" = \'tata\'';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
}
|
||||
86
test-phpUnit/db/xml_query/cubrid/CubridInsertOnlineTest.php
Normal file
86
test-phpUnit/db/xml_query/cubrid/CubridInsertOnlineTest.php
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
class CubridInsertOnlineTest extends CubridOnlineTest {
|
||||
|
||||
/**
|
||||
* Note: this test can fail when comaparing regdate from the $args with
|
||||
* regdate from the expected string - a few seconds difference
|
||||
*/
|
||||
function test_module_insertModule_escapeContent(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/insertModule.xml";
|
||||
|
||||
$args->module_category_srl = 0;
|
||||
$args->browser_title = "test";
|
||||
$args->layout_srl = 0;
|
||||
$args->mlayout_srl = 0;
|
||||
$args->module = "page";
|
||||
$args->mid = "test";
|
||||
$args->site_srl = 0;
|
||||
$args->module_srl = 47374;
|
||||
$args->content = "hello \' moto";
|
||||
|
||||
$output = executeQuery('module.insertModule', $args);
|
||||
|
||||
$this->assertTrue(!$output->error, $output->message);
|
||||
}
|
||||
|
||||
function test_document_insertDocument_defaultVarcharValue(){
|
||||
$args->module_srl = 102;
|
||||
$args->content = '<p>yuhuuuuu</p>';
|
||||
$args->document_srl = 9200;
|
||||
$args->is_secret = 'N';
|
||||
$args->allow_comment = 'N';
|
||||
$args->lock_comment = 'N';
|
||||
$args->allow_trackback = 'N';
|
||||
$args->notify_message = 'N';
|
||||
$args->ipaddress = '127.0.0.1';
|
||||
$args->extra_vars = 'N;';
|
||||
$args->readed_count = 0;
|
||||
$args->list_order = -9201;
|
||||
$args->update_order = -9201;
|
||||
$args->member_srl = 4;
|
||||
$args->user_id = 'admin';
|
||||
$args->user_name = 'admin';
|
||||
$args->nick_name = 'admin';
|
||||
$args->email_address = 'admin@admin.admin';
|
||||
$args->homepage = '';
|
||||
$args->title = 'yuhuu';
|
||||
$args->lang_code;
|
||||
$output = executeQuery('document.insertDocument', $args);
|
||||
|
||||
$this->assertNotEquals(-225, $output->error);
|
||||
$this->assertNotEquals('Missing value for attribute "homepage" with the NOT NULL constraint.', $output->message);
|
||||
}
|
||||
|
||||
function test_communication_addFriendGroup(){
|
||||
$args->member_srl = 202;
|
||||
$args->title = "Grup";
|
||||
|
||||
$output = executeQuery("communication.addFriendGroup", $args);
|
||||
$this->assertEquals(0, $output->error, $output->message);
|
||||
|
||||
}
|
||||
|
||||
function test_communication_addFriendGroup_NullId(){
|
||||
$args->member_srl = 202;
|
||||
$args->title = "Grup";
|
||||
$args->friend_group_srl = trim(null);
|
||||
|
||||
$output = executeQuery("communication.addFriendGroup", $args);
|
||||
$this->assertEquals(0, $output->error, $output->message);
|
||||
|
||||
}
|
||||
|
||||
protected function tearDown() {
|
||||
$db = &DB::getInstance();
|
||||
$db->_query("DELETE FROM xe_modules WHERE module_srl = 47374");
|
||||
$db->_query("DELETE FROM xe_documents WHERE document_srl = 9200");
|
||||
$db->_query("DELETE FROM xe_member_friend_group WHERE member_srl = 202");
|
||||
$db->close();
|
||||
|
||||
parent::tearDown();
|
||||
// TODO Delete inserted value
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
128
test-phpUnit/db/xml_query/cubrid/CubridInsertTest.php
Normal file
128
test-phpUnit/db/xml_query/cubrid/CubridInsertTest.php
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
class CubridInsertTest extends CubridTest {
|
||||
|
||||
function _test($xml_file, $argsString, $expected){
|
||||
$this->_testQuery($xml_file, $argsString, $expected, 'getInsertSql');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Note: this test can fail when comaparing regdate from the $args with
|
||||
* regdate from the expected string - a few seconds difference
|
||||
*/
|
||||
function test_module_insertModule(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/insertModule.xml";
|
||||
$argsString = ' $args->module_category_srl = 0;
|
||||
$args->browser_title = "test";
|
||||
$args->layout_srl = 0;
|
||||
$args->mlayout_srl = 0;
|
||||
$args->module = "page";
|
||||
$args->mid = "test";
|
||||
$args->site_srl = 0;
|
||||
$args->module_srl = 47374;';
|
||||
$expected = 'insert into "xe_modules"
|
||||
("site_srl"
|
||||
, "module_srl"
|
||||
, "module_category_srl"
|
||||
, "mid"
|
||||
, "browser_title"
|
||||
, "layout_srl"
|
||||
, "module"
|
||||
, "is_default"
|
||||
, "open_rss"
|
||||
, "regdate"
|
||||
, "mlayout_srl"
|
||||
, "use_mobile")
|
||||
values
|
||||
(0
|
||||
, 47374
|
||||
, 0
|
||||
, \'test\'
|
||||
, \'test\'
|
||||
, 0
|
||||
, \'page\'
|
||||
, \'n\'
|
||||
, \'y\'
|
||||
, \''.date("YmdHis").'\'
|
||||
, 0
|
||||
, \'n\')';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_insertSiteTodayStatus(){
|
||||
//\''.date("YmdHis").'\'
|
||||
$xml_file = _XE_PATH_ . "modules/counter/queries/insertTodayStatus.xml";
|
||||
$argsString = ' $args->regdate = 0;
|
||||
$args->unique_visitor = 0;
|
||||
$args->pageview = 0;';
|
||||
$expected = 'insert into "xe_counter_status"
|
||||
("regdate"
|
||||
, "unique_visitor"
|
||||
, "pageview")
|
||||
values
|
||||
('.date("YmdHis").'
|
||||
, 0
|
||||
, 0)';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_insertCounterLog(){
|
||||
$xml_file = _XE_PATH_ . "modules/counter/queries/insertCounterLog.xml";
|
||||
$argsString = ' $args->site_srl = 0;
|
||||
$args->regdate = "20110607120619";
|
||||
$args->ipaddress = "127.0.0.1";
|
||||
$args->user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24";';
|
||||
$expected = 'insert into "xe_counter_log"
|
||||
("site_srl", "regdate", "ipaddress", "user_agent")
|
||||
VALUES (0, \'20110607120619\', \'127.0.0.1\', \'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24\')
|
||||
';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_insertMember(){
|
||||
$xml_file = _XE_PATH_ . "modules/member/queries/insertMember.xml";
|
||||
$argsString = ' $args->member_srl = 203;
|
||||
$args->user_id = "cacao";
|
||||
$args->email_address = "teta@ar.ro";
|
||||
$args->password = "23e5484cb88f3c07bcce2920a5e6a2a7";
|
||||
$args->email_id = "teta";
|
||||
$args->email_host = "ar.ro";
|
||||
$args->user_name = "trident";
|
||||
$args->nick_name = "aloha";
|
||||
$args->homepage = "http://jkgjfk./ww";
|
||||
$args->allow_mailing = "Y";
|
||||
$args->allow_message = "Y";
|
||||
$args->denied = "N";
|
||||
$args->regdate = "20110607121952";
|
||||
$args->change_password_date = "20110607121952";
|
||||
$args->last_login = "20110607121952";
|
||||
$args->is_admin = "N";
|
||||
$args->extra_vars = "O:8:\"stdClass\":2:{s:4:\"body\";s:0:\"\";s:7:\"_filter\";s:6:\"insert\";}";
|
||||
$args->list_order = -203;
|
||||
';
|
||||
$expected = 'INSERT INTO "xe_member"
|
||||
("member_srl", "user_id", "email_address", "password", "email_id", "email_host", "user_name", "nick_name",
|
||||
"homepage", "allow_mailing", "allow_message", "denied", "regdate", "change_password_date",
|
||||
"last_login", "is_admin", "extra_vars", "list_order")
|
||||
VALUES (203, \'cacao\', \'teta@ar.ro\', \'23e5484cb88f3c07bcce2920a5e6a2a7\', \'teta\', \'ar.ro\', \'trident\',
|
||||
\'aloha\', \'http://jkgjfk./ww\', \'Y\', \'Y\', \'N\', \'20110607121952\', \'20110607121952\',
|
||||
\'20110607121952\', \'N\', \'O:8:"stdClass":2:{s:4:"body";s:0:"";s:7:"_filter";s:6:"insert";}\', -203)';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_insertModuleExtraVars(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/insertModuleExtraVars.xml";
|
||||
$argsString = ' $args->module_srl = 202;
|
||||
$args->name = "_filter";
|
||||
$args->value = "insert_page";
|
||||
';
|
||||
$expected = 'INSERT INTO "xe_module_extra_vars"
|
||||
("module_srl", "name", "value")
|
||||
VALUES (202, \'_filter\', \'insert_page\')
|
||||
';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
}
|
||||
62
test-phpUnit/db/xml_query/cubrid/CubridSelectOnlineTest.php
Normal file
62
test-phpUnit/db/xml_query/cubrid/CubridSelectOnlineTest.php
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
class CubridSelectOnlineTest extends CubridOnlineTest {
|
||||
|
||||
function test_get_module_by_mid(){
|
||||
$args->mid = 'test_4l8ci4vv0n';
|
||||
$args->site_srl = 0;
|
||||
$output = executeQuery('module.getMidInfo', $args);
|
||||
$this->assertNotNull($output);
|
||||
$this->assertNotNull($output->data, $output->message . PHP_EOL . $output->variables["_query"]);
|
||||
$this->assertEquals($output->data->module_srl, 111);
|
||||
}
|
||||
|
||||
function test_module_getInfo(){
|
||||
$args->site_srl = 0;
|
||||
$output = executeQuery('module.getSiteInfo', $args);
|
||||
$this->assertTrue(is_a($output, 'Object'));
|
||||
$this->assertEquals(0, $output->error, $output->message . PHP_EOL . $output->variables["_query"]);
|
||||
}
|
||||
|
||||
function test_document_getDocumentList_pagination(){
|
||||
$args->sort_index = 'list_order';
|
||||
$args->order_type = 'asc';
|
||||
$args->page = 1;
|
||||
$args->list_count = 30;
|
||||
$args->page_count = 10;
|
||||
$args->s_member_srl = 4;
|
||||
|
||||
$output = executeQuery('document.getDocumentList', $args);
|
||||
$this->assertEquals(0, $output->error, $output->message . PHP_EOL . $output->variables["_query"]);
|
||||
}
|
||||
|
||||
function test_syndication_getDocumentList(){
|
||||
$args->module_srl = NULL;
|
||||
$args->exclude_module_srl = NULL;
|
||||
$args->category_srl = NULL;
|
||||
$args->sort_index = 'list_order';
|
||||
$args->order_type = 'asc';
|
||||
$args->page = 5;
|
||||
$args->list_count = 30;
|
||||
$args->page_count = 10;
|
||||
$args->start_date = NULL;
|
||||
$args->end_date = NULL;
|
||||
$args->member_srl = NULL;
|
||||
$output = executeQuery('document.getDocumentList', $args);
|
||||
|
||||
$this->assertTrue(is_int($output->page), $output->message . PHP_EOL . $output->variables["_query"]);
|
||||
}
|
||||
|
||||
function test_member_getMemberList(){
|
||||
$args->is_admin = '';
|
||||
$args->is_denied = '';
|
||||
$args->sort_index = "list_order";
|
||||
$args->sort_order = 'asc';
|
||||
$args->list_count = 40;
|
||||
$args->page_count = 10;
|
||||
|
||||
$output = executeQuery('member.getMemberList', $args);
|
||||
$this->assertEquals(0, $output->error, $output->message . PHP_EOL . $output->variables["_query"]);
|
||||
}
|
||||
}
|
||||
?>
|
||||
214
test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php
Normal file
214
test-phpUnit/db/xml_query/cubrid/CubridSelectTest.php
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
class CubridSelectTest extends CubridTest {
|
||||
|
||||
function _test($xml_file, $argsString, $expected, $columnList = null){
|
||||
$this->_testQuery($xml_file, $argsString, $expected, 'getSelectSql', $columnList);
|
||||
}
|
||||
|
||||
function testSelectStar(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getAdminId.xml";
|
||||
$argsString = '$args->module_srl = 10;';
|
||||
$expected = 'SELECT * FROM "xe_module_admins" as "module_admins" , "xe_member" as "member" WHERE "module_srl" = 10 and "member"."member_srl" = "module_admins"."member_srl"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testRquiredParameter(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getAdminId.xml";
|
||||
$argsString = '';
|
||||
$expected = 'Date incorecte! Query-ul nu a putut fi executat.';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testWithoutCategoriesTag(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getModuleCategories.xml";
|
||||
$argsString = '';
|
||||
$expected = 'SELECT * FROM "xe_module_categories" as "module_categories" ORDER BY "title" asc';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_getDefaultModules(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getDefaultModules.xml";
|
||||
$argsString = '';
|
||||
$expected = 'SELECT "modules"."site_srl"
|
||||
, "modules"."module"
|
||||
, "modules"."mid"
|
||||
, "modules"."browser_title"
|
||||
, "module_categories"."title" as "category"
|
||||
, "modules"."module_srl"
|
||||
FROM "xe_modules" as "modules"
|
||||
left join "xe_module_categories" as "module_categories"
|
||||
on "module_categories"."module_category_srl" = "modules"."module_category_srl"
|
||||
WHERE "modules"."site_srl" = 0
|
||||
ORDER BY "modules"."module" asc, "module_categories"."title" asc, "modules"."mid" asc';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_getSiteInfo(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getSiteInfo.xml";
|
||||
$argsString = '$args->site_srl = 0;';
|
||||
$expected = 'SELECT "modules"."site_srl" as "module_site_srl"
|
||||
, "modules"."module_srl" as "module_srl"
|
||||
, "modules"."module" as "module"
|
||||
, "modules"."module_category_srl" as "module_category_srl"
|
||||
, "modules"."layout_srl" as "layout_srl"
|
||||
, "modules"."mlayout_srl" as "mlayout_srl"
|
||||
, "modules"."use_mobile" as "use_mobile"
|
||||
, "modules"."menu_srl" as "menu_srl"
|
||||
, "modules"."mid" as "mid"
|
||||
, "modules"."skin" as "skin"
|
||||
, "modules"."mskin" as "mskin"
|
||||
, "modules"."browser_title" as "browser_title"
|
||||
, "modules"."description" as "description"
|
||||
, "modules"."is_default" as "is_default"
|
||||
, "modules"."content" as "content"
|
||||
, "modules"."mcontent" as "mcontent"
|
||||
, "modules"."open_rss" as "open_rss"
|
||||
, "modules"."header_text" as "header_text"
|
||||
, "modules"."footer_text" as "footer_text"
|
||||
, "modules"."regdate" as "regdate"
|
||||
, "sites"."site_srl" as "site_srl"
|
||||
, "sites"."domain" as "domain"
|
||||
, "sites"."index_module_srl" as "index_module_srl"
|
||||
, "sites"."default_language" as "default_language"
|
||||
FROM "xe_sites" as "sites"
|
||||
left join "xe_modules" as "modules" on "modules"."module_srl" = "sites"."index_module_srl"
|
||||
WHERE "sites"."site_srl" = 0 ';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_addon_getAddonInfo(){
|
||||
$xml_file = _XE_PATH_ . "modules/addon/queries/getAddonInfo.xml";
|
||||
$argsString = '$args->addon = "captcha";';
|
||||
$expected = 'SELECT *
|
||||
FROM "xe_addons" as "addons"
|
||||
WHERE "addon" = \'captcha\' ';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_addon_getAddons(){
|
||||
$xml_file = _XE_PATH_ . "modules/addon/queries/getAddons.xml";
|
||||
$argsString = '';
|
||||
$expected = 'SELECT *
|
||||
FROM "xe_addons" as "addons"
|
||||
ORDER BY "addon" asc';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_admin_getCommentCount(){
|
||||
$xml_file = _XE_PATH_ . "modules/admin/queries/getCommentCount.xml";
|
||||
$argsString = '';
|
||||
$expected = 'SELECT count(*) as "count"
|
||||
FROM "xe_comments" as "comments"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_admin_getCommentDeclaredStatus(){
|
||||
$xml_file = _XE_PATH_ . "modules/admin/queries/getCommentDeclaredStatus.xml";
|
||||
$argsString = '$args->date = "20110411";';
|
||||
$expected = 'SELECT substr("regdate",1,8) as "date", count(*) as "count"
|
||||
FROM "xe_comment_declared_log" as "comment_declared_log"
|
||||
WHERE "regdate" >= \'20110411\'
|
||||
GROUP BY substr("regdate",1,8)
|
||||
ORDER BY substr("regdate",1,8) asc limit 2';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_member_getAutoLogin(){
|
||||
$xml_file = _XE_PATH_ . "modules/member/queries/getAutoLogin.xml";
|
||||
$argsString = '$args->autologin_key = 10;';
|
||||
$expected = 'SELECT "member"."user_id" as "user_id"
|
||||
, "member"."password" as "password"
|
||||
, "member_autologin"."autologin_key" as "autologin_key"
|
||||
FROM "xe_member" as "member" , "xe_member_autologin" as "member_autologin"
|
||||
WHERE "member_autologin"."autologin_key" = \'10\'
|
||||
and "member"."member_srl" = "member_autologin"."member_srl"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_opage_getOpageList(){
|
||||
$xml_file = _XE_PATH_ . "modules/opage/queries/getOpageList.xml";
|
||||
$argsString = '$args->s_title = "yuhuu";
|
||||
$args->module = \'opage\';';
|
||||
$expected = 'SELECT *
|
||||
FROM "xe_modules" as "modules"
|
||||
WHERE "module" = \'opage\' and ("browser_title" like \'%yuhuu%\')
|
||||
ORDER BY "module_srl" desc
|
||||
LIMIT 0, 20';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_syndication_getGrantedModules(){
|
||||
$xml_file = _XE_PATH_ . "modules/syndication/queries/getGrantedModules.xml";
|
||||
$argsString = '$args->module_srl = 12;
|
||||
$args->name = array(\'access\',\'view\',\'list\');';
|
||||
$expected = 'select "module_srl"
|
||||
from "xe_module_grants" as "module_grants"
|
||||
where "name" in (\'access\',\'view\',\'list\')
|
||||
and ("group_srl" >= 1
|
||||
or "group_srl" = -1
|
||||
or "group_srl" = -2)
|
||||
group by "module_srl"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_document_getDocumentList(){
|
||||
$xml_file = _XE_PATH_ . "modules/document/queries/getDocumentList.xml";
|
||||
$argsString = '$args->sort_index = \'list_order\';
|
||||
$args->order_type = \'asc\';
|
||||
$args->page = 1;
|
||||
$args->list_count = 30;
|
||||
$args->page_count = 10;
|
||||
$args->s_member_srl = 4;';
|
||||
$expected = 'select *
|
||||
from "xe_documents" as "documents"
|
||||
where "member_srl" = 4
|
||||
order by "list_order" asc
|
||||
limit 0, 30';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test column list
|
||||
*/
|
||||
function test_session_getSession(){
|
||||
$xml_file = _XE_PATH_ . "modules/session/queries/getSession.xml";
|
||||
$argsString = '$args->session_key = \'session_key\';';
|
||||
$columnList = array('session_key', 'cur_mid', 'val');
|
||||
|
||||
$expected = 'select "session_key", "cur_mid", "val"
|
||||
from "xe_session" as "session"
|
||||
where "session_key" = \'session_key\'';
|
||||
|
||||
$this->_test($xml_file, $argsString, $expected, $columnList);
|
||||
}
|
||||
|
||||
function test_module_getModuleInfoByDocument(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/getModuleInfoByDocument.xml";
|
||||
$argsString = '$args->document_srl = 10;';
|
||||
$expected = 'SELECT "modules".*
|
||||
FROM "xe_modules" as "modules"
|
||||
, "xe_documents" as "documents"
|
||||
WHERE "documents"."document_srl" = 10
|
||||
and "modules"."module_srl" = "documents"."module_srl"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_member_getMemberList(){
|
||||
$xml_file = _XE_PATH_ . "modules/member/queries/getMemberList.xml";
|
||||
$argsString = '$args->is_admin = \'\';
|
||||
$args->is_denied = \'\';
|
||||
$args->sort_index = "list_order";
|
||||
$args->sort_order = \'asc\';
|
||||
$args->list_count = 40;
|
||||
$args->page_count = 10;';
|
||||
$expected = 'select * from "xe_member" as "member"
|
||||
order by "list_order" asc
|
||||
limit 0, 40';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
}
|
||||
191
test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php
Normal file
191
test-phpUnit/db/xml_query/cubrid/CubridSubqueryTest.php
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
class CubridSubqueryTest extends CubridTest {
|
||||
var $xmlPath = 'data/';
|
||||
|
||||
function CubridSubqueryTest(){
|
||||
$this->xmlPath = str_replace('CubridSubqueryTest.php', '', str_replace('\\', '/', __FILE__)) . $this->xmlPath;
|
||||
}
|
||||
|
||||
function _test($xml_file, $argsString, $expected){
|
||||
$this->_testQuery($xml_file, $argsString, $expected, 'getSelectSql');
|
||||
}
|
||||
|
||||
function testSelectUncorrelated1(){
|
||||
$xml_file = $this->xmlPath . "select_uncorrelated1.xml";
|
||||
$argsString = '$args->user_id = 4;
|
||||
';
|
||||
$expected = 'select "column_a" as "value_a"
|
||||
, (select max("column_b") as "count"
|
||||
from "xe_table_b" as "table_b"
|
||||
) as "value_b"
|
||||
from "xe_table_a" as "table_a"
|
||||
where "column_a" = 4';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testSelectUncorrelated2(){
|
||||
$xml_file = $this->xmlPath . "select_uncorrelated2.xml";
|
||||
$argsString = '$args->user_id = 4;
|
||||
$args->user_name = 7;
|
||||
';
|
||||
$expected = 'SELECT "column_a" as "value_a"
|
||||
, "column_b" as "value_b"
|
||||
, "column_c" as "value_c"
|
||||
, (SELECT max("column_b") as "count"
|
||||
FROM "xe_table_b" as "table_b"
|
||||
WHERE "column_ab" = 7) as "value_b"
|
||||
FROM "xe_table_a" as "table_a"
|
||||
WHERE "column_a" = 4';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testFromUncorrelated1(){
|
||||
$xml_file = $this->xmlPath . "from_uncorrelated1.xml";
|
||||
$argsString = '$args->user_id = 4;
|
||||
$args->user_name = 7;
|
||||
';
|
||||
$expected = 'select max("documentcountbymember"."count") as "maxcount"
|
||||
from (
|
||||
select "member_srl" as "member_srl"
|
||||
, count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
group by "member_srl"
|
||||
) as "documentcountbymember"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
// function testFromUncorrelated2(){
|
||||
// $xml_file = $this->xmlPath . "from_uncorrelated1.xml";
|
||||
// $argsString = '$args->user_id = 4;
|
||||
// $args->user_name = 7;
|
||||
// ';
|
||||
// $expected = 'select max("documentcountbymember"."count") as "maxcount"
|
||||
// from (
|
||||
// select "member_srl" as "member_srl"
|
||||
// , count(*) as "count"
|
||||
// from "xe_documents" as "documents"
|
||||
// group by "member_srl"
|
||||
// ) as "documentcountbymember"';
|
||||
// $this->_test($xml_file, $argsString, $expected);
|
||||
// }
|
||||
|
||||
function testFromUncorrelated2(){
|
||||
$xml_file = $this->xmlPath . "from_uncorrelated2.xml";
|
||||
$argsString = '$args->member_srl = 4;
|
||||
$args->module_srl = 7;
|
||||
';
|
||||
$expected = 'select max("documentcountbymember"."count") as "maxcount"
|
||||
from (
|
||||
select "member_srl" as "member_srl"
|
||||
, count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
where "module_srl" = 7
|
||||
group by "member_srl"
|
||||
) as "documentcountbymember"
|
||||
where "member_srl" = 4
|
||||
';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testSelectCorrelated1(){
|
||||
$xml_file = $this->xmlPath . "select_correlated1.xml";
|
||||
$argsString = '$args->user_id = 7;';
|
||||
$expected = 'select *,
|
||||
(select count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
where "documents"."user_id" = "member"."user_id"
|
||||
) as "totaldocumentcount"
|
||||
from "xe_member" as "member"
|
||||
where "user_id" = \'7\'';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testSelectCorrelated2(){
|
||||
$xml_file = $this->xmlPath . "select_correlated2.xml";
|
||||
$argsString = '$args->user_id = 7;
|
||||
$args->module_srl = 17;
|
||||
';
|
||||
$expected = 'select *,
|
||||
(select count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
where "documents"."user_id" = "member"."user_id"
|
||||
and "module_srl" = 17
|
||||
) as "totaldocumentcount"
|
||||
from "xe_member" as "member"
|
||||
where "user_id" = \'7\'';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testWhereCorrelated1(){
|
||||
$xml_file = $this->xmlPath . "where_correlated1.xml";
|
||||
$argsString = '';
|
||||
$expected = 'select *
|
||||
from "xe_member" as "member"
|
||||
where "regdate" = (
|
||||
select max("regdate") as "maxregdate"
|
||||
from "xe_documents" as "documents"
|
||||
where "documents"."user_id" = "member"."user_id"
|
||||
)';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testWhereCorrelated2(){
|
||||
$xml_file = $this->xmlPath . "where_correlated2.xml";
|
||||
$argsString = '$args->module_srl = 12; $args->member_srl = 19;';
|
||||
$expected = 'select *
|
||||
from "xe_member" as "member"
|
||||
where "member_srl" = 19
|
||||
and "regdate" = (
|
||||
select max("regdate") as "maxregdate"
|
||||
from "xe_documents" as "documents"
|
||||
where "documents"."user_id" = "member"."user_id"
|
||||
and "module_srl" = 12
|
||||
)
|
||||
';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testFromCorrelated1(){
|
||||
$xml_file = $this->xmlPath . "from_correlated1.xml";
|
||||
$argsString = '';
|
||||
$expected = 'select "m"."member_srl"
|
||||
, "m"."nickname"
|
||||
, "m"."regdate"
|
||||
, "a"."count"
|
||||
from (
|
||||
select "member_srl" as "member_srl"
|
||||
, count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
group by "member_srl"
|
||||
) as "a"
|
||||
left join "xe_member" as "m" on "m"."member" = "a"."member_srl"';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function testFromCorrelated2(){
|
||||
$xml_file = $this->xmlPath . "from_correlated2.xml";
|
||||
$argsString = '$args->module_srl = 12; $args->count = 20;';
|
||||
$expected = 'select "m"."member_srl"
|
||||
, "m"."nickname"
|
||||
, "m"."regdate"
|
||||
, "a"."count"
|
||||
from (
|
||||
select "member_srl" as "member_srl"
|
||||
, count(*) as "count"
|
||||
from "xe_documents" as "documents"
|
||||
where "module_srl" = 12
|
||||
group by "member_srl"
|
||||
) as "a"
|
||||
left join "xe_member" as "m" on "m"."member" = "a"."member_srl"
|
||||
where "a"."count" >= 20
|
||||
';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
}
|
||||
?>
|
||||
73
test-phpUnit/db/xml_query/cubrid/CubridUpdateTest.php
Normal file
73
test-phpUnit/db/xml_query/cubrid/CubridUpdateTest.php
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?php
|
||||
require(_XE_PATH_ . 'test-phpUnit/config/config.inc.php');
|
||||
|
||||
class CubridUpdateTest extends CubridTest {
|
||||
|
||||
function _test($xml_file, $argsString, $expected){
|
||||
$this->_testQuery($xml_file, $argsString, $expected, 'getUpdateSql');
|
||||
}
|
||||
|
||||
function test_module_updateModule(){
|
||||
$xml_file = _XE_PATH_ . "modules/module/queries/updateModule.xml";
|
||||
$argsString = ' $args->module_category_srl = 0;
|
||||
$args->browser_title = "test";
|
||||
$args->layout_srl = 0;
|
||||
$args->mlayout_srl = 0;
|
||||
$args->module = "page";
|
||||
$args->mid = "test";
|
||||
$args->use_mobile = "";
|
||||
$args->site_srl = 0;
|
||||
$args->module_srl = 47374;';
|
||||
$expected = 'UPDATE "xe_modules"
|
||||
SET "module" = \'page\'
|
||||
, "mid" = \'test\'
|
||||
, "browser_title" = \'test\'
|
||||
, "description" = \'\'
|
||||
, "is_default" = \'N\'
|
||||
, "open_rss" = \'Y\'
|
||||
, "header_text" = \'\'
|
||||
, "footer_text" = \'\'
|
||||
, "use_mobile" = \'n\'
|
||||
WHERE "site_srl" = 0
|
||||
AND "module_srl" = 47374';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
function test_member_updateLastLogin(){
|
||||
$xml_file = _XE_PATH_ . "modules/member/queries/updateLastLogin.xml";
|
||||
$argsString = ' $args->member_srl = 4;
|
||||
$args->last_login = "20110607120549";';
|
||||
$expected = 'UPDATE "xe_member" SET "member_srl" = 4, "last_login" = \'20110607120549\' WHERE "member_srl" = 4';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_updatePoint(){
|
||||
$xml_file = _XE_PATH_ . "modules/point/queries/updatePoint.xml";
|
||||
$argsString = ' $args->member_srl = 4;
|
||||
$args->point = 105;';
|
||||
$expected = 'UPDATE "xe_point" SET "point" = 105 WHERE "member_srl" = 4';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_updateCounterUnique(){
|
||||
$xml_file = _XE_PATH_ . "modules/counter/queries/updateCounterUnique.xml";
|
||||
$argsString = '$args->regdate = 20110607;
|
||||
';
|
||||
$expected = 'UPDATE "xe_counter_status" SET "unique_visitor" = "unique_visitor" + 1,
|
||||
"pageview" = "pageview" + 1 WHERE "regdate" = 20110607 ';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
function test_module_updateMenu(){
|
||||
$xml_file = _XE_PATH_ . "modules/menu/queries/updateMenu.xml";
|
||||
$argsString = '$args->menu_srl = 204;
|
||||
$args->title = "test_menu";
|
||||
';
|
||||
$expected = 'UPDATE "xe_menu" SET "title" = \'test_menu\' WHERE "menu_srl" = 204';
|
||||
$this->_test($xml_file, $argsString, $expected);
|
||||
}
|
||||
|
||||
// $queryTester->test_admin_deleteActionForward();
|
||||
// $queryTester->test_module_insertModule();
|
||||
|
||||
|
||||
}
|
||||
27
test-phpUnit/db/xml_query/cubrid/data/from_correlated1.xml
Normal file
27
test-phpUnit/db/xml_query/cubrid/data/from_correlated1.xml
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table query="true" alias="a">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="member_srl" alias="member_srl" />
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<groups>
|
||||
<group column="member_srl" />
|
||||
</groups>
|
||||
</table>
|
||||
<table name="member" alias="m" type="left join">
|
||||
<conditions>
|
||||
<condition operation="equal" column="m.member" default="a.member_srl" />
|
||||
</conditions>
|
||||
</table>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="m.member_srl" />
|
||||
<column name="m.nickname" />
|
||||
<column name="m.regdate" />
|
||||
<column name="a.count" />
|
||||
</columns>
|
||||
</query>
|
||||
33
test-phpUnit/db/xml_query/cubrid/data/from_correlated2.xml
Normal file
33
test-phpUnit/db/xml_query/cubrid/data/from_correlated2.xml
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table query="true" alias="a">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="member_srl" alias="member_srl" />
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
<groups>
|
||||
<group column="member_srl" />
|
||||
</groups>
|
||||
</table>
|
||||
<table name="member" alias="m" type="left join">
|
||||
<conditions>
|
||||
<condition operation="equal" column="m.member" default="a.member_srl" />
|
||||
</conditions>
|
||||
</table>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="m.member_srl" />
|
||||
<column name="m.nickname" />
|
||||
<column name="m.regdate" />
|
||||
<column name="a.count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="more" column="a.count" var="count" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
19
test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated1.xml
Normal file
19
test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated1.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table query="true" alias="documentCountByMember">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="member_srl" alias="member_srl" />
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<groups>
|
||||
<group column="member_srl" />
|
||||
</groups>
|
||||
</table>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="MAX(documentCountByMember.count)" alias="maxCount" />
|
||||
</columns>
|
||||
</query>
|
||||
25
test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated2.xml
Normal file
25
test-phpUnit/db/xml_query/cubrid/data/from_uncorrelated2.xml
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table query="true" alias="documentCountByMember">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="member_srl" alias="member_srl" />
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
<groups>
|
||||
<group column="member_srl" />
|
||||
</groups>
|
||||
</table>
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="MAX(documentCountByMember.count)" alias="maxCount" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
22
test-phpUnit/db/xml_query/cubrid/data/select_correlated1.xml
Normal file
22
test-phpUnit/db/xml_query/cubrid/data/select_correlated1.xml
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<query id="getStatistics" action="select">
|
||||
<tables>
|
||||
<table name="member" alias="member" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
<query id="getMemberDocumentCount" alias="totalDocumentCount">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.user_id" default="member.user_id" />
|
||||
</conditions>
|
||||
</query>
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="user_id" var="user_id" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
23
test-phpUnit/db/xml_query/cubrid/data/select_correlated2.xml
Normal file
23
test-phpUnit/db/xml_query/cubrid/data/select_correlated2.xml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<query id="getStatistics" action="select">
|
||||
<tables>
|
||||
<table name="member" alias="member" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
<query id="getMemberDocumentCount" alias="totalDocumentCount">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.user_id" default="member.user_id" />
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="user_id" var="user_id" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<query id="select_uncorrelated" action="select">
|
||||
<tables>
|
||||
<table name="table_a" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="column_a" alias="value_a" />
|
||||
<query alias="value_b">
|
||||
<tables>
|
||||
<table name="table_b" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(column_b)" alias="count" />
|
||||
</columns>
|
||||
</query>
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="column_a" var="user_id" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
<query id="select_uncorrelated" action="select">
|
||||
<tables>
|
||||
<table name="table_a" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="column_a" alias="value_a" />
|
||||
<column name="column_b" alias="value_b" />
|
||||
<query alias="value_b">
|
||||
<tables>
|
||||
<table name="table_b" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(column_b)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="column_ab" var="user_name" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
<column name="column_c" alias="value_c" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="column_a" var="user_id" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
21
test-phpUnit/db/xml_query/cubrid/data/where_correlated1.xml
Normal file
21
test-phpUnit/db/xml_query/cubrid/data/where_correlated1.xml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table name="member" alias="member" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<query alias="documentMaxRegdate" operation="equal" column="regdate" notnull="notnull">
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(regdate)" alias="maxregdate" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.user_id" default="member.user_id" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
</conditions>
|
||||
</query>
|
||||
23
test-phpUnit/db/xml_query/cubrid/data/where_correlated2.xml
Normal file
23
test-phpUnit/db/xml_query/cubrid/data/where_correlated2.xml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table name="member" alias="member" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull"/>
|
||||
<query alias="documentMaxRegdate" operation="equal" column="regdate" notnull="notnull" pipe="and" >
|
||||
<tables>
|
||||
<table name="documents" alias="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(regdate)" alias="maxregdate" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="documents.user_id" default="member.user_id" notnull="notnull" />
|
||||
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
<query id="getMemberInfo" action="select">
|
||||
<tables>
|
||||
<table name="member" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<query operation="equal" column="regdate" alias="documentMaxRegdate">
|
||||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="max(regdate)" alias="maxregdate" />
|
||||
</columns>
|
||||
</query>
|
||||
</conditions>
|
||||
</query>
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue