From 7d964e054bff291309d4ef68706a0c3a902682cd Mon Sep 17 00:00:00 2001 From: David Grudl Date: Sat, 1 Dec 2007 17:24:49 +0000 Subject: [PATCH] * fixed identifier delimitation in DibiPostgreDriver (table.col -> table."col") * better SQL syntax highlighting * removed addslashes from DibiPostgreDriver --- dibi/dibi.php | 7 ++++--- dibi/drivers/mysql.php | 3 +-- dibi/drivers/mysqli.php | 3 +-- dibi/drivers/postgre.php | 20 ++++++++++++-------- examples/sample.mdb | Bin 188416 -> 274432 bytes examples/sample.sdb | Bin 5120 -> 6144 bytes 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/dibi/dibi.php b/dibi/dibi.php index 1c1e4601..8e14571a 100644 --- a/dibi/dibi.php +++ b/dibi/dibi.php @@ -543,9 +543,9 @@ class dibi extends NClass static $keywords1 = 'SELECT|UPDATE|INSERT(?:\s+INTO)|REPLACE(?:\s+INTO)|DELETE|FROM|WHERE|HAVING|GROUP\s+BY|ORDER\s+BY|LIMIT|SET|VALUES|LEFT\s+JOIN|INNER\s+JOIN'; // insert new lines - $sql = preg_replace("#\\b(?:$keywords1)\\b#i", "\n\$0", $sql); + $sql = ' ' . $sql; + $sql = preg_replace("#(?<=[\\s,(])($keywords1)(?=[\\s,)])#i", "\n\$1", $sql); - $sql = trim($sql); // reduce spaces $sql = preg_replace('# {2,}#', ' ', $sql); @@ -554,7 +554,8 @@ class dibi extends NClass $sql = preg_replace("#\n{2,}#", "\n", $sql); // syntax highlight - $sql = preg_replace_callback("#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|\\b($keywords1)\\b|\\b($keywords2)\\b#i", array('dibi', 'highlightCallback'), $sql); + $sql = preg_replace_callback("#(/\\*.+?\\*/)|(\\*\\*.+?\\*\\*)|(?<=[\\s,(])($keywords1)(?=[\\s,)])|(?<=[\\s,(])($keywords2)(?=[\\s,)])#i", array('dibi', 'highlightCallback'), $sql); + $sql = trim($sql); echo '
', $sql, "
\n"; } diff --git a/dibi/drivers/mysql.php b/dibi/drivers/mysql.php index eec6db83..41b0a2e7 100644 --- a/dibi/drivers/mysql.php +++ b/dibi/drivers/mysql.php @@ -344,8 +344,7 @@ class DibiMySqlDriver extends NObject implements DibiDriverInterface $meta = array(); for ($i = 0; $i < $count; $i++) { // items 'name' and 'table' are required - $info = (array) mysql_fetch_field($this->resultset, $i); - $meta[] = $info; + $meta[] = (array) mysql_fetch_field($this->resultset, $i); } return $meta; } diff --git a/dibi/drivers/mysqli.php b/dibi/drivers/mysqli.php index 9fb260bc..ac165e76 100644 --- a/dibi/drivers/mysqli.php +++ b/dibi/drivers/mysqli.php @@ -320,8 +320,7 @@ class DibiMySqliDriver extends NObject implements DibiDriverInterface $meta = array(); for ($i = 0; $i < $count; $i++) { // items 'name' and 'table' are required - $info = (array) mysqli_fetch_field_direct($this->resultset, $i); - $meta[] = $info; + $meta[] = (array) mysqli_fetch_field_direct($this->resultset, $i); } return $meta; } diff --git a/dibi/drivers/postgre.php b/dibi/drivers/postgre.php index 8b596e0b..cf2c0528 100644 --- a/dibi/drivers/postgre.php +++ b/dibi/drivers/postgre.php @@ -52,9 +52,9 @@ class DibiPostgreDriver extends NObject implements DibiDriverInterface /** * Escape method - * @var int + * @var bool */ - private $escMethod; + private $escMethod = FALSE; @@ -66,8 +66,6 @@ class DibiPostgreDriver extends NObject implements DibiDriverInterface if (!extension_loaded('pgsql')) { throw new DibiDriverException("PHP extension 'pgsql' is not loaded"); } - - $this->escMethod = version_compare(PHP_VERSION , '5.2.0', '>=') ? 1 : 0; } @@ -106,7 +104,7 @@ class DibiPostgreDriver extends NObject implements DibiDriverInterface DibiDriverException::restore(); } - if (!empty($config['escapefix'])) $this->escMethod = -1; + $this->escMethod = version_compare(PHP_VERSION , '5.2.0', '>='); } @@ -226,11 +224,17 @@ class DibiPostgreDriver extends NObject implements DibiDriverInterface public function format($value, $type) { if ($type === dibi::FIELD_TEXT) { - if ($this->escMethod === -1) return "'" . addSlashes($value) . "'"; - if ($this->escMethod === 1 && $this->connection) return "'" . pg_escape_string($this->connection, $value) . "'"; + if ($this->escMethod) return "'" . pg_escape_string($this->connection, $value) . "'"; return "'" . pg_escape_string($value) . "'"; } - if ($type === dibi::IDENTIFIER) return '"' . str_replace('.', '"."', str_replace('"', '""', $value)) . '"'; + + if ($type === dibi::IDENTIFIER) { + $a = strrpos($value, '.'); + if ($a === FALSE) return '"' . str_replace('"', '""', $value) . '"'; + // table.col delimite as table."col" + return substr($value, 0, $a) . '."' . str_replace('"', '""', substr($value, $a + 1)) . '"'; + } + if ($type === dibi::FIELD_BOOL) return $value ? 'TRUE' : 'FALSE'; if ($type === dibi::FIELD_DATE) return date("'Y-m-d'", $value); if ($type === dibi::FIELD_DATETIME) return date("'Y-m-d H:i:s'", $value); diff --git a/examples/sample.mdb b/examples/sample.mdb index dd1e6860d63a9d47b46950b98927d43d6373ff62..554e6a69ddd1fc02228fa830b369b990bb1002f8 100644 GIT binary patch literal 274432 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 delta 7853 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 U4g%7Q43lF7q?s8yfO^`P0U@Ozt^fc4