diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 2074e4c97..3727d4008 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -1,56 +1,56 @@ 'numeric(20)', - 'number' => 'integer', - 'varchar' => 'character varying', - 'char' => 'character', - 'tinytext' => 'character varying(256)', - 'text' => 'character varying(1073741823)', - 'bigtext' => 'character varying(1073741823)', - 'date' => 'character varying(14)', - 'float' => 'float', - ); + /** + * @brief column type used in CUBRID + * + * column_type should be replaced for each DBMS's type + * becasue it uses commonly defined type in the schema/query xml + **/ + var $column_type = array( + 'bignumber' => 'numeric(20)', + 'number' => 'integer', + 'varchar' => 'character varying', + 'char' => 'character', + 'tinytext' => 'character varying(256)', + 'text' => 'character varying(1073741823)', + 'bigtext' => 'character varying(1073741823)', + 'date' => 'character varying(14)', + 'float' => 'float', + ); - /** - * @brief constructor - **/ - function DBCubrid() - { - $this->_setDBInfo(); - $this->_connect(); - } + /** + * @brief constructor + **/ + function DBCubrid() + { + $this->_setDBInfo(); + $this->_connect(); + } /** * @brief create an instance of this class @@ -60,975 +60,975 @@ return new DBCubrid; } - /** - * @brief Return if installable - **/ - function isSupported() - { - if (!function_exists('cubrid_connect')) return false; - return true; - } - - /** - * @brief DB settings and connect/close - **/ - function _setDBInfo() - { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->port = $db_info->db_port; - $this->prefix = $db_info->db_table_prefix; - - if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; - } - - /** - * @brief DB Connection - **/ - function _connect() - { - // ignore if db information not exists - if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; - - // attempts to connect - $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); - - // check connections - if (!$this->fd) { - $this->setError (-1, 'database connect fail'); - return $this->is_connected = false; - } - - $this->is_connected = true; - $this->password = md5 ($this->password); - } - - /** - * @brief DB disconnect - **/ - function close() - { - if (!$this->isConnected ()) return; - - @cubrid_commit ($this->fd); - @cubrid_disconnect ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief handles quatation of the string variables from the query - **/ - function addQuotes($string) - { - if (!$this->fd) return $string; - - if (version_compare (PHP_VERSION, "5.9.0", "<") && - get_magic_quotes_gpc ()) { - $string = stripslashes (str_replace ("\\","\\\\", $string)); - } - - if (!is_numeric ($string)) { - /* - if ($this->isConnected()) { - $string = cubrid_real_escape_string($string); - } - else { - $string = str_replace("'","\'",$string); - } - */ - - $string = str_replace("'","''",$string); - } - - return $string; - } - - /** - * @brief Begin transaction - **/ - function begin() - { - if (!$this->isConnected () || $this->transaction_started) return; - $this->transaction_started = true; - } - - /** - * @brief Rollback - **/ - function rollback() - { - if (!$this->isConnected () || !$this->transaction_started) return; - @cubrid_rollback ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief Commit - **/ - function commit() - { - if (!$force && (!$this->isConnected () || - !$this->transaction_started)) return; - - @cubrid_commit($this->fd); - $this->transaction_started = false; - } - - /** - * @brief : executing the query and fetching the result - * - * query: run a query and return the result\n - * fetch: NULL if no value returned \n - * array object if rows returned \n - * object if a row returned \n - * return\n - **/ - function _query($query) - { - if (!$query || !$this->isConnected ()) return; - - // Notify to start a query execution - $this->actStart ($query); - - // Execute the query - $result = @cubrid_execute ($this->fd, $query); - // error check - if (cubrid_error_code ()) { - $code = cubrid_error_code (); - $msg = cubrid_error_msg (); - - $this->setError ($code, $msg); - } - - // Notify to complete a query execution - $this->actFinish (); - - // Return the result - return $result; - } - - /** - * @brief Fetch the result - **/ - function _fetch($result) - { - if (!$this->isConnected() || $this->isError() || !$result) return; - - $col_types = cubrid_column_types ($result); - $col_names = cubrid_column_names ($result); - $max = count ($col_types); - - for ($count = 0; $count < $max; $count++) { - if (preg_match ("/^char/", $col_types[$count]) > 0) { - $char_type_fields[] = $col_names[$count]; - } - } - - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if (is_array ($char_type_fields)) { - foreach ($char_type_fields as $val) { - $tmp->{$val} = rtrim ($tmp->{$val}); - } - } - - $output[] = $tmp; - } - - unset ($char_type_fields); - - if ($result) cubrid_close_request($result); - - if (count ($output) == 1) return $output[0]; - return $output; - } - - /** - * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) - **/ - function getNextSequence() - { - $this->_makeSequence(); - - $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - return $output->seq; - } - - /** - * @brief return if the table already exists - **/ - function _makeSequence() - { - if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; - - // check cubrid serial - $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - // if do not create serial - if ($output->count == 0) { - $query = sprintf('select max("a"."srl") as "srl" from '. - '( select max("document_srl") as "srl" from '. - '"%sdocuments" UNION '. - 'select max("comment_srl") as "srl" from '. - '"%scomments" UNION '. - 'select max("member_srl") as "srl" from '. - '"%smember"'. - ') as "a"', $this->prefix, $this->prefix, $this->prefix); - - $result = $this->_query($query); - $output = $this->_fetch($result); - $srl = $output->srl; - if ($srl < 1) { - $start = 1; - } - else { - $start = $srl + 1000000; - } - - // create sequence - $query = sprintf('create serial "%ssequence" start with %s increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix, $start); - $this->_query($query); - } - - $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; - } - - - /** - * brief return a table if exists - **/ - function isTableExists ($target_name) - { - if($target_name == 'sequence') { - $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); - } - else { - $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); - } - - $result = $this->_query ($query); - if (cubrid_num_rows($result) > 0) { - $output = true; - } - else { - $output = false; - } - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add a column to the table - **/ - function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) - { - $type = strtoupper($this->column_type[$type]); - if ($type == 'INTEGER') $size = ''; - - $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); - - if ($type == 'char' || $type == 'varchar') { - if ($size) $size = $size * 3; - } - - if ($size) { - $query .= sprintf ("%s(%s) ", $type, $size); - } - else { - $query .= sprintf ("%s ", $type); - } - - if ($default) { - if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { - $query .= sprintf ("default %d ", $default); - } - else { - $query .= sprintf ("default '%s' ", $default); - } - } - - if ($notnull) $query .= "not null "; - - $this->_query ($query); - } - - /** - * @brief drop a column from the table - **/ - function dropColumn ($table_name, $column_name) - { - $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); - - $this->_query ($query); - } - - /** - * @brief return column information of the table - **/ - function isColumnExists ($table_name, $column_name) - { - $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); - $result = $this->_query ($query); - - if (cubrid_num_rows ($result) > 0) $output = true; - else $output = false; - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add an index to the table - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) - { - if (!is_array ($target_columns)) { - $target_columns = array ($target_columns); - } - - $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); - - $this->_query ($query); - } - - /** - * @brief drop an index from the table - **/ - function dropIndex ($table_name, $index_name, $is_unique = false) - { - $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); - - $this->_query($query); - } - - /** - * @brief return index information of the table - **/ - function isIndexExists ($table_name, $index_name) - { - $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); - $result = $this->_query ($query); - - if ($this->isError ()) return false; - - $output = $this->_fetch ($result); - - if (!$output) return false; - return true; - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXml ($xml_doc) - { - return $this->_createTable ($xml_doc); - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXmlFile ($file_name) - { - if (!file_exists ($file_name)) return; - // read xml file - $buff = FileHandler::readFile ($file_name); - - return $this->_createTable ($buff); - } - - /** - * @brief create table by using the schema xml - * - * type : number, varchar, tinytext, text, bigtext, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable ($xml_doc) - { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - // Create a table schema - $table_name = $xml_obj->table->attrs->name; + /** + * @brief Return if installable + **/ + function isSupported() + { + if (!function_exists('cubrid_connect')) return false; + return true; + } + + /** + * @brief DB settings and connect/close + **/ + function _setDBInfo() + { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->port = $db_info->db_port; + $this->prefix = $db_info->db_table_prefix; + + if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; + } + + /** + * @brief DB Connection + **/ + function _connect() + { + // ignore if db information not exists + if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; + + // attempts to connect + $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); + + // check connections + if (!$this->fd) { + $this->setError (-1, 'database connect fail'); + return $this->is_connected = false; + } + + $this->is_connected = true; + $this->password = md5 ($this->password); + } + + /** + * @brief DB disconnect + **/ + function close() + { + if (!$this->isConnected ()) return; + + @cubrid_commit ($this->fd); + @cubrid_disconnect ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief handles quatation of the string variables from the query + **/ + function addQuotes($string) + { + if (!$this->fd) return $string; + + if (version_compare (PHP_VERSION, "5.9.0", "<") && + get_magic_quotes_gpc ()) { + $string = stripslashes (str_replace ("\\","\\\\", $string)); + } + + if (!is_numeric ($string)) { + /* + if ($this->isConnected()) { + $string = cubrid_real_escape_string($string); + } + else { + $string = str_replace("'","\'",$string); + } + */ + + $string = str_replace("'","''",$string); + } + + return $string; + } + + /** + * @brief Begin transaction + **/ + function begin() + { + if (!$this->isConnected () || $this->transaction_started) return; + $this->transaction_started = true; + } + + /** + * @brief Rollback + **/ + function rollback() + { + if (!$this->isConnected () || !$this->transaction_started) return; + @cubrid_rollback ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief Commit + **/ + function commit() + { + if (!$force && (!$this->isConnected () || + !$this->transaction_started)) return; + + @cubrid_commit($this->fd); + $this->transaction_started = false; + } + + /** + * @brief : executing the query and fetching the result + * + * query: run a query and return the result\n + * fetch: NULL if no value returned \n + * array object if rows returned \n + * object if a row returned \n + * return\n + **/ + function _query($query) + { + if (!$query || !$this->isConnected ()) return; + + // Notify to start a query execution + $this->actStart ($query); + + // Execute the query + $result = @cubrid_execute ($this->fd, $query); + // error check + if (cubrid_error_code ()) { + $code = cubrid_error_code (); + $msg = cubrid_error_msg (); + + $this->setError ($code, $msg); + } + + // Notify to complete a query execution + $this->actFinish (); + + // Return the result + return $result; + } + + /** + * @brief Fetch the result + **/ + function _fetch($result) + { + if (!$this->isConnected() || $this->isError() || !$result) return; + + $col_types = cubrid_column_types ($result); + $col_names = cubrid_column_names ($result); + $max = count ($col_types); + + for ($count = 0; $count < $max; $count++) { + if (preg_match ("/^char/", $col_types[$count]) > 0) { + $char_type_fields[] = $col_names[$count]; + } + } + + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if (is_array ($char_type_fields)) { + foreach ($char_type_fields as $val) { + $tmp->{$val} = rtrim ($tmp->{$val}); + } + } + + $output[] = $tmp; + } + + unset ($char_type_fields); + + if ($result) cubrid_close_request($result); + + if (count ($output) == 1) return $output[0]; + return $output; + } + + /** + * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) + **/ + function getNextSequence() + { + $this->_makeSequence(); + + $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + return $output->seq; + } + + /** + * @brief return if the table already exists + **/ + function _makeSequence() + { + if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; + + // check cubrid serial + $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + // if do not create serial + if ($output->count == 0) { + $query = sprintf('select max("a"."srl") as "srl" from '. + '( select max("document_srl") as "srl" from '. + '"%sdocuments" UNION '. + 'select max("comment_srl") as "srl" from '. + '"%scomments" UNION '. + 'select max("member_srl") as "srl" from '. + '"%smember"'. + ') as "a"', $this->prefix, $this->prefix, $this->prefix); + + $result = $this->_query($query); + $output = $this->_fetch($result); + $srl = $output->srl; + if ($srl < 1) { + $start = 1; + } + else { + $start = $srl + 1000000; + } + + // create sequence + $query = sprintf('create serial "%ssequence" start with %s increment by 1 minvalue 1 maxvalue 10000000000000000000000000000000000000 nocycle;', $this->prefix, $start); + $this->_query($query); + } + + $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; + } + + + /** + * brief return a table if exists + **/ + function isTableExists ($target_name) + { + if($target_name == 'sequence') { + $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); + } + else { + $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); + } + + $result = $this->_query ($query); + if (cubrid_num_rows($result) > 0) { + $output = true; + } + else { + $output = false; + } + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add a column to the table + **/ + function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = strtoupper($this->column_type[$type]); + if ($type == 'INTEGER') $size = ''; + + $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); + + if ($type == 'char' || $type == 'varchar') { + if ($size) $size = $size * 3; + } + + if ($size) { + $query .= sprintf ("%s(%s) ", $type, $size); + } + else { + $query .= sprintf ("%s ", $type); + } + + if ($default) { + if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { + $query .= sprintf ("default %d ", $default); + } + else { + $query .= sprintf ("default '%s' ", $default); + } + } + + if ($notnull) $query .= "not null "; + + $this->_query ($query); + } + + /** + * @brief drop a column from the table + **/ + function dropColumn ($table_name, $column_name) + { + $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); + + $this->_query ($query); + } + + /** + * @brief return column information of the table + **/ + function isColumnExists ($table_name, $column_name) + { + $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); + $result = $this->_query ($query); + + if (cubrid_num_rows ($result) > 0) $output = true; + else $output = false; + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add an index to the table + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) + { + if (!is_array ($target_columns)) { + $target_columns = array ($target_columns); + } + + $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); + + $this->_query ($query); + } + + /** + * @brief drop an index from the table + **/ + function dropIndex ($table_name, $index_name, $is_unique = false) + { + $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); + + $this->_query($query); + } + + /** + * @brief return index information of the table + **/ + function isIndexExists ($table_name, $index_name) + { + $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); + $result = $this->_query ($query); + + if ($this->isError ()) return false; + + $output = $this->_fetch ($result); + + if (!$output) return false; + return true; + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXml ($xml_doc) + { + return $this->_createTable ($xml_doc); + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXmlFile ($file_name) + { + if (!file_exists ($file_name)) return; + // read xml file + $buff = FileHandler::readFile ($file_name); + + return $this->_createTable ($buff); + } + + /** + * @brief create table by using the schema xml + * + * type : number, varchar, tinytext, text, bigtext, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable ($xml_doc) + { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + // Create a table schema + $table_name = $xml_obj->table->attrs->name; // if the table already exists exit function - if ($this->isTableExists($table_name)) return; - - // If the table name is sequence, it creates a serial - if ($table_name == 'sequence') { - $query = sprintf ('create serial "%s" start with 1 increment by 1'. - ' minvalue 1 '. - 'maxvalue 10000000000000000000000000000000000000'. ' nocycle;', $this->prefix.$table_name); - - return $this->_query($query); - } - - - $table_name = $this->prefix.$table_name; - - $query = sprintf ('create class "%s";', $table_name); - $this->_query ($query); - - if (!is_array ($xml_obj->table->column)) { - $columns[] = $xml_obj->table->column; - } - else { - $columns = $xml_obj->table->column; - } - - $query = sprintf ("alter class \"%s\" add attribute ", $table_name); - - foreach ($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - - switch ($this->column_type[$type]) { - case 'integer' : - $size = null; - break; - case 'text' : - $size = null; - break; - } - - if (isset ($default) && ($type == 'varchar' || $type == 'char' || - $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { - $default = sprintf ("'%s'", $default); - } - - if ($type == 'varchar' || $type == 'char') { - if($size) $size = $size * 3; - } - - - $column_schema[] = sprintf ('"%s" %s%s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default ".$default:'', - $notnull?'not null':''); - - if ($primary_key) { - $primary_list[] = $name; - } - else if ($unique) { - $unique_list[$unique][] = $name; - } - else if ($index) { - $index_list[$index][] = $name; - } - } - - $query .= implode (',', $column_schema).';'; - $this->_query ($query); - - if (count ($primary_list)) { - $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); - $this->_query ($query); - } - - if (count ($unique_list)) { - foreach ($unique_list as $key => $val) { - $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); - $this->_query ($query); - } - } - - if (count ($index_list)) { - foreach ($index_list as $key => $val) { - $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); - $this->_query ($query); - } - } - } - - /** - * @brief return the condition - **/ - function getCondition ($output) - { - if (!$output->conditions) return; - $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); - if ($condition) $condition = ' where '.$condition; - - return $condition; - } - - function _getCondition ($conditions, $column_type, &$output) - { - $condition = ''; - - foreach ($conditions as $val) { - $sub_condition = ''; - - foreach ($val['condition'] as $v) { - if (!isset ($v['value'])) continue; - if ($v['value'] === '') continue; - if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; - - $name = $v['column']; - $operation = $v['operation']; - $value = $v['value']; - $type = $this->getColumnType ($column_type, $name); - $pipe = $v['pipe']; - $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); - - if (!$value) { - $value = $v['value']; - if (strpos ($value, '(')) { - $valuetmp = $value; - } - elseif (strpos ($value, ".") === false) { - $valuetmp = $value; - } - else { - $valuetmp = '"'.str_replace('.', '"."', $value).'"'; - } - } - else { - $tmp = explode('.',$value); - - if (count($tmp)==2) { - $table = $tmp[0]; - $column = $tmp[1]; - - if ($column_type[$column] && (in_array ($table, $output->tables) || - array_key_exists($table, $output->tables))) { - $valuetmp = sprintf('"%s"."%s"', $table, $column); - } - else { - $valuetmp = $value; - } - } - else { - $valuetmp = $value; - } - } - - if (strpos ($name, '(') > 0) { - $nametmp = $name; - } - elseif (strpos ($name, ".") === false) { - $nametmp = '"'.$name.'"'; - } - else { - $nametmp = '"'.str_replace('.', '"."', $name).'"'; - } - $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); - if ($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - - if ($sub_condition) { - if ($condition && $val['pipe']) { - $condition .= ' '.$val['pipe'].' '; - } - $condition .= '('.$sub_condition.')'; - } - } - - return $condition; - } - - /** - * @brief handles insertAct - **/ - function _executeInsertAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // columns - foreach ($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - //if ($this->getColumnType ($output->column_type, $name) != 'number') - if ($output->column_type[$name] != 'number') { - if (!is_null($value)) { - $value = "'" . $this->addQuotes($value) ."'"; - } - else { - if ($val['notnull']=='notnull') { - $value = "''"; - } - else { - //$value = 'null'; - $value = "''"; - } - } - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = '"'.$name.'"'; - $value_list[] = $value; - } - - $query = sprintf ("insert into %s (%s) values (%s);", implode(',', $table_list), implode(',', $column_list), implode(',', $value_list)); - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($result && !$this->transaction_started) { - @cubrid_commit ($this->fd); - } - - return $result; - } - - /** - * @brief handles updateAct - **/ - function _executeUpdateAct ($output) - { - // tables - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - - $check_click_count = true; - - // columns - foreach ($output->columns as $key => $val) { - if (!isset ($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - - if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { - $check_click_count = false; - } - - for ($i = 0; $i < $key; $i++) { - // not allows to define the same property repeatedly in a single query in CUBRID - if ($output->columns[$i]['name'] == $name) break; - } - if ($i < $key) continue; // ignore the rest of properties if duplicated property found - - if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { - $column_list[] = $name.' = '.$value; - } - else { - if ($output->column_type[$name] != 'number') { - $check_column = false; - $value = "'".$this->addQuotes ($value)."'"; - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = sprintf ("\"%s\" = %s", $name, $value); - } - } - - // conditional clause - $condition = $this->getCondition ($output); - - $check_click_count_condition = false; - if ($check_click_count) { - foreach ($output->conditions as $val) { - if ($val['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - - foreach ($val['condition'] as $v) { - if ($v['operation'] == 'equal') { - $check_click_count_condition = true; - } - else { - if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { - $check_click_count_condition = true; - } - else { - $check_click_count_condition = false; - } - } - - if ($v['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - } - } - } - - if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { - foreach ($output->columns as $v) { - $incr_columns[] = 'incr("'.$v['name'].'")'; - } - - $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); - } - else { - $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); - } - - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief handles deleteAct - **/ - function _executeDeleteAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // Conditional clauses - $condition = $this->getCondition ($output); - - $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief Handle selectAct - * - * to get a specific page list easily in select statement,\n - * a method, navigation, is used - **/ - function _executeSelectAct ($output) - { - // tables - $table_list = array (); - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - $left_join = array (); - // why??? - $left_tables = (array) $output->left_tables; - - foreach ($left_tables as $key => $val) { - $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); - if ($condition) { - $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array (); - foreach ($output->columns as $key => $val) { - $name = $val['name']; - - $click_count = '%s'; - if ($val['click_count'] && count ($output->conditions) > 0) { - $click_count = 'incr(%s)'; - } - - $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; - $_alias = $val['alias']; - - if ($name == '*') { - $column_list[] = $name; - } - elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { - $name = sprintf ($click_count,$name); - if ($alias) { - $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); - } - else { - $column_list[] = sprintf ('"%s"', $name); - } - } - else { - if (strpos ($name, '.') != false) { - list ($prefix, $name) = explode('.', $name); - if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { - if ($now_matchs == 1) { - $tmpval = explode ("(", $prefix); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $prefix = implode ("(", $tmpval); - $tmpval = explode (")", $name); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $name = implode (")", $tmpval); - } - } - else { - $prefix = sprintf ('"%s"', $prefix); - $name = ($name == '*') ? $name : sprintf('"%s"',$name); - } - $xtmp = null; - $now_matchs = null; - if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); - else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); - } - elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { - if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { - $open_pos = strpos ($name, "("); - $close_pos = strpos ($name, ")"); - - if (preg_match ("/,/", $name)) { - $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); - $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - $tmpval = null; - $tmpval = explode (',', $tmp_params); - - foreach ($tmpval as $tmp_param) { - $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; - } - - $tmpval = implode (',', $tmp_param_list); - $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); - } - else { - $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - } - } - - if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); - else $column_list[] = sprintf ($click_count, $name); - } - else { - if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); - else $column_list[] = sprintf($click_count, $name); - } - } - $columns = implode (',', $column_list); - } - - $condition = $this->getCondition ($output); - - $output->column_list = $column_list; - if ($output->list_count && $output->page) { - return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); - } - - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } - - - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) { - $value = $value; - } - else { - $value = sprintf ('"%s"', $value); - } - $output->groups[$key] = $value; - - - if(count($output->arg_columns)) - { - if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; - } - } - $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); - } - - - // apply when using list_count - if ($output->list_count['value']) { - $start_count = 0; - $list_count = $output->list_count['value']; - - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - } - if (count($index_list)) - $orderby_query = ' order by '.implode(',', $index_list); - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count ($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } - } - else { - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf('%s %s', $val[0], $val[1]); - - if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; - } - - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } - } - } - - - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ + if ($this->isTableExists($table_name)) return; + + // If the table name is sequence, it creates a serial + if ($table_name == 'sequence') { + $query = sprintf ('create serial "%s" start with 1 increment by 1'. + ' minvalue 1 '. + 'maxvalue 10000000000000000000000000000000000000'. ' nocycle;', $this->prefix.$table_name); + + return $this->_query($query); + } + + + $table_name = $this->prefix.$table_name; + + $query = sprintf ('create class "%s";', $table_name); + $this->_query ($query); + + if (!is_array ($xml_obj->table->column)) { + $columns[] = $xml_obj->table->column; + } + else { + $columns = $xml_obj->table->column; + } + + $query = sprintf ("alter class \"%s\" add attribute ", $table_name); + + foreach ($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + + switch ($this->column_type[$type]) { + case 'integer' : + $size = null; + break; + case 'text' : + $size = null; + break; + } + + if (isset ($default) && ($type == 'varchar' || $type == 'char' || + $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { + $default = sprintf ("'%s'", $default); + } + + if ($type == 'varchar' || $type == 'char') { + if($size) $size = $size * 3; + } + + + $column_schema[] = sprintf ('"%s" %s%s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default ".$default:'', + $notnull?'not null':''); + + if ($primary_key) { + $primary_list[] = $name; + } + else if ($unique) { + $unique_list[$unique][] = $name; + } + else if ($index) { + $index_list[$index][] = $name; + } + } + + $query .= implode (',', $column_schema).';'; + $this->_query ($query); + + if (count ($primary_list)) { + $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); + $this->_query ($query); + } + + if (count ($unique_list)) { + foreach ($unique_list as $key => $val) { + $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); + $this->_query ($query); + } + } + + if (count ($index_list)) { + foreach ($index_list as $key => $val) { + $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); + $this->_query ($query); + } + } + } + + /** + * @brief return the condition + **/ + function getCondition ($output) + { + if (!$output->conditions) return; + $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); + if ($condition) $condition = ' where '.$condition; + + return $condition; + } + + function _getCondition ($conditions, $column_type, &$output) + { + $condition = ''; + + foreach ($conditions as $val) { + $sub_condition = ''; + + foreach ($val['condition'] as $v) { + if (!isset ($v['value'])) continue; + if ($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer', 'double', 'array'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType ($column_type, $name); + $pipe = $v['pipe']; + $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); + + if (!$value) { + $value = $v['value']; + if (strpos ($value, '(')) { + $valuetmp = $value; + } + elseif (strpos ($value, ".") === false) { + $valuetmp = $value; + } + else { + $valuetmp = '"'.str_replace('.', '"."', $value).'"'; + } + } + else { + $tmp = explode('.',$value); + + if (count($tmp)==2) { + $table = $tmp[0]; + $column = $tmp[1]; + + if ($column_type[$column] && (in_array ($table, $output->tables) || + array_key_exists($table, $output->tables))) { + $valuetmp = sprintf('"%s"."%s"', $table, $column); + } + else { + $valuetmp = $value; + } + } + else { + $valuetmp = $value; + } + } + + if (strpos ($name, '(') > 0) { + $nametmp = $name; + } + elseif (strpos ($name, ".") === false) { + $nametmp = '"'.$name.'"'; + } + else { + $nametmp = '"'.str_replace('.', '"."', $name).'"'; + } + $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); + if ($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + + if ($sub_condition) { + if ($condition && $val['pipe']) { + $condition .= ' '.$val['pipe'].' '; + } + $condition .= '('.$sub_condition.')'; + } + } + + return $condition; + } + + /** + * @brief handles insertAct + **/ + function _executeInsertAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // columns + foreach ($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + //if ($this->getColumnType ($output->column_type, $name) != 'number') + if ($output->column_type[$name] != 'number') { + if (!is_null($value)) { + $value = "'" . $this->addQuotes($value) ."'"; + } + else { + if ($val['notnull']=='notnull') { + $value = "''"; + } + else { + //$value = 'null'; + $value = "''"; + } + } + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = '"'.$name.'"'; + $value_list[] = $value; + } + + $query = sprintf ("insert into %s (%s) values (%s);", implode(',', $table_list), implode(',', $column_list), implode(',', $value_list)); + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($result && !$this->transaction_started) { + @cubrid_commit ($this->fd); + } + + return $result; + } + + /** + * @brief handles updateAct + **/ + function _executeUpdateAct ($output) + { + // tables + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + + $check_click_count = true; + + // columns + foreach ($output->columns as $key => $val) { + if (!isset ($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + + if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { + $check_click_count = false; + } + + for ($i = 0; $i < $key; $i++) { + // not allows to define the same property repeatedly in a single query in CUBRID + if ($output->columns[$i]['name'] == $name) break; + } + if ($i < $key) continue; // ignore the rest of properties if duplicated property found + + if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { + $column_list[] = $name.' = '.$value; + } + else { + if ($output->column_type[$name] != 'number') { + $check_column = false; + $value = "'".$this->addQuotes ($value)."'"; + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = sprintf ("\"%s\" = %s", $name, $value); + } + } + + // conditional clause + $condition = $this->getCondition ($output); + + $check_click_count_condition = false; + if ($check_click_count) { + foreach ($output->conditions as $val) { + if ($val['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + + foreach ($val['condition'] as $v) { + if ($v['operation'] == 'equal') { + $check_click_count_condition = true; + } + else { + if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { + $check_click_count_condition = true; + } + else { + $check_click_count_condition = false; + } + } + + if ($v['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + } + } + } + + if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { + foreach ($output->columns as $v) { + $incr_columns[] = 'incr("'.$v['name'].'")'; + } + + $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); + } + else { + $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); + } + + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief handles deleteAct + **/ + function _executeDeleteAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // Conditional clauses + $condition = $this->getCondition ($output); + + $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief Handle selectAct + * + * to get a specific page list easily in select statement,\n + * a method, navigation, is used + **/ + function _executeSelectAct ($output) + { + // tables + $table_list = array (); + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + $left_join = array (); + // why??? + $left_tables = (array) $output->left_tables; + + foreach ($left_tables as $key => $val) { + $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); + if ($condition) { + $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array (); + foreach ($output->columns as $key => $val) { + $name = $val['name']; + + $click_count = '%s'; + if ($val['click_count'] && count ($output->conditions) > 0) { + $click_count = 'incr(%s)'; + } + + $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; + $_alias = $val['alias']; + + if ($name == '*') { + $column_list[] = $name; + } + elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { + $name = sprintf ($click_count,$name); + if ($alias) { + $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); + } + else { + $column_list[] = sprintf ('"%s"', $name); + } + } + else { + if (strpos ($name, '.') != false) { + list ($prefix, $name) = explode('.', $name); + if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { + if ($now_matchs == 1) { + $tmpval = explode ("(", $prefix); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $prefix = implode ("(", $tmpval); + $tmpval = explode (")", $name); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $name = implode (")", $tmpval); + } + } + else { + $prefix = sprintf ('"%s"', $prefix); + $name = ($name == '*') ? $name : sprintf('"%s"',$name); + } + $xtmp = null; + $now_matchs = null; + if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); + else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); + } + elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { + if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { + $open_pos = strpos ($name, "("); + $close_pos = strpos ($name, ")"); + + if (preg_match ("/,/", $name)) { + $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); + $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + $tmpval = null; + $tmpval = explode (',', $tmp_params); + + foreach ($tmpval as $tmp_param) { + $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; + } + + $tmpval = implode (',', $tmp_param_list); + $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); + } + else { + $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + } + } + + if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); + else $column_list[] = sprintf ($click_count, $name); + } + else { + if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); + else $column_list[] = sprintf($click_count, $name); + } + } + $columns = implode (',', $column_list); + } + + $condition = $this->getCondition ($output); + + $output->column_list = $column_list; + if ($output->list_count && $output->page) { + return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); + } + + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if ($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } + + + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) { + $value = $value; + } + else { + $value = sprintf ('"%s"', $value); + } + $output->groups[$key] = $value; + + + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } + } + $groupby_query = sprintf ('group by %s', implode(',', $output->groups)); + } + + + // apply when using list_count + if ($output->list_count['value']) { + $start_count = 0; + $list_count = $output->list_count['value']; + + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if (count($index_list)) + $orderby_query = ' order by '.implode(',', $index_list); + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count ($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf ('%s where inst_num() between %d'. ' and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } + } + else { + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + + if(count($output->arg_columns) && $column_list[$val]) $output->arg_columns[] = $column_list[$key]; + } + + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } + } + } + + + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ unset($tmpCol); $tmpCol = explode('.', $col); if(isset($tmpCol[1])) $col = $tmpCol[1]; @@ -1037,182 +1037,182 @@ if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; $columns[] = $col; - } + } - $columns = join(',',$columns); - } + $columns = join(',',$columns); + } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); - $buff = new Object (); - $buff->data = $data; + $buff = new Object (); + $buff->data = $data; - return $buff; - } + return $buff; + } - /** - * @brief displays the current stack trace. Fetch the result - **/ - function backtrace () - { - $output = "
\n"; - $output .= "Backtrace:
\n"; - $backtrace = debug_backtrace (); + /** + * @brief displays the current stack trace. Fetch the result + **/ + function backtrace () + { + $output = "
\n"; + $output .= "Backtrace:
\n"; + $backtrace = debug_backtrace (); - foreach ($backtrace as $bt) { - $args = ''; - foreach ($bt['args'] as $a) { - if (!empty ($args)) { - $args .= ', '; - } - switch (gettype ($a)) { - case 'integer': - case 'double': - $args .= $a; - break; - case 'string': - $a = htmlspecialchars (substr ($a, 0, 64)). - ((strlen ($a) > 64) ? '...' : ''); - $args .= "\"$a\""; - break; - case 'array': - $args .= 'Array ('. count ($a).')'; - break; - case 'object': - $args .= 'Object ('.get_class ($a).')'; - break; - case 'resource': - $args .= 'Resource ('.strstr ($a, '#').')'; - break; - case 'boolean': - $args .= $a ? 'True' : 'False'; - break; - case 'NULL': - $args .= 'Null'; - break; - default: - $args .= 'Unknown'; - } - } - $output .= "
\n"; - $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; - $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; - } - $output .= "
\n"; - return $output; - } + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty ($args)) { + $args .= ', '; + } + switch (gettype ($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars (substr ($a, 0, 64)). + ((strlen ($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array ('. count ($a).')'; + break; + case 'object': + $args .= 'Object ('.get_class ($a).')'; + break; + case 'resource': + $args .= 'Resource ('.strstr ($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
\n"; + $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; + $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; + } + $output .= "
\n"; + return $output; + } - /** - * @brief paginates when navigation info exists in the query xml - * - * it is convenient although its structure is not good .. -_-; - **/ - function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { - require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); + /** + * @brief paginates when navigation info exists in the query xml + * + * it is convenient although its structure is not good .. -_-; + **/ + function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { + require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); - $column_list = $output->column_list; + $column_list = $output->column_list; - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) { - $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); - } + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; - $list_count = $output->list_count['value']; - if (!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if (!$page_count) $page_count = 10; - $page = $output->page['value']; - if (!$page) $page = 1; + $list_count = $output->list_count['value']; + if (!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if (!$page_count) $page_count = 10; + $page = $output->page['value']; + if (!$page) $page = 1; - // total pages - if ($total_count) { - $total_page = (int) (($total_count - 1) / $list_count) + 1; - } - else { - $total_page = 1; - } + // total pages + if ($total_count) { + $total_page = (int) (($total_count - 1) / $list_count) + 1; + } + else { + $total_page = 1; + } - // check the page variables - if ($page > $total_page) $page = $total_page; - $start_count = ($page - 1) * $list_count; + // check the page variables + if ($page > $total_page) $page = $total_page; + $start_count = ($page - 1) * $list_count; - if ($output->order) { - $conditions = $this->getConditionList($output); - //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { - foreach ($output->order as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - //} - } + if ($output->order) { + $conditions = $this->getConditionList($output); + //if(in_array('list_order', $conditions) || in_array('update_order', $conditions)) { + foreach ($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + //} + } - if (count ($output->groups)) { - foreach ($output->groups as $key => $value) { - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - elseif (strpos ($value, '(')) $value = $value; - else $value = sprintf ('"%s"', $value); - $output->groups[$key] = $value; - } + if (count ($output->groups)) { + foreach ($output->groups as $key => $value) { + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + elseif (strpos ($value, '(')) $value = $value; + else $value = sprintf ('"%s"', $value); + $output->groups[$key] = $value; + } - $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); - } + $groupby_query = sprintf (' group by %s', implode (',', $output->groups)); + } - if ($output->order) { - foreach ($output->order as $val) { - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count (*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - $index_list[] = sprintf ('%s %s', $val[0], $val[1]); - } + if ($output->order) { + foreach ($output->order as $val) { + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count (*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + $index_list[] = sprintf ('%s %s', $val[0], $val[1]); + } - if (count ($index_list)) { - $orderby_query = ' order by '.implode(',', $index_list); - } + if (count ($index_list)) { + $orderby_query = ' order by '.implode(',', $index_list); + } - $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if (count($output->groups)) { - $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - if ($condition) { - $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - else { - $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); - } - } - } + $orderby_query = sprintf ('%s for orderby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if (count($output->groups)) { + $orderby_query = sprintf ('%s having groupby_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + if ($condition) { + $orderby_query = sprintf ('%s and inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + else { + $orderby_query = sprintf('%s where inst_num() between %d and %d', $orderby_query, $start_count + 1, $list_count + $start_count); + } + } + } - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ unset($tmpCol); $tmpCol = explode('.', $col); if(isset($tmpCol[1])) $col = $tmpCol[1]; @@ -1221,48 +1221,48 @@ if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; $columns[] = $col; - } + } - $columns = join(',',$columns); - } + $columns = join(',',$columns); + } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); - if ($this->isError ()) { - $buff = new Object (); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array (); + if ($this->isError ()) { + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array (); - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - return $buff; - } + return $buff; + } - $virtual_no = $total_count - ($page - 1) * $list_count; - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if ($tmp) { - foreach ($tmp as $k => $v) { - $tmp->{$k} = rtrim($v); - } - } - $data[$virtual_no--] = $tmp; - } + $virtual_no = $total_count - ($page - 1) * $list_count; + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if ($tmp) { + foreach ($tmp as $k => $v) { + $tmp->{$k} = rtrim($v); + } + } + $data[$virtual_no--] = $tmp; + } - $buff = new Object (); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; + $buff = new Object (); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - return $buff; - } - } + return $buff; + } + } -return new DBCubrid; + return new DBCubrid; ?> diff --git a/classes/db/DBCubrid3.class.php b/classes/db/DBCubrid3.class.php index 7cdf9c8b5..70cb1e124 100644 --- a/classes/db/DBCubrid3.class.php +++ b/classes/db/DBCubrid3.class.php @@ -1,55 +1,55 @@ 'numeric(20)', - 'number' => 'integer', - 'varchar' => 'character varying', - 'char' => 'character', - 'tinytext' => 'character varying(256)', - 'text' => 'character varying(1073741823)', - 'bigtext' => 'character varying(1073741823)', - 'date' => 'character varying(14)', - 'float' => 'float', - ); + /** + * @brief column type used in CUBRID + * + * column_type should be replaced for each DBMS's type + * becasue it uses commonly defined type in the schema/query xml + **/ + var $column_type = array( + 'bignumber' => 'numeric(20)', + 'number' => 'integer', + 'varchar' => 'character varying', + 'char' => 'character', + 'tinytext' => 'character varying(256)', + 'text' => 'character varying(1073741823)', + 'bigtext' => 'character varying(1073741823)', + 'date' => 'character varying(14)', + 'float' => 'float', + ); - /** - * @brief constructor - **/ - function DBCubrid3() - { - $this->_setDBInfo(); - $this->_connect(); - } + /** + * @brief constructor + **/ + function DBCubrid3() + { + $this->_setDBInfo(); + $this->_connect(); + } /** * @brief create an instance of this class @@ -59,887 +59,887 @@ return new DBCubrid3; } - /** - * @brief Return if installable - **/ - function isSupported() - { - if (!function_exists('cubrid_connect')) return false; - return true; - } - - /** - * @brief DB settings and connect/close - **/ - function _setDBInfo() - { - $db_info = Context::getDBInfo(); - $this->hostname = $db_info->db_hostname; - $this->userid = $db_info->db_userid; - $this->password = $db_info->db_password; - $this->database = $db_info->db_database; - $this->port = $db_info->db_port; - $this->prefix = $db_info->db_table_prefix; - - if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; - $this->magic_quotes_enabled = (version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()); - } - - /** - * @brief DB Connection - **/ - function _connect() - { - // ignore if db information not exists - if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; - - // attempts to connect - $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); - - // check connections - if (!$this->fd) { - $this->setError (-1, 'database connect fail'); - return $this->is_connected = false; - } - - $this->is_connected = true; - $this->password = md5 ($this->password); - } - - /** - * @brief DB disconnect - **/ - function close() - { - if (!$this->isConnected ()) return; - - @cubrid_commit ($this->fd); - @cubrid_disconnect ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief handles quatation of the string variables from the query - **/ - function addQuotes($string) - { - if (!$this->fd) return $string; - - if ($this->magic_quotes_enabled) { - $string = stripslashes (str_replace ("\\","\\\\", $string)); - } - - if (!is_numeric($string)) { - $string = str_replace("'","''",$string); - } - - return $string; - } - - /** - * @brief Begin transaction - **/ - function begin() - { - if (!$this->isConnected () || $this->transaction_started) return; - $this->transaction_started = true; - } - - /** - * @brief Rollback - **/ - function rollback() - { - if (!$this->isConnected () || !$this->transaction_started) return; - @cubrid_rollback ($this->fd); - $this->transaction_started = false; - } - - /** - * @brief Commit - **/ - function commit() - { - if (!$force && (!$this->isConnected () || - !$this->transaction_started)) return; - - @cubrid_commit($this->fd); - $this->transaction_started = false; - } - - /** - * @brief : executing the query and fetching the result - * - * query: run a query and return the result\n - * fetch: NULL if no value returned \n - * array object if rows returned \n - * object if a row returned \n - * return\n - **/ - function _query($query) - { - if (!$query || !$this->isConnected ()) return; - - // Notify to start a query execution - $this->actStart ($query); - - // Execute the query - $result = @cubrid_execute ($this->fd, $query); - // error check - if (cubrid_error_code ()) { - $code = cubrid_error_code (); - $msg = cubrid_error_msg (); - - $this->setError ($code, $msg); - } - - // Notify to complete a query execution - $this->actFinish (); - - // Return the result - return $result; - } - - /** - * @brief Fetch the result - **/ - function _fetch($result) - { - if (!$this->isConnected() || $this->isError() || !$result) return; - - $col_types = cubrid_column_types ($result); - $col_names = cubrid_column_names ($result); - $max = count ($col_types); - - for ($count = 0; $count < $max; $count++) { - if (preg_match ("/^char/", $col_types[$count]) > 0) { - $char_type_fields[] = $col_names[$count]; - } - } - - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if (is_array ($char_type_fields)) { - foreach ($char_type_fields as $val) { - $tmp->{$val} = rtrim ($tmp->{$val}); - } - } - - $output[] = $tmp; - } - - unset ($char_type_fields); - - if ($result) cubrid_close_request($result); - - if (count ($output) == 1) return $output[0]; - return $output; - } - - /** - * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) - **/ - function getNextSequence() - { - $this->_makeSequence(); - - $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - return $output->seq; - } - - /** - * @brief return if the table already exists - **/ - function _makeSequence() - { - if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; - - // check cubrid serial - $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); - $result = $this->_query($query); - $output = $this->_fetch($result); - - // if do not create serial - if ($output->count == 0) { - $query = sprintf('select max("a"."srl") as "srl" from '. - '( select max("document_srl") as "srl" from '. - '"%sdocuments" UNION '. - 'select max("comment_srl") as "srl" from '. - '"%scomments" UNION '. - 'select max("member_srl") as "srl" from '. - '"%smember"'. - ') as "a"', $this->prefix, $this->prefix, $this->prefix); - - $result = $this->_query($query); - $output = $this->_fetch($result); - $srl = $output->srl; - if ($srl < 1) { - $start = 1; - } - else { - $start = $srl + 1000000; - } - - // create sequence - $query = sprintf('create serial "%ssequence" start with %s increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix, $start); - $result = $this->_query($query); - if ($result) cubrid_close_request($result); - } - - $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; - } - - - /** - * brief return a table if exists - **/ - function isTableExists ($target_name) - { - if($target_name == 'sequence') { - $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); - } - else { - $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); - } - - $result = $this->_query ($query); - if (cubrid_num_rows($result) > 0) { - $output = true; - } - else { - $output = false; - } - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add a column to the table - **/ - function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) - { - $type = strtoupper($this->column_type[$type]); - if ($type == 'INTEGER') $size = ''; - - $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); - - if ($type == 'CHAR' || $type == 'VARCHAR') { - if ($size) $size = $size * 3; - } - - if ($size) { - $query .= sprintf ("%s(%s) ", $type, $size); - } - else { - $query .= sprintf ("%s ", $type); - } - - if ($default) { - if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { - $query .= sprintf ("default %d ", $default); - } - else { - $query .= sprintf ("default '%s' ", $default); - } - } - - if ($notnull) $query .= "not null "; - - $result = $this->_query($query); - if ($result) cubrid_close_request($result); - } - - /** - * @brief drop a column from the table - **/ - function dropColumn ($table_name, $column_name) - { - $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief return column information of the table - **/ - function isColumnExists ($table_name, $column_name) - { - $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); - $result = $this->_query ($query); - - if (cubrid_num_rows ($result) > 0) $output = true; - else $output = false; - - if ($result) cubrid_close_request ($result); - - return $output; - } - - /** - * @brief add an index to the table - * $target_columns = array(col1, col2) - * $is_unique? unique : none - **/ - function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) - { - if (!is_array ($target_columns)) { - $target_columns = array ($target_columns); - } - - $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief drop an index from the table - **/ - function dropIndex ($table_name, $index_name, $is_unique = false) - { - $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); - - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - /** - * @brief return index information of the table - **/ - function isIndexExists ($table_name, $index_name) - { - $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); - $result = $this->_query ($query); - - if ($this->isError ()) return false; - - $output = $this->_fetch ($result); - - if (!$output) return false; - return true; - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXml ($xml_doc) - { - return $this->_createTable ($xml_doc); - } - - /** - * @brief creates a table by using xml file - **/ - function createTableByXmlFile ($file_name) - { - if (!file_exists ($file_name)) return; - // read xml file - $buff = FileHandler::readFile ($file_name); - - return $this->_createTable ($buff); - } - - /** - * @brief create table by using the schema xml - * - * type : number, varchar, tinytext, text, bigtext, char, date, \n - * opt : notnull, default, size\n - * index : primary key, index, unique\n - **/ - function _createTable ($xml_doc) - { - // xml parsing - $oXml = new XmlParser(); - $xml_obj = $oXml->parse($xml_doc); - // Create a table schema - $table_name = $xml_obj->table->attrs->name; + /** + * @brief Return if installable + **/ + function isSupported() + { + if (!function_exists('cubrid_connect')) return false; + return true; + } + + /** + * @brief DB settings and connect/close + **/ + function _setDBInfo() + { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->port = $db_info->db_port; + $this->prefix = $db_info->db_table_prefix; + + if (!substr($this->prefix, -1) != '_') $this->prefix .= '_'; + $this->magic_quotes_enabled = (version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()); + } + + /** + * @brief DB Connection + **/ + function _connect() + { + // ignore if db information not exists + if (!$this->hostname || !$this->userid || !$this->password || !$this->database || !$this->port) return; + + // attempts to connect + $this->fd = @cubrid_connect ($this->hostname, $this->port, $this->database, $this->userid, $this->password); + + // check connections + if (!$this->fd) { + $this->setError (-1, 'database connect fail'); + return $this->is_connected = false; + } + + $this->is_connected = true; + $this->password = md5 ($this->password); + } + + /** + * @brief DB disconnect + **/ + function close() + { + if (!$this->isConnected ()) return; + + @cubrid_commit ($this->fd); + @cubrid_disconnect ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief handles quatation of the string variables from the query + **/ + function addQuotes($string) + { + if (!$this->fd) return $string; + + if ($this->magic_quotes_enabled) { + $string = stripslashes (str_replace ("\\","\\\\", $string)); + } + + if (!is_numeric($string)) { + $string = str_replace("'","''",$string); + } + + return $string; + } + + /** + * @brief Begin transaction + **/ + function begin() + { + if (!$this->isConnected () || $this->transaction_started) return; + $this->transaction_started = true; + } + + /** + * @brief Rollback + **/ + function rollback() + { + if (!$this->isConnected () || !$this->transaction_started) return; + @cubrid_rollback ($this->fd); + $this->transaction_started = false; + } + + /** + * @brief Commit + **/ + function commit() + { + if (!$force && (!$this->isConnected () || + !$this->transaction_started)) return; + + @cubrid_commit($this->fd); + $this->transaction_started = false; + } + + /** + * @brief : executing the query and fetching the result + * + * query: run a query and return the result\n + * fetch: NULL if no value returned \n + * array object if rows returned \n + * object if a row returned \n + * return\n + **/ + function _query($query) + { + if (!$query || !$this->isConnected ()) return; + + // Notify to start a query execution + $this->actStart ($query); + + // Execute the query + $result = @cubrid_execute ($this->fd, $query); + // error check + if (cubrid_error_code ()) { + $code = cubrid_error_code (); + $msg = cubrid_error_msg (); + + $this->setError ($code, $msg); + } + + // Notify to complete a query execution + $this->actFinish (); + + // Return the result + return $result; + } + + /** + * @brief Fetch the result + **/ + function _fetch($result) + { + if (!$this->isConnected() || $this->isError() || !$result) return; + + $col_types = cubrid_column_types ($result); + $col_names = cubrid_column_names ($result); + $max = count ($col_types); + + for ($count = 0; $count < $max; $count++) { + if (preg_match ("/^char/", $col_types[$count]) > 0) { + $char_type_fields[] = $col_names[$count]; + } + } + + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if (is_array ($char_type_fields)) { + foreach ($char_type_fields as $val) { + $tmp->{$val} = rtrim ($tmp->{$val}); + } + } + + $output[] = $tmp; + } + + unset ($char_type_fields); + + if ($result) cubrid_close_request($result); + + if (count ($output) == 1) return $output[0]; + return $output; + } + + /** + * @brief return the sequence value incremented by 1(auto_increment column only used in the CUBRID sequence table) + **/ + function getNextSequence() + { + $this->_makeSequence(); + + $query = sprintf ("select \"%ssequence\".\"nextval\" as \"seq\" from db_root", $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + return $output->seq; + } + + /** + * @brief return if the table already exists + **/ + function _makeSequence() + { + if($_GLOBALS['XE_EXISTS_SEQUENCE']) return; + + // check cubrid serial + $query = sprintf('select count(*) as "count" from "db_serial" where name=\'%ssequence\'', $this->prefix); + $result = $this->_query($query); + $output = $this->_fetch($result); + + // if do not create serial + if ($output->count == 0) { + $query = sprintf('select max("a"."srl") as "srl" from '. + '( select max("document_srl") as "srl" from '. + '"%sdocuments" UNION '. + 'select max("comment_srl") as "srl" from '. + '"%scomments" UNION '. + 'select max("member_srl") as "srl" from '. + '"%smember"'. + ') as "a"', $this->prefix, $this->prefix, $this->prefix); + + $result = $this->_query($query); + $output = $this->_fetch($result); + $srl = $output->srl; + if ($srl < 1) { + $start = 1; + } + else { + $start = $srl + 1000000; + } + + // create sequence + $query = sprintf('create serial "%ssequence" start with %s increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix, $start); + $result = $this->_query($query); + if ($result) cubrid_close_request($result); + } + + $_GLOBALS['XE_EXISTS_SEQUENCE'] = true; + } + + + /** + * brief return a table if exists + **/ + function isTableExists ($target_name) + { + if($target_name == 'sequence') { + $query = sprintf ("select \"name\" from \"db_serial\" where \"name\" = '%s%s'", $this->prefix, $target_name); + } + else { + $query = sprintf ("select \"class_name\" from \"db_class\" where \"class_name\" = '%s%s'", $this->prefix, $target_name); + } + + $result = $this->_query ($query); + if (cubrid_num_rows($result) > 0) { + $output = true; + } + else { + $output = false; + } + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add a column to the table + **/ + function addColumn($table_name, $column_name, $type = 'number', $size = '', $default = '', $notnull = false) + { + $type = strtoupper($this->column_type[$type]); + if ($type == 'INTEGER') $size = ''; + + $query = sprintf ("alter class \"%s%s\" add \"%s\" ", $this->prefix, $table_name, $column_name); + + if ($type == 'CHAR' || $type == 'VARCHAR') { + if ($size) $size = $size * 3; + } + + if ($size) { + $query .= sprintf ("%s(%s) ", $type, $size); + } + else { + $query .= sprintf ("%s ", $type); + } + + if ($default) { + if ($type == 'INTEGER' || $type == 'BIGINT' || $type=='INT') { + $query .= sprintf ("default %d ", $default); + } + else { + $query .= sprintf ("default '%s' ", $default); + } + } + + if ($notnull) $query .= "not null "; + + $result = $this->_query($query); + if ($result) cubrid_close_request($result); + } + + /** + * @brief drop a column from the table + **/ + function dropColumn ($table_name, $column_name) + { + $query = sprintf ("alter class \"%s%s\" drop \"%s\" ", $this->prefix, $table_name, $column_name); + + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + + /** + * @brief return column information of the table + **/ + function isColumnExists ($table_name, $column_name) + { + $query = sprintf ("select \"attr_name\" from \"db_attribute\" where ". "\"attr_name\" ='%s' and \"class_name\" = '%s%s'", $column_name, $this->prefix, $table_name); + $result = $this->_query ($query); + + if (cubrid_num_rows ($result) > 0) $output = true; + else $output = false; + + if ($result) cubrid_close_request ($result); + + return $output; + } + + /** + * @brief add an index to the table + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex ($table_name, $index_name, $target_columns, $is_unique = false) + { + if (!is_array ($target_columns)) { + $target_columns = array ($target_columns); + } + + $query = sprintf ("create %s index \"%s\" on \"%s%s\" (%s);", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name, '"'.implode('","',$target_columns).'"'); + + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + + /** + * @brief drop an index from the table + **/ + function dropIndex ($table_name, $index_name, $is_unique = false) + { + $query = sprintf ("drop %s index \"%s\" on \"%s%s\"", $is_unique?'unique':'', $this->prefix .$index_name, $this->prefix, $table_name); + + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + + /** + * @brief return index information of the table + **/ + function isIndexExists ($table_name, $index_name) + { + $query = sprintf ("select \"index_name\" from \"db_index\" where ". "\"class_name\" = '%s%s' and \"index_name\" = '%s' ", $this->prefix, $table_name, $this->prefix .$index_name); + $result = $this->_query ($query); + + if ($this->isError ()) return false; + + $output = $this->_fetch ($result); + + if (!$output) return false; + return true; + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXml ($xml_doc) + { + return $this->_createTable ($xml_doc); + } + + /** + * @brief creates a table by using xml file + **/ + function createTableByXmlFile ($file_name) + { + if (!file_exists ($file_name)) return; + // read xml file + $buff = FileHandler::readFile ($file_name); + + return $this->_createTable ($buff); + } + + /** + * @brief create table by using the schema xml + * + * type : number, varchar, tinytext, text, bigtext, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable ($xml_doc) + { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + // Create a table schema + $table_name = $xml_obj->table->attrs->name; // if the table already exists exit function - if ($this->isTableExists($table_name)) return; - - // If the table name is sequence, it creates a serial - if ($table_name == 'sequence') { - $query = sprintf('create serial "%ssequence" start with 1 increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - return; - } - - - $table_name = $this->prefix.$table_name; - - $query = sprintf ('create class "%s";', $table_name); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - - if (!is_array ($xml_obj->table->column)) { - $columns[] = $xml_obj->table->column; - } - else { - $columns = $xml_obj->table->column; - } - - $query = sprintf ("alter class \"%s\" add attribute ", $table_name); - - foreach ($columns as $column) { - $name = $column->attrs->name; - $type = $column->attrs->type; - $size = $column->attrs->size; - $notnull = $column->attrs->notnull; - $primary_key = $column->attrs->primary_key; - $index = $column->attrs->index; - $unique = $column->attrs->unique; - $default = $column->attrs->default; - - switch ($this->column_type[$type]) { - case 'integer' : - $size = null; - break; - case 'text' : - $size = null; - break; - } - - if (isset ($default) && ($type == 'varchar' || $type == 'char' || - $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) { - $default = sprintf ("'%s'", $default); - } - - if ($type == 'varchar' || $type == 'char') { - if($size) $size = $size * 3; - } - - - $column_schema[] = sprintf ('"%s" %s%s %s %s', - $name, - $this->column_type[$type], - $size?'('.$size.')':'', - isset($default)?"default ".$default:'', - $notnull?'not null':''); - - if ($primary_key) { - $primary_list[] = $name; - } - else if ($unique) { - $unique_list[$unique][] = $name; - } - else if ($index) { - $index_list[$index][] = $name; - } - } - - $query .= implode (',', $column_schema).';'; - $result = $this->_query($query); - if($result) cubrid_close_request($result); - - if (count ($primary_list)) { - $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - - if (count ($unique_list)) { - foreach ($unique_list as $key => $val) { - $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - } - - if (count ($index_list)) { - foreach ($index_list as $key => $val) { - $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); - $result = $this->_query($query); - if($result) cubrid_close_request($result); - } - } - } - - /** - * @brief return the condition - **/ - function getCondition ($output) - { - if (!$output->conditions) return; - $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); - if ($condition) $condition = ' where '.$condition; - - return $condition; - } - - function _getCondition ($conditions, $column_type, &$output) - { - $condition = ''; - - foreach ($conditions as $val) { - $sub_condition = ''; - - foreach ($val['condition'] as $v) { - $value = $v['value']; - if (!isset ($value)) continue; - if ($value === '') continue; - if(!is_string($value) && !is_integer($value) && !is_float($value) && !is_array($value)) continue; - - $name = $v['column']; - $operation = $v['operation']; - $type = $this->getColumnType ($column_type, $name); - $pipe = $v['pipe']; - $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); - - if (!$value) { - $value = $v['value']; - if (strpos ($value, '(')) { - $valuetmp = $value; - } - elseif (strpos ($value, ".") === false) { - $valuetmp = $value; - } - else { - $valuetmp = '"'.str_replace('.', '"."', $value).'"'; - } - } - else { - $tmp = explode('.',$value); - - if (count($tmp)==2) { - $table = $tmp[0]; - $column = $tmp[1]; - - if ($column_type[$column] && (in_array ($table, $output->tables) || - array_key_exists($table, $output->tables))) { - $valuetmp = sprintf('"%s"."%s"', $table, $column); - } - else { - $valuetmp = $value; - } - } - else { - $valuetmp = $value; - } - } - - if (strpos ($name, '(') > 0) { - $nametmp = $name; - } - elseif (strpos ($name, ".") === false) { - $nametmp = '"'.$name.'"'; - } - else { - $nametmp = '"'.str_replace('.', '"."', $name).'"'; - } - $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); - if ($sub_condition) $sub_condition .= ' '.$pipe.' '; - $sub_condition .= $str; - } - - if ($sub_condition) { - if ($condition && $val['pipe']) { - $condition .= ' '.$val['pipe'].' '; - } - $condition .= '('.$sub_condition.')'; - } - } - - return $condition; - } - - /** - * @brief handles insertAct - **/ - function _executeInsertAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // columns - foreach ($output->columns as $key => $val) { - $name = $val['name']; - $value = $val['value']; - //if ($this->getColumnType ($output->column_type, $name) != 'number') - if ($output->column_type[$name] != 'number') { - if (!is_null($value)) { - $value = "'" . $this->addQuotes($value) ."'"; - } - else { - if ($val['notnull']=='notnull') { - $value = "''"; - } - else { - //$value = 'null'; - $value = "''"; - } - } - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = '"'.$name.'"'; - $value_list[] = $value; - } - - $query = sprintf ("insert into %s (%s) values (%s);", implode(',', $table_list), implode(',', $column_list), implode(',', $value_list)); - - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($result && !$this->transaction_started) { - @cubrid_commit ($this->fd); - } - - return $result; - } - - /** - * @brief handles updateAct - **/ - function _executeUpdateAct ($output) - { - // tables - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - - $check_click_count = true; - - // columns - foreach ($output->columns as $key => $val) { - if (!isset ($val['value'])) continue; - $name = $val['name']; - $value = $val['value']; - - if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { - $check_click_count = false; - } - - for ($i = 0; $i < $key; $i++) { - // not allows to define the same property repeatedly in a single query in CUBRID - if ($output->columns[$i]['name'] == $name) break; - } - if ($i < $key) continue; // ignore the rest of properties if duplicated property found - - if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { - $column_list[] = $name.' = '.$value; - } - else { - if ($output->column_type[$name] != 'number') { - $check_column = false; - $value = "'".$this->addQuotes ($value)."'"; - } - elseif (!$value || is_numeric ($value)) { - $value = (int) $value; - } - - $column_list[] = sprintf ("\"%s\" = %s", $name, $value); - } - } - - // conditional clause - $condition = $this->getCondition ($output); - - $check_click_count_condition = false; - if ($check_click_count) { - foreach ($output->conditions as $val) { - if ($val['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - - foreach ($val['condition'] as $v) { - if ($v['operation'] == 'equal') { - $check_click_count_condition = true; - } - else { - if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { - $check_click_count_condition = true; - } - else { - $check_click_count_condition = false; - } - } - - if ($v['pipe'] == 'or') { - $check_click_count_condition = false; - break; - } - } - } - } - - if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { - foreach ($output->columns as $v) { - $incr_columns[] = 'incr("'.$v['name'].'")'; - } - - $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); - } - else { - $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); - } - - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief handles deleteAct - **/ - function _executeDeleteAct ($output) - { - // tables - foreach ($output->tables as $val) { - $table_list[] = '"'.$this->prefix.$val.'"'; - } - - // Conditional clauses - $condition = $this->getCondition ($output); - - $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); - $result = $this->_query ($query); - if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); - - return $result; - } - - /** - * @brief Handle selectAct - * - * to get a specific page list easily in select statement,\n - * a method, navigation, is used - **/ - function _executeSelectAct ($output) - { - // tables - $table_list = array (); - foreach ($output->tables as $key => $val) { - $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; - } - $left_join = array (); - // why??? - $left_tables = (array) $output->left_tables; - - foreach ($left_tables as $key => $val) { - $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); - if ($condition) { - $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; - } - } - - $click_count = array(); - if(!$output->columns){ - $output->columns = array(array('name'=>'*')); - } - - $column_list = array (); - foreach ($output->columns as $key => $val) { - $name = $val['name']; - - $click_count = '%s'; - if ($val['click_count'] && count ($output->conditions) > 0) { - $click_count = 'incr(%s)'; - } - - $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; - $_alias = $val['alias']; - - if ($name == '*') { - $column_list[] = $name; - } - elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { - $name = sprintf ($click_count,$name); - if ($alias) { - $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); - } - else { - $column_list[] = sprintf ('"%s"', $name); - } - } - else { - if (strpos ($name, '.') != false) { - list ($prefix, $name) = explode('.', $name); - if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { - if ($now_matchs == 1) { - $tmpval = explode ("(", $prefix); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $prefix = implode ("(", $tmpval); - $tmpval = explode (")", $name); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $name = implode (")", $tmpval); - } - } - else { - $prefix = sprintf ('"%s"', $prefix); - $name = ($name == '*') ? $name : sprintf('"%s"',$name); - } - $xtmp = null; - $now_matchs = null; - if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); - else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); - } - elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { - if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { - $open_pos = strpos ($name, "("); - $close_pos = strpos ($name, ")"); - - if (preg_match ("/,/", $name)) { - $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); - $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - $tmpval = null; - $tmpval = explode (',', $tmp_params); - - foreach ($tmpval as $tmp_param) { - $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; - } - - $tmpval = implode (',', $tmp_param_list); - $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); - } - else { - $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); - } - } - - if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); - else $column_list[] = sprintf ($click_count, $name); - } - else { - if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); - else $column_list[] = sprintf($click_count, $name); - } - } - $columns = implode (',', $column_list); - } - - $condition = $this->getCondition ($output); - - $output->column_list = $column_list; - if ($output->list_count && $output->page) { - return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); - } - - $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); - - // group by - $groupby_query = $this->getGroupByClause($output->groups); - - // order by + if ($this->isTableExists($table_name)) return; + + // If the table name is sequence, it creates a serial + if ($table_name == 'sequence') { + $query = sprintf('create serial "%ssequence" start with 1 increment by 1 nominvalue nomaxvalue nocycle cache 3;', $this->prefix); + $result = $this->_query($query); + if($result) cubrid_close_request($result); + return; + } + + + $table_name = $this->prefix.$table_name; + + $query = sprintf ('create class "%s";', $table_name); + $result = $this->_query($query); + if($result) cubrid_close_request($result); + + if (!is_array ($xml_obj->table->column)) { + $columns[] = $xml_obj->table->column; + } + else { + $columns = $xml_obj->table->column; + } + + $query = sprintf ("alter class \"%s\" add attribute ", $table_name); + + foreach ($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + + switch ($this->column_type[$type]) { + case 'integer' : + $size = null; + break; + case 'text' : + $size = null; + break; + } + + if (isset ($default) && ($type == 'varchar' || $type == 'char' || + $type == 'text' || $type == 'tinytext' || $type == 'bigtext')) + { + $default = sprintf ("'%s'", $default); + } + + if ($type == 'varchar' || $type == 'char') { + if($size) $size = $size * 3; + } + + $column_schema[] = sprintf ('"%s" %s%s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + isset($default)?"default ".$default:'', + $notnull?'not null':''); + + if ($primary_key) { + $primary_list[] = $name; + } + else if ($unique) { + $unique_list[$unique][] = $name; + } + else if ($index) { + $index_list[$index][] = $name; + } + } + + $query .= implode (',', $column_schema).';'; + $result = $this->_query($query); + if($result) cubrid_close_request($result); + + if (count ($primary_list)) { + $query = sprintf ("alter class \"%s\" add attribute constraint ". "\"pkey_%s\" PRIMARY KEY(%s);", $table_name, $table_name, '"'.implode('","',$primary_list).'"'); + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + + if (count ($unique_list)) { + foreach ($unique_list as $key => $val) { + $query = sprintf ("create unique index \"%s\" on \"%s\" ". "(%s);", $this->prefix .$key, $table_name, '"'.implode('","', $val).'"'); + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + } + + if (count ($index_list)) { + foreach ($index_list as $key => $val) { + $query = sprintf ("create index \"%s\" on \"%s\" (%s);", $this->prefix .$key, $table_name, '"'.implode('","',$val).'"'); + $result = $this->_query($query); + if($result) cubrid_close_request($result); + } + } + } + + /** + * @brief return the condition + **/ + function getCondition ($output) + { + if (!$output->conditions) return; + $condition = $this->_getCondition ($output->conditions, $output->column_type, $output); + if ($condition) $condition = ' where '.$condition; + + return $condition; + } + + function _getCondition ($conditions, $column_type, &$output) + { + $condition = ''; + + foreach ($conditions as $val) { + $sub_condition = ''; + + foreach ($val['condition'] as $v) { + $value = $v['value']; + if (!isset ($value)) continue; + if ($value === '') continue; + if(!is_string($value) && !is_integer($value) && !is_float($value) && !is_array($value)) continue; + + $name = $v['column']; + $operation = $v['operation']; + $type = $this->getColumnType ($column_type, $name); + $pipe = $v['pipe']; + $value = $this->getConditionValue ($name, $value, $operation, $type, $column_type); + + if (!$value) { + $value = $v['value']; + if (strpos ($value, '(')) { + $valuetmp = $value; + } + elseif (strpos ($value, ".") === false) { + $valuetmp = $value; + } + else { + $valuetmp = '"'.str_replace('.', '"."', $value).'"'; + } + } + else { + $tmp = explode('.',$value); + + if (count($tmp)==2) { + $table = $tmp[0]; + $column = $tmp[1]; + + if ($column_type[$column] && (in_array ($table, $output->tables) || + array_key_exists($table, $output->tables))) { + $valuetmp = sprintf('"%s"."%s"', $table, $column); + } + else { + $valuetmp = $value; + } + } + else { + $valuetmp = $value; + } + } + + if (strpos ($name, '(') > 0) { + $nametmp = $name; + } + elseif (strpos ($name, ".") === false) { + $nametmp = '"'.$name.'"'; + } + else { + $nametmp = '"'.str_replace('.', '"."', $name).'"'; + } + $str = $this->getConditionPart ($nametmp, $valuetmp, $operation); + if ($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + + if ($sub_condition) { + if ($condition && $val['pipe']) { + $condition .= ' '.$val['pipe'].' '; + } + $condition .= '('.$sub_condition.')'; + } + } + + return $condition; + } + + /** + * @brief handles insertAct + **/ + function _executeInsertAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // columns + foreach ($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + //if ($this->getColumnType ($output->column_type, $name) != 'number') + if ($output->column_type[$name] != 'number') { + if (!is_null($value)) { + $value = "'" . $this->addQuotes($value) ."'"; + } + else { + if ($val['notnull']=='notnull') { + $value = "''"; + } + else { + //$value = 'null'; + $value = "''"; + } + } + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = '"'.$name.'"'; + $value_list[] = $value; + } + + $query = sprintf ("insert into %s (%s) values (%s);", implode(',', $table_list), implode(',', $column_list), implode(',', $value_list)); + + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($result && !$this->transaction_started) { + @cubrid_commit ($this->fd); + } + + return $result; + } + + /** + * @brief handles updateAct + **/ + function _executeUpdateAct ($output) + { + // tables + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + + $check_click_count = true; + + // columns + foreach ($output->columns as $key => $val) { + if (!isset ($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + + if (substr ($value, -2) != '+1' || $output->column_type[$name] != 'number') { + $check_click_count = false; + } + + for ($i = 0; $i < $key; $i++) { + // not allows to define the same property repeatedly in a single query in CUBRID + if ($output->columns[$i]['name'] == $name) break; + } + if ($i < $key) continue; // ignore the rest of properties if duplicated property found + + if (strpos ($name, '.') !== false && strpos ($value, '.') !== false) { + $column_list[] = $name.' = '.$value; + } + else { + if ($output->column_type[$name] != 'number') { + $check_column = false; + $value = "'".$this->addQuotes ($value)."'"; + } + elseif (!$value || is_numeric ($value)) { + $value = (int) $value; + } + + $column_list[] = sprintf ("\"%s\" = %s", $name, $value); + } + } + + // conditional clause + $condition = $this->getCondition ($output); + + $check_click_count_condition = false; + if ($check_click_count) { + foreach ($output->conditions as $val) { + if ($val['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + + foreach ($val['condition'] as $v) { + if ($v['operation'] == 'equal') { + $check_click_count_condition = true; + } + else { + if ($v['operation'] == 'in' && !strpos ($v['value'], ',')) { + $check_click_count_condition = true; + } + else { + $check_click_count_condition = false; + } + } + + if ($v['pipe'] == 'or') { + $check_click_count_condition = false; + break; + } + } + } + } + + if ($check_click_count&& $check_click_count_condition && count ($output->tables) == 1 && count ($output->conditions) > 0 && count ($output->groups) == 0 && count ($output->order) == 0) { + foreach ($output->columns as $v) { + $incr_columns[] = 'incr("'.$v['name'].'")'; + } + + $query = sprintf ('select %s from %s %s', join (',', $incr_columns), implode(',', $table_list), $condition); + } + else { + $query = sprintf ("update %s set %s %s", implode (',', $table_list), implode (',', $column_list), $condition); + } + + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief handles deleteAct + **/ + function _executeDeleteAct ($output) + { + // tables + foreach ($output->tables as $val) { + $table_list[] = '"'.$this->prefix.$val.'"'; + } + + // Conditional clauses + $condition = $this->getCondition ($output); + + $query = sprintf ("delete from %s %s", implode (',',$table_list), $condition); + $result = $this->_query ($query); + if ($result && !$this->transaction_started) @cubrid_commit ($this->fd); + + return $result; + } + + /** + * @brief Handle selectAct + * + * to get a specific page list easily in select statement,\n + * a method, navigation, is used + **/ + function _executeSelectAct ($output) + { + // tables + $table_list = array (); + foreach ($output->tables as $key => $val) { + $table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"'; + } + $left_join = array (); + // why??? + $left_tables = (array) $output->left_tables; + + foreach ($left_tables as $key => $val) { + $condition = $this->_getCondition ($output->left_conditions[$key], $output->column_type, $output); + if ($condition) { + $left_join[] = $val.' "'.$this->prefix.$output->_tables[$key]. '" "'.$key.'" on ('.$condition.')'; + } + } + + $click_count = array(); + if(!$output->columns){ + $output->columns = array(array('name'=>'*')); + } + + $column_list = array (); + foreach ($output->columns as $key => $val) { + $name = $val['name']; + + $click_count = '%s'; + if ($val['click_count'] && count ($output->conditions) > 0) { + $click_count = 'incr(%s)'; + } + + $alias = $val['alias'] ? sprintf ('"%s"', $val['alias']) : null; + $_alias = $val['alias']; + + if ($name == '*') { + $column_list[] = $name; + } + elseif (strpos ($name, '.') === false && strpos ($name, '(') === false) { + $name = sprintf ($click_count,$name); + if ($alias) { + $column_list[$alias] = sprintf('"%s" as %s', $name, $alias); + } + else { + $column_list[] = sprintf ('"%s"', $name); + } + } + else { + if (strpos ($name, '.') != false) { + list ($prefix, $name) = explode('.', $name); + if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) { + if ($now_matchs == 1) { + $tmpval = explode ("(", $prefix); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $prefix = implode ("(", $tmpval); + $tmpval = explode (")", $name); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $name = implode (")", $tmpval); + } + } + else { + $prefix = sprintf ('"%s"', $prefix); + $name = ($name == '*') ? $name : sprintf('"%s"',$name); + } + $xtmp = null; + $now_matchs = null; + if($alias) $column_list[$_alias] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)) . ($alias ? sprintf (' as %s',$alias) : ''); + else $column_list[] = sprintf ($click_count, sprintf ('%s.%s', $prefix, $name)); + } + elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) { + if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) { + $open_pos = strpos ($name, "("); + $close_pos = strpos ($name, ")"); + + if (preg_match ("/,/", $name)) { + $tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos)); + $tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + $tmpval = null; + $tmpval = explode (',', $tmp_params); + + foreach ($tmpval as $tmp_param) { + $tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param; + } + + $tmpval = implode (',', $tmp_param_list); + $name = sprintf ('%s(%s)', $tmp_func_name, $tmpval); + } + else { + $name = sprintf ('%s("%s")', substr ($name, 0, $open_pos), substr ($name, $open_pos + 1, $close_pos - $open_pos - 1)); + } + } + + if($alias) $column_list[$_alias] = sprintf ($click_count, $name). ($alias ? sprintf (' as %s', $alias) : ''); + else $column_list[] = sprintf ($click_count, $name); + } + else { + if($alias) $column_list[$_alias] = sprintf($click_count, $name). ($alias ? sprintf(' as %s',$alias) : ''); + else $column_list[] = sprintf($click_count, $name); + } + } + $columns = implode (',', $column_list); + } + + $condition = $this->getCondition ($output); + + $output->column_list = $column_list; + if ($output->list_count && $output->page) { + return ($this->_getNavigationData($table_list, $columns, $left_join, $condition, $output)); + } + + $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); + + // group by + $groupby_query = $this->getGroupByClause($output->groups); + + // order by $orderby_query = $this->getOrderByClause($output->order); - // limit - $limit_query = $this->getLimitClause(0, $output->list_count['value']); + // limit + $limit_query = $this->getLimitClause(0, $output->list_count['value']); - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ unset($tmpCol); $tmpCol = explode('.', $col); if(isset($tmpCol[1])) $col = $tmpCol[1]; @@ -948,242 +948,242 @@ if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; $columns[] = $col; - } + } - $columns = join(',',$columns); - } + $columns = join(',',$columns); + } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); - if ($this->isError ()) return; - $data = $this->_fetch ($result); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); + if ($this->isError ()) return; + $data = $this->_fetch ($result); - $buff = new Object (); - $buff->data = $data; + $buff = new Object (); + $buff->data = $data; - return $buff; - } + return $buff; + } - /** - * @brief Retrieve text for limit clause - * - * Example: SELECT * FROM xe_modules LIMIT 20 - * - **/ - function getLimitClause($offset, $row_count){ - if(!$row_count) return ''; - if($offset === 0) - return sprintf(' limit %d', $row_count); - return sprintf(' limit %d, %d', $offset, $row_count); - } + /** + * @brief Retrieve text for limit clause + * + * Example: SELECT * FROM xe_modules LIMIT 20 + * + **/ + function getLimitClause($offset, $row_count){ + if(!$row_count) return ''; + if($offset === 0) + return sprintf(' limit %d', $row_count); + return sprintf(' limit %d, %d', $offset, $row_count); + } - /** - * @brief Retrieve text for order by clause - * - * Example: SELECT * FROM xe_modules ORDER BY list_order, regdate - * - **/ - function getOrderByClause($order_list){ - if(!$order_list) return ''; - - foreach ($order_list as $val) { - // Parse column names - if (strpos ($val[0], '.')) { - $tmpval = explode ('.', $val[0]); - $tmpval[0] = sprintf ('"%s"', $tmpval[0]); - $tmpval[1] = sprintf ('"%s"', $tmpval[1]); - $val[0] = implode ('.', $tmpval); - } - elseif (strpos ($val[0], '(')) $val[0] = $val[0]; - elseif ($val[0] == 'count') $val[0] = 'count(*)'; - else $val[0] = sprintf ('"%s"', $val[0]); - - // Save name - $index_list[] = sprintf('%s %s', $val[0], $val[1]); + /** + * @brief Retrieve text for order by clause + * + * Example: SELECT * FROM xe_modules ORDER BY list_order, regdate + * + **/ + function getOrderByClause($order_list){ + if(!$order_list) return ''; + + foreach ($order_list as $val) { + // Parse column names + if (strpos ($val[0], '.')) { + $tmpval = explode ('.', $val[0]); + $tmpval[0] = sprintf ('"%s"', $tmpval[0]); + $tmpval[1] = sprintf ('"%s"', $tmpval[1]); + $val[0] = implode ('.', $tmpval); + } + elseif (strpos ($val[0], '(')) $val[0] = $val[0]; + elseif ($val[0] == 'count') $val[0] = 'count(*)'; + else $val[0] = sprintf ('"%s"', $val[0]); + + // Save name + $index_list[] = sprintf('%s %s', $val[0], $val[1]); - // 1. This if never gets executed: column names are alias in $column_list but with real name in order clause - // 2. There is no need for the columns in the order by clause to also show up in the select statement - /* - if(count($output->arg_columns) && $column_list[$val[0]]) - $output->arg_columns[] = $column_list[$val[0]]; - */ - } + // 1. This if never gets executed: column names are alias in $column_list but with real name in order clause + // 2. There is no need for the columns in the order by clause to also show up in the select statement + /* + if(count($output->arg_columns) && $column_list[$val[0]]) + $output->arg_columns[] = $column_list[$val[0]]; + */ + } - if (count($index_list)) { - return ' order by '.implode(',', $index_list); - } - - return ''; - } + if (count($index_list)) { + return ' order by '.implode(',', $index_list); + } + + return ''; + } - /** - * @brief Retrieve text for group by clause - * - * Example: SELECT substr(regdate, 1, 8), count(*) FROM xe_modules GROUP BY substr(regdate, 1, 8) - * - **/ - function getGroupByClause($group_list){ - if(!$group_list) return ''; - if(!count($group_list)) return ''; - - foreach ($group_list as $key => $value) { - // If value is qualified table name - if (strpos ($value, '.')) { - $tmp = explode ('.', $value); - $tmp[0] = sprintf ('"%s"', $tmp[0]); - $tmp[1] = sprintf ('"%s"', $tmp[1]); - $value = implode ('.', $tmp); - } - // If value is an expression - elseif (strpos ($value, '(')) { - $value = $value; - } - else { - $value = sprintf ('"%s"', $value); - } - // Update - $group_list[$key] = $value; + /** + * @brief Retrieve text for group by clause + * + * Example: SELECT substr(regdate, 1, 8), count(*) FROM xe_modules GROUP BY substr(regdate, 1, 8) + * + **/ + function getGroupByClause($group_list){ + if(!$group_list) return ''; + if(!count($group_list)) return ''; + + foreach ($group_list as $key => $value) { + // If value is qualified table name + if (strpos ($value, '.')) { + $tmp = explode ('.', $value); + $tmp[0] = sprintf ('"%s"', $tmp[0]); + $tmp[1] = sprintf ('"%s"', $tmp[1]); + $value = implode ('.', $tmp); + } + // If value is an expression + elseif (strpos ($value, '(')) { + $value = $value; + } + else { + $value = sprintf ('"%s"', $value); + } + // Update + $group_list[$key] = $value; /* * The same as with order by - columns in "group by" do not need to be in the select clause - if(count($output->arg_columns)) - { - if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; - } - */ - } - return sprintf ('group by %s', implode(',', $group_list)); - } + if(count($output->arg_columns)) + { + if($column_list[$value]) $output->arg_columns[] = $column_list[$value]; + } + */ + } + return sprintf ('group by %s', implode(',', $group_list)); + } - /** - * @brief Adds a where clause that retrieves only a subset of the table data if order by is used - * @remarks Only works with tables that have columns named "list_order" or "update_order" - * - * EXAMPLE: SELECT * FROM xe_documents WHERE module_srl = 10 AND list_order < 2100000000 ORDER BY list_order - * - **/ - function limitResultIfOrderByIsUsed($order_list, $condition){ - if(!$order_list) return $condition; - - foreach ($order_list as $key => $val) { - $col = $val[0]; - if(!in_array($col, array('list_order','update_order'))) continue; - - if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); - else $condition = sprintf(' where %s < 2100000000 ', $col); - } - - return $condition; - } - - /** - * @brief displays the current stack trace. Fetch the result - **/ - function backtrace () - { - $output = "
\n"; - $output .= "Backtrace:
\n"; - $backtrace = debug_backtrace (); + /** + * @brief Adds a where clause that retrieves only a subset of the table data if order by is used + * @remarks Only works with tables that have columns named "list_order" or "update_order" + * + * EXAMPLE: SELECT * FROM xe_documents WHERE module_srl = 10 AND list_order < 2100000000 ORDER BY list_order + * + **/ + function limitResultIfOrderByIsUsed($order_list, $condition){ + if(!$order_list) return $condition; + + foreach ($order_list as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + + return $condition; + } + + /** + * @brief displays the current stack trace. Fetch the result + **/ + function backtrace () + { + $output = "
\n"; + $output .= "Backtrace:
\n"; + $backtrace = debug_backtrace (); - foreach ($backtrace as $bt) { - $args = ''; - foreach ($bt['args'] as $a) { - if (!empty ($args)) { - $args .= ', '; - } - switch (gettype ($a)) { - case 'integer': - case 'double': - $args .= $a; - break; - case 'string': - $a = htmlspecialchars (substr ($a, 0, 64)). - ((strlen ($a) > 64) ? '...' : ''); - $args .= "\"$a\""; - break; - case 'array': - $args .= 'Array ('. count ($a).')'; - break; - case 'object': - $args .= 'Object ('.get_class ($a).')'; - break; - case 'resource': - $args .= 'Resource ('.strstr ($a, '#').')'; - break; - case 'boolean': - $args .= $a ? 'True' : 'False'; - break; - case 'NULL': - $args .= 'Null'; - break; - default: - $args .= 'Unknown'; - } - } - $output .= "
\n"; - $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; - $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; - } - $output .= "
\n"; - return $output; - } + foreach ($backtrace as $bt) { + $args = ''; + foreach ($bt['args'] as $a) { + if (!empty ($args)) { + $args .= ', '; + } + switch (gettype ($a)) { + case 'integer': + case 'double': + $args .= $a; + break; + case 'string': + $a = htmlspecialchars (substr ($a, 0, 64)). + ((strlen ($a) > 64) ? '...' : ''); + $args .= "\"$a\""; + break; + case 'array': + $args .= 'Array ('. count ($a).')'; + break; + case 'object': + $args .= 'Object ('.get_class ($a).')'; + break; + case 'resource': + $args .= 'Resource ('.strstr ($a, '#').')'; + break; + case 'boolean': + $args .= $a ? 'True' : 'False'; + break; + case 'NULL': + $args .= 'Null'; + break; + default: + $args .= 'Unknown'; + } + } + $output .= "
\n"; + $output .= "file: ".$bt['line']." - ". $bt['file']."
\n"; + $output .= "call: ".$bt['class']. $bt['type'].$bt['function'].$args."
\n"; + } + $output .= "
\n"; + return $output; + } - /** - * @brief paginates when navigation info exists in the query xml - * - * it is convenient although its structure is not good .. -_-; - **/ - function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { - require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); + /** + * @brief paginates when navigation info exists in the query xml + * + * it is convenient although its structure is not good .. -_-; + **/ + function _getNavigationData ($table_list, $columns, $left_join, $condition, $output) { + require_once (_XE_PATH_.'classes/page/PageHandler.class.php'); - $column_list = $output->column_list; + $column_list = $output->column_list; - $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; - $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); - if (count($output->groups)) { - $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); - } + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) { + $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query); + } - $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query($count_query); - $count_output = $this->_fetch($result); - $total_count = (int)$count_output->count; + $count_query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; - $list_count = $output->list_count['value']; - if (!$list_count) $list_count = 20; - $page_count = $output->page_count['value']; - if (!$page_count) $page_count = 10; - $page = $output->page['value']; - if (!$page) $page = 1; + $list_count = $output->list_count['value']; + if (!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if (!$page_count) $page_count = 10; + $page = $output->page['value']; + if (!$page) $page = 1; - // total pages - if ($total_count) { - $total_page = (int) (($total_count - 1) / $list_count) + 1; - } - else { - $total_page = 1; - } + // total pages + if ($total_count) { + $total_page = (int) (($total_count - 1) / $list_count) + 1; + } + else { + $total_page = 1; + } - // check the page variables - if ($page > $total_page) $page = $total_page; - $start_count = ($page - 1) * $list_count; + // check the page variables + if ($page > $total_page) $page = $total_page; + $start_count = ($page - 1) * $list_count; - $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); - - // group by - $groupby_query = $this->getGroupByClause($output->groups); + $condition = $this->limitResultIfOrderByIsUsed($output->order, $condition); + + // group by + $groupby_query = $this->getGroupByClause($output->groups); - // order by + // order by $orderby_query = $this->getOrderByClause($output->order); - // limit - $limit_query = $this->getLimitClause($start_count, $list_count); + // limit + $limit_query = $this->getLimitClause($start_count, $list_count); - if(count($output->arg_columns)) - { - $columns = array(); - foreach($output->arg_columns as $col){ + if(count($output->arg_columns)) + { + $columns = array(); + foreach($output->arg_columns as $col){ unset($tmpCol); $tmpCol = explode('.', $col); if(isset($tmpCol[1])) $col = $tmpCol[1]; @@ -1192,48 +1192,48 @@ if(isset($tmpCol[1])) $col = $tmpCol[0].'.'.$col; $columns[] = $col; - } + } - $columns = join(',',$columns); - } + $columns = join(',',$columns); + } - $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); - $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; - $result = $this->_query ($query); + $query = sprintf ("select %s from %s %s %s %s", $columns, implode (',',$table_list), implode (' ',$left_join), $condition, $groupby_query.$orderby_query.$limit_query); + $query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):''; + $result = $this->_query ($query); - if ($this->isError ()) { - $buff = new Object (); - $buff->total_count = 0; - $buff->total_page = 0; - $buff->page = 1; - $buff->data = array (); + if ($this->isError ()) { + $buff = new Object (); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array (); - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - return $buff; - } + return $buff; + } - $virtual_no = $total_count - ($page - 1) * $list_count; - while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { - if ($tmp) { - foreach ($tmp as $k => $v) { - $tmp->{$k} = rtrim($v); - } - } - $data[$virtual_no--] = $tmp; - } + $virtual_no = $total_count - ($page - 1) * $list_count; + while ($tmp = cubrid_fetch ($result, CUBRID_OBJECT)) { + if ($tmp) { + foreach ($tmp as $k => $v) { + $tmp->{$k} = rtrim($v); + } + } + $data[$virtual_no--] = $tmp; + } - $buff = new Object (); - $buff->total_count = $total_count; - $buff->total_page = $total_page; - $buff->page = $page; - $buff->data = $data; + $buff = new Object (); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; - $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); + $buff->page_navigation = new PageHandler ($total_count, $total_page, $page, $page_count); - return $buff; - } - } + return $buff; + } + } -return new DBCubrid3; + return new DBCubrid3; ?>