diff options
author | Derek Allard <derek.allard@ellislab.com> | 2008-02-10 22:46:18 +0100 |
---|---|---|
committer | Derek Allard <derek.allard@ellislab.com> | 2008-02-10 22:46:18 +0100 |
commit | 156481371306db532d6b3880d0914e9237b93685 (patch) | |
tree | e523a9e2dfc0775a682549644a4f8fb0df77e7ec /system/database/drivers/mssql/mssql_driver.php | |
parent | 26c7a9c3757b27a632be453be7adb4eca29baa2f (diff) |
changes for enhanced database compatibility
Diffstat (limited to 'system/database/drivers/mssql/mssql_driver.php')
-rw-r--r-- | system/database/drivers/mssql/mssql_driver.php | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php index 4cf444088..8e12a2d21 100644 --- a/system/database/drivers/mssql/mssql_driver.php +++ b/system/database/drivers/mssql/mssql_driver.php @@ -430,16 +430,51 @@ class CI_DB_mssql_driver extends CI_DB { * @param boolean only affect the first word
* @return mixed the item with backticks
*/
- function _protect_identifiers($item, $affect_spaces = TRUE, $first_word_only = FALSE)
+ function _protect_identifiers($item, $first_word_only = FALSE)
{
- // MSSQL doesn't use backticks
- if (strpos($item, '.') !== FALSE)
+ if (is_array($item))
{
- $aliased_tables = implode(".",$this->ar_aliased_tables).'.';
- $table_name = substr($item, 0, strpos($item, '.')+1);
- $item = (strpos($aliased_tables, $table_name) !== FALSE) ? $item = $item : $this->dbprefix.$item;
+ $escaped_array = array();
+
+ foreach($item as $k=>$v)
+ {
+ $escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v, $first_word_only);
+ }
+
+ return $escaped_array;
+ }
+
+ // This function may get "item1 item2" as a string, and so
+ // we may need ""item1" "item2"" and not ""item1 item2""
+ if (ctype_alnum($item) === FALSE)
+ {
+ if (strpos($item, '.') !== FALSE)
+ {
+ $aliased_tables = implode(".",$this->ar_aliased_tables).'.';
+ $table_name = substr($item, 0, strpos($item, '.')+1);
+ $item = (strpos($aliased_tables, $table_name) !== FALSE) ? $item = $item : $this->dbprefix.$item;
+ }
+
+ // This function may get "field >= 1", and need it to return ""field" >= 1"
+ $lbound = ($first_word_only === TRUE) ? '' : '|\s|\(';
+
+ $item = preg_replace('/(^'.$lbound.')([\w\d\-\_]+?)(\s|\)|$)/iS', '$1"$2"$3', $item);
+ }
+ else
+ {
+ return "\"{$item}\"";
}
+ $exceptions = array('AS', '/', '-', '%', '+', '*');
+
+ foreach ($exceptions as $exception)
+ {
+
+ if (stristr($item, " \"{$exception}\" ") !== FALSE)
+ {
+ $item = preg_replace('/ "('.preg_quote($exception).')" /i', ' $1 ', $item);
+ }
+ }
return $item;
}
|