merge changes of luminous to maserati (~r12676)

git-svn-id: http://xe-core.googlecode.com/svn/branches/maserati@12680 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
flyskyko 2013-02-04 08:09:07 +00:00
commit 0f04bd3f92
50 changed files with 784 additions and 265 deletions

View file

@ -1,4 +1,8 @@
<?php
/**
* File containing the XE 1.5 XmlQueryParserClass
*/
if(!defined('__XE_LOADED_XML_CLASS__'))
{
define('__XE_LOADED_XML_CLASS__', 1);
@ -30,13 +34,12 @@ if(!defined('__XE_LOADED_XML_CLASS__'))
}
/**
* New XmlQueryParser class
* @author NHN (developers@xpressengine.com)
* @brief case to parse XE xml query
* @version 0.1
* New XmlQueryParser class <br />
* Parses XE XML query files
*
* @todo need to support extend query such as subquery, union
* @todo include info about column types for parsing user input
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml
* @version 0.1
*/
class XmlQueryParser extends XmlParser
{
@ -50,11 +53,12 @@ class XmlQueryParser extends XmlParser
/**
* Create XmlQueryParser instance for Singleton
*
* @return XmlQueryParser object
*/
function &getInstance()
{
static $theInstance = null;
static $theInstance = NULL;
if(!isset($theInstance))
{
$theInstance = new XmlQueryParser();
@ -63,9 +67,16 @@ class XmlQueryParser extends XmlParser
}
/**
* Parses an XML query file
*
* 1. Read xml file<br />
* 2. Check the action<br />
* 3. Parsing and write a cache file<br />
* 3. Parse and write cache file <br />
*
* @param $query_id
* @param $xml_file
* @param $cache_file
*
* @return QueryParser object
*/
function &parse_xml_query($query_id, $xml_file, $cache_file)
@ -85,8 +96,13 @@ class XmlQueryParser extends XmlParser
}
/**
* Query XML file parsing
* @return QueryParser object
* Override for parent "parse" method
*
* @param null $query_id
* @param null $xml_file
* @param null $cache_file
*
* @return void
*/
function parse($query_id = NULL, $xml_file = NULL, $cache_file = NULL)
{
@ -94,8 +110,11 @@ class XmlQueryParser extends XmlParser
}
/**
* Return XML file content
* @return array|NULL Returns a resultant data object or NULL in case of error
* Returns XML file contents as an object
* or NULL in case of error
*
* @param $xml_file
* @return array|NULL
*/
function getXmlFileContent($xml_file)
{

View file

@ -1,33 +1,59 @@
<?php
/**
* DBParser class
* @author NHN (developers@xpressengine.com)
* @package /classes/xml/xmlquery
* File containing the DBParser class
*/
/**
* Escapes query statements: <br />
* - column names: member.member_srl =&gt; "member"."member_srl" <br />
* - expressions: SUM(member.member_srl) =&gt; SUM("member"."member_srl") <br />
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery
* @version 0.1
*/
class DBParser
{
/**
* Character for escape target value on the left
*
* For example, in CUBRID left and right escape
* chars are the same, the double quote - " <br />
* But for SQL Server, the escape is made with
* [double brackets], so the left and right char differ
*
*
* @var string
*/
var $escape_char_left;
/**
* Character for escape target value on the right
*
* For example, in CUBRID left and right escape
* chars are the same, the double quote - " <br />
* But for SQL Server, the escape is made with
* [double brackets], so the left and right char differ
*
* @var string
*/
var $escape_char_right;
/**
* Table prefix string
*
* Default is "xe_"
*
* @var string
*/
var $table_prefix;
/**
* constructor
* Constructor
*
* @param string $escape_char_left
* @param string $escape_char_right
* @param string $table_prefix
*
* @return void
*/
function DBParser($escape_char_left, $escape_char_right = "", $table_prefix = "xe_")
@ -40,6 +66,7 @@ class DBParser
/**
* Get escape character
*
* @param string $leftOrRight left or right
* @return string
*/
@ -50,17 +77,19 @@ class DBParser
}
/**
* escape the value
* Escape the value
*
* @param mixed $name
* @return string
*/
function escape($name)
{
return $this->escape_char_left . $name . $this->escape_char_right;
}
}
/**
* escape the string value
* Escape the string value
*
* @param string $name
* @return string
*/
@ -70,7 +99,8 @@ class DBParser
}
/**
* escape the string value
* Escape the string value
*
* @param string $value
* @return string
*/
@ -83,7 +113,9 @@ class DBParser
/**
* Return table full name
*
* @param string $name table name without table prefix
*
* @return string table full name with table prefix
*/
function parseTableName($name)
@ -92,8 +124,10 @@ class DBParser
}
/**
* Return colmun name after escape
* Return column name after escape
*
* @param string $name column name before escape
*
* @return string column name after escape
*/
function parseColumnName($name)
@ -102,7 +136,8 @@ class DBParser
}
/**
* Escape column
* Escape column name
*
* @param string $column_name
* @return string column name with db name
*/
@ -120,27 +155,53 @@ class DBParser
}
/**
* Column name is suitable for use in checking
* Checks to see if a given column name is unqualified
*
* Ex: "member_srl" -> unqualified <br />
* "member"."member_srl" -> qualified
*
* @param string $column_name
* @return bool
*/
function isUnqualifiedColumnName($column_name)
{
if(strpos($column_name,'.')===false && strpos($column_name,'(')===false) return true;
return false;
if(strpos($column_name,'.')===FALSE && strpos($column_name,'(')===FALSE) return TRUE;
return FALSE;
}
/**
* Column name is suitable for use in checking
* Checks to see if a given column name is qualified
*
* Ex: "member_srl" -> unqualified <br />
* "member"."member_srl" -> qualified
*
* @param string $column_name
* @return bool
*/
function isQualifiedColumnName($column_name)
{
if(strpos($column_name,'.')!==false && strpos($column_name,'(')===false) return true;
return false;
if(strpos($column_name,'.')!==FALSE && strpos($column_name,'(')===FALSE) return TRUE;
return FALSE;
}
/**
* Escapes a query expression
*
* An expression can be: <br />
* <ul>
* <li> a column name: "member_srl" or "xe_member"."member_srl"
* <li> an expression:
* <ul>
* <li> LEFT(UPPER("content")) <br />
* <li> readed_count + voted_count <br />
* <li> CAST(regdate as DATE) </li>
* </ul>
* </li>
* </ul>
*
* @param $column_name
* @return string
*/
function parseExpression($column_name)
{
$functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
@ -156,45 +217,47 @@ class DBParser
{
$match = &$matches[$i];
if($match == '(') {$brackets++; continue;}
if(strpos($match,')') !== false) continue;
if(strpos($match,')') !== FALSE) continue;
if(in_array($match, array(',', '.'))) continue;
if($brackets == $total_brackets)
{
if(!is_numeric($match))
if(!is_numeric($match) && !in_array(strtoupper($match), array('UNSIGNED', 'INTEGER', 'AS')))
{
$match = $this->escapeColumnExpression($match);
}
}
}
$function = implode('', $matches);
}
return implode('', $functions);
}
return implode('', $functions);
}
/*
* Checks argument is asterisk
/**
* Checks if a given argument is an asterisk
*
* @param string $column_name
* @return bool
*/
function isStar($column_name)
{
if(substr($column_name,-1) == '*') return true;
return false;
if(substr($column_name,-1) == '*') return TRUE;
return FALSE;
}
/*
/**
* Checks to see if expression is an aggregate star function
* like count(*)
*
* @param string $column_name
* @return bool
*/
function isStarFunction($column_name)
{
if(strpos($column_name, "(*)")!==false) return true;
return false;
if(strpos($column_name, "(*)")!==FALSE) return TRUE;
return FALSE;
}
/*
/**
* Return column name after escape
* @param string $column_name
* @return string
@ -206,9 +269,9 @@ class DBParser
{
return $column_name;
}
if(strpos(strtolower($column_name), 'distinct') !== false) return $column_name;
return $this->escapeColumn($column_name);
}
if(strpos(strtolower($column_name), 'distinct') !== FALSE) return $column_name;
return $this->escapeColumn($column_name);
}
}
/* End of file DBParser.class.php */
/* Location: ./classes/xml/xmlquery/DBParser.class.php */

