📄 sqlite.php
字号:
<?php/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2004 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available at through the world-wide-web at |// | http://www.php.net/license/2_02.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Authors: Urs Gehrig <urs@circle.ch> |// | Mika Tuupola <tuupola@appelsiini.net> |// | Maintainer: Daniel Convissor <danielc@php.net> |// +----------------------------------------------------------------------+//// $Id: sqlite.php,v 1.2 2005/07/22 05:10:14 max Exp $require_once PEAR_DIR . 'DB/common.php';/** * Database independent query interface definition for the SQLite * PECL extension. * * @package DB * @version $Id: sqlite.php,v 1.2 2005/07/22 05:10:14 max Exp $ * @category Database * @author Urs Gehrig <urs@circle.ch> * @author Mika Tuupola <tuupola@appelsiini.net> */class DB_sqlite extends DB_common{ // {{{ properties var $connection; var $phptype, $dbsyntax; var $prepare_tokens = array(); var $prepare_types = array(); var $_lasterror = ''; // }}} // {{{ constructor /** * Constructor for this class. * * Error codes according to sqlite_exec. Error Codes specification is * in the {@link http://sqlite.org/c_interface.html online manual}. * * This errorhandling based on sqlite_exec is not yet implemented. * * @access public */ function DB_sqlite() { $this->DB_common(); $this->phptype = 'sqlite'; $this->dbsyntax = 'sqlite'; $this->features = array ( 'prepare' => false, 'pconnect' => true, 'transactions' => false, 'limit' => 'alter' ); // SQLite data types, http://www.sqlite.org/datatypes.html $this->keywords = array ( 'BLOB' => '', 'BOOLEAN' => '', 'CHARACTER' => '', 'CLOB' => '', 'FLOAT' => '', 'INTEGER' => '', 'KEY' => '', 'NATIONAL' => '', 'NUMERIC' => '', 'NVARCHAR' => '', 'PRIMARY' => '', 'TEXT' => '', 'TIMESTAMP' => '', 'UNIQUE' => '', 'VARCHAR' => '', 'VARYING' => '' ); $this->errorcode_map = array( ); } // }}} // {{{ connect() /** * Connect to a database represented by a file. * * @param $dsn the data source name; the file is taken as * database; "sqlite://root:@host/test.db?mode=0644" * @param $persistent (optional) whether the connection should * be persistent * @access public * @return int DB_OK on success, a DB error on failure */ function connect($dsninfo, $persistent = false) { if (!DB::assertExtension('sqlite')) { return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); } $this->dsn = $dsninfo; if ($dsninfo['database']) { if (!file_exists($dsninfo['database'])) { if (!touch($dsninfo['database'])) { return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); } if (!isset($dsninfo['mode']) || !is_numeric($dsninfo['mode'])) { $mode = 0644; } else { $mode = octdec($dsninfo['mode']); } if (!chmod($dsninfo['database'], $mode)) { return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); } if (!file_exists($dsninfo['database'])) { return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); } } if (!is_file($dsninfo['database'])) { return $this->sqliteRaiseError(DB_ERROR_INVALID); } if (!is_readable($dsninfo['database'])) { return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); } } else { return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); } $connect_function = $persistent ? 'sqlite_popen' : 'sqlite_open'; if (!($conn = @$connect_function($dsninfo['database']))) { return $this->sqliteRaiseError(DB_ERROR_NODBSELECTED); } $this->connection = $conn; return DB_OK; } // }}} // {{{ disconnect() /** * Log out and disconnect from the database. * * @access public * @return bool true on success, false if not connected. * @todo fix return values */ function disconnect() { $ret = @sqlite_close($this->connection); $this->connection = null; return $ret; } // }}} // {{{ simpleQuery() /** * Send a query to SQLite and returns the results as a SQLite resource * identifier. * * @param the SQL query * @access public * @return mixed returns a valid SQLite result for successful SELECT * queries, DB_OK for other successful queries. A DB error is * returned on failure. */ function simpleQuery($query) { $ismanip = DB::isManip($query); $this->last_query = $query; $query = $this->_modifyQuery($query);// ini_set('track_errors', true); $result = @sqlite_query($query, $this->connection); ini_restore('track_errors'); $this->_lasterror = isset($php_errormsg) ? $php_errormsg : ''; $this->result = $result; if (!$this->result) { return $this->sqliteRaiseError(null); } /* sqlite_query() seems to allways return a resource */ /* so cant use that. Using $ismanip instead */ if (!$ismanip) { $numRows = $this->numRows($result); /* if numRows() returned PEAR_Error */ if (is_object($numRows)) { return $numRows; } return $result; } return DB_OK; } // }}} // {{{ nextResult() /** * Move the internal sqlite result pointer to the next available result. * * @param a valid sqlite result resource * @access public * @return true if a result is available otherwise return false */ function nextResult($result) { return false; } // }}} // {{{ fetchInto() /** * Fetch a row and insert the data into an existing array. * * Formating of the array and the data therein are configurable. * See DB_result::fetchInto() for more information. * * @param resource $result query result identifier * @param array $arr (reference) array where data from the row * should be placed * @param int $fetchmode how the resulting array should be indexed * @param int $rownum the row number to fetch * * @return mixed DB_OK on success, null when end of result set is * reached or on failure * * @see DB_result::fetchInto() * @access private */ function fetchInto($result, &$arr, $fetchmode, $rownum=null) { if ($rownum !== null) { if (!@sqlite_seek($this->result, $rownum)) { return null; } } if ($fetchmode & DB_FETCHMODE_ASSOC) { $arr = @sqlite_fetch_array($result, SQLITE_ASSOC); if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { $arr = array_change_key_case($arr, CASE_LOWER); } } else { $arr = @sqlite_fetch_array($result, SQLITE_NUM); } if (!$arr) { /* See: http://bugs.php.net/bug.php?id=22328 */ return null; } if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { /* * Even though this DBMS already trims output, we do this because * a field might have intentional whitespace at the end that * gets removed by DB_PORTABILITY_RTRIM under another driver. */ $this->_rtrimArrayValues($arr); } if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { $this->_convertNullArrayValuesToEmpty($arr); } return DB_OK; } // }}} // {{{ freeResult() /** * Free the internal resources associated with $result. * * @param $result SQLite result identifier * @access public * @return bool true on success, false if $result is invalid */ function freeResult(&$result) { // XXX No native free? if (!is_resource($result)) { return false; } $result = null; return true; } // }}} // {{{ numCols() /** * Gets the number of columns in a result set. * * @return number of columns in a result set */ function numCols($result) { $cols = @sqlite_num_fields($result); if (!$cols) { return $this->sqliteRaiseError(); } return $cols; } // }}} // {{{ numRows() /** * Gets the number of rows affected by a query. * * @return number of rows affected by the last query */ function numRows($result) { $rows = @sqlite_num_rows($result); if (!is_integer($rows)) { return $this->raiseError(); } return $rows; } // }}} // {{{ affected() /** * Gets the number of rows affected by a query. * * @return number of rows affected by the last query */ function affectedRows() { return @sqlite_changes($this->connection); } // }}} // {{{ errorNative()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -