]> git.andy128k.dev Git - ipf-legacy-orm.git/commitdiff
rework quoteIdentifier method
authorAndrey Kutejko <andy128k@gmail.com>
Sat, 27 Jul 2013 12:19:51 +0000 (15:19 +0300)
committerAndrey Kutejko <andy128k@gmail.com>
Sat, 27 Jul 2013 12:19:51 +0000 (15:19 +0300)
ipf/orm.php
ipf/orm/configurable.php
ipf/orm/connection.php
ipf/orm/connection/mysql.php
ipf/orm/formatter.php
ipf/orm/manager.php

index a216def34e2c8b3bdb478db76e2a84b3ea4e7d30..a34f2c3004138cb71ab6b2a1775e865e48b7e10a 100644 (file)
@@ -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;
index ce12e9429bc5c78427cb25a54f68e23d9884057e..4ef99325bbec33d3c25cd7c9c59fafbd9bb422ba 100644 (file)
@@ -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:
index b134b758a43cc76ec766cef59b9df1382f1ada82..9bb9f1001f32c109c2465fd3c7c80855549a83a3 100644 (file)
@@ -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)) {
index 7b7a1402e7fd5c8e3e8dfc351b56a7c13f34d0a1..fa7f77226264b9600dde9b5f6ee98768a0be2609 100644 (file)
@@ -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;
     }
 }
+
index 3b98fca0c73e2056939e702b2f3031ad8e7cd354..3e448482fbe2aa8b3bbbafb2f0fe37cc65f68b55 100644 (file)
@@ -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) {
index e790f11220807d12fb4e374010e0e3220b3d79dc..b206559d0d5308d6077968a695501e3db7b16087 100644 (file)
@@ -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,