From 5af8a657deea38142975363974ffedb2d3502049 Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Sat, 27 Jul 2013 15:19:51 +0300 Subject: [PATCH] rework quoteIdentifier method --- ipf/orm.php | 1 - ipf/orm/configurable.php | 1 - ipf/orm/connection.php | 16 ++------- ipf/orm/connection/mysql.php | 63 ++++++++++++++++++++++++++++++++++-- ipf/orm/formatter.php | 13 -------- ipf/orm/manager.php | 1 - 6 files changed, 63 insertions(+), 32 deletions(-) diff --git a/ipf/orm.php b/ipf/orm.php index a216def..a34f2c3 100644 --- a/ipf/orm.php +++ b/ipf/orm.php @@ -98,7 +98,6 @@ final class IPF_ORM const ATTR_STRINGIFY_FETCHES = 17; const ATTR_MAX_COLUMN_LEN = 18; - const ATTR_QUOTE_IDENTIFIER = 101; const ATTR_FIELD_CASE = 102; const ATTR_IDXNAME_FORMAT = 103; const ATTR_CMPNAME_FORMAT = 118; diff --git a/ipf/orm/configurable.php b/ipf/orm/configurable.php index ce12e94..4ef9932 100644 --- a/ipf/orm/configurable.php +++ b/ipf/orm/configurable.php @@ -62,7 +62,6 @@ abstract class IPF_ORM_Configurable } } break; - case IPF_ORM::ATTR_QUOTE_IDENTIFIER: case IPF_ORM::ATTR_PORTABILITY: case IPF_ORM::ATTR_DEFAULT_TABLE_TYPE: case IPF_ORM::ATTR_EMULATE_DATABASE: diff --git a/ipf/orm/connection.php b/ipf/orm/connection.php index b134b75..9bb9f10 100644 --- a/ipf/orm/connection.php +++ b/ipf/orm/connection.php @@ -19,7 +19,7 @@ abstract class IPF_ORM_Connection extends IPF_ORM_Configurable implements Counta protected $properties = array('sql_comments' => array(array('start' => '--', 'end' => "\n", 'escape' => false), array('start' => '/*', 'end' => '*/', 'escape' => false)), - 'identifier_quoting' => array('start' => '"', 'end' => '"','escape' => '"'), + 'identifier_quoting' => '"', 'string_quoting' => array('start' => "'", 'end' => "'", 'escape' => false, @@ -351,18 +351,8 @@ abstract class IPF_ORM_Connection extends IPF_ORM_Configurable implements Counta return $this->exec($query, array_values($fields)); } - public function quoteIdentifier($str, $checkOption = true) - { - // quick fix for the identifiers that contain a dot - if (strpos($str, '.')) { - $e = explode('.', $str); - - return $this->formatter->quoteIdentifier($e[0], $checkOption) . '.' - . $this->formatter->quoteIdentifier($e[1], $checkOption); - } - return $this->formatter->quoteIdentifier($str, $checkOption); - } - + public abstract function quoteIdentifier($str); + public function convertBooleans($item) { if (is_array($item)) { diff --git a/ipf/orm/connection/mysql.php b/ipf/orm/connection/mysql.php index 7b7a140..fa7f772 100644 --- a/ipf/orm/connection/mysql.php +++ b/ipf/orm/connection/mysql.php @@ -4,6 +4,51 @@ class IPF_ORM_Connection_Mysql extends IPF_ORM_Connection { protected $driverName = 'Mysql'; + protected static $keywords = array( + 'ADD', 'ALL', 'ALTER', 'ANALYZE', 'AND', 'AS', 'ASC', + 'ASENSITIVE', 'BEFORE', 'BETWEEN', 'BIGINT', 'BINARY', 'BLOB', + 'BOTH', 'BY', 'BIT', 'CALL', 'CASCADE', 'CASE', 'CHANGE', + 'CHAR', 'CHARACTER', 'CHECK', 'COLLATE', 'COLUMN', + 'CONDITION', 'CONNECTION', 'CONSTRAINT', 'CONTINUE', + 'CONVERT', 'CREATE', 'CROSS', 'CURRENT_DATE', 'CURRENT_TIME', + 'CURRENT_TIMESTAMP', 'CURRENT_USER', 'CURSOR', 'DATABASE', + 'DATABASES', 'DAY_HOUR', 'DAY_MICROSECOND', 'DAY_MINUTE', + 'DAY_SECOND', 'DEC', 'DECIMAL', 'DECLARE', 'DEFAULT', + 'DELAYED', 'DELETE', 'DESC', 'DESCRIBE', 'DETERMINISTIC', + 'DISTINCT', 'DISTINCTROW', 'DIV', 'DOUBLE', 'DROP', 'DUAL', + 'EACH', 'ELSE', 'ELSEIF', 'ENCLOSED', 'ESCAPED', 'EXISTS', + 'EXIT', 'EXPLAIN', 'FALSE', 'FETCH', 'FLOAT', 'FLOAT4', + 'FLOAT8', 'FOR', 'FORCE', 'FOREIGN', 'FROM', 'FULLTEXT', + 'GRANT', 'GROUP', 'HAVING', 'HIGH_PRIORITY', + 'HOUR_MICROSECOND', 'HOUR_MINUTE', 'HOUR_SECOND', 'IF', + 'IGNORE', 'IN', 'INDEX', 'INFILE', 'INNER', 'INOUT', + 'INSENSITIVE', 'INSERT', 'INT', 'INT1', 'INT2', 'INT3', + 'INT4', 'INT8', 'INTEGER', 'INTERVAL', 'INTO', 'IS', + 'ITERATE', 'JOIN', 'KEY', 'KEYS', 'KILL', 'LEADING', 'LEAVE', + 'LEFT', 'LIKE', 'LIMIT', 'LINES', 'LOAD', 'LOCALTIME', + 'LOCALTIMESTAMP', 'LOCK', 'LONG', 'LONGBLOB', 'LONGTEXT', + 'LOOP', 'LOW_PRIORITY', 'MATCH', 'MEDIUMBLOB', 'MEDIUMINT', + 'MEDIUMTEXT', 'MIDDLEINT', 'MINUTE_MICROSECOND', + 'MINUTE_SECOND', 'MOD', 'MODIFIES', 'NATURAL', 'NOT', + 'NO_WRITE_TO_BINLOG', 'NULL', 'NUMERIC', 'ON', 'OPTIMIZE', + 'OPTION', 'OPTIONALLY', 'OR', 'ORDER', 'OUT', 'OUTER', + 'OUTFILE', 'PRECISION', 'PRIMARY', 'PROCEDURE', 'PURGE', + 'RAID0', 'READ', 'READS', 'REAL', 'REFERENCES', 'REGEXP', + 'RELEASE', 'RENAME', 'REPEAT', 'REPLACE', 'REQUIRE', + 'RESTRICT', 'RETURN', 'REVOKE', 'RIGHT', 'RLIKE', 'SCHEMA', + 'SCHEMAS', 'SECOND_MICROSECOND', 'SELECT', 'SENSITIVE', + 'SEPARATOR', 'SET', 'SHOW', 'SMALLINT', 'SONAME', 'SPATIAL', + 'SPECIFIC', 'SQL', 'SQLEXCEPTION', 'SQLSTATE', 'SQLWARNING', + 'SQL_BIG_RESULT', 'SQL_CALC_FOUND_ROWS', 'SQL_SMALL_RESULT', + 'SSL', 'STARTING', 'STRAIGHT_JOIN', 'TABLE', 'TERMINATED', + 'THEN', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'TO', 'TRAILING', + 'TRIGGER', 'TRUE', 'UNDO', 'UNION', 'UNIQUE', 'UNLOCK', + 'UNSIGNED', 'UPDATE', 'USAGE', 'USE', 'USING', 'UTC_DATE', + 'UTC_TIME', 'UTC_TIMESTAMP', 'VALUES', 'VARBINARY', 'VARCHAR', + 'VARCHARACTER', 'VARYING', 'WHEN', 'WHERE', 'WHILE', 'WITH', + 'WRITE', 'X509', 'XOR', 'YEAR_MONTH', 'ZEROFILL' + ); + public function __construct(IPF_ORM_Manager $manager, $adapter) { $this->attributes[IPF_ORM::ATTR_DEFAULT_TABLE_TYPE] = 'INNODB'; @@ -13,9 +58,7 @@ class IPF_ORM_Connection_Mysql extends IPF_ORM_Connection 'escape' => '\\', 'escape_pattern' => '\\'); - $this->properties['identifier_quoting'] = array('start' => '`', - 'end' => '`', - 'escape' => '`'); + $this->properties['identifier_quoting'] = '`'; $this->properties['sql_comments'] = array( array('start' => '-- ', 'end' => "\n", 'escape' => false), @@ -34,6 +77,19 @@ class IPF_ORM_Connection_Mysql extends IPF_ORM_Connection $this->exec('SET NAMES \'utf8\''); } + public function quoteIdentifier($str) + { + $quote = $this->identifier_quoting; + $q = array(); + foreach (explode('.', $str) as $s) { + if (in_array(strtoupper($s), self::$keywords)) + $q[] = $quote . str_replace($quote, $quote . $quote, $s) . $quote; + else + $q[] = $s; + } + return implode('.', $q); + } + public function getDatabaseName() { return $this->fetchOne('SELECT DATABASE()'); @@ -71,3 +127,4 @@ class IPF_ORM_Connection_Mysql extends IPF_ORM_Connection return $query; } } + diff --git a/ipf/orm/formatter.php b/ipf/orm/formatter.php index 3b98fca..3e44848 100644 --- a/ipf/orm/formatter.php +++ b/ipf/orm/formatter.php @@ -19,19 +19,6 @@ class IPF_ORM_Formatter extends IPF_ORM_Connection_Module return $text; } - public function quoteIdentifier($str, $checkOption = true) - { - if ($checkOption && ! $this->conn->getAttribute(IPF_ORM::ATTR_QUOTE_IDENTIFIER)) { - return $str; - } - $tmp = $this->conn->identifier_quoting; - $str = str_replace($tmp['end'], - $tmp['escape'] . - $tmp['end'], $str); - - return $tmp['start'] . $str . $tmp['end']; - } - public function quote($input, $type = null) { if ($type == null) { diff --git a/ipf/orm/manager.php b/ipf/orm/manager.php index e790f11..b206559 100644 --- a/ipf/orm/manager.php +++ b/ipf/orm/manager.php @@ -15,7 +15,6 @@ class IPF_ORM_Manager extends IPF_ORM_Configurable implements Countable, Iterato IPF_ORM::ATTR_LOAD_REFERENCES => true, IPF_ORM::ATTR_IDXNAME_FORMAT => "%s_idx", IPF_ORM::ATTR_TBLNAME_FORMAT => "%s", - IPF_ORM::ATTR_QUOTE_IDENTIFIER => false, IPF_ORM::ATTR_PORTABILITY => IPF_ORM::PORTABILITY_ALL, IPF_ORM::ATTR_EXPORT => IPF_ORM::EXPORT_ALL, IPF_ORM::ATTR_DECIMAL_PLACES => 2, -- 2.49.0