diff --git a/TODO.txt b/TODO.txt index 9ab7b9e4..b7b97e96 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,3 +1 @@ -- sjednotit DibiVariable, modifier a type u IDibiDriver::format() -- odstranit podporu pro modifikátory v klíčích pole? - event, log, profiler diff --git a/dibi/dibi.php b/dibi/dibi.php index 2558721f..864e8b06 100644 --- a/dibi/dibi.php +++ b/dibi/dibi.php @@ -76,16 +76,14 @@ class dibi */ const FIELD_TEXT = 's', // as 'string' - FIELD_BINARY = 'S', + FIELD_BINARY = 'bin', FIELD_BOOL = 'b', FIELD_INTEGER = 'i', FIELD_FLOAT = 'f', FIELD_DATE = 'd', FIELD_DATETIME = 't', - FIELD_UNKNOWN = '?', // special - FIELD_COUNTER = 'C', // counter or autoincrement, is integer IDENTIFIER = 'n'; /** diff --git a/dibi/drivers/mssql.php b/dibi/drivers/mssql.php index 9de24c11..ad2b8173 100644 --- a/dibi/drivers/mssql.php +++ b/dibi/drivers/mssql.php @@ -186,21 +186,50 @@ class DibiMsSqlDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . str_replace("'", "''", $value) . "'"; - if ($type === dibi::IDENTIFIER) return '[' . str_replace('.', '].[', $value) . ']'; - if ($type === dibi::FIELD_BOOL) return $value ? -1 : 0; - 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); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . str_replace("'", "''", $value) . "'"; + + case dibi::IDENTIFIER: + return '[' . str_replace('.', '].[', $value) . ']'; + + case dibi::FIELD_BOOL: + return $value ? -1 : 0; + + case dibi::FIELD_DATE: + return date("'Y-m-d'", $value); + + case dibi::FIELD_DATETIME: + return date("'Y-m-d H:i:s'", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/mysql.php b/dibi/drivers/mysql.php index 0e451cc6..95cb7349 100644 --- a/dibi/drivers/mysql.php +++ b/dibi/drivers/mysql.php @@ -239,21 +239,50 @@ class DibiMySqlDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . mysql_real_escape_string($value, $this->connection) . "'"; - if ($type === dibi::IDENTIFIER) return '`' . str_replace('.', '`.`', $value) . '`'; - if ($type === dibi::FIELD_BOOL) return $value ? 1 : 0; - 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); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . mysql_real_escape_string($value, $this->connection) . "'"; + + case dibi::IDENTIFIER: + return '`' . str_replace('.', '`.`', $value) . '`'; + + case dibi::FIELD_BOOL: + return $value ? 1 : 0; + + case dibi::FIELD_DATE: + return date("'Y-m-d'", $value); + + case dibi::FIELD_DATETIME: + return date("'Y-m-d H:i:s'", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/mysqli.php b/dibi/drivers/mysqli.php index 44ad665f..0eba59bf 100644 --- a/dibi/drivers/mysqli.php +++ b/dibi/drivers/mysqli.php @@ -219,21 +219,50 @@ class DibiMySqliDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . mysqli_real_escape_string($this->connection, $value) . "'"; - if ($type === dibi::IDENTIFIER) return '`' . str_replace('.', '`.`', $value) . '`'; - if ($type === dibi::FIELD_BOOL) return $value ? 1 : 0; - 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); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . mysqli_real_escape_string($this->connection, $value) . "'"; + + case dibi::IDENTIFIER: + return '`' . str_replace('.', '`.`', $value) . '`'; + + case dibi::FIELD_BOOL: + return $value ? 1 : 0; + + case dibi::FIELD_DATE: + return date("'Y-m-d'", $value); + + case dibi::FIELD_DATETIME: + return date("'Y-m-d H:i:s'", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/odbc.php b/dibi/drivers/odbc.php index 87d46b12..1a6060ba 100644 --- a/dibi/drivers/odbc.php +++ b/dibi/drivers/odbc.php @@ -200,21 +200,50 @@ class DibiOdbcDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . str_replace("'", "''", $value) . "'"; - if ($type === dibi::IDENTIFIER) return '[' . str_replace('.', '].[', $value) . ']'; - if ($type === dibi::FIELD_BOOL) return $value ? -1 : 0; - if ($type === dibi::FIELD_DATE) return date("#m/d/Y#", $value); - if ($type === dibi::FIELD_DATETIME) return date("#m/d/Y H:i:s#", $value); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . str_replace("'", "''", $value) . "'"; + + case dibi::IDENTIFIER: + return '[' . str_replace('.', '].[', $value) . ']'; + + case dibi::FIELD_BOOL: + return $value ? -1 : 0; + + case dibi::FIELD_DATE: + return date("#m/d/Y#", $value); + + case dibi::FIELD_DATETIME: + return date("#m/d/Y H:i:s#", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/oracle.php b/dibi/drivers/oracle.php index 6292a399..f81b3f4b 100644 --- a/dibi/drivers/oracle.php +++ b/dibi/drivers/oracle.php @@ -197,21 +197,50 @@ class DibiOracleDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . str_replace("'", "''", $value) . "'"; // TODO: not tested - if ($type === dibi::IDENTIFIER) return '[' . str_replace('.', '].[', $value) . ']'; // TODO: not tested - if ($type === dibi::FIELD_BOOL) return $value ? 1 : 0; - if ($type === dibi::FIELD_DATE) return date("U", $value); - if ($type === dibi::FIELD_DATETIME) return date("U", $value); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . str_replace("'", "''", $value) . "'"; // TODO: not tested + + case dibi::IDENTIFIER: + return '[' . str_replace('.', '].[', $value) . ']'; // TODO: not tested + + case dibi::FIELD_BOOL: + return $value ? 1 : 0; + + case dibi::FIELD_DATE: + return date("U", $value); + + case dibi::FIELD_DATETIME: + return date("U", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/pdo.php b/dibi/drivers/pdo.php index 3acddd03..c1cef5df 100644 --- a/dibi/drivers/pdo.php +++ b/dibi/drivers/pdo.php @@ -218,21 +218,52 @@ class DibiPdoDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return $this->connection->quote($value); - if ($type === dibi::IDENTIFIER) return $value; // quoting is not supported by PDO - if ($type === dibi::FIELD_BOOL) return $value ? 1 : 0; - 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); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + return $this->connection->quote($value, PDO::PARAM_STR); + + case dibi::FIELD_BINARY: + return $this->connection->quote($value, PDO::PARAM_LOB); + + case dibi::IDENTIFIER: + return $value; // quoting is not supported by PDO + + case dibi::FIELD_BOOL: + return $this->connection->quote($value, PDO::PARAM_BOOL); + + case dibi::FIELD_DATE: + return date("'Y-m-d'", $value); + + case dibi::FIELD_DATETIME: + return date("'Y-m-d H:i:s'", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/drivers/postgre.php b/dibi/drivers/postgre.php index 4f6fcb4a..45998196 100644 --- a/dibi/drivers/postgre.php +++ b/dibi/drivers/postgre.php @@ -224,31 +224,69 @@ class DibiPostgreDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) { - if ($this->escMethod) return "'" . pg_escape_string($this->connection, $value) . "'"; - return "'" . pg_escape_string($value) . "'"; - } + switch ($type) { + case dibi::FIELD_TEXT: + if ($this->escMethod) { + return "'" . pg_escape_string($this->connection, $value) . "'"; + } else { + return "'" . pg_escape_string($value) . "'"; + } - if ($type === dibi::IDENTIFIER) { + case dibi::FIELD_BINARY: + if ($this->escMethod) { + return "'" . pg_escape_bytea($this->connection, $value) . "'"; + } else { + return "'" . pg_escape_bytea($value) . "'"; + } + + case 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); - throw new InvalidArgumentException('Unsupported formatting type.'); + case dibi::FIELD_BOOL: + return $value ? 'TRUE' : 'FALSE'; + + case dibi::FIELD_DATE: + return date("'Y-m-d'", $value); + + case dibi::FIELD_DATETIME: + return date("'Y-m-d H:i:s'", $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + switch ($type) { + case dibi::FIELD_BINARY: + return pg_unescape_bytea($value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } } diff --git a/dibi/drivers/sqlite.php b/dibi/drivers/sqlite.php index ec355194..0f9d99e0 100644 --- a/dibi/drivers/sqlite.php +++ b/dibi/drivers/sqlite.php @@ -203,21 +203,50 @@ class DibiSqliteDriver extends /*Nette::*/Object implements IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value * @throws InvalidArgumentException */ - public function format($value, $type) + public function escape($value, $type) { - if ($type === dibi::FIELD_TEXT) return "'" . sqlite_escape_string($value) . "'"; - if ($type === dibi::IDENTIFIER) return '[' . str_replace('.', '].[', $value) . ']'; - if ($type === dibi::FIELD_BOOL) return $value ? 1 : 0; - if ($type === dibi::FIELD_DATE) return date($this->fmtDate, $value); - if ($type === dibi::FIELD_DATETIME) return date($this->fmtDateTime, $value); - throw new InvalidArgumentException('Unsupported formatting type.'); + switch ($type) { + case dibi::FIELD_TEXT: + case dibi::FIELD_BINARY: + return "'" . sqlite_escape_string($value) . "'"; + + case dibi::IDENTIFIER: + return '[' . str_replace('.', '].[', $value) . ']'; + + case dibi::FIELD_BOOL: + return $value ? 1 : 0; + + case dibi::FIELD_DATE: + return date($this->fmtDate, $value); + + case dibi::FIELD_DATETIME: + return date($this->fmtDateTime, $value); + + default: + throw new InvalidArgumentException('Unsupported type.'); + } + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + public function unescape($value, $type) + { + throw new InvalidArgumentException('Unsupported type.'); } diff --git a/dibi/libs/DibiConnection.php b/dibi/libs/DibiConnection.php index 93b7d61a..38debd26 100644 --- a/dibi/libs/DibiConnection.php +++ b/dibi/libs/DibiConnection.php @@ -372,15 +372,30 @@ class DibiConnection extends /*Nette::*/Object /** - * Escapes the string. + * Encodes data for use in an SQL statement. * * @param string unescaped string - * @return string escaped and optionally quoted string + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string escaped and quoted string */ - public function escape($value) + public function escape($value, $type = dibi::FIELD_TEXT) { $this->connect(); // MySQL & PDO require connection - return $this->driver->format($value, dibi::FIELD_TEXT); + return $this->driver->escape($value, $type); + } + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + */ + public function unescape($value, $type = dibi::FIELD_BINARY) + { + return $this->driver->unescape($value, $type); } @@ -393,7 +408,7 @@ class DibiConnection extends /*Nette::*/Object */ public function delimite($value) { - return $this->driver->format($value, dibi::IDENTIFIER); + return $this->driver->escape($value, dibi::IDENTIFIER); } diff --git a/dibi/libs/DibiResult.php b/dibi/libs/DibiResult.php index b6c8a048..3605274a 100644 --- a/dibi/libs/DibiResult.php +++ b/dibi/libs/DibiResult.php @@ -81,16 +81,6 @@ class DibiResult extends /*Nette::*/Object implements IDataSource - private static $types = array( - dibi::FIELD_TEXT => 'string', - dibi::FIELD_BINARY => 'string', - dibi::FIELD_INTEGER => 'int', - dibi::FIELD_FLOAT => 'float', - dibi::FIELD_COUNTER => 'int', - ); - - - /** * @param IDibiDriver * @param array @@ -542,20 +532,30 @@ class DibiResult extends /*Nette::*/Object implements IDataSource return $value; } - if (isset(self::$types[$type])) { - settype($value, self::$types[$type]); + switch ($type) { + case dibi::FIELD_TEXT: + return (string) $value; + + case dibi::FIELD_BINARY: + return $this->getDriver()->unescape($value, $type); + + case dibi::FIELD_INTEGER: + return (int) $value; + + case dibi::FIELD_FLOAT: + return (float) $value; + + case dibi::FIELD_DATE: + case dibi::FIELD_DATETIME: + $value = strtotime($value); + return $format === NULL ? $value : date($format, $value); + + case dibi::FIELD_BOOL: + return ((bool) $value) && $value !== 'f' && $value !== 'F'; + + default: return $value; } - - if ($type === dibi::FIELD_DATE || $type === dibi::FIELD_DATETIME) { - return $format === NULL ? strtotime($value) : date($format, strtotime($value)); - } - - if ($type === dibi::FIELD_BOOL) { - return ((bool) $value) && $value !== 'f' && $value !== 'F'; - } - - return $value; } diff --git a/dibi/libs/DibiTranslator.php b/dibi/libs/DibiTranslator.php index a6081c89..a22400e5 100644 --- a/dibi/libs/DibiTranslator.php +++ b/dibi/libs/DibiTranslator.php @@ -261,13 +261,12 @@ final class DibiTranslator extends /*Nette::*/Object switch ($modifier) { case 's': // string - return $this->driver->format($value, dibi::FIELD_TEXT); + case 'bin':// binary + case 'b': // boolean + return $this->driver->escape($value, $modifier); case 'sn': // string or NULL - return $value == '' ? 'NULL' : $this->driver->format($value, dibi::FIELD_TEXT); // notice two equal signs - - case 'b': // boolean - return $this->driver->format($value, dibi::FIELD_BOOL); + return $value == '' ? 'NULL' : $this->driver->escape($value, dibi::FIELD_TEXT); // notice two equal signs case 'i': // signed int case 'u': // unsigned int, ignored @@ -285,10 +284,8 @@ final class DibiTranslator extends /*Nette::*/Object return (string) ($value + 0); case 'd': // date - return $this->driver->format(is_string($value) ? strtotime($value) : $value, dibi::FIELD_DATE); - case 't': // datetime - return $this->driver->format(is_string($value) ? strtotime($value) : $value, dibi::FIELD_DATETIME); + return $this->driver->escape(is_string($value) ? strtotime($value) : $value, $modifier); case 'n': // identifier name return $this->delimite($value); @@ -307,7 +304,10 @@ final class DibiTranslator extends /*Nette::*/Object ); } + case 'and': + case 'or': case 'a': + case 'l': case 'v': $this->hasError = TRUE; return '**Unexpected type ' . gettype($value) . '**'; @@ -321,13 +321,13 @@ final class DibiTranslator extends /*Nette::*/Object // without modifier procession if (is_string($value)) - return $this->driver->format($value, dibi::FIELD_TEXT); + return $this->driver->escape($value, dibi::FIELD_TEXT); if (is_int($value) || is_float($value)) return (string) $value; // something like -9E-005 is accepted by SQL if (is_bool($value)) - return $this->driver->format($value, dibi::FIELD_BOOL); + return $this->driver->escape($value, dibi::FIELD_BOOL); if ($value === NULL) return 'NULL'; @@ -427,10 +427,10 @@ final class DibiTranslator extends /*Nette::*/Object return $this->delimite($matches[2]); if ($matches[3]) // SQL strings: '...' - return $this->driver->format( str_replace("''", "'", $matches[4]), dibi::FIELD_TEXT); + return $this->driver->escape( str_replace("''", "'", $matches[4]), dibi::FIELD_TEXT); if ($matches[5]) // SQL strings: "..." - return $this->driver->format( str_replace('""', '"', $matches[6]), dibi::FIELD_TEXT); + return $this->driver->escape( str_replace('""', '"', $matches[6]), dibi::FIELD_TEXT); if ($matches[7]) { // string quote $this->hasError = TRUE; @@ -453,7 +453,7 @@ final class DibiTranslator extends /*Nette::*/Object if (strpos($value, ':') !== FALSE) { $value = strtr($value, dibi::getSubst()); } - return $this->driver->format($value, dibi::IDENTIFIER); + return $this->driver->escape($value, dibi::IDENTIFIER); } diff --git a/dibi/libs/interfaces.php b/dibi/libs/interfaces.php index 2034e256..616d7dce 100644 --- a/dibi/libs/interfaces.php +++ b/dibi/libs/interfaces.php @@ -142,13 +142,27 @@ interface IDibiDriver /** - * Format to SQL command. + * Encodes data for use in an SQL statement. * * @param string value - * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, dibi::FIELD_DATE, dibi::FIELD_DATETIME, dibi::IDENTIFIER) - * @return string formatted value + * @param string type (dibi::FIELD_TEXT, dibi::FIELD_BOOL, ...) + * @return string encoded value + * @throws InvalidArgumentException */ - function format($value, $type); + function escape($value, $type); + + + + /** + * Decodes data from resultset. + * + * @param string value + * @param string type (dibi::FIELD_BINARY) + * @return string decoded value + * @throws InvalidArgumentException + */ + function unescape($value, $type); + /**