View file

@ -1,32 +1,46 @@
<?php
/**
* QueryParser class
* @author NHN (developers@xpressengine.com)
* @package /classes/xml/xmlquery
* File containing the QueryParser class
*/
/**
* Parses an XML Object and returns a string used for generating the PHP cache file <br />
* The XML Object structure must be the one defined in the XmlParser class
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery
* @version 0.1
*/
class QueryParser
{
/**
* QueryTag object
* Property containing the associated QueryTag object
*
* @var QueryTag object
*/
var $queryTag;
/**
* constructor
* @param object $query
* Constructor
*
* @param object $query XML object obtained after reading the XML Query file
* @param bool $isSubQuery
* @return void
*/
function QueryParser($query = NULL, $isSubQuery = false)
function QueryParser($query = NULL, $isSubQuery = FALSE)
{
if($query)
{
$this->queryTag = new QueryTag($query, $isSubQuery);
}
}
/**
* Return table information
* Returns table information
*
* Used for finding column type info (string/numeric) <br />
* Obtains the table info from XE's XML schema files
*
* @param object $query_id
* @param bool $table_name
* @return array
@ -90,7 +104,8 @@ class QueryParser
}
/**
* Change code string from queryTag object
* Returns the contents for the query cache file
*
* @return string
*/
function toString()

View file

@ -109,6 +109,7 @@ class Argument
function getUnescapedValue()
{
if($this->value === 'null') return null;
return $this->value;
}
@ -228,8 +229,10 @@ class Argument
function isColumnName()
{
$type = $this->getType();
$value = $this->getUnescapedValue();
if($type == 'column_name') return true;
if($type == 'number' && !is_numeric($this->value) && $this->uses_default_value) return true;
if($type == 'number' && is_null($value)) return false;
if($type == 'number' && !is_numeric($value) && $this->uses_default_value) return true;
return false;
}

View file

@ -1,13 +1,12 @@
<?php
/**
* ColumnTag class
* Models the <column> tag inside an XML Query file
* Since the <column> tag supports different attributes depending on
* Models the &lt;column&gt; tag inside an XML Query file <br />
* Since the &lt;column&gt; 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.
* the base class for the classes that will model each type <column> tag.
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class ColumnTag
@ -19,7 +18,7 @@ class ColumnTag
var $name;
/**
* constructor
* Constructor
* @param string $name
* @return void
*/

View file

@ -1,23 +1,25 @@
<?php
/**
* InsertColumnTag
* Models the <column> tag inside an XML Query file whose action is 'insert'
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'insert'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnTag extends ColumnTag
{
/**
* argument
* Argument
*
* @var QueryArgument object
*/
var $argument;
/**
* constructor
* Constructor
*
* @param object $column
*
* @return void
*/
function InsertColumnTag($column)
@ -28,6 +30,13 @@ class InsertColumnTag extends ColumnTag
$this->argument = new QueryArgument($column);
}
/**
* Returns the string to be output in the cache file
* used for instantiating an InsertExpression when a
* query is executed
*
* @return string
*/
function getExpressionString()
{
return sprintf('new InsertExpression(\'%s\', ${\'%s_argument\'})'
@ -35,6 +44,11 @@ class InsertColumnTag extends ColumnTag
, $this->argument->argument_name);
}
/**
* Returns the QueryArgument object associated with this INSERT statement
*
* @return QueryArgument
*/
function getArgument()
{
return $this->argument;

View file

@ -1,16 +1,16 @@
<?php
/**
* InsertColumnTagWithoutArgument
* Models the <column> tag inside an XML Query file whose action is 'insert-select'
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'insert-select'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnTagWithoutArgument extends ColumnTag
{
/**
* constructor
* Constructor
*
* @param object $column
* @return void
*/
@ -21,14 +21,24 @@ class InsertColumnTagWithoutArgument extends ColumnTag
$this->name = $dbParser->parseColumnName($this->name);
}
/**
* Returns the string to be output in the cache file
*
* @return string
*/
function getExpressionString()
{
return sprintf('new Expression(\'%s\')', $this->name);
}
/**
* Returns the QueryArgument object associated with this INSERT statement
*
* @return null
*/
function getArgument()
{
return null;
return NULL;
}
}

