merge from branch luminous (version 1.5.4.2, ~r12561)

git-svn-id: http://xe-core.googlecode.com/svn/trunk@12611 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
flyskyko 2013-01-30 05:53:14 +00:00
parent 2263200ce4
commit cc47d2b247
196 changed files with 3655 additions and 2033 deletions

View file

@ -113,6 +113,20 @@ class Context {
* @var bool true if attached file exists
*/
var $is_uploaded = false;
/**
* Pattern for request vars check
* @var array
*/
var $patterns = array(
'/<\?/iUsm',
'/<\%/iUsm',
'/<script\s*?language\s*?=\s*?("|\')?\s*?php\s*("|\')?/iUsm'
);
/**
* Check init
* @var bool false if init fail
*/
var $isSuccessInit = true;
/**
* returns static context object (Singleton). It's to use Context without declaration of an object
@ -235,16 +249,19 @@ class Context {
$oMemberModel = &getModel('member');
$oMemberController = &getController('member');
// if signed in, validate it.
if($oMemberModel->isLogged()) {
$oMemberController->setSessionInfo();
}
elseif($_COOKIE['xeak']) { // check auto sign-in
$oMemberController->doAutologin();
}
if($oMemberController && $oMemberModel)
{
// if signed in, validate it.
if($oMemberModel->isLogged()) {
$oMemberController->setSessionInfo();
}
elseif($_COOKIE['xeak']) { // check auto sign-in
$oMemberController->doAutologin();
}
$this->set('is_logged', $oMemberModel->isLogged() );
$this->set('logged_info', $oMemberModel->getLoggedInfo() );
$this->set('is_logged', $oMemberModel->isLogged() );
$this->set('logged_info', $oMemberModel->getLoggedInfo() );
}
}
// load common language file
@ -722,21 +739,63 @@ class Context {
$obj = clone($source_obj);
foreach($charset_list as $charset) {
$flag = true;
foreach($obj as $key=>$val) {
if(!$val) continue;
if($val && iconv($charset,$charset,$val)!=$val) $flag = false;
}
if($flag) {
foreach($charset_list as $charset)
{
array_walk($obj,'Context::checkConvertFlag',$charset);
$flag = Context::checkConvertFlag($flag = true);
if($flag)
{
if($charset == 'UTF-8') return $obj;
foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val);
array_walk($obj,'Context::doConvertEncoding',$charset);
return $obj;
}
}
return $obj;
}
/**
* Check flag
*
* @param mixed $val
* @param string $key
* @param mixed $charset charset
* @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5
* @return void
*/
function checkConvertFlag(&$val, $key = null, $charset = null)
{
static $flag = true;
if($charset)
{
if(is_array($val))
array_walk($val,'Context::checkConvertFlag',$charset);
else if($val && iconv($charset,$charset,$val)!=$val) $flag = false;
else $flag = false;
}
else
{
$return = $flag;
$flag = true;
return $return;
}
}
/**
* Convert array type variables into UTF-8
*
* @param mixed $val
* @param string $key
* @param string $charset character set
* @see arrayConvWalkCallback will replaced array_walk_recursive in >=PHP5
* @return object converted object
*/
function doConvertEncoding(&$val, $key = null, $charset)
{
if (is_array($val))
{
array_walk($val,'Context::doConvertEncoding',$charset);
}
else $val = iconv($charset,'UTF-8',$val);
}
/**
* Convert strings into UTF-8
@ -812,15 +871,36 @@ class Context {
if($set_to_vars)
{
$val = preg_replace('/<\?.*(\?>)?/iUsm', '', $val);
$val = preg_replace('/<\%.*(\%>)?/iUsm', '', $val);
$val = preg_replace('/<script(\s|\S)*language[\s]*=("|\')php("|\')(\s|\S)*>.*<[\s]*\/[\s]*script[\s]*>/iUsm', '', $val);
$this->_recursiveCheckVar($val);
}
$this->set($key, $val, $set_to_vars);
}
}
function _recursiveCheckVar($val)
{
if(is_string($val))
{
foreach($this->patterns as $pattern)
{
$result = preg_match($pattern, $val);
if($result)
{
$this->isSuccessInit = FALSE;
return;
}
}
}
else if(is_array($val))
{
foreach($val as $val2)
{
$this->_recursiveCheckVar($val2);
}
}
}
/**
* Handle request arguments for JSON
*
@ -893,7 +973,7 @@ class Context {
$v = stripslashes($v);
}
$val[$k] = trim($v);
if (is_string($v)) $val[$k] = trim($v);
}
}
@ -1097,7 +1177,9 @@ class Context {
'act.mid' =>$is_feed?"$mid/$act":'',
'act.mid.vid'=>$is_feed?"$vid/$mid/$act":'',
'act.document_srl.key' =>($act=='trackback')?"$srl/$key/$act":'',
'act.document_srl.key.vid'=>($act=='trackback')?"$vid/$srl/$key/$act":''
'act.document_srl.key.mid'=>($act=='trackback')?"$mid/$srl/$key/$act":'',
'act.document_srl.key.vid'=>($act=='trackback')?"$vid/$srl/$key/$act":'',
'act.document_srl.key.mid.vid'=>($act=='trackback')?"$vid/$mid/$srl/$key/$act":''
);
$query = $target_map[$target];
@ -1109,7 +1191,7 @@ class Context {
if(is_array($val) && count($val)) {
foreach($val as $k => $v) $queries[] = $key.'['.$k.']='.urlencode($v);
} else {
$queries[] = $key.'='.urlencode($val);
$queries[] = $key.'='.@urlencode($val);
}
}
if(count($queries)) $query = 'index.php?'.implode('&', $queries);

View file

@ -13,6 +13,7 @@
require(_XE_PATH_.'classes/db/queryparts/expression/InsertExpression.class.php');
require(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpression.class.php');
require(_XE_PATH_.'classes/db/queryparts/expression/UpdateExpressionWithoutArgument.class.php');
require(_XE_PATH_.'classes/db/queryparts/expression/ClickCountExpression.class.php');
require(_XE_PATH_.'classes/db/queryparts/table/Table.class.php');
require(_XE_PATH_.'classes/db/queryparts/table/JoinTable.class.php');
require(_XE_PATH_.'classes/db/queryparts/table/CubridTableWithHint.class.php');
@ -110,9 +111,9 @@
* transaction flag
* @var boolean
*/
var $transaction_started = false;
var $transaction_started = FALSE;
var $is_connected = false;
var $is_connected = FALSE;
/**
* returns enable list in supported dbms list
@ -249,7 +250,7 @@
$get_supported_list = array();
$db_classes_path = _XE_PATH_."classes/db/";
$filter = "/^DB([^\.]+)\.class\.php/i";
$supported_list = FileHandler::readDir($db_classes_path, $filter, true);
$supported_list = FileHandler::readDir($db_classes_path, $filter, TRUE);
sort($supported_list);
// after creating instance of class, check is supported
@ -269,9 +270,9 @@
if(!$oDB) continue;
$obj = null;
$obj = NULL;
$obj->db_type = $db_type;
$obj->enable = $oDB->isSupported() ? true : false;
$obj->enable = $oDB->isSupported() ? TRUE : FALSE;
$get_supported_list[] = $obj;
}
@ -295,8 +296,8 @@
* @return boolean true: connected, false: not connected
*/
function isConnected($type = 'master', $indx = 0) {
if($type == 'master') return $this->master_db["is_connected"] ? true : false;
else return $this->slave_db[$indx]["is_connected"] ? true : false;
if($type == 'master') return $this->master_db["is_connected"] ? TRUE : FALSE;
else return $this->slave_db[$indx]["is_connected"] ? TRUE : FALSE;
}
/**
@ -341,7 +342,7 @@
$debug_file = _XE_PATH_."files/_debug_db_query.php";
$buff = array();
if(!file_exists($debug_file)) $buff[] = '<?php exit(); ?>';
$buff[] = print_r($log, true);
$buff[] = print_r($log, TRUE);
if(@!$fp = fopen($debug_file, "a")) return;
fwrite($fp, implode("\n", $buff)."\n\n");
@ -385,7 +386,7 @@
* @return boolean true: error, false: no error
*/
function isError() {
return $this->errno === 0 ? false : true;
return $this->errno === 0 ? FALSE : TRUE;
}
/**
@ -535,8 +536,8 @@
* @return int count of cache data
*/
function getCountCache($tables, $condition) {
return false;
if(!$tables) return false;
return FALSE;
if(!$tables) return FALSE;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
$condition = md5($condition);
@ -548,14 +549,14 @@
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
$cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition);
if(!file_exists($cache_filename)) return false;
if(!file_exists($cache_filename)) return FALSE;
$cache_mtime = filemtime($cache_filename);
if(!is_array($tables)) $tables = array($tables);
foreach($tables as $alias => $table) {
$table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ;
if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return false;
if(!file_exists($table_filename) || filemtime($table_filename) > $cache_mtime) return FALSE;
}
$count = (int)FileHandler::readFile($cache_filename);
@ -570,8 +571,8 @@
* @return void
*/
function putCountCache($tables, $condition, $count = 0) {
return false;
if(!$tables) return false;
return FALSE;
if(!$tables) return FALSE;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
$condition = md5($condition);
@ -593,8 +594,8 @@
* @return boolean true: success, false: failed
*/
function resetCountCache($tables) {
return false;
if(!$tables) return false;
return FALSE;
if(!$tables) return FALSE;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
if(!is_array($tables)) $tables = array($tables);
@ -604,7 +605,7 @@
FileHandler::writeFile($filename, '');
}
return true;
return TRUE;
}
/**
@ -642,7 +643,7 @@
* @param boolean $with_values
* @return string
*/
function getSelectSql($query, $with_values = true){
function getSelectSql($query, $with_values = TRUE){
$select = $query->getSelectString($with_values);
if($select == '') return new Object(-1, "Invalid query");
$select = 'SELECT ' .$select;
@ -676,6 +677,36 @@
return $select . ' ' . $from . ' ' . $where . ' ' . $index_hint_list . ' ' . $groupBy . ' ' . $orderBy . ' ' . $limit;
}
/**
* Given a SELECT statement that uses click count
* returns the corresponding update sql string
* for databases that don't have click count support built in
* (aka all besides CUBRID)
*
* Function does not check if click count columns exist!
* You must call $query->usesClickCount() before using this function
*
* @param $queryObject
*/
function getClickCountQuery($queryObject)
{
$new_update_columns = array();
$click_count_columns = $queryObject->getClickCountColumns();
foreach($click_count_columns as $click_count_column)
{
$click_count_column_name = $click_count_column->column_name;
$increase_by_1 = new Argument($click_count_column_name, null);
$increase_by_1->setColumnOperation('+');
$increase_by_1->ensureDefaultValue(1);
$update_expression = new UpdateExpression($click_count_column_name, $increase_by_1);
$new_update_columns[] = $update_expression;
}
$queryObject->columns = $new_update_columns;
return $queryObject;
}
/**
* Return delete query string
* @param object $query
@ -683,7 +714,7 @@
* @param boolean $with_priority
* @return string
*/
function getDeleteSql($query, $with_values = true, $with_priority = false){
function getDeleteSql($query, $with_values = TRUE, $with_priority = FALSE){
$sql = 'DELETE ';
$sql .= $with_priority?$query->getPriority():'';
@ -708,7 +739,7 @@
* @param boolean $with_priority
* @return string
*/
function getUpdateSql($query, $with_values = true, $with_priority = false){
function getUpdateSql($query, $with_values = TRUE, $with_priority = FALSE){
$columnsList = $query->getUpdateString($with_values);
if($columnsList == '') return new Object(-1, "Invalid query");
@ -730,7 +761,7 @@
* @param boolean $with_priority
* @return string
*/
function getInsertSql($query, $with_values = true, $with_priority = false){
function getInsertSql($query, $with_values = TRUE, $with_priority = FALSE){
$tableName = $query->getFirstTableName();
$values = $query->getInsertString($with_values);
$priority = $with_priority?$query->getPriority():'';
@ -778,10 +809,10 @@
*/
function _dbInfoExists() {
if (!$this->master_db)
return false;
return FALSE;
if (count($this->slave_db) === 0)
return false;
return true;
return FALSE;
return TRUE;
}
/**
@ -811,7 +842,7 @@
$this->_close($connection["resource"]);
$connection["is_connected"] = false;
$connection["is_connected"] = FALSE;
}
/**
@ -820,7 +851,7 @@
* @return boolean
*/
function _begin(){
return true;
return TRUE;
}
/**
@ -832,7 +863,7 @@
return;
if($this->_begin())
$this->transaction_started = true;
$this->transaction_started = TRUE;
}
/**
@ -841,7 +872,7 @@
* @return boolean
*/
function _rollback(){
return true;
return TRUE;
}
/**
@ -852,7 +883,7 @@
if (!$this->isConnected() || !$this->transaction_started)
return;
if($this->_rollback())
$this->transaction_started = false;
$this->transaction_started = FALSE;
}
/**
@ -861,7 +892,7 @@
* @return boolean
*/
function _commit(){
return true;
return TRUE;
}
/**
@ -869,11 +900,11 @@
* @param boolean $force regardless transaction start status or connect status, forced to commit
* @return void
*/
function commit($force = false) {
function commit($force = FALSE) {
if (!$force && (!$this->isConnected() || !$this->transaction_started))
return;
if($this->_commit())
$this->transaction_started = false;
$this->transaction_started = FALSE;
}
/**
@ -894,8 +925,8 @@
* @param resource $connection
* @return resource
*/
function _query($query, $connection = null) {
if($connection == null)
function _query($query, $connection = NULL) {
if($connection == NULL)
$connection = $this->_getConnection('master');
// Notify to start a query execution
$this->actStart($query);
@ -971,14 +1002,14 @@
$connection = &$this->slave_db[$indx];
$result = $this->__connect($connection);
if($result === NULL || $result === false) {
$connection["is_connected"] = false;
if($result === NULL || $result === FALSE) {
$connection["is_connected"] = FALSE;
return;
}
// Check connections
$connection["resource"] = $result;
$connection["is_connected"] = true;
$connection["is_connected"] = TRUE;
// Save connection info for db logs
$this->connection = ucfirst($type) . ' ' . $connection["db_hostname"];
@ -1018,8 +1049,8 @@
* @param boolean $force force load DBParser instance
* @return DBParser
*/
function &getParser($force = false){
static $dbParser = null;
function &getParser($force = FALSE){
static $dbParser = NULL;
if(!$dbParser || $force) {
$oDB = &DB::getInstance();
$dbParser = $oDB->getParser();

View file

@ -455,7 +455,7 @@
if ($notnull) $query .= "not null ";
$this->_query ($query);
return $this->_query ($query);
}
/**

View file

@ -310,7 +310,7 @@
if($default) $query .= sprintf(" default '%s' ", $default);
if($notnull) $query .= " not null ";
$this->_query($query);
return $this->_query($query);
}
/**
@ -729,6 +729,12 @@
$data = $this->_fetch($result);
$buff = new Object ();
$buff->data = $data;
if($queryObject->usesClickCount())
{
$update_query = $this->getClickCountQuery($queryObject);
$this->_executeUpdateAct($update_query);
}
}
return $buff;
}

View file

@ -256,7 +256,7 @@ class DBMysql extends DB {
if($default) $query .= sprintf(" default '%s' ", $default);
if($notnull) $query .= " not null ";
$this->_query($query);
return $this->_query($query);
}
/**
@ -501,6 +501,13 @@ class DBMysql extends DB {
$data = $this->_fetch($result);
$buff = new Object ();
$buff->data = $data;
if($queryObject->usesClickCount())
{
$update_query = $this->getClickCountQuery($queryObject);
$this->_executeUpdateAct($update_query, $with_values);
}
return $buff;
}
}

View file

@ -56,13 +56,13 @@
* argument list
* @var array
*/
var $arguments = null;
var $arguments = NULL;
/**
* column list
* @var array
*/
var $columnList = null;
var $columnList = NULL;
/**
* order by text
@ -83,15 +83,15 @@
* @param string $priority
* @return void
*/
function Query($queryID = null
, $action = null
, $columns = null
, $tables = null
, $conditions = null
, $groups = null
, $orderby = null
, $limit = null
, $priority = null){
function Query($queryID = NULL
, $action = NULL
, $columns = NULL
, $tables = NULL
, $conditions = NULL
, $groups = NULL
, $orderby = NULL
, $limit = NULL
, $priority = NULL){
$this->queryID = $queryID;
$this->action = $action;
$this->priority = $priority;
@ -106,7 +106,7 @@
}
function show(){
return true;
return TRUE;
}
function setQueryId($queryID){
@ -149,7 +149,7 @@
function setTables($tables){
if(!isset($tables) || count($tables) === 0){
$this->setError(true);
$this->setError(TRUE);
$this->setMessage("You must provide at least one table for the query.");
return;
}
@ -158,10 +158,10 @@
$this->tables = $tables;
}
function setSubquery($subquery){
$this->subquery = $subquery;
}
function setSubquery($subquery){
$this->subquery = $subquery;
}
function setConditions($conditions){
$this->conditions = array();
@ -198,7 +198,7 @@
* @param string|array $columns
* @return Query return Query instance
*/
function select($columns= null){
function select($columns= NULL){
$this->action = 'select';
$this->setColumns($columns);
return $this;
@ -263,12 +263,34 @@
return $this->priority?'LOW_PRIORITY':'';
}
/**
* Check if current query uses the click count attribute
* For CUBRID, this statement uses the click count feature.
* For the other databases, using this attribute causes a query
* to produce both a select and an update
*/
function usesClickCount()
{
return count($this->getClickCountColumns()) > 0;
}
function getClickCountColumns()
{
$click_count_columns = array();
foreach($this->columns as $column){
if($column->show() && is_a($column, 'ClickCountExpression'))
$click_count_columns[] = $column;
}
return $click_count_columns;
}
/**
* Return select sql
* @param boolean $with_values
* @return string
*/
function getSelectString($with_values = true){
function getSelectString($with_values = TRUE){
$select = array();
foreach($this->columns as $column){
if($column->show())
if($column->isSubquery()){
@ -285,7 +307,7 @@
* @param boolean $with_values
* @return string
*/
function getUpdateString($with_values = true){
function getUpdateString($with_values = TRUE){
foreach($this->columns as $column){
if($column->show())
$update[] = $column->getExpression($with_values);
@ -298,22 +320,22 @@
* @param boolean $with_values
* @return string
*/
function getInsertString($with_values = true){
function getInsertString($with_values = TRUE){
$columnsList = '';
if($this->subquery){ // means we have insert-select
foreach($this->columns as $column){
$columnsList .= $column->getColumnName() . ', ';
}
$columnsList = substr($columnsList, 0, -2);
$selectStatement = $this->subquery->toString($with_values);
$selectStatement = substr($selectStatement, 1, -1);
return "($columnsList) \n $selectStatement";
}
if($this->subquery){ // means we have insert-select
foreach($this->columns as $column){
$columnsList .= $column->getColumnName() . ', ';
}
$columnsList = substr($columnsList, 0, -2);
$selectStatement = $this->subquery->toString($with_values);
$selectStatement = substr($selectStatement, 1, -1);
return "($columnsList) \n $selectStatement";
}
$valuesList = '';
foreach($this->columns as $column){
if($column->show()){
@ -339,7 +361,7 @@
* @param boolean $with_values
* @return string
*/
function getFromString($with_values = true){
function getFromString($with_values = TRUE){
$from = '';
$simple_table_count = 0;
foreach($this->tables as $table){
@ -360,7 +382,7 @@
* @param boolean $with_optimization
* @return string
*/
function getWhereString($with_values = true, $with_optimization = true){
function getWhereString($with_values = TRUE, $with_optimization = TRUE){
$where = '';
$condition_count = 0;

View file

@ -23,9 +23,8 @@
parent::SelectExpression($column_name, $alias);
if(!is_bool($click_count)){
error_log("Click_count value for $column_name was not boolean", 0);
// error_log("Click_count value for $column_name was not boolean", 0);
$this->click_count = false;
return;
}
$this->click_count = $click_count;
}
@ -39,7 +38,15 @@
* @return string
*/
function getExpression(){
return "$this->column_name = $this->column_name + 1";
$db_type = Context::getDBType();
if($db_type == 'cubrid')
{
return "INCR($this->column_name)";
}
else
{
return "$this->column_name";
}
}
}

View file

@ -27,7 +27,8 @@
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
function_exists('ob_gzhandler') &&
extension_loaded('zlib')
extension_loaded('zlib') &&
$oModule->gzhandler_enable
) $this->gz_enabled = true;
// Extract contents to display by the request method
if(Context::get('xeVirtualRequestMethod')=='xml') {

View file

@ -370,6 +370,32 @@ class FileHandler {
* @return string If success, the content of the target file. Otherwise: none
**/
function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) {
if(version_compare(PHP_VERSION, '5.0.0', '>='))
{
return include _XE_PATH_ . 'classes/file/getRemoteResourcePHP5.php';
}
else
{
return FileHandler::_getRemoteResource($url, $boyd, $timeout, $mehtod, $conent_type, $headers, $cookies, $post_data);
}
}
/**
* Return remote file's content via HTTP
*
* If the target is moved (when return code is 300~399), this function follows the location specified response header.
*
* @param string $url The address of the target file
* @param string $body HTTP request body
* @param int $timeout Connection timeout
* @param string $method GET/POST
* @param string $content_type Content type header of HTTP request
* @param string[] $headers Headers key vaule array.
* @param string[] $cookies Cookies key value array.
* @param string $post_data Request arguments array for POST method
* @return string If success, the content of the target file. Otherwise: none
**/
function _getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) {
requirePear();
require_once('HTTP/Request.php');

View file

@ -0,0 +1,9 @@
<?php
try
{
return self::_getRemoteResource($url, $body, $timeout, $method, $content_type, $headers, $cookies, $post_data);
}
catch(Exception $e)
{
return NULL;
}

View file

@ -97,12 +97,35 @@
if (!is_array($args)) $args = array($args);
$pathInfo = pathinfo($args[0]);
$file = new stdClass();
$file->fileName = $pathInfo['basename'];
$file->filePath = $this->_getAbsFileUrl($pathInfo['dirname']);
$file->fileRealPath = FileHandler::getRealPath($pathInfo['dirname']);
$file->fileExtension = strtolower($pathInfo['extension']);
$file->fileNameNoExt = preg_replace('/\.min$/', '', $pathInfo['filename']);
$file->keyName = implode('.', array($file->fileNameNoExt, $file->fileExtension));
if (strpos($file->filePath, '://') == false)
if(strpos($file->filePath, '://') === FALSE)
{
if(!__DEBUG__)
{
// if no debug mode, load minifed file
$minifiedFileName = implode('.', array($file->fileNameNoExt, 'min', $file->fileExtension));
$minifiedRealPath = implode('/', array($file->fileRealPath, $minifiedFileName));
if(file_exists($minifiedRealPath))
{
$file->fileName = $minifiedFileName;
}
}
else
{
// Remove .min
if(file_exists(implode('/', array($file->fileRealPath, $file->keyName))))
{
$file->fileName = $file->keyName;
}
}
$file->useCdn = $useCdn;
$file->cdnPath = $this->_normalizeFilePath($pathInfo['dirname']);
$file->cdnPrefix = $cdnPrefix;
@ -121,7 +144,7 @@
if (!$file->media) $file->media = 'all';
$map = &$this->cssMap;
$mapIndex = &$this->cssMapIndex;
$key = $file->filePath . $file->fileName . "\t" . $file->targetIe . "\t" . $file->media;
$key = $file->filePath . $file->keyName . "\t" . $file->targetIe . "\t" . $file->media;
$this->_arrangeCssIndex($pathInfo['dirname'], $file);
}
@ -138,11 +161,11 @@
$map = &$this->jsHeadMap;
$mapIndex = &$this->jsHeadMapIndex;
}
$key = $file->filePath . $file->fileName . "\t" . $file->targetIe;
$key = $file->filePath . $file->keyName . "\t" . $file->targetIe;
}
(is_null($file->index))?$file->index=0:$file->index=$file->index;
if (!isset($map[$file->index][$key]) || $mapIndex[$key] != $file->index)
if (!isset($map[$file->index][$key]) || $mapIndex[$key] > $file->index)
{
$this->unloadFile($args[0], $args[2], $args[1]);
$map[$file->index][$key] = $file;

View file

@ -38,6 +38,14 @@
$this->act = Context::get('act');
return;
}
$oContext = Context::getInstance();
if($oContext->isSuccessInit == false)
{
$this->error = 'msg_invalid_request';
return;
}
// Set variables from request arguments
$this->module = $module?$module:Context::get('module');
$this->act = $act?$act:Context::get('act');
@ -151,7 +159,17 @@
$this->mid = $module_info->mid;
$this->module_info = $module_info;
Context::setBrowserTitle($module_info->browser_title);
$part_config= $oModuleModel->getModulePartConfig('layout',$module_info->layout_srl);
if($module_info->use_mobile && Mobile::isFromMobilePhone())
{
$layoutSrl = $module_info->mlayout_srl;
}
else
{
$layoutSrl = $module_info->layout_srl;
}
$part_config= $oModuleModel->getModulePartConfig('layout',$layoutSrl);
Context::addHtmlHeader($part_config->header_script);
}
@ -361,6 +379,20 @@
{
$oModule = &$this->getModuleInstance($forward->module, $type, $kind);
}
if(!is_object($oModule)) {
$type = Mobile::isFromMobilePhone() ? 'mobile' : 'view';
$oMessageObject = &ModuleHandler::getModuleInstance('message',$type);
$oMessageObject->setError(-1);
$oMessageObject->setMessage('msg_module_is_not_exists');
$oMessageObject->dispMessage();
if($this->httpStatusCode)
{
$oMessageObject->setHttpStatusCode($this->httpStatusCode);
}
return $oMessageObject;
}
$xml_info = $oModuleModel->getModuleActionXml($forward->module);
$oMemberModel = &getModel('member');
@ -686,6 +718,7 @@
if(__DEBUG__==3) $start_time = getMicroTime();
$parent_module = $module;
$kind = strtolower($kind);
$type = strtolower($type);
@ -702,10 +735,13 @@
// if there is no instance of the module in global variable, create a new one
if(!isset($GLOBALS['_loaded_module'][$module][$type][$kind]))
{
$parent_module = $module;
ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
$class_path = ModuleHandler::getModulePath($module);
if(!is_dir(FileHandler::getRealPath($class_path))) return NULL;
if($extend_module && (!is_readable($high_class_file) || !is_readable($class_file)))
{
$module = $parent_module;
ModuleHandler::_getModuleFilePath($module, $type, $kind, $class_path, $high_class_file, $class_file, $instance_name);
}
// Get base class name and load the file contains it
if(!class_exists($module)) {
@ -714,23 +750,6 @@
require_once($high_class_file);
}
// Get the object's name
$types = explode(' ', 'view controller model api wap mobile class');
if(!in_array($type, $types)) $type = $types[0];
if($type == 'class') {
$instance_name = '%s';
$class_file = '%s%s.%s.php';
} elseif($kind == 'admin' && array_search($type, $types) < 3) {
$instance_name = '%sAdmin%s';
$class_file = '%s%s.admin.%s.php';
} else{
$instance_name = '%s%s';
$class_file = '%s%s.%s.php';
}
$instance_name = sprintf($instance_name, $module, ucfirst($type));
$class_file = sprintf($class_file, $class_path, $module, $type);
$class_file = FileHandler::getRealPath($class_file);
// Get the name of the class file
if(!is_readable($class_file)) return NULL;
@ -767,6 +786,31 @@
return $GLOBALS['_loaded_module'][$module][$type][$kind];
}
function _getModuleFilePath($module, $type, $kind, &$classPath, &$highClassFile, &$classFile, &$instanceName)
{
$classPath = ModuleHandler::getModulePath($module);
$highClassFile = sprintf('%s%s%s.class.php', _XE_PATH_,$classPath, $module);
$highClassFile = FileHandler::getRealPath($highClassFile);
$types = explode(' ', 'view controller model api wap mobile class');
if(!in_array($type, $types)) $type = $types[0];
if($type == 'class') {
$instanceName = '%s';
$classFile = '%s%s.%s.php';
} elseif($kind == 'admin' && array_search($type, $types) < 3) {
$instanceName = '%sAdmin%s';
$classFile = '%s%s.admin.%s.php';
} else{
$instanceName = '%s%s';
$classFile = '%s%s.%s.php';
}
$instanceName = sprintf($instanceName, $module, ucfirst($type));
$classFile = sprintf($classFile, $classPath, $module, $type);
$classFile = FileHandler::getRealPath($classFile);
}
/**
* call a trigger
* @param string $trigger_name trigger's name to call

View file

@ -30,6 +30,8 @@
var $module_config = NULL;
var $ajaxRequestMethod = array('XMLRPC', 'JSON');
var $gzhandler_enable = TRUE;
/**
* setter to set the name of module
* @param string $module name of module

View file

@ -1,8 +1,18 @@
<?php
include "phphtmlparser/src/htmlparser.inc";
include _XE_PATH_ . 'classes/security/phphtmlparser/src/htmlparser.inc';
class EmbedFilter
{
/**
* allow script access list
* @var array
*/
var $allowscriptaccessList = array();
/**
* allow script access key
* @var int
*/
var $allowscriptaccessKey = 0;
var $whiteUrlXmlFile = './classes/security/conf/embedWhiteUrl.xml';
var $whiteUrlCacheFile = './files/cache/embedfilter/embedWhiteUrl.php';
var $whiteUrlList = array();
@ -275,6 +285,9 @@ class EmbedFilter
*/
function check(&$content)
{
$content = preg_replace_callback('/<(object|param|embed)[^>]*/is', array($this, '_checkAllowScriptAccess'), $content);
$content = preg_replace_callback('/<object[^>]*>/is', array($this, '_addAllowScriptAccess'), $content);
$this->checkObjectTag($content);
$this->checkEmbedTag($content);
$this->checkIframeTag($content);
@ -530,6 +543,49 @@ class EmbedFilter
return false;
}
function _checkAllowScriptAccess($m)
{
if($m[1] == 'object')
{
$this->allowscriptaccessList[] = 1;
}
if($m[1] == 'param')
{
if(strpos(strtolower($m[0]), 'allowscriptaccess'))
{
$m[0] = '<param name="allowscriptaccess" value="never"';
if(substr($m[0], -1) == '/')
{
$m[0] .= '/';
}
$this->allowscriptaccessList[count($this->allowscriptaccessList)-1]--;
}
}
else if($m[1] == 'embed')
{
if(strpos(strtolower($m[0]), 'allowscriptaccess'))
{
$m[0] = preg_replace('/always|samedomain/i', 'never', $m[0]);
}
else
{
$m[0] = preg_replace('/\<embed/i', '<embed allowscriptaccess="never"', $m[0]);
}
}
return $m[0];
}
function _addAllowScriptAccess($m)
{
if($this->allowscriptaccessList[$this->allowscriptaccessKey] == 1)
{
$m[0] = $m[0].'<param name="allowscriptaccess" value="never"></param>';
}
$this->allowscriptaccessKey++;
return $m[0];
}
/**
* Make white domain list cache file from xml config file.
* @return void

View file

@ -239,7 +239,13 @@ class Validator
$value = $exists ? $fields[$fname] : null;
}
if(is_array($value)) $value = implode('', $value);
if(is_array($value)) {
if(!isset($value[tmp_name])){
$value = implode('', $value);
}else{
$value = $value['name'];
}
}
// conditional statement
foreach($filter['if'] as $cond) {

View file

@ -1,109 +1,124 @@
<?php
if(!defined('__XE_LOADED_XML_CLASS__')){
define('__XE_LOADED_XML_CLASS__', 1);
/**
* File containing the XE 1.5 XmlQueryParserClass
*/
require(_XE_PATH_.'classes/xml/xmlquery/tags/query/QueryTag.class.php');
if(!defined('__XE_LOADED_XML_CLASS__')){
define('__XE_LOADED_XML_CLASS__', 1);
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/HintTableTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/TablesTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/query/QueryTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/TableTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/HintTableTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/table/TablesTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/ColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnTagWithoutArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/SelectColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/InsertColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/column/UpdateColumnsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/JoinConditionsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/group/GroupsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/group/GroupsTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/NavigationTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/NavigationTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/IndexTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/tags/navigation/LimitTag.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/SortQueryArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/QueryArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/SortQueryArgument.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/validator/QueryArgumentValidator.class.php');
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/DefaultValue.class.php');
}
require(_XE_PATH_.'classes/xml/xmlquery/queryargument/DefaultValue.class.php');
}
/**
* New XmlQueryParser class <br />
* Parses XE XML query files
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml
* @version 0.1
*/
class XmlQueryParser extends XmlParser {
/**
* New XmlQueryParser class
* @author NHN (developers@xpressengine.com)
* @brief case to parse XE xml query
* @version 0.1
* Create XmlQueryParser instance for Singleton
*
* @todo need to support extend query such as subquery, union
* @todo include info about column types for parsing user input
* @return XmlQueryParser object
*/
class XmlQueryParser extends XmlParser {
/**
* constructor
* @return void
*/
function XmlQueryParser(){
}
/**
* Create XmlQueryParser instance for Singleton
* @return XmlQueryParser object
*/
function &getInstance(){
static $theInstance = null;
if(!isset($theInstance)){
$theInstance = new XmlQueryParser();
}
return $theInstance;
}
/**
* 1. Read xml file<br />
* 2. Check the action<br />
* 3. Parsing and write a cache file<br />
* @return QueryParser object
*/
function &parse_xml_query($query_id, $xml_file, $cache_file)
function &getInstance()
{
// Read xml file
$xml_obj = $this->getXmlFileContent($xml_file);
// insert, update, delete, select action
$action = strtolower($xml_obj->query->attrs->action);
if(!$action) return;
// Write query cache file
$parser = new QueryParser($xml_obj->query);
FileHandler::writeFile($cache_file, $parser->toString());
return $parser;
}
/**
* Query XML file parsing
* @return QueryParser object
*/
function parse($query_id = NULL, $xml_file = NULL, $cache_file = NULL)
{
$this->parse_xml_query($query_id, $xml_file, $cache_file);
static $theInstance = NULL;
if(!isset($theInstance)){
$theInstance = new XmlQueryParser();
}
return $theInstance;
}
/**
* Return XML file content
* @return array|NULL Returns a resultant data object or NULL in case of error
*/
function getXmlFileContent($xml_file){
$buff = FileHandler::readFile($xml_file);
$xml_obj = parent::parse($buff);
if(!$xml_obj) return;
unset($buff);
return $xml_obj;
}
}
/**
* Parses an XML query file
*
* 1. Read xml file <br />
* 2. Check the action <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)
{
// Read xml file
$xml_obj = $this->getXmlFileContent($xml_file);
// insert, update, delete, select action
$action = strtolower($xml_obj->query->attrs->action);
if(!$action) return;
// Write query cache file
$parser = new QueryParser($xml_obj->query);
FileHandler::writeFile($cache_file, $parser->toString());
return $parser;
}
/**
* 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)
{
$this->parse_xml_query($query_id, $xml_file, $cache_file);
}
/**
* Returns XML file contents as an object
* or NULL in case of error
*
* @param $xml_file
* @return array|NULL
*/
function getXmlFileContent($xml_file)
{
$buff = FileHandler::readFile($xml_file);
$xml_obj = parent::parse($buff);
if(!$xml_obj) return;
unset($buff);
return $xml_obj;
}
}
?>

View file

@ -1,193 +1,272 @@
<?php
/**
* 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
{
/**
* DBParser class
* @author NHN (developers@xpressengine.com)
* @package /classes/xml/xmlquery
* @version 0.1
* 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
*/
class DBParser {
/**
* Character for escape target value on the left
* @var string
*/
var $escape_char_left;
/**
* Character for escape target value on the right
* @var string
*/
var $escape_char_right;
/**
* Table prefix string
* @var string
*/
var $table_prefix;
/**
* 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_"){
$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;
}
/**
* Get escape character
* @param string $leftOrRight left or right
* @return string
*/
function getEscapeChar($leftOrRight){
if ($leftOrRight === 'left')return $this->escape_char_left;
else return $this->escape_char_right;
}
/**
* 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
* @param string $name
* @return string
*/
function escapeString($name){
return "'".$this->escapeStringValue($name)."'";
}
/**
* escape the string value
* @param string $value
* @return string
*/
function escapeStringValue($value){
if($value == "*") return $value;
if (is_string($value)) return $value = str_replace("'","''",$value);
return $value;
}
/**
* Return table full name
* @param string $name table name without table prefix
* @return string table full name with table prefix
*/
function parseTableName($name){
return $this->table_prefix . $name;
}
/**
* Return colmun name after escape
* @param string $name column name before escape
* @return string column name after escape
*/
function parseColumnName($name){
return $this->escapeColumn($name);
}
/**
* Escape column
* @param string $column_name
* @return string column name with db 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);
}
}
var $escape_char_left;
/**
* Column name is suitable for use in checking
* @param string $column_name
* @return bool
*/
function isUnqualifiedColumnName($column_name){
if(strpos($column_name,'.')===false && strpos($column_name,'(')===false) return true;
return false;
}
/**
* Column name is suitable for use in checking
* @param string $column_name
* @return bool
*/
function isQualifiedColumnName($column_name){
if(strpos($column_name,'.')!==false && strpos($column_name,'(')===false) return true;
return false;
}
/**
* 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;
function parseExpression($column_name){
$functions = preg_split('/([\+\-\*\/\ ])/', $column_name, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
foreach($functions as $k => $v){
$function = &$functions[$k];
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 $i => $j){
$match = &$matches[$i];
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);
}
/**
* Table prefix string
*
* Default is "xe_"
*
* @var string
*/
var $table_prefix;
/**
* 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_")
{
$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;
}
/**
* Get escape character
*
* @param string $leftOrRight left or right
* @return string
*/
function getEscapeChar($leftOrRight)
{
if ($leftOrRight === 'left')return $this->escape_char_left;
else return $this->escape_char_right;
}
/**
* 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
*
* @param string $name
* @return string
*/
function escapeString($name)
{
return "'".$this->escapeStringValue($name)."'";
}
/**
* Escape the string value
*
* @param string $value
* @return string
*/
function escapeStringValue($value)
{
if($value == "*") return $value;
if (is_string($value)) return $value = str_replace("'","''",$value);
return $value;
}
/**
* Return table full name
*
* @param string $name table name without table prefix
*
* @return string table full name with table prefix
*/
function parseTableName($name)
{
return $this->table_prefix . $name;
}
/**
* Return column name after escape
*
* @param string $name column name before escape
*
* @return string column name after escape
*/
function parseColumnName($name)
{
return $this->escapeColumn($name);
}
/**
* Escape column name
*
* @param string $column_name
* @return string column name with db 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);
}
}
/**
* 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;
}
/**
* 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;
}
/**
* 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);
foreach($functions as $k => $v){
$function = &$functions[$k];
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 $i => $j){
$match = &$matches[$i];
if($match == '(') {$brackets++; continue;}
if(strpos($match,')') !== FALSE) continue;
if(in_array($match, array(',', '.'))) continue;
if($brackets == $total_brackets){
if(!is_numeric($match) && !in_array(strtoupper($match), array('UNSIGNED', 'INTEGER', 'AS'))) {
$match = $this->escapeColumnExpression($match);
}
}
$function = implode('', $matches);
}
return implode('', $functions);
}
/*
* Checks argument is asterisk
* @param string $column_name
* @return bool
*/
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(*)
* @param string $column_name
* @return bool
*/
function isStarFunction($column_name){
if(strpos($column_name, "(*)")!==false) return true;
return false;
}
/*
* Return column name after escape
* @param string $column_name
* @return string
*/
function escapeColumnExpression($column_name){
if($this->isStar($column_name)) return $column_name;
if($this->isStarFunction($column_name)){
return $column_name;
}
if(strpos(strtolower($column_name), 'distinct') !== false) return $column_name;
return $this->escapeColumn($column_name);
}
$function = implode('', $matches);
}
return implode('', $functions);
}
/**
* 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;
}
/**
* 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;
}
/**
* Return column name after escape
* @param string $column_name
* @return string
*/
function escapeColumnExpression($column_name)
{
if($this->isStar($column_name)) return $column_name;
if($this->isStarFunction($column_name))
{
return $column_name;
}
if(strpos(strtolower($column_name), 'distinct') !== FALSE) return $column_name;
return $this->escapeColumn($column_name);
}
}

View file

@ -1,92 +1,108 @@
<?php
/**
* 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 {
/**
* QueryParser class
* @author NHN (developers@xpressengine.com)
* @package /classes/xml/xmlquery
* @version 0.1
* Property containing the associated QueryTag object
*
* @var QueryTag object
*/
class QueryParser {
/**
* QueryTag object
* @var QueryTag object
*/
var $queryTag;
var $queryTag;
/**
* constructor
* @param object $query
* @param bool $isSubQuery
* @return void
*/
function QueryParser($query = NULL, $isSubQuery = false) {
if ($query)
$this->queryTag = new QueryTag($query, $isSubQuery);
}
/**
* Constructor
*
* @param object $query XML object obtained after reading the XML Query file
* @param bool $isSubQuery
* @return void
*/
function QueryParser($query = NULL, $isSubQuery = FALSE)
{
if ($query)
{
$this->queryTag = new QueryTag($query, $isSubQuery);
}
}
/**
* Return table information
* @param object $query_id
* @param bool $table_name
* @return array
*/
function getTableInfo($query_id, $table_name) {
$column_type = array();
$module = '';
$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];
$targetList = array('modules'=>1, 'addons'=>1, 'widgets'=>1);
if (!isset($targetList[$target]))
return;
$module = $id_args[1];
$id = $id_args[2];
}
/**
* 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
*/
function getTableInfo($query_id, $table_name) {
$column_type = array();
$module = '';
// 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;
}
}
$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];
$targetList = array('modules'=>1, 'addons'=>1, 'widgets'=>1);
if (!isset($targetList[$target]))
return;
$module = $id_args[1];
$id = $id_args[2];
}
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);
}
// 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;
}
}
foreach ($table_obj->table->column as $k => $v) {
$column_type[$v->attrs->name] = $v->attrs->type;
}
}
}
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);
}
return $column_type;
}
foreach ($table_obj->table->column as $k => $v) {
$column_type[$v->attrs->name] = $v->attrs->type;
}
}
}
/**
* Change code string from queryTag object
* @return string
*/
function toString() {
return "<?php if(!defined('__ZBXE__')) exit();\n"
. $this->queryTag->toString()
. 'return $query; ?>';
}
return $column_type;
}
}
/**
* Returns the contents for the query cache file
*
* @return string
*/
function toString() {
return "<?php if(!defined('__ZBXE__')) exit();\n"
. $this->queryTag->toString()
. 'return $query; ?>';
}
}
?>

View file

@ -97,6 +97,7 @@ class Argument {
}
function getUnescapedValue() {
if($this->value === 'null') return null;
return $this->value;
}
@ -163,19 +164,47 @@ class Argument {
* @return string
*/
function _escapeStringValue($value) {
// Remove non-utf8 chars.
$regex = '@((?:[\x00-\x7F]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}){1,100})|([\xF0-\xF7][\x80-\xBF]{3})|([\x80-\xBF])|([\xC0-\xFF])@x';
$value = preg_replace_callback($regex, array($this, 'utf8Replacer'), $value);
$db = &DB::getInstance();
$value = $db->addQuotes($value);
return '\'' . $value . '\'';
}
function utf8Replacer($captures) {
if (!empty($captures[1]))
{
// Valid byte sequence. Return unmodified.
return $captures[1];
}
elseif(!empty($captures[2]))
{
// Remove user defined area
if("\xF3\xB0\x80\x80" <= $captures[2])
{
return;
}
return $captures[2];
}
else
{
return;
}
}
function isValid() {
return $this->isValid;
}
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,28 +1,29 @@
<?php
/**
* 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.
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class ColumnTag
{
/**
* ColumnTag class
* 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.
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* Column name
* @var string
*/
class ColumnTag {
/**
* Column name
* @var string
*/
var $name;
/**
* constructor
* @param string $name
* @return void
*/
function ColumnTag($name){
$this->name = $name;
}
var $name;
/**
* Constructor
* @param string $name
* @return void
*/
function ColumnTag($name)
{
$this->name = $name;
}
}

View file

@ -1,40 +1,58 @@
<?php
/**
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'insert'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnTag extends ColumnTag
{
/**
* InsertColumnTag
* Models the <column> tag inside an XML Query file whose action is 'insert'
* Argument
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var QueryArgument object
*/
class InsertColumnTag extends ColumnTag {
/**
* argument
* @var QueryArgument object
*/
var $argument;
/**
* constructor
* @param object $column
* @return void
*/
function InsertColumnTag($column) {
parent::ColumnTag($column->attrs->name);
$dbParser = DB::getParser();
$this->name = $dbParser->parseColumnName($this->name);
$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;
}
var $argument;
/**
* Constructor
*
* @param object $column
*
* @return void
*/
function InsertColumnTag($column)
{
parent::ColumnTag($column->attrs->name);
$dbParser = DB::getParser();
$this->name = $dbParser->parseColumnName($this->name);
$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\'})'
, $this->name
, $this->argument->argument_name);
}
/**
* Returns the QueryArgument object associated with this INSERT statement
*
* @return QueryArgument
*/
function getArgument()
{
return $this->argument;
}
}
?>

View file

@ -1,31 +1,45 @@
<?php
/**
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'insert-select'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnTagWithoutArgument extends ColumnTag
{
/**
* InsertColumnTagWithoutArgument
* Models the <column> tag inside an XML Query file whose action is 'insert-select'
* Constructor
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @param object $column
* @return void
*/
class InsertColumnTagWithoutArgument extends ColumnTag {
/**
* constructor
* @param object $column
* @return void
*/
function InsertColumnTagWithoutArgument($column) {
parent::ColumnTag($column->attrs->name);
$dbParser = DB::getParser();
$this->name = $dbParser->parseColumnName($this->name);
}
function getExpressionString(){
return sprintf('new Expression(\'%s\')', $this->name);
}
function getArgument(){
return null;
}
function InsertColumnTagWithoutArgument($column)
{
parent::ColumnTag($column->attrs->name);
$dbParser = DB::getParser();
$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;
}
}
?>

View file

@ -1,65 +1,72 @@
<?php
/**
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'insert'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class InsertColumnsTag
{
/**
* InsertColumnsTag class
* Models the <column> tag inside an XML Query file whose action is 'insert'
* Column list
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var array value is InsertColumnTag object
*/
class InsertColumnsTag{
/**
* Column list
* @var array value is InsertColumnTag object
*/
var $columns;
var $columns;
/**
* constructor
* @param array|string $xml_columns
* @return void
*/
function InsertColumnsTag($xml_columns) {
$this->columns = array();
/**
* Constructor
*
* @param array|string $xml_columns
* @return void
*/
function InsertColumnsTag($xml_columns)
{
$this->columns = array();
if(!$xml_columns)
return;
if(!$xml_columns)
return;
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
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 if(!isset($column->attrs->var) && !isset($column->attrs->default)) $this->columns[] = new InsertColumnTagWithoutArgument($column);
else $this->columns[] = new InsertColumnTag($column);
}
foreach($xml_columns as $column){
if($column->name === 'query') $this->columns[] = new QueryTag($column, true);
else if(!isset($column->attrs->var) && !isset($column->attrs->default)) $this->columns[] = new InsertColumnTagWithoutArgument($column);
else $this->columns[] = new InsertColumnTag($column);
}
/**
* InsertColumnTag object to string
* @return string
*/
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;
}
/**
* Return argument list
* @return array
*/
function getArguments(){
$arguments = array();
foreach($this->columns as $column){
$arguments[] = $column->getArgument();
}
return $arguments;
}
}
/**
* InsertColumnTag object to string
*
* @return string
*/
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;
}
/**
* Return argument list
*
* @return array
*/
function getArguments()
{
$arguments = array();
foreach($this->columns as $column){
$arguments[] = $column->getArgument();
}
return $arguments;
}
}
?>

View file

@ -1,53 +1,71 @@
<?php
/**
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'select'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class SelectColumnTag extends ColumnTag
{
/**
* SelectColumnTag
* Models the <column> tag inside an XML Query file whose action is 'select'
* Column alias
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var string
*/
class SelectColumnTag extends ColumnTag{
/**
* alias
* @var string
*/
var $alias;
/**
* click count status
* @var bool
*/
var $click_count;
/**
* constructor
* @param string|object $column
* @return void
*/
function SelectColumnTag($column){
if ($column == "*" || $column->attrs->name == '*')
{
parent::ColumnTag(NULL);
$this->name = "*";
}
else
{
parent::ColumnTag($column->attrs->name);
$dbParser = new DB(); $dbParser = &$dbParser->getParser();
$this->name = $dbParser->parseExpression($this->name);
$this->alias = $column->attrs->alias;
$this->click_count = $column->attrs->click_count;
}
var $alias;
/**
* Click count status
*
* @var bool
*/
var $click_count;
/**
* Constructor
*
* @param string|object $column
* @return void
*/
function SelectColumnTag($column)
{
if ($column == "*" || $column->attrs->name == '*')
{
parent::ColumnTag(NULL);
$this->name = "*";
}
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);
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) .'\'': '');
else
{
parent::ColumnTag($column->attrs->name);
$dbParser = new DB(); $dbParser = &$dbParser->getParser();
$this->name = $dbParser->parseExpression($this->name);
$this->alias = $column->attrs->alias;
$this->click_count = $column->attrs->click_count;
}
}
/**
* 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->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) .'\'': '');
}
}

View file

@ -1,83 +1,92 @@
<?php
/**
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'select'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class SelectColumnsTag
{
/**
* SelectColumnTag class
* Column list
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var array value is SelectColumnTag object
*/
class SelectColumnsTag {
/**
* Column list
* @var array value is SelectColumnTag object
*/
var $columns;
var $columns;
/**
* constructor
* @param Xml_Node_ $xml_columns
* @return void
*/
function SelectColumnsTag($xml_columns_tag){
if (!$xml_columns_tag)
$xml_columns_tag = new Xml_Node_();
/**
* Constructor
*
* @param $xml_columns_tag
* @internal param \Xml_Node_ $xml_columns
* @return void
*/
function SelectColumnsTag($xml_columns_tag)
{
if (!$xml_columns_tag)
$xml_columns_tag = new Xml_Node_();
$xml_columns = $xml_columns_tag->column;
$xml_queries = $xml_columns_tag->query;
$xml_columns = $xml_columns_tag->column;
$xml_queries = $xml_columns_tag->query;
$this->columns = array();
$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);
}
if(!$xml_columns) {
$this->columns[] = new SelectColumnTag("*");
return;
}
/**
* SelectColumnTag object to string
* @return string
*/
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;
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
foreach($xml_columns as $column){
$this->columns[] = new SelectColumnTag($column);
}
/**
* Return argument list
* @return array
*/
function getArguments(){
$arguments = array();
foreach($this->columns as $column){
if(is_a($column, 'QueryTag'))
$arguments = array_merge($arguments, $column->getArguments());
}
return $arguments;
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);
}
}
/**
* Returns the string to be output in the cache file
*
* @return string
*/
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;
}
/**
* Return argument list
*
* @return array
*/
function getArguments()
{
$arguments = array();
foreach($this->columns as $column){
if(is_a($column, 'QueryTag'))
$arguments = array_merge($arguments, $column->getArguments());
}
return $arguments;
}
}
?>

View file

@ -1,73 +1,103 @@
<?php
/**
* Models the &lt;column&gt; tag inside an XML Query file whose action is 'update'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class UpdateColumnTag extends ColumnTag
{
/**
* UpdateColumnTag
* Models the <column> tag inside an XML Query file whose action is 'update'
* Argument
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var QueryArgument object
*/
class UpdateColumnTag extends ColumnTag {
/**
* argument
* @var QueryArgument object
*/
var $argument;
/**
* default value
* @var string
*/
var $default_value;
var $argument;
/**
* 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)
$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);
//else $this->default_value = $dbParser->parseColumnName($column->attrs->default);
else {
$this->default_value = $default_value->toString();
if($default_value->isStringFromFunction()){
$this->default_value = '"\'".' . $this->default_value . '."\'"';
}
if($default_value->isString()){
$this->default_value = '"' . $this->default_value . '"';
}
}
/**
* Default value
*
* @var string
*/
var $default_value;
/**
* 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)
{
$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);
}
//else $this->default_value = $dbParser->parseColumnName($column->attrs->default);
else
{
$this->default_value = $default_value->toString();
if($default_value->isStringFromFunction())
{
$this->default_value = '"\'".' . $this->default_value . '."\'"';
}
if($default_value->isString())
{
$this->default_value = '"' . $this->default_value . '"';
}
}
}
}
}
function getExpressionString(){
if($this->argument)
return sprintf('new UpdateExpression(\'%s\', ${\'%s_argument\'})'
, $this->name
, $this->argument->argument_name);
else {
return sprintf('new UpdateExpressionWithoutArgument(\'%s\', %s)'
, $this->name
, $this->default_value);
}
}
function getArgument(){
return $this->argument;
}
}
}
/**
* Returns the string to be output in the cache file
*
* @return string
*/
function getExpressionString()
{
if($this->argument)
{
return sprintf('new UpdateExpression(\'%s\', ${\'%s_argument\'})'
, $this->name
, $this->argument->argument_name);
}
else
{
return sprintf('new UpdateExpressionWithoutArgument(\'%s\', %s)'
, $this->name
, $this->default_value);
}
}
/**
* Returns the Argument associated with this update statement
*
* @return QueryArgument
*/
function getArgument()
{
return $this->argument;
}
}
?>

View file

@ -1,61 +1,68 @@
<?php
/**
* Models the &lt;columns&gt; tag inside an XML Query file whose action is 'update'
*
* @author Corina Udrescu (corina.udrescu@arnia.ro)
* @package classes\xml\xmlquery\tags\column
* @version 0.1
*/
class UpdateColumnsTag
{
/**
* UpdateColumnsTag
* Models the <column> tag inside an XML Query file whose action is 'update'
* Column list
*
* @author Arnia Software
* @package /classes/xml/xmlquery/tags/column
* @version 0.1
* @var array value is UpdateColumnTag object
*/
class UpdateColumnsTag{
/**
* Column list
* @var array value is UpdateColumnTag object
*/
var $columns;
var $columns;
/**
* constructor
* @param array|string $xml_columns
* @return void
*/
function UpdateColumnsTag($xml_columns) {
$this->columns = array();
/**
* Constructor
*
* @param array|object $xml_columns
* @return void
*/
function UpdateColumnsTag($xml_columns)
{
$this->columns = array();
if(!is_array($xml_columns)) $xml_columns = array($xml_columns);
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);
}
foreach($xml_columns as $column){
if($column->name === 'query') $this->columns[] = new QueryTag($column, true);
else $this->columns[] = new UpdateColumnTag($column);
}
/**
* UpdateColumnTag object to string
* @return string
*/
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;
}
/**
* Return argument list
* @return array
*/
function getArguments(){
$arguments = array();
foreach($this->columns as $column){
$arguments[] = $column->getArgument();
}
return $arguments;
}
}
/**
* Returns the string to be output in the cache file
*
* @return string
*/
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;
}
/**
* Return argument list
*
* @return array
*/
function getArguments()
{
$arguments = array();
foreach($this->columns as $column){
$arguments[] = $column->getArgument();
}
return $arguments;
}
}
?>