| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- <?php
- /*
- @version v5.20.17 31-Mar-2020
- @copyright (c) 2000-2013 John Lim (jlim#natsoft.com). All rights reserved.
- @copyright (c) 2014 Damien Regad, Mark Newnham and the ADOdb community
- Released under both BSD license and Lesser GPL library license.
- Whenever there is any discrepancy between the two licenses,
- the BSD license will take precedence.
- Latest version is available at http://adodb.org/
- SQLite info: http://www.hwaci.com/sw/sqlite/
- Install Instructions:
- ====================
- 1. Place this in adodb/drivers
- 2. Rename the file, remove the .txt prefix.
- */
- // security - hide paths
- if (!defined('ADODB_DIR')) die();
- class ADODB_sqlite extends ADOConnection {
- var $databaseType = "sqlite";
- var $replaceQuote = "''"; // string to use to replace quotes
- var $concat_operator='||';
- var $_errorNo = 0;
- var $hasLimit = true;
- var $hasInsertID = true; /// supports autoincrement ID?
- var $hasAffectedRows = true; /// supports affected rows for update/delete?
- var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
- var $sysDate = "adodb_date('Y-m-d')";
- var $sysTimeStamp = "adodb_date('Y-m-d H:i:s')";
- var $fmtTimeStamp = "'Y-m-d H:i:s'";
- function __construct()
- {
- }
- function ServerInfo()
- {
- $arr['version'] = sqlite_libversion();
- $arr['description'] = 'SQLite ';
- $arr['encoding'] = sqlite_libencoding();
- return $arr;
- }
- function BeginTrans()
- {
- if ($this->transOff) {
- return true;
- }
- $ret = $this->Execute("BEGIN TRANSACTION");
- $this->transCnt += 1;
- return true;
- }
- function CommitTrans($ok=true)
- {
- if ($this->transOff) {
- return true;
- }
- if (!$ok) {
- return $this->RollbackTrans();
- }
- $ret = $this->Execute("COMMIT");
- if ($this->transCnt > 0) {
- $this->transCnt -= 1;
- }
- return !empty($ret);
- }
- function RollbackTrans()
- {
- if ($this->transOff) {
- return true;
- }
- $ret = $this->Execute("ROLLBACK");
- if ($this->transCnt > 0) {
- $this->transCnt -= 1;
- }
- return !empty($ret);
- }
- // mark newnham
- function MetaColumns($table, $normalize=true)
- {
- global $ADODB_FETCH_MODE;
- $false = false;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
- if ($this->fetchMode !== false) {
- $savem = $this->SetFetchMode(false);
- }
- $rs = $this->Execute("PRAGMA table_info('$table')");
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- }
- if (!$rs) {
- $ADODB_FETCH_MODE = $save;
- return $false;
- }
- $arr = array();
- while ($r = $rs->FetchRow()) {
- $type = explode('(',$r['type']);
- $size = '';
- if (sizeof($type)==2) {
- $size = trim($type[1],')');
- }
- $fn = strtoupper($r['name']);
- $fld = new ADOFieldObject;
- $fld->name = $r['name'];
- $fld->type = $type[0];
- $fld->max_length = $size;
- $fld->not_null = $r['notnull'];
- $fld->default_value = $r['dflt_value'];
- $fld->scale = 0;
- if (isset($r['pk']) && $r['pk']) {
- $fld->primary_key=1;
- }
- if ($save == ADODB_FETCH_NUM) {
- $arr[] = $fld;
- } else {
- $arr[strtoupper($fld->name)] = $fld;
- }
- }
- $rs->Close();
- $ADODB_FETCH_MODE = $save;
- return $arr;
- }
- function _init($parentDriver)
- {
- $parentDriver->hasTransactions = false;
- $parentDriver->hasInsertID = true;
- }
- function _insertid()
- {
- return sqlite_last_insert_rowid($this->_connectionID);
- }
- function _affectedrows()
- {
- return sqlite_changes($this->_connectionID);
- }
- function ErrorMsg()
- {
- if ($this->_logsql) {
- return $this->_errorMsg;
- }
- return ($this->_errorNo) ? sqlite_error_string($this->_errorNo) : '';
- }
- function ErrorNo()
- {
- return $this->_errorNo;
- }
- function SQLDate($fmt, $col=false)
- {
- $fmt = $this->qstr($fmt);
- return ($col) ? "adodb_date2($fmt,$col)" : "adodb_date($fmt)";
- }
- function _createFunctions()
- {
- @sqlite_create_function($this->_connectionID, 'adodb_date', 'adodb_date', 1);
- @sqlite_create_function($this->_connectionID, 'adodb_date2', 'adodb_date2', 2);
- }
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (!function_exists('sqlite_open')) {
- return null;
- }
- if (empty($argHostname) && $argDatabasename) {
- $argHostname = $argDatabasename;
- }
- $this->_connectionID = sqlite_open($argHostname);
- if ($this->_connectionID === false) {
- return false;
- }
- $this->_createFunctions();
- return true;
- }
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (!function_exists('sqlite_open')) {
- return null;
- }
- if (empty($argHostname) && $argDatabasename) {
- $argHostname = $argDatabasename;
- }
- $this->_connectionID = sqlite_popen($argHostname);
- if ($this->_connectionID === false) {
- return false;
- }
- $this->_createFunctions();
- return true;
- }
- // returns query ID if successful, otherwise false
- function _query($sql,$inputarr=false)
- {
- $rez = sqlite_query($sql,$this->_connectionID);
- if (!$rez) {
- $this->_errorNo = sqlite_last_error($this->_connectionID);
- }
- // If no data was returned, we don't need to create a real recordset
- // Note: this code is untested, as I don't have a sqlite2 setup available
- elseif (sqlite_num_fields($rez) == 0) {
- $rez = true;
- }
- return $rez;
- }
- function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
- {
- $nrows = (int) $nrows;
- $offset = (int) $offset;
- $offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
- $limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : '');
- if ($secs2cache) {
- $rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
- } else {
- $rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
- }
- return $rs;
- }
- /*
- This algorithm is not very efficient, but works even if table locking
- is not available.
- Will return false if unable to generate an ID after $MAXLOOPS attempts.
- */
- var $_genSeqSQL = "create table %s (id integer)";
- function GenID($seq='adodbseq',$start=1)
- {
- // if you have to modify the parameter below, your database is overloaded,
- // or you need to implement generation of id's yourself!
- $MAXLOOPS = 100;
- //$this->debug=1;
- while (--$MAXLOOPS>=0) {
- @($num = $this->GetOne("select id from $seq"));
- if ($num === false) {
- $this->Execute(sprintf($this->_genSeqSQL ,$seq));
- $start -= 1;
- $num = '0';
- $ok = $this->Execute("insert into $seq values($start)");
- if (!$ok) {
- return false;
- }
- }
- $this->Execute("update $seq set id=id+1 where id=$num");
- if ($this->affected_rows() > 0) {
- $num += 1;
- $this->genID = $num;
- return $num;
- }
- }
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
- }
- return false;
- }
- function CreateSequence($seqname='adodbseq',$start=1)
- {
- if (empty($this->_genSeqSQL)) {
- return false;
- }
- $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
- if (!$ok) {
- return false;
- }
- $start -= 1;
- return $this->Execute("insert into $seqname values($start)");
- }
- var $_dropSeqSQL = 'drop table %s';
- function DropSequence($seqname = 'adodbseq')
- {
- if (empty($this->_dropSeqSQL)) {
- return false;
- }
- return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
- }
- // returns true or false
- function _close()
- {
- return @sqlite_close($this->_connectionID);
- }
- function MetaIndexes($table, $primary = FALSE, $owner = false)
- {
- $false = false;
- // save old fetch mode
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->fetchMode !== FALSE) {
- $savem = $this->SetFetchMode(FALSE);
- }
- $SQL=sprintf("SELECT name,sql FROM sqlite_master WHERE type='index' AND tbl_name='%s'", strtolower($table));
- $rs = $this->Execute($SQL);
- if (!is_object($rs)) {
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- }
- $ADODB_FETCH_MODE = $save;
- return $false;
- }
- $indexes = array ();
- while ($row = $rs->FetchRow()) {
- if ($primary && preg_match("/primary/i",$row[1]) == 0) {
- continue;
- }
- if (!isset($indexes[$row[0]])) {
- $indexes[$row[0]] = array(
- 'unique' => preg_match("/unique/i",$row[1]),
- 'columns' => array()
- );
- }
- /**
- * There must be a more elegant way of doing this,
- * the index elements appear in the SQL statement
- * in cols[1] between parentheses
- * e.g CREATE UNIQUE INDEX ware_0 ON warehouse (org,warehouse)
- */
- $cols = explode("(",$row[1]);
- $cols = explode(")",$cols[1]);
- array_pop($cols);
- $indexes[$row[0]]['columns'] = $cols;
- }
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- }
- return $indexes;
- }
- }
- /*--------------------------------------------------------------------------------------
- Class Name: Recordset
- --------------------------------------------------------------------------------------*/
- class ADORecordset_sqlite extends ADORecordSet {
- var $databaseType = "sqlite";
- var $bind = false;
- function __construct($queryID,$mode=false)
- {
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- switch($mode) {
- case ADODB_FETCH_NUM:
- $this->fetchMode = SQLITE_NUM;
- break;
- case ADODB_FETCH_ASSOC:
- $this->fetchMode = SQLITE_ASSOC;
- break;
- default:
- $this->fetchMode = SQLITE_BOTH;
- break;
- }
- $this->adodbFetchMode = $mode;
- $this->_queryID = $queryID;
- $this->_inited = true;
- $this->fields = array();
- if ($queryID) {
- $this->_currentRow = 0;
- $this->EOF = !$this->_fetch();
- @$this->_initrs();
- } else {
- $this->_numOfRows = 0;
- $this->_numOfFields = 0;
- $this->EOF = true;
- }
- return $this->_queryID;
- }
- function FetchField($fieldOffset = -1)
- {
- $fld = new ADOFieldObject;
- $fld->name = sqlite_field_name($this->_queryID, $fieldOffset);
- $fld->type = 'VARCHAR';
- $fld->max_length = -1;
- return $fld;
- }
- function _initrs()
- {
- $this->_numOfRows = @sqlite_num_rows($this->_queryID);
- $this->_numOfFields = @sqlite_num_fields($this->_queryID);
- }
- function Fields($colname)
- {
- if ($this->fetchMode != SQLITE_NUM) {
- return $this->fields[$colname];
- }
- if (!$this->bind) {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- $this->bind[strtoupper($o->name)] = $i;
- }
- }
- return $this->fields[$this->bind[strtoupper($colname)]];
- }
- function _seek($row)
- {
- return sqlite_seek($this->_queryID, $row);
- }
- function _fetch($ignore_fields=false)
- {
- $this->fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
- return !empty($this->fields);
- }
- function _close()
- {
- }
- }
|