View file

@ -1,22 +1,23 @@
<?php
/**
* InsertColumnsTag class
* Models the <column> tag inside an XML Query file whose action is 'insert'
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'insert'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnsTag
{
/**
* Column list
*
* @var array value is InsertColumnTag object
*/
var $columns;
/**
* constructor
* Constructor
*
* @param array|string $xml_columns
* @return void
*/
@ -39,6 +40,7 @@ class InsertColumnsTag
/**
* InsertColumnTag object to string
*
* @return string
*/
function toString()
@ -55,6 +57,7 @@ class InsertColumnsTag
/**
* Return argument list
*
* @return array
*/
function getArguments()

View file

@ -1,27 +1,30 @@
<?php
/**
* SelectColumnTag
* Models the <column> tag inside an XML Query file whose action is 'select'
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'select'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class SelectColumnTag extends ColumnTag
{
/**
* alias
* Column alias
*
* @var string
*/
var $alias;
/**
* click count status
* Click count status
*
* @var bool
*/
var $click_count;
/**
* constructor
* Constructor
*
* @param string|object $column
* @return void
*/
@ -43,15 +46,27 @@ class SelectColumnTag extends ColumnTag
}
}
/**
* Returns the string to be output in the cache file
*
* A select column tag in an XML query can be used for:
* <ul>
* <li> a star expression: SELECT *
* <li> a click count expression: SELECT + UPDATE
* <li> any other select expression (column name, function call etc). </li>
* </ul>
*
* @return string
*/
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);
return sprintf('new ClickCountExpression(\'%s\', %s, $args->%s)', $this->name, $this->alias ? '\'' . $this->alias . '\'' : "''",$this->click_count);
if(strpos($this->name, '$') === 0)
return sprintf('new SelectExpression($args->%s)', substr($this->name, 1));
$dbParser = DB::getParser();
return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': '');
return sprintf('new SelectExpression(\'%s\'%s)', $this->name, $this->alias ? ', \''.$dbParser->escape($this->alias) .'\'': '');
}
}
/* End of file SelectColumnTag.class.php */

