diff --git a/examples/connecting-to-databases.php b/examples/connecting-to-databases.php index a30f14c2..62f6b79f 100644 --- a/examples/connecting-to-databases.php +++ b/examples/connecting-to-databases.php @@ -103,7 +103,7 @@ echo '

Connecting to Sqlite via PDO: '; try { dibi::connect(array( 'driver' => 'pdo', - 'dsn' => 'sqlite2::memory:', + 'dsn' => 'sqlite::memory:', )); echo 'OK'; } catch (DibiException $e) { diff --git a/src/Dibi/Bridges/Nette/DibiExtension21.php b/src/Dibi/Bridges/Nette/DibiExtension21.php index 8a0eefa0..979b4d91 100644 --- a/src/Dibi/Bridges/Nette/DibiExtension21.php +++ b/src/Dibi/Bridges/Nette/DibiExtension21.php @@ -10,7 +10,6 @@ * Dibi extension for Nette Framework 2.1. Creates 'connection' service. * * @package dibi\nette - * @phpversion 5.3 */ class DibiNette21Extension extends Nette\DI\CompilerExtension { diff --git a/src/Dibi/DateTime.php b/src/Dibi/DateTime.php index 3f2f7ec1..506dfde3 100644 --- a/src/Dibi/DateTime.php +++ b/src/Dibi/DateTime.php @@ -7,7 +7,7 @@ /** - * DateTime with serialization and timestamp support for PHP 5.2. + * DateTime. * * @package dibi */ @@ -34,19 +34,11 @@ class DibiDateTime extends DateTime } - public function modify($modify) - { - parent::modify($modify); - return $this; - } - - public function setTimestamp($timestamp) { - $zone = PHP_VERSION_ID === 50206 ? new DateTimeZone($this->getTimezone()->getName()) : $this->getTimezone(); + $zone = $this->getTimezone(); $this->__construct('@' . $timestamp); - $this->setTimeZone($zone); - return $this; + return $this->setTimeZone($zone); } @@ -62,27 +54,4 @@ class DibiDateTime extends DateTime return $this->format('Y-m-d H:i:s'); } - - public function __sleep() - { - $zone = $this->getTimezone()->getName(); - if ($zone[0] === '+') { - $this->fix = array($this->format('Y-m-d H:i:sP')); - } else { - $this->fix = array($this->format('Y-m-d H:i:s'), $zone); } - return array('fix'); - } - - - public function __wakeup() - { - if (isset($this->fix[1])) { - $this->__construct($this->fix[0], new DateTimeZone($this->fix[1])); - } else { - $this->__construct($this->fix[0]); - } - unset($this->fix); - } - -} diff --git a/src/Dibi/Drivers/MySqlDriver.php b/src/Dibi/Drivers/MySqlDriver.php index 7564d204..062e9505 100644 --- a/src/Dibi/Drivers/MySqlDriver.php +++ b/src/Dibi/Drivers/MySqlDriver.php @@ -109,12 +109,7 @@ class DibiMySqlDriver extends DibiObject implements IDibiDriver, IDibiResultDriv } if (isset($config['charset'])) { - $ok = FALSE; - if (function_exists('mysql_set_charset')) { - // affects the character set used by mysql_real_escape_string() (was added in MySQL 5.0.7 and PHP 5.2.3) - $ok = @mysql_set_charset($config['charset'], $this->connection); // intentionally @ - } - if (!$ok) { + if (!@mysql_set_charset($config['charset'], $this->connection)) { // intentionally @ $this->query("SET NAMES '$config[charset]'"); } } diff --git a/src/Dibi/Drivers/PdoDriver.php b/src/Dibi/Drivers/PdoDriver.php index ce0d5522..88d25e15 100644 --- a/src/Dibi/Drivers/PdoDriver.php +++ b/src/Dibi/Drivers/PdoDriver.php @@ -215,7 +215,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver return new DibiMySqlReflector($this); case 'sqlite': - case 'sqlite2': return new DibiSqliteReflector($this); default: @@ -276,7 +275,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver return '"' . str_replace('"', '""', $value) . '"'; case 'sqlite': - case 'sqlite2': return '[' . strtr($value, '[]', ' ') . ']'; case 'odbc': @@ -346,7 +344,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'"); case 'sqlite': - case 'sqlite2': $value = addcslashes(substr($this->connection->quote($value, PDO::PARAM_STR), 1, -1), '%_\\'); return ($pos <= 0 ? "'%" : "'") . $value . ($pos >= 0 ? "%'" : "'") . " ESCAPE '\\'"; @@ -407,7 +404,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver break; case 'sqlite': - case 'sqlite2': $sql .= ' LIMIT ' . $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : ''); break; @@ -505,8 +501,6 @@ class DibiPdoDriver extends DibiObject implements IDibiDriver, IDibiResultDriver if ($row === FALSE) { throw new DibiNotSupportedException('Driver does not support meta data.'); } - // PHP < 5.2.3 compatibility - // @see: http://php.net/manual/en/pdostatement.getcolumnmeta.php#pdostatement.getcolumnmeta.changelog $row = $row + array( 'table' => NULL, 'native_type' => 'VAR_STRING', diff --git a/src/Dibi/Drivers/SqliteDriver.php b/src/Dibi/Drivers/SqliteDriver.php deleted file mode 100644 index 321f8eff..00000000 --- a/src/Dibi/Drivers/SqliteDriver.php +++ /dev/null @@ -1,426 +0,0 @@ - the filename of the SQLite database - * - persistent (bool) => try to find a persistent link? - * - unbuffered (bool) => sends query without fetching and buffering the result rows automatically? - * - formatDate => how to format date in SQL (@see date) - * - formatDateTime => how to format datetime in SQL (@see date) - * - dbcharset => database character encoding (will be converted to 'charset') - * - charset => character encoding to set (default is UTF-8) - * - resource (resource) => existing connection resource - * - lazy, profiler, result, substitutes, ... => see DibiConnection options - * - * @author David Grudl - * @package dibi\drivers - */ -class DibiSqliteDriver extends DibiObject implements IDibiDriver, IDibiResultDriver -{ - /** @var resource Connection resource */ - private $connection; - - /** @var resource Resultset resource */ - private $resultSet; - - /** @var bool Is buffered (seekable and countable)? */ - private $buffered; - - /** @var string Date and datetime format */ - private $fmtDate, $fmtDateTime; - - /** @var string character encoding */ - private $dbcharset, $charset; - - - /** - * @throws DibiNotSupportedException - */ - public function __construct() - { - if (!extension_loaded('sqlite')) { - throw new DibiNotSupportedException("PHP extension 'sqlite' is not loaded."); - } - } - - - /** - * Connects to a database. - * @return void - * @throws DibiException - */ - public function connect(array & $config) - { - DibiConnection::alias($config, 'database', 'file'); - $this->fmtDate = isset($config['formatDate']) ? $config['formatDate'] : 'U'; - $this->fmtDateTime = isset($config['formatDateTime']) ? $config['formatDateTime'] : 'U'; - - $errorMsg = ''; - if (isset($config['resource'])) { - $this->connection = $config['resource']; - } elseif (empty($config['persistent'])) { - $this->connection = @sqlite_open($config['database'], 0666, $errorMsg); // intentionally @ - } else { - $this->connection = @sqlite_popen($config['database'], 0666, $errorMsg); // intentionally @ - } - - if (!$this->connection) { - throw new DibiDriverException($errorMsg); - } - - $this->buffered = empty($config['unbuffered']); - - $this->dbcharset = empty($config['dbcharset']) ? 'UTF-8' : $config['dbcharset']; - $this->charset = empty($config['charset']) ? 'UTF-8' : $config['charset']; - if (strcasecmp($this->dbcharset, $this->charset) === 0) { - $this->dbcharset = $this->charset = NULL; - } - } - - - /** - * Disconnects from a database. - * @return void - */ - public function disconnect() - { - sqlite_close($this->connection); - } - - - /** - * Executes the SQL query. - * @param string SQL statement. - * @return IDibiResultDriver|NULL - * @throws DibiDriverException - */ - public function query($sql) - { - if ($this->dbcharset !== NULL) { - $sql = iconv($this->charset, $this->dbcharset . '//IGNORE', $sql); - } - - DibiDriverException::tryError(); - if ($this->buffered) { - $res = sqlite_query($this->connection, $sql); - } else { - $res = sqlite_unbuffered_query($this->connection, $sql); - } - if (DibiDriverException::catchError($msg)) { - throw new DibiDriverException($msg, sqlite_last_error($this->connection), $sql); - - } elseif (is_resource($res)) { - return $this->createResultDriver($res); - } - } - - - /** - * Gets the number of affected rows by the last INSERT, UPDATE or DELETE query. - * @return int|FALSE number of rows or FALSE on error - */ - public function getAffectedRows() - { - return sqlite_changes($this->connection); - } - - - /** - * Retrieves the ID generated for an AUTO_INCREMENT column by the previous INSERT query. - * @return int|FALSE int on success or FALSE on failure - */ - public function getInsertId($sequence) - { - return sqlite_last_insert_rowid($this->connection); - } - - - /** - * Begins a transaction (if supported). - * @param string optional savepoint name - * @return void - * @throws DibiDriverException - */ - public function begin($savepoint = NULL) - { - $this->query('BEGIN'); - } - - - /** - * Commits statements in a transaction. - * @param string optional savepoint name - * @return void - * @throws DibiDriverException - */ - public function commit($savepoint = NULL) - { - $this->query('COMMIT'); - } - - - /** - * Rollback changes in a transaction. - * @param string optional savepoint name - * @return void - * @throws DibiDriverException - */ - public function rollback($savepoint = NULL) - { - $this->query('ROLLBACK'); - } - - - /** - * Returns the connection resource. - * @return mixed - */ - public function getResource() - { - return is_resource($this->connection) ? $this->connection : NULL; - } - - - /** - * Returns the connection reflector. - * @return IDibiReflector - */ - public function getReflector() - { - return new DibiSqliteReflector($this); - } - - - /** - * Result set driver factory. - * @param resource - * @return IDibiResultDriver - */ - public function createResultDriver($resource) - { - $res = clone $this; - $res->resultSet = $resource; - return $res; - } - - - /********************* SQL ****************d*g**/ - - - /** - * Encodes data for use in a SQL statement. - * @param mixed value - * @param string type (dibi::TEXT, dibi::BOOL, ...) - * @return string encoded value - * @throws InvalidArgumentException - */ - public function escape($value, $type) - { - switch ($type) { - case dibi::TEXT: - case dibi::BINARY: - return "'" . sqlite_escape_string($value) . "'"; - - case dibi::IDENTIFIER: - return '[' . strtr($value, '[]', ' ') . ']'; - - case dibi::BOOL: - return $value ? 1 : 0; - - case dibi::DATE: - case dibi::DATETIME: - if (!$value instanceof DateTime && !$value instanceof DateTimeInterface) { - $value = new DibiDateTime($value); - } - return $value->format($type === dibi::DATETIME ? $this->fmtDateTime : $this->fmtDate); - - default: - throw new InvalidArgumentException('Unsupported type.'); - } - } - - - /** - * Encodes string for use in a LIKE statement. - * @param string - * @param int - * @return string - */ - public function escapeLike($value, $pos) - { - throw new DibiNotSupportedException; - } - - - /** - * Decodes data from result set. - * @param string value - * @param string type (dibi::BINARY) - * @return string decoded value - * @throws InvalidArgumentException - */ - public function unescape($value, $type) - { - if ($type === dibi::BINARY) { - return $value; - } - throw new InvalidArgumentException('Unsupported type.'); - } - - - /** @deprecated */ - public function escape($value, $type) - { - return DibiHelpers::escape($this, $value, $type); - } - - - /** - * Injects LIMIT/OFFSET to the SQL query. - * @return void - */ - public function applyLimit(& $sql, $limit, $offset) - { - if ($limit >= 0 || $offset > 0) { - $sql .= ' LIMIT ' . (int) $limit . ($offset > 0 ? ' OFFSET ' . (int) $offset : ''); - } - } - - - /********************* result set ****************d*g**/ - - - /** - * Returns the number of rows in a result set. - * @return int - */ - public function getRowCount() - { - if (!$this->buffered) { - throw new DibiNotSupportedException('Row count is not available for unbuffered queries.'); - } - return sqlite_num_rows($this->resultSet); - } - - - /** - * Fetches the row at current position and moves the internal cursor to the next position. - * @param bool TRUE for associative array, FALSE for numeric - * @return array array on success, nonarray if no next record - */ - public function fetch($assoc) - { - $row = sqlite_fetch_array($this->resultSet, $assoc ? SQLITE_ASSOC : SQLITE_NUM); - $charset = $this->charset === NULL ? NULL : $this->charset . '//TRANSLIT'; - if ($row && ($assoc || $charset)) { - $tmp = array(); - foreach ($row as $k => $v) { - if ($charset !== NULL && is_string($v)) { - $v = iconv($this->dbcharset, $charset, $v); - } - $tmp[str_replace(array('[', ']'), '', $k)] = $v; - } - return $tmp; - } - return $row; - } - - - /** - * Moves cursor position without fetching row. - * @param int the 0-based cursor pos to seek to - * @return bool TRUE on success, FALSE if unable to seek to specified record - * @throws DibiException - */ - public function seek($row) - { - if (!$this->buffered) { - throw new DibiNotSupportedException('Cannot seek an unbuffered result set.'); - } - return sqlite_seek($this->resultSet, $row); - } - - - /** - * Frees the resources allocated for this result set. - * @return void - */ - public function free() - { - $this->resultSet = NULL; - } - - - /** - * Returns metadata for all columns in a result set. - * @return array - */ - public function getResultColumns() - { - $count = sqlite_num_fields($this->resultSet); - $columns = array(); - for ($i = 0; $i < $count; $i++) { - $name = str_replace(array('[', ']'), '', sqlite_field_name($this->resultSet, $i)); - $pair = explode('.', $name); - $columns[] = array( - 'name' => isset($pair[1]) ? $pair[1] : $pair[0], - 'table' => isset($pair[1]) ? $pair[0] : NULL, - 'fullname' => $name, - 'nativetype' => NULL, - ); - } - return $columns; - } - - - /** - * Returns the result set resource. - * @return mixed - */ - public function getResultResource() - { - return is_resource($this->resultSet) ? $this->resultSet : NULL; - } - - - /********************* user defined functions ****************d*g**/ - - - /** - * Registers an user defined function for use in SQL statements. - * @param string function name - * @param mixed callback - * @param int num of arguments - * @return void - */ - public function registerFunction($name, $callback, $numArgs = -1) - { - sqlite_create_function($this->connection, $name, $callback, $numArgs); - } - - - /** - * Registers an aggregating user defined function for use in SQL statements. - * @param string function name - * @param mixed callback called for each row of the result set - * @param mixed callback called to aggregate the "stepped" data from each row - * @param int num of arguments - * @return void - */ - public function registerAggregateFunction($name, $rowCallback, $agrCallback, $numArgs = -1) - { - sqlite_create_aggregate($this->connection, $name, $rowCallback, $agrCallback, $numArgs); - } - -} diff --git a/src/Dibi/Drivers/SqliteReflector.php b/src/Dibi/Drivers/SqliteReflector.php index cc86ed10..b6461b21 100644 --- a/src/Dibi/Drivers/SqliteReflector.php +++ b/src/Dibi/Drivers/SqliteReflector.php @@ -136,9 +136,6 @@ class DibiSqliteReflector extends DibiObject implements IDibiReflector */ public function getForeignKeys($table) { - if (!($this->driver instanceof DibiSqlite3Driver)) { - // throw new DibiNotSupportedException; // @see http://www.sqlite.org/foreignkeys.html - } $res = $this->driver->query("PRAGMA foreign_key_list({$this->driver->escapeIdentifier($table)})"); $keys = array(); while ($row = $res->fetch(TRUE)) { diff --git a/tests/databases.sample.ini b/tests/databases.sample.ini index d4e11f63..fd155ee2 100644 --- a/tests/databases.sample.ini +++ b/tests/databases.sample.ini @@ -14,11 +14,6 @@ password = charset = utf8 system = mysql -[sqlite2] -driver = sqlite -database = :memory: -system = sqlite - [sqlite3] ; default driver = sqlite3 database = :memory: