1
0
mirror of https://github.com/dg/dibi.git synced 2025-08-05 21:58:10 +02:00

rewritten dibi::IDENTIFIER escaping; added support for [table.*]

This commit is contained in:
David Grudl
2010-05-19 14:53:19 +02:00
parent 27930611de
commit bec559448c
11 changed files with 20 additions and 37 deletions

View File

@@ -212,8 +212,7 @@ class DibiMsSqlDriver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx // @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
$value = str_replace(array('[', ']'), array('[[', ']]'), $value); return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
return '[' . str_replace('.', '].[', $value) . ']';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -210,8 +210,7 @@ class DibiMsSql2005Driver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
// @see http://msdn.microsoft.com/en-us/library/ms176027.aspx // @see http://msdn.microsoft.com/en-us/library/ms176027.aspx
$value = str_replace(array('[', ']'), array('[[', ']]'), $value); return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
return '[' . str_replace('.', '].[', $value) . ']';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -290,8 +290,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
// @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html // @see http://dev.mysql.com/doc/refman/5.0/en/identifiers.html
$value = str_replace('`', '``', $value); return '`' . str_replace('`', '``', $value) . '`';
return '`' . str_replace('.', '`.`', $value) . '`';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -274,8 +274,7 @@ class DibiMySqliDriver extends DibiObject implements IDibiDriver
return "_binary'" . mysqli_real_escape_string($this->connection, $value) . "'"; return "_binary'" . mysqli_real_escape_string($this->connection, $value) . "'";
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
$value = str_replace('`', '``', $value); return '`' . str_replace('`', '``', $value) . '`';
return '`' . str_replace('.', '`.`', $value) . '`';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -219,8 +219,7 @@ class DibiOdbcDriver extends DibiObject implements IDibiDriver
return "'" . str_replace("'", "''", $value) . "'"; return "'" . str_replace("'", "''", $value) . "'";
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
$value = str_replace(array('[', ']'), array('[[', ']]'), $value); return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
return '[' . str_replace('.', '].[', $value) . ']';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -228,8 +228,7 @@ class DibiOracleDriver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
// @see http://download.oracle.com/docs/cd/B10500_01/server.920/a96540/sql_elements9a.htm // @see http://download.oracle.com/docs/cd/B10500_01/server.920/a96540/sql_elements9a.htm
$value = str_replace('"', '""', $value); return '"' . str_replace('"', '""', $value) . '"';
return '"' . str_replace('.', '"."', $value) . '"';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -242,25 +242,19 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
switch ($this->connection->getAttribute(PDO::ATTR_DRIVER_NAME)) { switch ($this->connection->getAttribute(PDO::ATTR_DRIVER_NAME)) {
case 'mysql': case 'mysql':
$value = str_replace('`', '``', $value); return '`' . str_replace('`', '``', $value) . '`';
return '`' . str_replace('.', '`.`', $value) . '`';
case 'pgsql': case 'pgsql':
$a = strrpos($value, '.'); return '"' . str_replace('"', '""', $value) . '"';
if ($a === FALSE) {
return '"' . str_replace('"', '""', $value) . '"';
} else {
return substr($value, 0, $a) . '."' . str_replace('"', '""', substr($value, $a + 1)) . '"';
}
case 'sqlite': case 'sqlite':
case 'sqlite2': case 'sqlite2':
$value = strtr($value, '[]', ' '); return '[' . strtr($value, '[]', ' ') . ']';
case 'odbc': case 'odbc':
case 'oci': // TODO: not tested case 'oci': // TODO: not tested
case 'mssql': case 'mssql':
$value = str_replace(array('[', ']'), array('[[', ']]'), $value); return '[' . str_replace(array('[', ']'), array('[[', ']]'), $value) . ']';
return '[' . str_replace('.', '].[', $value) . ']';
default: default:
return $value; return $value;

View File

@@ -260,13 +260,7 @@ class DibiPostgreDriver extends DibiObject implements IDibiDriver
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
// @see http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS // @see http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
$a = strrpos($value, '.'); return '"' . str_replace('"', '""', $value) . '"';
if ($a === FALSE) {
return '"' . str_replace('"', '""', $value) . '"';
} else {
// table.col delimite as table."col"
return substr($value, 0, $a) . '."' . str_replace('"', '""', substr($value, $a + 1)) . '"';
}
case dibi::BOOL: case dibi::BOOL:
return $value ? 'TRUE' : 'FALSE'; return $value ? 'TRUE' : 'FALSE';

View File

@@ -234,7 +234,7 @@ class DibiSqliteDriver extends DibiObject implements IDibiDriver
return "'" . sqlite_escape_string($value) . "'"; return "'" . sqlite_escape_string($value) . "'";
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
return '[' . str_replace('.', '].[', strtr($value, '[]', ' ')) . ']'; return '[' . strtr($value, '[]', ' ') . ']';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -226,7 +226,7 @@ class DibiSqlite3Driver extends DibiObject implements IDibiDriver
return "X'" . bin2hex((string) $value) . "'"; return "X'" . bin2hex((string) $value) . "'";
case dibi::IDENTIFIER: case dibi::IDENTIFIER:
return '[' . str_replace('.', '].[', strtr($value, '[]', ' ')) . ']'; return '[' . strtr($value, '[]', ' ') . ']';
case dibi::BOOL: case dibi::BOOL:
return $value ? 1 : 0; return $value ? 1 : 0;

View File

@@ -564,14 +564,15 @@ final class DibiTranslator extends DibiObject
*/ */
private function delimite($value) private function delimite($value)
{ {
if ($value === '*') { if (strpos($value, ':') !== FALSE) { // provide substitution
return '*';
} elseif (strpos($value, ':') !== FALSE) { // provide substitution
$value = preg_replace_callback('#:([^:\s]*):#', array(__CLASS__, 'subCb'), $value); $value = preg_replace_callback('#:([^:\s]*):#', array(__CLASS__, 'subCb'), $value);
} }
return $this->driver->escape($value, dibi::IDENTIFIER); $parts = explode('.', $value);
foreach ($parts as & $value) {
$value = $value === '*' ? '*' : $this->driver->escape($value, dibi::IDENTIFIER);
}
return implode('.', $parts);
} }