From ba6f21caeb405c7e8512a09941fefbc97286e45f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 21 Nov 2012 19:52:03 +0100 Subject: Framework files moved to lib/Roundcube --- program/lib/Roundcube/rcube_db_mssql.php | 156 +++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 program/lib/Roundcube/rcube_db_mssql.php (limited to 'program/lib/Roundcube/rcube_db_mssql.php') diff --git a/program/lib/Roundcube/rcube_db_mssql.php b/program/lib/Roundcube/rcube_db_mssql.php new file mode 100644 index 000000000..c95663c74 --- /dev/null +++ b/program/lib/Roundcube/rcube_db_mssql.php @@ -0,0 +1,156 @@ + | + +-----------------------------------------------------------------------+ +*/ + + +/** + * Database independent query interface + * This is a wrapper for the PHP PDO + * + * @package Framework + * @subpackage Database + */ +class rcube_db_mssql extends rcube_db +{ + public $db_provider = 'mssql'; + + /** + * Driver initialization + */ + protected function init() + { + $this->options['identifier_start'] = '['; + $this->options['identifier_end'] = ']'; + } + + /** + * Character setting + */ + protected function set_charset($charset) + { + // UTF-8 is default + } + + /** + * Return SQL function for current time and date + * + * @return string SQL function to use in query + */ + public function now() + { + return "getdate()"; + } + + /** + * Return SQL statement to convert a field value into a unix timestamp + * + * This method is deprecated and should not be used anymore due to limitations + * of timestamp functions in Mysql (year 2038 problem) + * + * @param string $field Field name + * + * @return string SQL statement to use in query + * @deprecated + */ + public function unixtimestamp($field) + { + return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())"; + } + + /** + * Abstract SQL statement for value concatenation + * + * @return string SQL statement to be used in query + */ + public function concat(/* col1, col2, ... */) + { + $args = func_get_args(); + + if (is_array($args[0])) { + $args = $args[0]; + } + + return '(' . join('+', $args) . ')'; + } + + /** + * Adds TOP (LIMIT,OFFSET) clause to the query + * + * @param string $query SQL query + * @param int $limit Number of rows + * @param int $offset Offset + * + * @return string SQL query + */ + protected function set_limit($query, $limit = 0, $offset = 0) + { + $limit = intval($limit); + $offset = intval($offset); + + $orderby = stristr($query, 'ORDER BY'); + if ($orderby !== false) { + $sort = (stripos($orderby, ' desc') !== false) ? 'desc' : 'asc'; + $order = str_ireplace('ORDER BY', '', $orderby); + $order = trim(preg_replace('/\bASC\b|\bDESC\b/i', '', $order)); + } + + $query = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($limit + $offset) . ' ', $query); + + $query = 'SELECT * FROM (SELECT TOP ' . $limit . ' * FROM (' . $query . ') AS inner_tbl'; + if ($orderby !== false) { + $query .= ' ORDER BY ' . $order . ' '; + $query .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC'; + } + $query .= ') AS outer_tbl'; + if ($orderby !== false) { + $query .= ' ORDER BY ' . $order . ' ' . $sort; + } + + return $query; + } + + /** + * Returns PDO DSN string from DSN array + */ + protected function dsn_string($dsn) + { + $params = array(); + $result = $dsn['phptype'] . ':'; + + if ($dsn['hostspec']) { + $host = $dsn['hostspec']; + if ($dsn['port']) { + $host .= ',' . $dsn['port']; + } + $params[] = 'host=' . $host; + } + + if ($dsn['database']) { + $params[] = 'dbname=' . $dsn['database']; + } + + if (!empty($params)) { + $result .= implode(';', $params); + } + + return $result; + } +} -- cgit v1.2.3