From 7452065de020048827ac44f489c03f693aaa7725 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Sun, 13 May 2007 18:32:03 +0000 Subject: [PATCH] * new MS SQL driver * removed constant DIBI --- dibi/#todo.txt | 6 +- dibi/dibi.php | 10 +- dibi/drivers/mssql.php | 255 +++++++++++++++++++++++++++++++++++++++ dibi/drivers/mysql.php | 2 +- dibi/drivers/mysqli.php | 2 +- dibi/drivers/odbc.php | 2 +- dibi/drivers/pdo.php | 2 +- dibi/drivers/postgre.php | 2 +- dibi/drivers/sqlite.php | 2 +- dibi/libs/driver.php | 2 +- dibi/libs/exception.php | 2 +- dibi/libs/resultset.php | 2 +- dibi/libs/translator.php | 2 +- examples/connect.php | 7 ++ version.txt | 2 +- 15 files changed, 281 insertions(+), 19 deletions(-) create mode 100644 dibi/drivers/mssql.php diff --git a/dibi/#todo.txt b/dibi/#todo.txt index 798feb5d..12cc0cb1 100644 --- a/dibi/#todo.txt +++ b/dibi/#todo.txt @@ -1,3 +1,3 @@ -- PDO driver (current PDO driver is alpha version) -- better examples -- documentation +- current PDO & MSSQL drivers are untested alphas! +- make better examples & documentation + diff --git a/dibi/dibi.php b/dibi/dibi.php index 05f9197f..6d7261a4 100644 --- a/dibi/dibi.php +++ b/dibi/dibi.php @@ -12,7 +12,7 @@ * @license GNU GENERAL PUBLIC LICENSE version 2 * @package dibi * @category Database - * @version 0.8b (Revision: $WCREV$, Date: $WCDATE$) + * @version 0.8c (Revision: $WCREV$, Date: $WCDATE$) */ @@ -26,9 +26,6 @@ */ -define('DIBI', '0.8b (Revision: $WCREV$, Date: $WCDATE$)'); - - if (version_compare(PHP_VERSION , '5.0.3', '<')) die('dibi needs PHP 5.0.3 or newer'); @@ -85,7 +82,10 @@ class dibi FIELD_UNKNOWN = '?', // special - FIELD_COUNTER = 'c'; // counter or autoincrement, is integer + FIELD_COUNTER = 'c', // counter or autoincrement, is integer + + // dibi version + VERSION = '0.8c (Revision: $WCREV$, Date: $WCDATE$)'; /** diff --git a/dibi/drivers/mssql.php b/dibi/drivers/mssql.php new file mode 100644 index 00000000..0f8385c4 --- /dev/null +++ b/dibi/drivers/mssql.php @@ -0,0 +1,255 @@ + + * + * @version $Revision: 43 $ $Date: 2007-05-12 00:25:32 +0200 (so, 12 V 2007) $ + * @package dibi + */ + + +// security - include dibi.php, not this file +if (!class_exists('dibi', FALSE)) die(); + + +/** + * The dibi driver for MS SQL database + * + */ +class DibiMSSqlDriver extends DibiDriver +{ + private + $affectedRows = FALSE; + + public + $formats = array( + 'TRUE' => "1", + 'FALSE' => "0", + 'date' => "'Y-m-d'", + 'datetime' => "'Y-m-d H:i:s'", + ); + + + /** + * @param array connect configuration + * @throw DibiException + */ + public function __construct($config) + { + if (!extension_loaded('mssql')) + throw new DibiException("PHP extension 'mssql' is not loaded"); + + if (!isset($config['host'])) $config['host'] = NULL; + if (!isset($config['username'])) $config['username'] = NULL; + if (!isset($config['password'])) $config['password'] = NULL; + + parent::__construct($config); + } + + + + protected function connect() + { + $config = $this->config; + + if (empty($config['persistent'])) + $conn = @mssql_connect($config['host'], $config['username'], $config['password'], TRUE); + else + $conn = @mssql_pconnect($config['host'], $config['username'], $config['password']); + + if (!is_resource($conn)) + throw new DibiException("Connecting error (driver mssql)'"); + + if (!empty($config['database'])) { + if (!@mssql_select_db($config['database'], $conn)) + throw new DibiException("Connecting error (driver mssql)"); + } + + return $conn; + } + + + + + public function nativeQuery($sql) + { + $this->affectedRows = FALSE; + $conn = $this->getResource(); + $res = @mssql_query($sql, $conn); + + if ($res === FALSE) return FALSE; + + $this->affectedRows = mssql_rows_affected($conn); + if ($this->affectedRows < 0) $this->affectedRows = FALSE; + + if (is_resource($res)) + return new DibiMSSqlResult($res); + + return TRUE; + } + + + public function affectedRows() + { + return $this->affectedRows; + } + + + public function insertId() + { + return FALSE; + } + + + public function begin() + { + return mssql_query('BEGIN TRANSACTION', $this->getResource()); + } + + + public function commit() + { + return mssql_query('COMMIT', $this->getResource()); + } + + + public function rollback() + { + return mssql_query('ROLLBACK', $this->getResource()); + } + + + public function errorInfo() + { + return FALSE; + } + + + public function escape($value, $appendQuotes=TRUE) + { + $value = str_replace("'", "''", $value); + return $appendQuotes + ? "'" . $value . "'" + : $value; + } + + + public function delimite($value) + { + return '[' . str_replace('.', '].[', $value) . ']'; + } + + + public function getMetaData() + { + trigger_error('Meta is not implemented yet.', E_USER_WARNING); + } + + + /** + * @see DibiDriver::applyLimit() + */ + public function applyLimit(&$sql, $limit, $offset = 0) + { + // offset suppot is missing... + if ($limit >= 0) + $sql = 'SELECT TOP ' . (int) $limit . ' * FROM (' . $sql . ')'; + + if ($offset) throw new DibiException('Offset is not implemented in driver odbc'); + } + + +} // DibiMSSqlDriver + + + + + + + + + +class DibiMSSqlResult extends DibiResult +{ + private $resource; + + + public function __construct($resource) + { + $this->resource = $resource; + } + + + public function rowCount() + { + return mssql_num_rows($this->resource); + } + + + protected function doFetch() + { + return mssql_fetch_assoc($this->resource); + } + + + public function seek($row) + { + return mssql_data_seek($this->resource, $row); + } + + + protected function free() + { + mssql_free_result($this->resource); + } + + + /** this is experimental */ + protected function buildMeta() + { + static $types = array( + 'CHAR' => dibi::FIELD_TEXT, + 'COUNTER' => dibi::FIELD_COUNTER, + 'VARCHAR' => dibi::FIELD_TEXT, + 'LONGCHAR' => dibi::FIELD_TEXT, + 'INTEGER' => dibi::FIELD_INTEGER, + 'DATETIME' => dibi::FIELD_DATETIME, + 'CURRENCY' => dibi::FIELD_FLOAT, + 'BIT' => dibi::FIELD_BOOL, + 'LONGBINARY'=> dibi::FIELD_BINARY, + 'SMALLINT' => dibi::FIELD_INTEGER, + 'BYTE' => dibi::FIELD_INTEGER, + 'BIGINT' => dibi::FIELD_INTEGER, + 'INT' => dibi::FIELD_INTEGER, + 'TINYINT' => dibi::FIELD_INTEGER, + 'REAL' => dibi::FIELD_FLOAT, + 'DOUBLE' => dibi::FIELD_FLOAT, + 'DECIMAL' => dibi::FIELD_FLOAT, + 'NUMERIC' => dibi::FIELD_FLOAT, + 'MONEY' => dibi::FIELD_FLOAT, + 'SMALLMONEY'=> dibi::FIELD_FLOAT, + 'FLOAT' => dibi::FIELD_FLOAT, + 'YESNO' => dibi::FIELD_BOOL, + // and many others? + ); + + $count = mssql_num_fields($this->resource); + $this->meta = $this->convert = array(); + for ($index = 0; $index < $count; $index++) { + + $tmp = mssql_fetch_field($this->resource, $index); + $type = strtoupper($tmp->type); + $info['native'] = $tmp->type; + $info['type'] = isset($types[$type]) ? $types[$type] : dibi::FIELD_UNKNOWN; + $info['length'] = $tmp->max_length; + $info['table'] = $tmp->column_source; + + $this->meta[$tmp->name] = $info; + $this->convert[$tmp->name] = $info['type']; + } + } + + +} // class DibiMSSqlResult diff --git a/dibi/drivers/mysql.php b/dibi/drivers/mysql.php index e2c06947..3f347371 100644 --- a/dibi/drivers/mysql.php +++ b/dibi/drivers/mysql.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/drivers/mysqli.php b/dibi/drivers/mysqli.php index db9cb118..c204cf63 100644 --- a/dibi/drivers/mysqli.php +++ b/dibi/drivers/mysqli.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/drivers/odbc.php b/dibi/drivers/odbc.php index cc301c8a..fb701b4e 100644 --- a/dibi/drivers/odbc.php +++ b/dibi/drivers/odbc.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/drivers/pdo.php b/dibi/drivers/pdo.php index c2100fd0..d3b53d10 100644 --- a/dibi/drivers/pdo.php +++ b/dibi/drivers/pdo.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/drivers/postgre.php b/dibi/drivers/postgre.php index e3e3663f..d4d7b431 100644 --- a/dibi/drivers/postgre.php +++ b/dibi/drivers/postgre.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/drivers/sqlite.php b/dibi/drivers/sqlite.php index 206c33fe..7dd0a136 100644 --- a/dibi/drivers/sqlite.php +++ b/dibi/drivers/sqlite.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); /** diff --git a/dibi/libs/driver.php b/dibi/libs/driver.php index 873ae4d5..01f96fcb 100644 --- a/dibi/libs/driver.php +++ b/dibi/libs/driver.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); diff --git a/dibi/libs/exception.php b/dibi/libs/exception.php index 598fca47..f70fe194 100644 --- a/dibi/libs/exception.php +++ b/dibi/libs/exception.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); diff --git a/dibi/libs/resultset.php b/dibi/libs/resultset.php index eb7fedf7..9087e28d 100644 --- a/dibi/libs/resultset.php +++ b/dibi/libs/resultset.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); diff --git a/dibi/libs/translator.php b/dibi/libs/translator.php index ac74982b..74fd4ac0 100644 --- a/dibi/libs/translator.php +++ b/dibi/libs/translator.php @@ -11,7 +11,7 @@ // security - include dibi.php, not this file -if (!defined('DIBI')) die(); +if (!class_exists('dibi', FALSE)) die(); diff --git a/examples/connect.php b/examples/connect.php index 23b4b303..60f5df6a 100644 --- a/examples/connect.php +++ b/examples/connect.php @@ -49,6 +49,13 @@ try { 'dsn' => 'sqlite2::memory:', )); + // connects to MS SQL + dibi::connect(array( + 'driver' => 'mssql', + 'host' => 'localhost', + 'username' => 'root', + 'password' => 'xxx', + )); } catch (DibiException $e) { diff --git a/version.txt b/version.txt index b127ab75..3a6205a2 100644 --- a/version.txt +++ b/version.txt @@ -1,4 +1,4 @@ -Dibi version 0.8b +Dibi version 0.8c Revision: $WCREV$ Date: $WCDATE$