View file

@ -1,22 +1,25 @@
<?php
/**
* SelectColumnTag class
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'select'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class SelectColumnsTag
{
/**
* Column list
*
* @var array value is SelectColumnTag object
*/
var $columns;
/**
* constructor
* @param Xml_Node_ $xml_columns
* Constructor
*
* @param $xml_columns_tag
* @internal param \Xml_Node_ $xml_columns
* @return void
*/
function SelectColumnsTag($xml_columns_tag)
@ -52,12 +55,13 @@ class SelectColumnsTag
foreach($xml_queries as $column)
{
$this->columns[] = new QueryTag($column, true);
$this->columns[] = new QueryTag($column, TRUE);
}
}
/**
* SelectColumnTag object to string
* Returns the string to be output in the cache file
*
* @return string
*/
function toString()
@ -77,6 +81,7 @@ class SelectColumnsTag
/**
* Return argument list
*
* @return array
*/
function getArguments()

View file

@ -1,46 +1,55 @@
<?php
/**
* UpdateColumnTag
* Models the <column> tag inside an XML Query file whose action is 'update'
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'update'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class UpdateColumnTag extends ColumnTag
{
/**
* argument
* Argument
*
* @var QueryArgument object
*/
var $argument;
/**
* default value
* Default value
*
* @var string
*/
var $default_value;
/**
* constructor
* Constructor
*
* @param object $column
* @return void
*/
function UpdateColumnTag($column)
{
parent::ColumnTag($column->attrs->name);
$dbParser = DB::getParser();
$this->name = $dbParser->parseColumnName($this->name);
if($column->attrs->var)
$this->argument = new QueryArgument($column);
else
{
if(strpos($column->attrs->default, '.') !== false)
if(strpos($column->attrs->default, '.') !== FALSE)
{
$this->default_value = "'" . $dbParser->parseColumnName($column->attrs->default) . "'";
}
else
{
$default_value = new DefaultValue($this->name, $column->attrs->default);
if($default_value->isOperation())
$this->argument = new QueryArgument($column, true);
{
$this->argument = new QueryArgument($column, TRUE);
}
//else $this->default_value = $dbParser->parseColumnName($column->attrs->default);
else
{
@ -58,6 +67,11 @@ class UpdateColumnTag extends ColumnTag
}
}
/**
* Returns the string to be output in the cache file
*
* @return string
*/
function getExpressionString()
{
if($this->argument)
@ -74,6 +88,11 @@ class UpdateColumnTag extends ColumnTag
}
}
/**
* Returns the Argument associated with this update statement
*
* @return QueryArgument
*/
function getArgument()
{
return $this->argument;

View file

@ -1,23 +1,24 @@
<?php
/**
* UpdateColumnsTag
* Models the <column> tag inside an XML Query file whose action is 'update'
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'update'
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class UpdateColumnsTag
{
/**
* Column list
*
* @var array value is UpdateColumnTag object
*/
var $columns;
/**
* constructor
* @param array|string $xml_columns
* Constructor
*
* @param array|object $xml_columns
* @return void
*/
function UpdateColumnsTag($xml_columns)
@ -34,7 +35,8 @@ class UpdateColumnsTag
}
/**
* UpdateColumnTag object to string
* Returns the string to be output in the cache file
*
* @return string
*/
function toString()
@ -51,6 +53,7 @@ class UpdateColumnsTag
/**
* Return argument list
*
* @return array
*/
function getArguments()