File: /home/emblazeone/www/_backups/sql.php
<?
define('_tseDB_NUM',1); // Result type
define('_tseDB_ASSOC',2); // Result type
define('_tseDB_BOTH',3); // Result type
// For query_val, what kind of value to return:
define('_tseAuto',0); // Single value if 1 column in 1 row returned from a query;
// fetch_array (assoc) if several columns returned from a query;
define('_tseSingle',1); // Single value always
define('_tseRow',2); // Row
define('_tseRows',3); // Rows
define('_tseList',4); // List
define('_tseFlags',5); // Flags
class tseSQLResult {
var $sql; // Link to parent SQL object
var $dbtype;
var $result; // Result handle
var $num_rows;
var $total_rows; // Total rows found
var $affected_rows;
function tseSQLResult(&$sql,$result) {
$this->sql=&$sql;
$this->dbtype=&$this->sql->dbtype;
$this->result=$result;
$this->num_rows = $sql->num_rows; // Number of rows in result
$this->affected_rows = $sql->affected_rows; // Number of rows affected
$this->total_rows = $sql->total_rows; //
}
function found_rows() {
switch ($this->dbtype) {
case 1: // MySQL
$res = mysqli_query('SELECT FOUND_ROWS()',$this->sql->handle);
list($total) = mysqli_fetch_row($res);
return $total;
break;
case 2: // On PostgreSQL it is not implemented
default:
return false;
}
}
function insert_id() {return $this->last_id();}
function last_id() {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_insert_id($this->sql->handle);
break;
case 2: // PostgreSQL
return pg_last_oid($this->result);
break;
default:
return false;
}
} // insert_id or last_oid
function fetch_array($result_type = _tseDB_ASSOC, $row = 0) {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_fetch_array($this->result,$this->sql->restypetrans[$result_type]);
break;
case 2: // PostgreSQL
return pg_fetch_array($this->result,$row,$this->sql->restypetrans[$result_type]);
break;
default:
echo $this->dbtype;
return false;
}
}
function fetch_row($row = 0) {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_fetch_row($this->result);
break;
case 2: // PostgreSQL
return pg_fetch_row($this->result,$row);
break;
default:
return false;
}
}
// Returns a recordset. Records array keys can be set to values of a field, specified in $key
function fetch_rows($key='') {
while($row = $this->fetch_array()) { if ($key) $rows[$row[$key]]=$row; else $rows[]=$row;}
return (is_array($rows)?$rows:false);
}
function fetch_list($key='',$field='') {
// If you set $key, the value of the field '$key' will be used as key for the returning array
// else, the first column in the row will be used as key, if there are 2+ columns in result row
// if result has only one column, returning array will be indexed in order of result
// If you set $field, the value of the field '$field' will be used as value for the returning erray
// else the second column will be used if 2+ columns is in result
// if result has only one column, it will be used for values
// Examples:
// SELECT id,name FROM table --> $list[$id]=$name
// SELECT name FROM table --> $list[]=$name
// SELECT id,name,email FROM table --> $list[$name]=$email (if fetch_list('name','email') was called)
while($row = $this->fetch_array(_tseDB_BOTH)) {
if (count($row)<2) $list[]=$row[0];
else $list[$row[$key?$key:0]] = $row[$field?$field:1];
}
return (is_array($list)?$list:false);
}
function fetch_flags($key='',$field='') {
$list = $this->fetch_list($key,$field);
if ($list) {
foreach ($list as $k=>$v) $flags[pow(2,$k-1)]=$v;
return $flags;
} else return false;
}
function seek($offset) {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_data_seek($this->result,$offset);
break;
case 2: // PostgreSQL
return pg_result_seek($this->result,$offset);
break;
default:
return false;
}
}
function num_fields() {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_num_fields($this->result);
break;
case 2: // PostgreSQL
return pg_num_fields($this->result);
break;
default:
return false;
}
} // num_fields
function field_len($field_offset) {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_field_len($this->result,$field_offset);
break;
case 2: // PostgreSQL
return pg_field_size($this->result,$field_offset);
break;
default:
return false;
}
} // field_len
function field_name($field_offset) {
switch($this->dbtype) {
case 1: // MySQL
return mysqli_field_name($this->result,$field_offset);
break;
case 2: // PostgreSQL
return pg_field_name($this->result,$field_offset);
break;
default:
return false;
}
} // field_name
function fetch_result() { }
function free() { }
}
class tseSQLClass {
var $dbname;
var $dbtype = 0; // Database type
var $handle = 0; // Connection handle
var $sql; // Alias for $handle
var $result = 0; // Current SQL result var
var $res; // Alias for $result
var $error = ''; // Error string
var $errno = 0; // Error number
var $num_rows = null; // Number of rows in result
var $affected_rows = null; // Number of rows affected
var $total_rows = null; //
var $queryStr = ''; // Current query string
var $pf = ''; // Tables prefix
var $locks = array(); // Logical Locks acquired
var $permanent; // If true, means that connection used is permanent
var $queriesCounter = 0; // Counts queries performed during the session
var $connected = false; // Connected flag, to free itself before reconnecting
var $inTransaction = false; // During transaction (if you manipulate it using ->begin, ->commit, ->rollback - you can know it by this flag
var $restypetrans; // Result Type Translator array
function tseSQLClass($dsn='',$pcon=false) {
$this->resobj = new tseSQLResult($this,0);
$this->result = &$this->resobj->result;
$this->res = &$this->resobj->result;
$this->sql = &$this->handle;
if($dsn) $this->connect($dsn,$pcon);
}
function pconnect($dsn) {
return connect($dsn,true);
}
function connect($dsn,$pcon=false) { //$host='',$port='',$dbname='',$user='',$pass='') {
extract(parse_url($dsn));
$dbname = substr($path,1);
$this->dbname=$dbname;
$dbtype = &$scheme;
$this->permanent = $pcon;
switch ($dbtype) {
case 'mysql':
$dbtype = 1;
$this->restypetrans = array(_tseDB_NUM=>mysqli_NUM,_tseDB_ASSOC=>MYSQLI_ASSOC,_tseDB_BOTH=>MYSQLI_BOTH);
break;
case 'pgsql':
$dbtype = 2;
$this->restypetrans = array(_tseDB_NUM=>PGSQL_NUM,_tseDB_ASSOC=>PGSQL_ASSOC,_tseDB_BOTH=>PGSQL_BOTH);
break;
case 'mssql': $dbtype = 3; break;
case 'oracle': $dbtype = 4; break;
default: break;
}
switch ($dbtype) {
case 1: // MySQL
if ($host{0}=='|') { $port = ':'.str_replace('|','/',$host); $host = 'localhost'; }
else {
if ($host=='') $host = "localhost";
if ($port!='') $port = ":$port";
}
$this->close();
$fconnect = $pcon?'mysqli_pconnect':'mysqli_connect';
$this->handle = $fconnect("$host$port",$user,$pass);
if ($this->handle) {
$this->dbtype = $dbtype;
$this->error = 0;
$this->errno = '';
if ($dbname!='') {
if (!mysqli_select_db($this->handle,$dbname)) {
$this->error = mysqli_error($this->handle);
$this->errno = mysqli_errno($this->handle);
return false;
}
}
$this->connected = true;
} else {
$this->error = mysqli_error($this->handle);
$this->errno = mysqli_errno($this->handle);
}
$this->queryStr = '';
$this->num_rows = 0;
$this->affected_rows = 0;
return $this->handle;
break;
case 2: // PostgreSQL
$this->close();
$fconnect = $pcon?'pg_pconnect':'pg_connect';
$this->handle = $fconnect(
((!empty($host))?"host=$host ":'').
((!empty($port))?"port=$port ":'').
((!empty($dbname))?"dbname=$dbname ":'').
((!empty($user))?"user=$user ":'').
((!empty($password))?"password=$password ":'')
);
$this->dbtype = 0;
$this->error = 0;
$this->errno = '';
$this->queryStr = '';
$this->num_rows = 0;
$this->affected_rows = 0;
if ($this->handle) $this->connected = true;
return ($this->handle);
break;
default:
return false;
}
}
function close() {
switch ($this->dbtype) {
case 1: // MySQL
if ($this->result) mysqli_free_result($this->result);
if ($this->handle) mysqli_close($this->handle);
$this->result = 0;
$this->handle = 0;
$this->connected = false;
break;
case 2: // PostgreSQL
if ($this->result) pg_free_result($this->result);
if ($this->handle) pg_close($this->handle);
$this->result = 0;
$this->handle = 0;
$this->connected = false;
break;
default:
return false;
}
return true;
}
function begin() {
switch ($this->dbtype) {
case 1: // MySQL
$this->result = mysqli_query('SET AUTOCOMMIT = 0',$this->handle);
$this->inTransaction = true;
return $this->result;
break;
case 2: // PostgreSQL
$this->result = pg_query($this->handle,'BEGIN WORK');
$this->inTransaction = true;
return $this->result;
break;
default:
return false;
}
}
function commit() {
switch ($this->dbtype) {
case 1: // MySQL
$this->result = mysqli_query('COMMIT',$this->handle);
$this->inTransaction = false;
return $this->result;
break;
case 2: // PostgreSQL
$this->result = pg_query($this->handle,'COMMIT');
$this->inTransaction = false;
return $this->result;
break;
default:
return false;
}
}
function rollback() {
switch ($this->dbtype) {
case 1: // MySQL
$this->result = mysqli_query('ROLLBACK',$this->handle);
$this->inTransaction = false;
return $this->result;
break;
case 2: // PostgreSQL
$this->result = pg_query($this->handle,'ROLLBACK');
$this->inTransaction = false;
return $this->result;
break;
default:
return false;
}
}
function lock($name='',$timeout=5) { // MySQL ONLY logical locks
switch ($this->dbtype) {
case 1: // MySQL
if (!$name) $name='tselock_'+count($this->locks);
$res = mysqli_query("SELECT GET_LOCK('$name',$timeout)",$this->handle);
list($locked) = mysqli_fetch_row($res);
if($locked) array_push($this->locks,"$name");
return $locked;
break;
default:
return false;
}
}
function unlock($name='') { // read, write or full
switch ($this->dbtype) {
case 1: // MySQL
if (!$name) $name=array_pop($this->locks);
else
if (($lock=array_search($name,$this->locks))!==false) unset($this->locks[$lock]);
mysqli_query("DO RELEASE_LOCK('$name')",$this->handle);
return true; //$this->result;
break;
default:
return false;
}
}
function errorHandler() { // Abstract
tse_error_handler($this->errno,"SQL Error: {$this->error}","Query: {$this->queryStr}\n");
#trigger_error(E_USER_ERROR);
return false;
}
function query($queryStr='') { // Executes a query
if ($queryStr!='') $this->queryStr = $queryStr;
else $queryStr = $this->queryStr;
$cmd = strtoupper(substr($queryStr,0,strpos($queryStr,' ')));
if ($this->testMode) {
if (!$this->noDebug) debug($queryStr);
if ($cmd!='SELECT') return false;
}
switch ($this->dbtype) {
case 1: // MySQL
$this->resobj->result = mysqli_query($this->handle,$queryStr);
if ($this->result) {
if ($cmd=='SELECT') {
$this->affected_rows = null;
$this->num_rows = (int)mysqli_num_rows($this->result);
if (stripos($queryStr,'SQL_CALC_FOUND_ROWS')) $this->total = $this->resobj->found_rows();
else $this->total_rows = null;
} else {
$this->num_rows = null;
$this->affected_rows = (int)mysqli_affected_rows($this->handle);
}
$this->empty = ($this->num_rows===0 || $this->affected_rows===0);
$this->error = 0;
$this->errno = '';
} else {
$this->num_rows = 0;
$this->affected_rows = -1;
$this->error = mysqli_error($this->handle);
$this->errno = mysqli_errno($this->handle);
$this->errorHandler();
}
$this->queriesCounter++;
return new tseSQLResult($this,$this->result);
//return $this->resobj;
break;
case 2: // PostgreSQL
$this->resobj->result = pg_query($this->handle,$queryStr);
if ($this->result) {
$this->num_rows = pg_num_rows($this->result);
$this->empty = ($this->num_rows==0);
$this->affected_rows = pg_affected_rows($this->result);
$this->error = 0;
$this->errno = '';
} else {
$this->num_rows = 0;
$this->affected_rows = -1;
$this->error = pg_result_error($this->result);
$this->errno = -1;
$this->errorHandler();
}
$this->queriesCounter++;
return new tseSQLResult($this,$this->result);
//return $this->resobj;
break;
default:
return false;
}
}
// For single value $field parameter specifies which column to return from the record (first if omitted)
function query_val($queryStr='',$mode=_tseAuto, $key='', $field='') {return $this->queryval($queryStr,$mode,$key,$field);}
function queryval($queryStr='',$mode=_tseAuto, $key='', $field='', &$total=-1) {
$res = $this->query($queryStr);
if ($res && !$this->empty) {
if ($mode==_tseRows) $row=$this->fetch_rows($key);
elseif ($mode==_tseSingle&&!$key) $row=$this->fetch_row();
elseif ($mode==_tseList) $row=$this->fetch_list($key,$field);
elseif ($mode==_tseFlags) $row=$this->fetch_flags($key,$field);
else $row=$this->fetch_array();
if ($total!==-1) { $this->query('SELECT FOUND_ROWS();'); list($total) = $this->fetch_row(); }
switch($mode) {
case _tseAuto: return (count($row)==1?array_shift($row):$row);
case _tseSingle: return ($key?$row[$key]:$row[0]);
default: return $row;
}
} else return false;
}
function sysquery($queryStr='') {
if ($queryStr=='') $queryStr = $this->queryStr;
$queryStr = str_replace('%',$this->pf,$queryStr);
$this->query($queryStr);
}
function insert_id() { return $this->resobj->last_id(); }
function last_id() { return $this->resobj->last_id(); }
function fetch_array($result_type = _tseDB_ASSOC, $row = 0) { return $this->resobj->fetch_array($result_type,$row); }
function fetch_row($row = 0) { return $this->resobj->fetch_row($row); }
function fetch_rows($field='') { return $this->resobj->fetch_rows($field); }
function fetch_list($key='id',$val='') { return $this->resobj->fetch_list($key,$val); }
function fetch_flags($key='id',$val='') { return $this->resobj->fetch_flags($key,$val); }
function seek($offset) {return $this->resobj->seek($offset); }
function found_rows() { return $this->resobj->found_rows(); }
}
?>