mirror of
https://github.com/ACSPRI/queXS
synced 2024-04-02 12:12:16 +00:00
Added adodb5
This commit is contained in:
@@ -1,982 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
|
||||
@version V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
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.
|
||||
|
||||
Active Record implementation. Superset of Zend Framework's.
|
||||
|
||||
Version 0.92
|
||||
|
||||
See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord
|
||||
for info on Ruby on Rails Active Record implementation
|
||||
*/
|
||||
|
||||
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info
|
||||
global $ACTIVE_RECORD_SAFETY; // set to false to disable safety checks
|
||||
global $ADODB_ACTIVE_DEFVALS; // use default values of table definition when creating new active record.
|
||||
|
||||
// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat
|
||||
$_ADODB_ACTIVE_DBS = array();
|
||||
$ACTIVE_RECORD_SAFETY = true;
|
||||
$ADODB_ACTIVE_DEFVALS = false;
|
||||
$ADODB_ACTIVE_CACHESECS = 0;
|
||||
|
||||
class ADODB_Active_DB {
|
||||
var $db; // ADOConnection
|
||||
var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename
|
||||
}
|
||||
|
||||
class ADODB_Active_Table {
|
||||
var $name; // table name
|
||||
var $flds; // assoc array of adofieldobjs, indexed by fieldname
|
||||
var $keys; // assoc array of primary keys, indexed by fieldname
|
||||
var $_created; // only used when stored as a cached file
|
||||
var $_belongsTo = array();
|
||||
var $_hasMany = array();
|
||||
}
|
||||
|
||||
// $db = database connection
|
||||
// $index = name of index - can be associative, for an example see
|
||||
// http://phplens.com/lens/lensforum/msgs.php?id=17790
|
||||
// returns index into $_ADODB_ACTIVE_DBS
|
||||
function ADODB_SetDatabaseAdapter(&$db, $index=false)
|
||||
{
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
|
||||
foreach($_ADODB_ACTIVE_DBS as $k => $d) {
|
||||
if (PHP_VERSION >= 5) {
|
||||
if ($d->db === $db) return $k;
|
||||
} else {
|
||||
if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database)
|
||||
return $k;
|
||||
}
|
||||
}
|
||||
|
||||
$obj = new ADODB_Active_DB();
|
||||
$obj->db = $db;
|
||||
$obj->tables = array();
|
||||
|
||||
if ($index == false) $index = sizeof($_ADODB_ACTIVE_DBS);
|
||||
|
||||
|
||||
$_ADODB_ACTIVE_DBS[$index] = $obj;
|
||||
|
||||
return sizeof($_ADODB_ACTIVE_DBS)-1;
|
||||
}
|
||||
|
||||
|
||||
class ADODB_Active_Record {
|
||||
static $_changeNames = true; // dynamically pluralize table names
|
||||
static $_quoteNames = false;
|
||||
|
||||
static $_foreignSuffix = '_id'; //
|
||||
var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat]
|
||||
var $_table; // tablename, if set in class definition then use it as table name
|
||||
var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat]
|
||||
var $_where; // where clause set in Load()
|
||||
var $_saved = false; // indicates whether data is already inserted.
|
||||
var $_lasterr = false; // last error message
|
||||
var $_original = false; // the original values loaded or inserted, refreshed on update
|
||||
|
||||
var $foreignName; // CFR: class name when in a relationship
|
||||
|
||||
static function UseDefaultValues($bool=null)
|
||||
{
|
||||
global $ADODB_ACTIVE_DEFVALS;
|
||||
if (isset($bool)) $ADODB_ACTIVE_DEFVALS = $bool;
|
||||
return $ADODB_ACTIVE_DEFVALS;
|
||||
}
|
||||
|
||||
// should be static
|
||||
static function SetDatabaseAdapter(&$db, $index=false)
|
||||
{
|
||||
return ADODB_SetDatabaseAdapter($db, $index);
|
||||
}
|
||||
|
||||
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$name = str_replace(' ', '_', $name);
|
||||
$this->$name = $value;
|
||||
}
|
||||
|
||||
// php5 constructor
|
||||
function __construct($table = false, $pkeyarr=false, $db=false)
|
||||
{
|
||||
global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS;
|
||||
|
||||
if ($db == false && is_object($pkeyarr)) {
|
||||
$db = $pkeyarr;
|
||||
$pkeyarr = false;
|
||||
}
|
||||
|
||||
if (!$table) {
|
||||
if (!empty($this->_table)) $table = $this->_table;
|
||||
else $table = $this->_pluralize(get_class($this));
|
||||
}
|
||||
$this->foreignName = strtolower(get_class($this)); // CFR: default foreign name
|
||||
if ($db) {
|
||||
$this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db);
|
||||
} else if (!isset($this->_dbat)) {
|
||||
if (sizeof($_ADODB_ACTIVE_DBS) == 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor');
|
||||
end($_ADODB_ACTIVE_DBS);
|
||||
$this->_dbat = key($_ADODB_ACTIVE_DBS);
|
||||
}
|
||||
|
||||
$this->_table = $table;
|
||||
$this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future
|
||||
|
||||
$this->UpdateActiveTable($pkeyarr);
|
||||
}
|
||||
|
||||
function __wakeup()
|
||||
{
|
||||
$class = get_class($this);
|
||||
new $class;
|
||||
}
|
||||
|
||||
function _pluralize($table)
|
||||
{
|
||||
if (!ADODB_Active_Record::$_changeNames) return $table;
|
||||
|
||||
$ut = strtoupper($table);
|
||||
$len = strlen($table);
|
||||
$lastc = $ut[$len-1];
|
||||
$lastc2 = substr($ut,$len-2);
|
||||
switch ($lastc) {
|
||||
case 'S':
|
||||
return $table.'es';
|
||||
case 'Y':
|
||||
return substr($table,0,$len-1).'ies';
|
||||
case 'X':
|
||||
return $table.'es';
|
||||
case 'H':
|
||||
if ($lastc2 == 'CH' || $lastc2 == 'SH')
|
||||
return $table.'es';
|
||||
default:
|
||||
return $table.'s';
|
||||
}
|
||||
}
|
||||
|
||||
// CFR Lamest singular inflector ever - @todo Make it real!
|
||||
// Note: There is an assumption here...and it is that the argument's length >= 4
|
||||
function _singularize($tables)
|
||||
{
|
||||
|
||||
if (!ADODB_Active_Record::$_changeNames) return $table;
|
||||
|
||||
$ut = strtoupper($tables);
|
||||
$len = strlen($tables);
|
||||
if($ut[$len-1] != 'S')
|
||||
return $tables; // I know...forget oxen
|
||||
if($ut[$len-2] != 'E')
|
||||
return substr($tables, 0, $len-1);
|
||||
switch($ut[$len-3])
|
||||
{
|
||||
case 'S':
|
||||
case 'X':
|
||||
return substr($tables, 0, $len-2);
|
||||
case 'I':
|
||||
return substr($tables, 0, $len-3) . 'y';
|
||||
case 'H';
|
||||
if($ut[$len-4] == 'C' || $ut[$len-4] == 'S')
|
||||
return substr($tables, 0, $len-2);
|
||||
default:
|
||||
return substr($tables, 0, $len-1); // ?
|
||||
}
|
||||
}
|
||||
|
||||
function hasMany($foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
|
||||
{
|
||||
$ar = new $foreignClass($foreignRef);
|
||||
$ar->foreignName = $foreignRef;
|
||||
$ar->UpdateActiveTable();
|
||||
$ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix;
|
||||
$table =& $this->TableInfo();
|
||||
$table->_hasMany[$foreignRef] = $ar;
|
||||
# $this->$foreignRef = $this->_hasMany[$foreignRef]; // WATCHME Removed assignment by ref. to please __get()
|
||||
}
|
||||
|
||||
// use when you don't want ADOdb to auto-pluralize tablename
|
||||
static function TableHasMany($table, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
|
||||
{
|
||||
$ar = new ADODB_Active_Record($table);
|
||||
$ar->hasMany($foreignRef, $foreignKey, $foreignClass);
|
||||
}
|
||||
|
||||
// use when you don't want ADOdb to auto-pluralize tablename
|
||||
static function TableKeyHasMany($table, $tablePKey, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
|
||||
{
|
||||
if (!is_array($tablePKey)) $tablePKey = array($tablePKey);
|
||||
$ar = new ADODB_Active_Record($table,$tablePKey);
|
||||
$ar->hasMany($foreignRef, $foreignKey, $foreignClass);
|
||||
}
|
||||
|
||||
|
||||
// use when you want ADOdb to auto-pluralize tablename for you. Note that the class must already be defined.
|
||||
// e.g. class Person will generate relationship for table Persons
|
||||
static function ClassHasMany($parentclass, $foreignRef, $foreignKey = false, $foreignClass = 'ADODB_Active_Record')
|
||||
{
|
||||
$ar = new $parentclass();
|
||||
$ar->hasMany($foreignRef, $foreignKey, $foreignClass);
|
||||
}
|
||||
|
||||
|
||||
function belongsTo($foreignRef,$foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
|
||||
{
|
||||
global $inflector;
|
||||
|
||||
$ar = new $parentClass($this->_pluralize($foreignRef));
|
||||
$ar->foreignName = $foreignRef;
|
||||
$ar->parentKey = $parentKey;
|
||||
$ar->UpdateActiveTable();
|
||||
$ar->foreignKey = ($foreignKey) ? $foreignKey : $foreignRef.ADODB_Active_Record::$_foreignSuffix;
|
||||
|
||||
$table =& $this->TableInfo();
|
||||
$table->_belongsTo[$foreignRef] = $ar;
|
||||
# $this->$foreignRef = $this->_belongsTo[$foreignRef];
|
||||
}
|
||||
|
||||
static function ClassBelongsTo($class, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
|
||||
{
|
||||
$ar = new $class();
|
||||
$ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
|
||||
}
|
||||
|
||||
static function TableBelongsTo($table, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
|
||||
{
|
||||
$ar = new ADOdb_Active_Record($table);
|
||||
$ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
|
||||
}
|
||||
|
||||
static function TableKeyBelongsTo($table, $tablePKey, $foreignRef, $foreignKey=false, $parentKey='', $parentClass = 'ADODB_Active_Record')
|
||||
{
|
||||
if (!is_array($tablePKey)) $tablePKey = array($tablePKey);
|
||||
$ar = new ADOdb_Active_Record($table, $tablePKey);
|
||||
$ar->belongsTo($foreignRef, $foreignKey, $parentKey, $parentClass);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* __get Access properties - used for lazy loading
|
||||
*
|
||||
* @param mixed $name
|
||||
* @access protected
|
||||
* @return mixed
|
||||
*/
|
||||
function __get($name)
|
||||
{
|
||||
return $this->LoadRelations($name, '', -1, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param string $whereOrderBy : eg. ' AND field1 = value ORDER BY field2'
|
||||
* @param offset
|
||||
* @param limit
|
||||
* @return mixed
|
||||
*/
|
||||
function LoadRelations($name, $whereOrderBy='', $offset=-1,$limit=-1)
|
||||
{
|
||||
$extras = array();
|
||||
$table = $this->TableInfo();
|
||||
if ($limit >= 0) $extras['limit'] = $limit;
|
||||
if ($offset >= 0) $extras['offset'] = $offset;
|
||||
|
||||
if (strlen($whereOrderBy))
|
||||
if (!preg_match('/^[ \n\r]*AND/i',$whereOrderBy))
|
||||
if (!preg_match('/^[ \n\r]*ORDER[ \n\r]/i',$whereOrderBy))
|
||||
$whereOrderBy = 'AND '.$whereOrderBy;
|
||||
|
||||
if(!empty($table->_belongsTo[$name]))
|
||||
{
|
||||
$obj = $table->_belongsTo[$name];
|
||||
$columnName = $obj->foreignKey;
|
||||
if(empty($this->$columnName))
|
||||
$this->$name = null;
|
||||
else
|
||||
{
|
||||
if ($obj->parentKey) $key = $obj->parentKey;
|
||||
else $key = reset($table->keys);
|
||||
|
||||
$arrayOfOne = $obj->Find($key.'='.$this->$columnName.' '.$whereOrderBy,false,false,$extras);
|
||||
if ($arrayOfOne) {
|
||||
$this->$name = $arrayOfOne[0];
|
||||
return $arrayOfOne[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!empty($table->_hasMany[$name]))
|
||||
{
|
||||
$obj = $table->_hasMany[$name];
|
||||
$key = reset($table->keys);
|
||||
$id = @$this->$key;
|
||||
if (!is_numeric($id)) {
|
||||
$db = $this->DB();
|
||||
$id = $db->qstr($id);
|
||||
}
|
||||
$objs = $obj->Find($obj->foreignKey.'='.$id. ' '.$whereOrderBy,false,false,$extras);
|
||||
if (!$objs) $objs = array();
|
||||
$this->$name = $objs;
|
||||
return $objs;
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
//////////////////////////////////
|
||||
|
||||
// update metadata
|
||||
function UpdateActiveTable($pkeys=false,$forceUpdate=false)
|
||||
{
|
||||
global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS;
|
||||
global $ADODB_ACTIVE_DEFVALS,$ADODB_FETCH_MODE;
|
||||
|
||||
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
|
||||
|
||||
$table = $this->_table;
|
||||
$tables = $activedb->tables;
|
||||
$tableat = $this->_tableat;
|
||||
if (!$forceUpdate && !empty($tables[$tableat])) {
|
||||
|
||||
$tobj = $tables[$tableat];
|
||||
foreach($tobj->flds as $name => $fld) {
|
||||
if ($ADODB_ACTIVE_DEFVALS && isset($fld->default_value))
|
||||
$this->$name = $fld->default_value;
|
||||
else
|
||||
$this->$name = null;
|
||||
}
|
||||
return;
|
||||
}
|
||||
$db = $activedb->db;
|
||||
$fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache';
|
||||
if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) {
|
||||
$fp = fopen($fname,'r');
|
||||
@flock($fp, LOCK_SH);
|
||||
$acttab = unserialize(fread($fp,100000));
|
||||
fclose($fp);
|
||||
if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) {
|
||||
// abs(rand()) randomizes deletion, reducing contention to delete/refresh file
|
||||
// ideally, you should cache at least 32 secs
|
||||
$activedb->tables[$table] = $acttab;
|
||||
|
||||
//if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname");
|
||||
return;
|
||||
} else if ($db->debug) {
|
||||
ADOConnection::outp("Refreshing cached active record file: $fname");
|
||||
}
|
||||
}
|
||||
$activetab = new ADODB_Active_Table();
|
||||
$activetab->name = $table;
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||
if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false);
|
||||
|
||||
$cols = $db->MetaColumns($table);
|
||||
|
||||
if (isset($savem)) $db->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!$cols) {
|
||||
$this->Error("Invalid table name: $table",'UpdateActiveTable');
|
||||
return false;
|
||||
}
|
||||
$fld = reset($cols);
|
||||
if (!$pkeys) {
|
||||
if (isset($fld->primary_key)) {
|
||||
$pkeys = array();
|
||||
foreach($cols as $name => $fld) {
|
||||
if (!empty($fld->primary_key)) $pkeys[] = $name;
|
||||
}
|
||||
} else
|
||||
$pkeys = $this->GetPrimaryKeys($db, $table);
|
||||
}
|
||||
if (empty($pkeys)) {
|
||||
$this->Error("No primary key found for table $table",'UpdateActiveTable');
|
||||
return false;
|
||||
}
|
||||
|
||||
$attr = array();
|
||||
$keys = array();
|
||||
|
||||
switch($ADODB_ASSOC_CASE) {
|
||||
case 0:
|
||||
foreach($cols as $name => $fldobj) {
|
||||
$name = strtolower($name);
|
||||
if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value))
|
||||
$this->$name = $fldobj->default_value;
|
||||
else
|
||||
$this->$name = null;
|
||||
$attr[$name] = $fldobj;
|
||||
}
|
||||
foreach($pkeys as $k => $name) {
|
||||
$keys[strtolower($name)] = strtolower($name);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
foreach($cols as $name => $fldobj) {
|
||||
$name = strtoupper($name);
|
||||
|
||||
if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value))
|
||||
$this->$name = $fldobj->default_value;
|
||||
else
|
||||
$this->$name = null;
|
||||
$attr[$name] = $fldobj;
|
||||
}
|
||||
|
||||
foreach($pkeys as $k => $name) {
|
||||
$keys[strtoupper($name)] = strtoupper($name);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
foreach($cols as $name => $fldobj) {
|
||||
$name = ($fldobj->name);
|
||||
|
||||
if ($ADODB_ACTIVE_DEFVALS && isset($fldobj->default_value))
|
||||
$this->$name = $fldobj->default_value;
|
||||
else
|
||||
$this->$name = null;
|
||||
$attr[$name] = $fldobj;
|
||||
}
|
||||
foreach($pkeys as $k => $name) {
|
||||
$keys[$name] = $cols[$name]->name;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$activetab->keys = $keys;
|
||||
$activetab->flds = $attr;
|
||||
|
||||
if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) {
|
||||
$activetab->_created = time();
|
||||
$s = serialize($activetab);
|
||||
if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php');
|
||||
adodb_write_file($fname,$s);
|
||||
}
|
||||
if (isset($activedb->tables[$table])) {
|
||||
$oldtab = $activedb->tables[$table];
|
||||
|
||||
if ($oldtab) $activetab->_belongsTo = $oldtab->_belongsTo;
|
||||
if ($oldtab) $activetab->_hasMany = $oldtab->_hasMany;
|
||||
}
|
||||
$activedb->tables[$table] = $activetab;
|
||||
}
|
||||
|
||||
function GetPrimaryKeys(&$db, $table)
|
||||
{
|
||||
return $db->MetaPrimaryKeys($table);
|
||||
}
|
||||
|
||||
// error handler for both PHP4+5.
|
||||
function Error($err,$fn)
|
||||
{
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
|
||||
$fn = get_class($this).'::'.$fn;
|
||||
$this->_lasterr = $fn.': '.$err;
|
||||
|
||||
if ($this->_dbat < 0) $db = false;
|
||||
else {
|
||||
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
|
||||
$db = $activedb->db;
|
||||
}
|
||||
|
||||
if (function_exists('adodb_throw')) {
|
||||
if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false);
|
||||
else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db);
|
||||
} else
|
||||
if (!$db || $db->debug) ADOConnection::outp($this->_lasterr);
|
||||
|
||||
}
|
||||
|
||||
// return last error message
|
||||
function ErrorMsg()
|
||||
{
|
||||
if (!function_exists('adodb_throw')) {
|
||||
if ($this->_dbat < 0) $db = false;
|
||||
else $db = $this->DB();
|
||||
|
||||
// last error could be database error too
|
||||
if ($db && $db->ErrorMsg()) return $db->ErrorMsg();
|
||||
}
|
||||
return $this->_lasterr;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_dbat < 0) return -9999; // no database connection...
|
||||
$db = $this->DB();
|
||||
|
||||
return (int) $db->ErrorNo();
|
||||
}
|
||||
|
||||
|
||||
// retrieve ADOConnection from _ADODB_Active_DBs
|
||||
function DB()
|
||||
{
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
|
||||
if ($this->_dbat < 0) {
|
||||
$false = false;
|
||||
$this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB");
|
||||
return $false;
|
||||
}
|
||||
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
|
||||
$db = $activedb->db;
|
||||
return $db;
|
||||
}
|
||||
|
||||
// retrieve ADODB_Active_Table
|
||||
function &TableInfo()
|
||||
{
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
$activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
|
||||
$table = $activedb->tables[$this->_tableat];
|
||||
return $table;
|
||||
}
|
||||
|
||||
|
||||
// I have an ON INSERT trigger on a table that sets other columns in the table.
|
||||
// So, I find that for myTable, I want to reload an active record after saving it. -- Malcolm Cook
|
||||
function Reload()
|
||||
{
|
||||
$db =& $this->DB(); if (!$db) return false;
|
||||
$table =& $this->TableInfo();
|
||||
$where = $this->GenWhere($db, $table);
|
||||
return($this->Load($where));
|
||||
}
|
||||
|
||||
|
||||
// set a numeric array (using natural table field ordering) as object properties
|
||||
function Set(&$row)
|
||||
{
|
||||
global $ACTIVE_RECORD_SAFETY;
|
||||
|
||||
$db = $this->DB();
|
||||
|
||||
if (!$row) {
|
||||
$this->_saved = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->_saved = true;
|
||||
|
||||
$table = $this->TableInfo();
|
||||
if ($ACTIVE_RECORD_SAFETY && sizeof($table->flds) != sizeof($row)) {
|
||||
# <AP>
|
||||
$bad_size = TRUE;
|
||||
if (sizeof($row) == 2 * sizeof($table->flds)) {
|
||||
// Only keep string keys
|
||||
$keys = array_filter(array_keys($row), 'is_string');
|
||||
if (sizeof($keys) == sizeof($table->flds))
|
||||
$bad_size = FALSE;
|
||||
}
|
||||
if ($bad_size) {
|
||||
$this->Error("Table structure of $this->_table has changed","Load");
|
||||
return false;
|
||||
}
|
||||
# </AP>
|
||||
}
|
||||
else
|
||||
$keys = array_keys($row);
|
||||
|
||||
# <AP>
|
||||
reset($keys);
|
||||
$this->_original = array();
|
||||
foreach($table->flds as $name=>$fld) {
|
||||
$value = $row[current($keys)];
|
||||
$this->$name = $value;
|
||||
$this->_original[] = $value;
|
||||
next($keys);
|
||||
}
|
||||
|
||||
# </AP>
|
||||
return true;
|
||||
}
|
||||
|
||||
// get last inserted id for INSERT
|
||||
function LastInsertID(&$db,$fieldname)
|
||||
{
|
||||
if ($db->hasInsertID)
|
||||
$val = $db->Insert_ID($this->_table,$fieldname);
|
||||
else
|
||||
$val = false;
|
||||
|
||||
if (is_null($val) || $val === false) {
|
||||
// this might not work reliably in multi-user environment
|
||||
return $db->GetOne("select max(".$fieldname.") from ".$this->_table);
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
// quote data in where clause
|
||||
function doquote(&$db, $val,$t)
|
||||
{
|
||||
switch($t) {
|
||||
case 'D':
|
||||
case 'T':
|
||||
if (empty($val)) return 'null';
|
||||
|
||||
case 'B':
|
||||
case 'N':
|
||||
case 'C':
|
||||
case 'X':
|
||||
if (is_null($val)) return 'null';
|
||||
|
||||
if (strlen($val)>1 &&
|
||||
(strncmp($val,"'",1) != 0 || substr($val,strlen($val)-1,1) != "'")) {
|
||||
return $db->qstr($val);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return $val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// generate where clause for an UPDATE/SELECT
|
||||
function GenWhere(&$db, &$table)
|
||||
{
|
||||
$keys = $table->keys;
|
||||
$parr = array();
|
||||
|
||||
foreach($keys as $k) {
|
||||
$f = $table->flds[$k];
|
||||
if ($f) {
|
||||
$parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type));
|
||||
}
|
||||
}
|
||||
return implode(' and ', $parr);
|
||||
}
|
||||
|
||||
|
||||
function _QName($n,$db=false)
|
||||
{
|
||||
if (!ADODB_Active_Record::$_quoteNames) return $n;
|
||||
if (!$db) $db = $this->DB(); if (!$db) return false;
|
||||
return $db->nameQuote.$n.$db->nameQuote;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------ Public functions below
|
||||
|
||||
function Load($where=null,$bindarr=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$db = $this->DB(); if (!$db) return false;
|
||||
$this->_where = $where;
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($db->fetchMode !== false) $savem = $db->SetFetchMode(false);
|
||||
|
||||
$qry = "select * from ".$this->_table;
|
||||
|
||||
if($where) {
|
||||
$qry .= ' WHERE '.$where;
|
||||
}
|
||||
$row = $db->GetRow($qry,$bindarr);
|
||||
|
||||
if (isset($savem)) $db->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
return $this->Set($row);
|
||||
}
|
||||
|
||||
# useful for multiple record inserts
|
||||
# see http://phplens.com/lens/lensforum/msgs.php?id=17795
|
||||
function Reset()
|
||||
{
|
||||
$this->_where=null;
|
||||
$this->_saved = false;
|
||||
$this->_lasterr = false;
|
||||
$this->_original = false;
|
||||
$vars=get_object_vars($this);
|
||||
foreach($vars as $k=>$v){
|
||||
if(substr($k,0,1)!=='_'){
|
||||
$this->{$k}=null;
|
||||
}
|
||||
}
|
||||
$this->foreignName=strtolower(get_class($this));
|
||||
return true;
|
||||
}
|
||||
|
||||
// false on error
|
||||
function Save()
|
||||
{
|
||||
if ($this->_saved) $ok = $this->Update();
|
||||
else $ok = $this->Insert();
|
||||
|
||||
return $ok;
|
||||
}
|
||||
|
||||
|
||||
// false on error
|
||||
function Insert()
|
||||
{
|
||||
$db = $this->DB(); if (!$db) return false;
|
||||
$cnt = 0;
|
||||
$table = $this->TableInfo();
|
||||
|
||||
$valarr = array();
|
||||
$names = array();
|
||||
$valstr = array();
|
||||
|
||||
foreach($table->flds as $name=>$fld) {
|
||||
$val = $this->$name;
|
||||
if(!is_array($val) || !is_null($val) || !array_key_exists($name, $table->keys)) {
|
||||
$valarr[] = $val;
|
||||
$names[] = $this->_QName($name,$db);
|
||||
$valstr[] = $db->Param($cnt);
|
||||
$cnt += 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($names)){
|
||||
foreach($table->flds as $name=>$fld) {
|
||||
$valarr[] = null;
|
||||
$names[] = $name;
|
||||
$valstr[] = $db->Param($cnt);
|
||||
$cnt += 1;
|
||||
}
|
||||
}
|
||||
$sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')';
|
||||
$ok = $db->Execute($sql,$valarr);
|
||||
|
||||
if ($ok) {
|
||||
$this->_saved = true;
|
||||
$autoinc = false;
|
||||
foreach($table->keys as $k) {
|
||||
if (is_null($this->$k)) {
|
||||
$autoinc = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($autoinc && sizeof($table->keys) == 1) {
|
||||
$k = reset($table->keys);
|
||||
$this->$k = $this->LastInsertID($db,$k);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_original = $valarr;
|
||||
return !empty($ok);
|
||||
}
|
||||
|
||||
function Delete()
|
||||
{
|
||||
$db = $this->DB(); if (!$db) return false;
|
||||
$table = $this->TableInfo();
|
||||
|
||||
$where = $this->GenWhere($db,$table);
|
||||
$sql = 'DELETE FROM '.$this->_table.' WHERE '.$where;
|
||||
$ok = $db->Execute($sql);
|
||||
|
||||
return $ok ? true : false;
|
||||
}
|
||||
|
||||
// returns an array of active record objects
|
||||
function Find($whereOrderBy,$bindarr=false,$pkeysArr=false,$extra=array())
|
||||
{
|
||||
$db = $this->DB(); if (!$db || empty($this->_table)) return false;
|
||||
$arr = $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr,$extra);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
// returns 0 on error, 1 on update, 2 on insert
|
||||
function Replace()
|
||||
{
|
||||
global $ADODB_ASSOC_CASE;
|
||||
|
||||
$db = $this->DB(); if (!$db) return false;
|
||||
$table = $this->TableInfo();
|
||||
|
||||
$pkey = $table->keys;
|
||||
|
||||
foreach($table->flds as $name=>$fld) {
|
||||
$val = $this->$name;
|
||||
/*
|
||||
if (is_null($val)) {
|
||||
if (isset($fld->not_null) && $fld->not_null) {
|
||||
if (isset($fld->default_value) && strlen($fld->default_value)) continue;
|
||||
else {
|
||||
$this->Error("Cannot update null into $name","Replace");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
if (is_null($val) && !empty($fld->auto_increment)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_array($val)) continue;
|
||||
|
||||
$t = $db->MetaType($fld->type);
|
||||
$arr[$name] = $this->doquote($db,$val,$t);
|
||||
$valarr[] = $val;
|
||||
}
|
||||
|
||||
if (!is_array($pkey)) $pkey = array($pkey);
|
||||
|
||||
|
||||
if ($ADODB_ASSOC_CASE == 0)
|
||||
foreach($pkey as $k => $v)
|
||||
$pkey[$k] = strtolower($v);
|
||||
elseif ($ADODB_ASSOC_CASE == 1)
|
||||
foreach($pkey as $k => $v)
|
||||
$pkey[$k] = strtoupper($v);
|
||||
|
||||
$ok = $db->Replace($this->_table,$arr,$pkey);
|
||||
if ($ok) {
|
||||
$this->_saved = true; // 1= update 2=insert
|
||||
if ($ok == 2) {
|
||||
$autoinc = false;
|
||||
foreach($table->keys as $k) {
|
||||
if (is_null($this->$k)) {
|
||||
$autoinc = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($autoinc && sizeof($table->keys) == 1) {
|
||||
$k = reset($table->keys);
|
||||
$this->$k = $this->LastInsertID($db,$k);
|
||||
}
|
||||
}
|
||||
|
||||
$this->_original = $valarr;
|
||||
}
|
||||
return $ok;
|
||||
}
|
||||
|
||||
// returns 0 on error, 1 on update, -1 if no change in data (no update)
|
||||
function Update()
|
||||
{
|
||||
$db = $this->DB(); if (!$db) return false;
|
||||
$table = $this->TableInfo();
|
||||
|
||||
$where = $this->GenWhere($db, $table);
|
||||
|
||||
if (!$where) {
|
||||
$this->error("Where missing for table $table", "Update");
|
||||
return false;
|
||||
}
|
||||
$valarr = array();
|
||||
$neworig = array();
|
||||
$pairs = array();
|
||||
$i = -1;
|
||||
$cnt = 0;
|
||||
foreach($table->flds as $name=>$fld) {
|
||||
$i += 1;
|
||||
$val = $this->$name;
|
||||
$neworig[] = $val;
|
||||
|
||||
if (isset($table->keys[$name]) || is_array($val))
|
||||
continue;
|
||||
|
||||
if (is_null($val)) {
|
||||
if (isset($fld->not_null) && $fld->not_null) {
|
||||
if (isset($fld->default_value) && strlen($fld->default_value)) continue;
|
||||
else {
|
||||
$this->Error("Cannot set field $name to NULL","Update");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($this->_original[$i]) && $val == $this->_original[$i]) {
|
||||
continue;
|
||||
}
|
||||
$valarr[] = $val;
|
||||
$pairs[] = $this->_QName($name,$db).'='.$db->Param($cnt);
|
||||
$cnt += 1;
|
||||
}
|
||||
|
||||
|
||||
if (!$cnt) return -1;
|
||||
$sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where;
|
||||
$ok = $db->Execute($sql,$valarr);
|
||||
if ($ok) {
|
||||
$this->_original = $neworig;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function GetAttributeNames()
|
||||
{
|
||||
$table = $this->TableInfo();
|
||||
if (!$table) return false;
|
||||
return array_keys($table->flds);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
function adodb_GetActiveRecordsClass(&$db, $class, $table,$whereOrderBy,$bindarr, $primkeyArr,
|
||||
$extra)
|
||||
{
|
||||
global $_ADODB_ACTIVE_DBS;
|
||||
|
||||
|
||||
$save = $db->SetFetchMode(ADODB_FETCH_NUM);
|
||||
$qry = "select * from ".$table;
|
||||
|
||||
if (!empty($whereOrderBy))
|
||||
$qry .= ' WHERE '.$whereOrderBy;
|
||||
if(isset($extra['limit']))
|
||||
{
|
||||
$rows = false;
|
||||
if(isset($extra['offset'])) {
|
||||
$rs = $db->SelectLimit($qry, $extra['limit'], $extra['offset'],$bindarr);
|
||||
} else {
|
||||
$rs = $db->SelectLimit($qry, $extra['limit'],-1,$bindarr);
|
||||
}
|
||||
if ($rs) {
|
||||
while (!$rs->EOF) {
|
||||
$rows[] = $rs->fields;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
}
|
||||
} else
|
||||
$rows = $db->GetAll($qry,$bindarr);
|
||||
|
||||
$db->SetFetchMode($save);
|
||||
|
||||
$false = false;
|
||||
|
||||
if ($rows === false) {
|
||||
return $false;
|
||||
}
|
||||
|
||||
|
||||
if (!class_exists($class)) {
|
||||
$db->outp_throw("Unknown class $class in GetActiveRecordsClass()",'GetActiveRecordsClass');
|
||||
return $false;
|
||||
}
|
||||
$arr = array();
|
||||
// arrRef will be the structure that knows about our objects.
|
||||
// It is an associative array.
|
||||
// We will, however, return arr, preserving regular 0.. order so that
|
||||
// obj[0] can be used by app developpers.
|
||||
$arrRef = array();
|
||||
$bTos = array(); // Will store belongTo's indices if any
|
||||
foreach($rows as $row) {
|
||||
|
||||
$obj = new $class($table,$primkeyArr,$db);
|
||||
if ($obj->ErrorNo()){
|
||||
$db->_errorMsg = $obj->ErrorMsg();
|
||||
return $false;
|
||||
}
|
||||
$obj->Set($row);
|
||||
$arr[] = $obj;
|
||||
} // foreach($rows as $row)
|
||||
|
||||
return $arr;
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,318 +0,0 @@
|
||||
<?php
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
global $ADODB_INCLUDED_CSV;
|
||||
$ADODB_INCLUDED_CSV = 1;
|
||||
|
||||
/*
|
||||
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Library for CSV serialization. This is used by the csv/proxy driver and is the
|
||||
CacheExecute() serialization format.
|
||||
|
||||
==== NOTE ====
|
||||
Format documented at http://php.weblogs.com/ADODB_CSV
|
||||
==============
|
||||
*/
|
||||
|
||||
/**
|
||||
* convert a recordset into special format
|
||||
*
|
||||
* @param rs the recordset
|
||||
*
|
||||
* @return the CSV formated data
|
||||
*/
|
||||
function _rs2serialize(&$rs,$conn=false,$sql='')
|
||||
{
|
||||
$max = ($rs) ? $rs->FieldCount() : 0;
|
||||
|
||||
if ($sql) $sql = urlencode($sql);
|
||||
// metadata setup
|
||||
|
||||
if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete
|
||||
if (is_object($conn)) {
|
||||
$sql .= ','.$conn->Affected_Rows();
|
||||
$sql .= ','.$conn->Insert_ID();
|
||||
} else
|
||||
$sql .= ',,';
|
||||
|
||||
$text = "====-1,0,$sql\n";
|
||||
return $text;
|
||||
}
|
||||
$tt = ($rs->timeCreated) ? $rs->timeCreated : time();
|
||||
|
||||
## changed format from ====0 to ====1
|
||||
$line = "====1,$tt,$sql\n";
|
||||
|
||||
if ($rs->databaseType == 'array') {
|
||||
$rows = $rs->_array;
|
||||
} else {
|
||||
$rows = array();
|
||||
while (!$rs->EOF) {
|
||||
$rows[] = $rs->fields;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
}
|
||||
|
||||
for($i=0; $i < $max; $i++) {
|
||||
$o = $rs->FetchField($i);
|
||||
$flds[] = $o;
|
||||
}
|
||||
|
||||
$savefetch = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
|
||||
$class = $rs->connection->arrayClass;
|
||||
$rs2 = new $class();
|
||||
$rs2->timeCreated = $rs->timeCreated; # memcache fix
|
||||
$rs2->sql = $rs->sql;
|
||||
$rs2->oldProvider = $rs->dataProvider;
|
||||
$rs2->InitArrayFields($rows,$flds);
|
||||
$rs2->fetchMode = $savefetch;
|
||||
return $line.serialize($rs2);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open CSV file and convert it into Data.
|
||||
*
|
||||
* @param url file/ftp/http url
|
||||
* @param err returns the error message
|
||||
* @param timeout dispose if recordset has been alive for $timeout secs
|
||||
*
|
||||
* @return recordset, or false if error occured. If no
|
||||
* error occurred in sql INSERT/UPDATE/DELETE,
|
||||
* empty recordset is returned
|
||||
*/
|
||||
function csv2rs($url,&$err,$timeout=0, $rsclass='ADORecordSet_array')
|
||||
{
|
||||
$false = false;
|
||||
$err = false;
|
||||
$fp = @fopen($url,'rb');
|
||||
if (!$fp) {
|
||||
$err = $url.' file/URL not found';
|
||||
return $false;
|
||||
}
|
||||
@flock($fp, LOCK_SH);
|
||||
$arr = array();
|
||||
$ttl = 0;
|
||||
|
||||
if ($meta = fgetcsv($fp, 32000, ",")) {
|
||||
// check if error message
|
||||
if (strncmp($meta[0],'****',4) === 0) {
|
||||
$err = trim(substr($meta[0],4,1024));
|
||||
fclose($fp);
|
||||
return $false;
|
||||
}
|
||||
// check for meta data
|
||||
// $meta[0] is -1 means return an empty recordset
|
||||
// $meta[1] contains a time
|
||||
|
||||
if (strncmp($meta[0], '====',4) === 0) {
|
||||
|
||||
if ($meta[0] == "====-1") {
|
||||
if (sizeof($meta) < 5) {
|
||||
$err = "Corrupt first line for format -1";
|
||||
fclose($fp);
|
||||
return $false;
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
if ($timeout > 0) {
|
||||
$err = " Illegal Timeout $timeout ";
|
||||
return $false;
|
||||
}
|
||||
|
||||
$rs = new $rsclass($val=true);
|
||||
$rs->fields = array();
|
||||
$rs->timeCreated = $meta[1];
|
||||
$rs->EOF = true;
|
||||
$rs->_numOfFields = 0;
|
||||
$rs->sql = urldecode($meta[2]);
|
||||
$rs->affectedrows = (integer)$meta[3];
|
||||
$rs->insertid = $meta[4];
|
||||
return $rs;
|
||||
}
|
||||
# Under high volume loads, we want only 1 thread/process to _write_file
|
||||
# so that we don't have 50 processes queueing to write the same data.
|
||||
# We use probabilistic timeout, ahead of time.
|
||||
#
|
||||
# -4 sec before timeout, give processes 1/32 chance of timing out
|
||||
# -2 sec before timeout, give processes 1/16 chance of timing out
|
||||
# -1 sec after timeout give processes 1/4 chance of timing out
|
||||
# +0 sec after timeout, give processes 100% chance of timing out
|
||||
if (sizeof($meta) > 1) {
|
||||
if($timeout >0){
|
||||
$tdiff = (integer)( $meta[1]+$timeout - time());
|
||||
if ($tdiff <= 2) {
|
||||
switch($tdiff) {
|
||||
case 4:
|
||||
case 3:
|
||||
if ((rand() & 31) == 0) {
|
||||
fclose($fp);
|
||||
$err = "Timeout 3";
|
||||
return $false;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if ((rand() & 15) == 0) {
|
||||
fclose($fp);
|
||||
$err = "Timeout 2";
|
||||
return $false;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if ((rand() & 3) == 0) {
|
||||
fclose($fp);
|
||||
$err = "Timeout 1";
|
||||
return $false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fclose($fp);
|
||||
$err = "Timeout 0";
|
||||
return $false;
|
||||
} // switch
|
||||
|
||||
} // if check flush cache
|
||||
}// (timeout>0)
|
||||
$ttl = $meta[1];
|
||||
}
|
||||
//================================================
|
||||
// new cache format - use serialize extensively...
|
||||
if ($meta[0] === '====1') {
|
||||
// slurp in the data
|
||||
$MAXSIZE = 128000;
|
||||
|
||||
$text = fread($fp,$MAXSIZE);
|
||||
if (strlen($text)) {
|
||||
while ($txt = fread($fp,$MAXSIZE)) {
|
||||
$text .= $txt;
|
||||
}
|
||||
}
|
||||
fclose($fp);
|
||||
$rs = unserialize($text);
|
||||
if (is_object($rs)) $rs->timeCreated = $ttl;
|
||||
else {
|
||||
$err = "Unable to unserialize recordset";
|
||||
//echo htmlspecialchars($text),' !--END--!<p>';
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
$meta = false;
|
||||
$meta = fgetcsv($fp, 32000, ",");
|
||||
if (!$meta) {
|
||||
fclose($fp);
|
||||
$err = "Unexpected EOF 1";
|
||||
return $false;
|
||||
}
|
||||
}
|
||||
|
||||
// Get Column definitions
|
||||
$flds = array();
|
||||
foreach($meta as $o) {
|
||||
$o2 = explode(':',$o);
|
||||
if (sizeof($o2)!=3) {
|
||||
$arr[] = $meta;
|
||||
$flds = false;
|
||||
break;
|
||||
}
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = urldecode($o2[0]);
|
||||
$fld->type = $o2[1];
|
||||
$fld->max_length = $o2[2];
|
||||
$flds[] = $fld;
|
||||
}
|
||||
} else {
|
||||
fclose($fp);
|
||||
$err = "Recordset had unexpected EOF 2";
|
||||
return $false;
|
||||
}
|
||||
|
||||
// slurp in the data
|
||||
$MAXSIZE = 128000;
|
||||
|
||||
$text = '';
|
||||
while ($txt = fread($fp,$MAXSIZE)) {
|
||||
$text .= $txt;
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
@$arr = unserialize($text);
|
||||
//var_dump($arr);
|
||||
if (!is_array($arr)) {
|
||||
$err = "Recordset had unexpected EOF (in serialized recordset)";
|
||||
if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
|
||||
return $false;
|
||||
}
|
||||
$rs = new $rsclass();
|
||||
$rs->timeCreated = $ttl;
|
||||
$rs->InitArrayFields($arr,$flds);
|
||||
return $rs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save a file $filename and its $contents (normally for caching) with file locking
|
||||
* Returns true if ok, false if fopen/fwrite error, 0 if rename error (eg. file is locked)
|
||||
*/
|
||||
function adodb_write_file($filename, $contents,$debug=false)
|
||||
{
|
||||
# http://www.php.net/bugs.php?id=9203 Bug that flock fails on Windows
|
||||
# So to simulate locking, we assume that rename is an atomic operation.
|
||||
# First we delete $filename, then we create a $tempfile write to it and
|
||||
# rename to the desired $filename. If the rename works, then we successfully
|
||||
# modified the file exclusively.
|
||||
# What a stupid need - having to simulate locking.
|
||||
# Risks:
|
||||
# 1. $tempfile name is not unique -- very very low
|
||||
# 2. unlink($filename) fails -- ok, rename will fail
|
||||
# 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs
|
||||
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
|
||||
if (strncmp(PHP_OS,'WIN',3) === 0) {
|
||||
// skip the decimal place
|
||||
$mtime = substr(str_replace(' ','_',microtime()),2);
|
||||
// getmypid() actually returns 0 on Win98 - never mind!
|
||||
$tmpname = $filename.uniqid($mtime).getmypid();
|
||||
if (!($fd = @fopen($tmpname,'w'))) return false;
|
||||
if (fwrite($fd,$contents)) $ok = true;
|
||||
else $ok = false;
|
||||
fclose($fd);
|
||||
|
||||
if ($ok) {
|
||||
@chmod($tmpname,0644);
|
||||
// the tricky moment
|
||||
@unlink($filename);
|
||||
if (!@rename($tmpname,$filename)) {
|
||||
unlink($tmpname);
|
||||
$ok = 0;
|
||||
}
|
||||
if (!$ok) {
|
||||
if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed'));
|
||||
}
|
||||
}
|
||||
return $ok;
|
||||
}
|
||||
if (!($fd = @fopen($filename, 'a'))) return false;
|
||||
if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) {
|
||||
if (fwrite( $fd, $contents )) $ok = true;
|
||||
else $ok = false;
|
||||
fclose($fd);
|
||||
@chmod($filename,0644);
|
||||
}else {
|
||||
fclose($fd);
|
||||
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
|
||||
$ok = false;
|
||||
}
|
||||
|
||||
return $ok;
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,258 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* The following code is adapted from the PEAR DB error handling code.
|
||||
* Portions (c)1997-2002 The PHP Group.
|
||||
*/
|
||||
|
||||
|
||||
if (!defined("DB_ERROR")) define("DB_ERROR",-1);
|
||||
|
||||
if (!defined("DB_ERROR_SYNTAX")) {
|
||||
define("DB_ERROR_SYNTAX", -2);
|
||||
define("DB_ERROR_CONSTRAINT", -3);
|
||||
define("DB_ERROR_NOT_FOUND", -4);
|
||||
define("DB_ERROR_ALREADY_EXISTS", -5);
|
||||
define("DB_ERROR_UNSUPPORTED", -6);
|
||||
define("DB_ERROR_MISMATCH", -7);
|
||||
define("DB_ERROR_INVALID", -8);
|
||||
define("DB_ERROR_NOT_CAPABLE", -9);
|
||||
define("DB_ERROR_TRUNCATED", -10);
|
||||
define("DB_ERROR_INVALID_NUMBER", -11);
|
||||
define("DB_ERROR_INVALID_DATE", -12);
|
||||
define("DB_ERROR_DIVZERO", -13);
|
||||
define("DB_ERROR_NODBSELECTED", -14);
|
||||
define("DB_ERROR_CANNOT_CREATE", -15);
|
||||
define("DB_ERROR_CANNOT_DELETE", -16);
|
||||
define("DB_ERROR_CANNOT_DROP", -17);
|
||||
define("DB_ERROR_NOSUCHTABLE", -18);
|
||||
define("DB_ERROR_NOSUCHFIELD", -19);
|
||||
define("DB_ERROR_NEED_MORE_DATA", -20);
|
||||
define("DB_ERROR_NOT_LOCKED", -21);
|
||||
define("DB_ERROR_VALUE_COUNT_ON_ROW", -22);
|
||||
define("DB_ERROR_INVALID_DSN", -23);
|
||||
define("DB_ERROR_CONNECT_FAILED", -24);
|
||||
define("DB_ERROR_EXTENSION_NOT_FOUND",-25);
|
||||
define("DB_ERROR_NOSUCHDB", -25);
|
||||
define("DB_ERROR_ACCESS_VIOLATION", -26);
|
||||
}
|
||||
|
||||
function adodb_errormsg($value)
|
||||
{
|
||||
global $ADODB_LANG,$ADODB_LANG_ARRAY;
|
||||
|
||||
if (empty($ADODB_LANG)) $ADODB_LANG = 'en';
|
||||
if (isset($ADODB_LANG_ARRAY['LANG']) && $ADODB_LANG_ARRAY['LANG'] == $ADODB_LANG) ;
|
||||
else {
|
||||
include_once(ADODB_DIR."/lang/adodb-$ADODB_LANG.inc.php");
|
||||
}
|
||||
return isset($ADODB_LANG_ARRAY[$value]) ? $ADODB_LANG_ARRAY[$value] : $ADODB_LANG_ARRAY[DB_ERROR];
|
||||
}
|
||||
|
||||
function adodb_error($provider,$dbType,$errno)
|
||||
{
|
||||
//var_dump($errno);
|
||||
if (is_numeric($errno) && $errno == 0) return 0;
|
||||
switch($provider) {
|
||||
case 'mysql': $map = adodb_error_mysql(); break;
|
||||
|
||||
case 'oracle':
|
||||
case 'oci8': $map = adodb_error_oci8(); break;
|
||||
|
||||
case 'ibase': $map = adodb_error_ibase(); break;
|
||||
|
||||
case 'odbc': $map = adodb_error_odbc(); break;
|
||||
|
||||
case 'mssql':
|
||||
case 'sybase': $map = adodb_error_mssql(); break;
|
||||
|
||||
case 'informix': $map = adodb_error_ifx(); break;
|
||||
|
||||
case 'postgres': return adodb_error_pg($errno); break;
|
||||
|
||||
case 'sqlite': return $map = adodb_error_sqlite(); break;
|
||||
default:
|
||||
return DB_ERROR;
|
||||
}
|
||||
//print_r($map);
|
||||
//var_dump($errno);
|
||||
if (isset($map[$errno])) return $map[$errno];
|
||||
return DB_ERROR;
|
||||
}
|
||||
|
||||
//**************************************************************************************
|
||||
|
||||
function adodb_error_pg($errormsg)
|
||||
{
|
||||
if (is_numeric($errormsg)) return (integer) $errormsg;
|
||||
static $error_regexps = array(
|
||||
'/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/i' => DB_ERROR_NOSUCHTABLE,
|
||||
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/i' => DB_ERROR_ALREADY_EXISTS,
|
||||
'/divide by zero$/i' => DB_ERROR_DIVZERO,
|
||||
'/pg_atoi: error in .*: can\'t parse /i' => DB_ERROR_INVALID_NUMBER,
|
||||
'/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/i' => DB_ERROR_NOSUCHFIELD,
|
||||
'/parser: parse error at or near \"/i' => DB_ERROR_SYNTAX,
|
||||
'/referential integrity violation/i' => DB_ERROR_CONSTRAINT,
|
||||
'/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/i'
|
||||
=> DB_ERROR_ALREADY_EXISTS
|
||||
);
|
||||
reset($error_regexps);
|
||||
while (list($regexp,$code) = each($error_regexps)) {
|
||||
if (preg_match($regexp, $errormsg)) {
|
||||
return $code;
|
||||
}
|
||||
}
|
||||
// Fall back to DB_ERROR if there was no mapping.
|
||||
return DB_ERROR;
|
||||
}
|
||||
|
||||
function adodb_error_odbc()
|
||||
{
|
||||
static $MAP = array(
|
||||
'01004' => DB_ERROR_TRUNCATED,
|
||||
'07001' => DB_ERROR_MISMATCH,
|
||||
'21S01' => DB_ERROR_MISMATCH,
|
||||
'21S02' => DB_ERROR_MISMATCH,
|
||||
'22003' => DB_ERROR_INVALID_NUMBER,
|
||||
'22008' => DB_ERROR_INVALID_DATE,
|
||||
'22012' => DB_ERROR_DIVZERO,
|
||||
'23000' => DB_ERROR_CONSTRAINT,
|
||||
'24000' => DB_ERROR_INVALID,
|
||||
'34000' => DB_ERROR_INVALID,
|
||||
'37000' => DB_ERROR_SYNTAX,
|
||||
'42000' => DB_ERROR_SYNTAX,
|
||||
'IM001' => DB_ERROR_UNSUPPORTED,
|
||||
'S0000' => DB_ERROR_NOSUCHTABLE,
|
||||
'S0001' => DB_ERROR_NOT_FOUND,
|
||||
'S0002' => DB_ERROR_NOSUCHTABLE,
|
||||
'S0011' => DB_ERROR_ALREADY_EXISTS,
|
||||
'S0012' => DB_ERROR_NOT_FOUND,
|
||||
'S0021' => DB_ERROR_ALREADY_EXISTS,
|
||||
'S0022' => DB_ERROR_NOT_FOUND,
|
||||
'S1000' => DB_ERROR_NOSUCHTABLE,
|
||||
'S1009' => DB_ERROR_INVALID,
|
||||
'S1090' => DB_ERROR_INVALID,
|
||||
'S1C00' => DB_ERROR_NOT_CAPABLE
|
||||
);
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_ibase()
|
||||
{
|
||||
static $MAP = array(
|
||||
-104 => DB_ERROR_SYNTAX,
|
||||
-150 => DB_ERROR_ACCESS_VIOLATION,
|
||||
-151 => DB_ERROR_ACCESS_VIOLATION,
|
||||
-155 => DB_ERROR_NOSUCHTABLE,
|
||||
-157 => DB_ERROR_NOSUCHFIELD,
|
||||
-158 => DB_ERROR_VALUE_COUNT_ON_ROW,
|
||||
-170 => DB_ERROR_MISMATCH,
|
||||
-171 => DB_ERROR_MISMATCH,
|
||||
-172 => DB_ERROR_INVALID,
|
||||
-204 => DB_ERROR_INVALID,
|
||||
-205 => DB_ERROR_NOSUCHFIELD,
|
||||
-206 => DB_ERROR_NOSUCHFIELD,
|
||||
-208 => DB_ERROR_INVALID,
|
||||
-219 => DB_ERROR_NOSUCHTABLE,
|
||||
-297 => DB_ERROR_CONSTRAINT,
|
||||
-530 => DB_ERROR_CONSTRAINT,
|
||||
-803 => DB_ERROR_CONSTRAINT,
|
||||
-551 => DB_ERROR_ACCESS_VIOLATION,
|
||||
-552 => DB_ERROR_ACCESS_VIOLATION,
|
||||
-922 => DB_ERROR_NOSUCHDB,
|
||||
-923 => DB_ERROR_CONNECT_FAILED,
|
||||
-924 => DB_ERROR_CONNECT_FAILED
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_ifx()
|
||||
{
|
||||
static $MAP = array(
|
||||
'-201' => DB_ERROR_SYNTAX,
|
||||
'-206' => DB_ERROR_NOSUCHTABLE,
|
||||
'-217' => DB_ERROR_NOSUCHFIELD,
|
||||
'-329' => DB_ERROR_NODBSELECTED,
|
||||
'-1204' => DB_ERROR_INVALID_DATE,
|
||||
'-1205' => DB_ERROR_INVALID_DATE,
|
||||
'-1206' => DB_ERROR_INVALID_DATE,
|
||||
'-1209' => DB_ERROR_INVALID_DATE,
|
||||
'-1210' => DB_ERROR_INVALID_DATE,
|
||||
'-1212' => DB_ERROR_INVALID_DATE
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_oci8()
|
||||
{
|
||||
static $MAP = array(
|
||||
1 => DB_ERROR_ALREADY_EXISTS,
|
||||
900 => DB_ERROR_SYNTAX,
|
||||
904 => DB_ERROR_NOSUCHFIELD,
|
||||
923 => DB_ERROR_SYNTAX,
|
||||
942 => DB_ERROR_NOSUCHTABLE,
|
||||
955 => DB_ERROR_ALREADY_EXISTS,
|
||||
1476 => DB_ERROR_DIVZERO,
|
||||
1722 => DB_ERROR_INVALID_NUMBER,
|
||||
2289 => DB_ERROR_NOSUCHTABLE,
|
||||
2291 => DB_ERROR_CONSTRAINT,
|
||||
2449 => DB_ERROR_CONSTRAINT
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_mssql()
|
||||
{
|
||||
static $MAP = array(
|
||||
208 => DB_ERROR_NOSUCHTABLE,
|
||||
2601 => DB_ERROR_ALREADY_EXISTS
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_sqlite()
|
||||
{
|
||||
static $MAP = array(
|
||||
1 => DB_ERROR_SYNTAX
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
|
||||
function adodb_error_mysql()
|
||||
{
|
||||
static $MAP = array(
|
||||
1004 => DB_ERROR_CANNOT_CREATE,
|
||||
1005 => DB_ERROR_CANNOT_CREATE,
|
||||
1006 => DB_ERROR_CANNOT_CREATE,
|
||||
1007 => DB_ERROR_ALREADY_EXISTS,
|
||||
1008 => DB_ERROR_CANNOT_DROP,
|
||||
1045 => DB_ERROR_ACCESS_VIOLATION,
|
||||
1046 => DB_ERROR_NODBSELECTED,
|
||||
1049 => DB_ERROR_NOSUCHDB,
|
||||
1050 => DB_ERROR_ALREADY_EXISTS,
|
||||
1051 => DB_ERROR_NOSUCHTABLE,
|
||||
1054 => DB_ERROR_NOSUCHFIELD,
|
||||
1062 => DB_ERROR_ALREADY_EXISTS,
|
||||
1064 => DB_ERROR_SYNTAX,
|
||||
1100 => DB_ERROR_NOT_LOCKED,
|
||||
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
|
||||
1146 => DB_ERROR_NOSUCHTABLE,
|
||||
1048 => DB_ERROR_CONSTRAINT,
|
||||
2002 => DB_ERROR_CONNECT_FAILED,
|
||||
2005 => DB_ERROR_CONNECT_FAILED
|
||||
);
|
||||
|
||||
return $MAP;
|
||||
}
|
||||
?>
|
||||
@@ -1,79 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// added Claudio Bustos clbustos#entelchile.net
|
||||
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
|
||||
|
||||
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_Handler');
|
||||
|
||||
/**
|
||||
* Default Error Handler. This will be called with the following params
|
||||
*
|
||||
* @param $dbms the RDBMS you are connecting to
|
||||
* @param $fn the name of the calling function (in uppercase)
|
||||
* @param $errno the native error number from the database
|
||||
* @param $errmsg the native error msg from the database
|
||||
* @param $p1 $fn specific parameter - see below
|
||||
* @param $p2 $fn specific parameter - see below
|
||||
* @param $thisConn $current connection object - can be false if no connection object created
|
||||
*/
|
||||
function ADODB_Error_Handler($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
|
||||
{
|
||||
if (error_reporting() == 0) return; // obey @ protocol
|
||||
switch($fn) {
|
||||
case 'EXECUTE':
|
||||
$sql = $p1;
|
||||
$inputparams = $p2;
|
||||
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")\n";
|
||||
break;
|
||||
|
||||
case 'PCONNECT':
|
||||
case 'CONNECT':
|
||||
$host = $p1;
|
||||
$database = $p2;
|
||||
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn($host, '****', '****', $database)\n";
|
||||
break;
|
||||
default:
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* Log connection error somewhere
|
||||
* 0 message is sent to PHP's system logger, using the Operating System's system
|
||||
* logging mechanism or a file, depending on what the error_log configuration
|
||||
* directive is set to.
|
||||
* 1 message is sent by email to the address in the destination parameter.
|
||||
* This is the only message type where the fourth parameter, extra_headers is used.
|
||||
* This message type uses the same internal function as mail() does.
|
||||
* 2 message is sent through the PHP debugging connection.
|
||||
* This option is only available if remote debugging has been enabled.
|
||||
* In this case, the destination parameter specifies the host name or IP address
|
||||
* and optionally, port number, of the socket receiving the debug information.
|
||||
* 3 message is appended to the file destination
|
||||
*/
|
||||
if (defined('ADODB_ERROR_LOG_TYPE')) {
|
||||
$t = date('Y-m-d H:i:s');
|
||||
if (defined('ADODB_ERROR_LOG_DEST'))
|
||||
error_log("($t) $s", ADODB_ERROR_LOG_TYPE, ADODB_ERROR_LOG_DEST);
|
||||
else
|
||||
error_log("($t) $s", ADODB_ERROR_LOG_TYPE);
|
||||
}
|
||||
|
||||
|
||||
//print "<p>$s</p>";
|
||||
trigger_error($s,ADODB_ERROR_HANDLER_TYPE);
|
||||
}
|
||||
?>
|
||||
@@ -1,88 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
*/
|
||||
include_once('PEAR.php');
|
||||
|
||||
if (!defined('ADODB_ERROR_HANDLER')) define('ADODB_ERROR_HANDLER','ADODB_Error_PEAR');
|
||||
|
||||
/*
|
||||
* Enabled the following if you want to terminate scripts when an error occurs
|
||||
*/
|
||||
//PEAR::setErrorHandling (PEAR_ERROR_DIE);
|
||||
|
||||
/*
|
||||
* Name of the PEAR_Error derived class to call.
|
||||
*/
|
||||
if (!defined('ADODB_PEAR_ERROR_CLASS')) define('ADODB_PEAR_ERROR_CLASS','PEAR_Error');
|
||||
|
||||
/*
|
||||
* Store the last PEAR_Error object here
|
||||
*/
|
||||
global $ADODB_Last_PEAR_Error; $ADODB_Last_PEAR_Error = false;
|
||||
|
||||
/**
|
||||
* Error Handler with PEAR support. This will be called with the following params
|
||||
*
|
||||
* @param $dbms the RDBMS you are connecting to
|
||||
* @param $fn the name of the calling function (in uppercase)
|
||||
* @param $errno the native error number from the database
|
||||
* @param $errmsg the native error msg from the database
|
||||
* @param $p1 $fn specific parameter - see below
|
||||
* @param $P2 $fn specific parameter - see below
|
||||
*/
|
||||
function ADODB_Error_PEAR($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false)
|
||||
{
|
||||
global $ADODB_Last_PEAR_Error;
|
||||
|
||||
if (error_reporting() == 0) return; // obey @ protocol
|
||||
switch($fn) {
|
||||
case 'EXECUTE':
|
||||
$sql = $p1;
|
||||
$inputparams = $p2;
|
||||
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$sql\")";
|
||||
break;
|
||||
|
||||
case 'PCONNECT':
|
||||
case 'CONNECT':
|
||||
$host = $p1;
|
||||
$database = $p2;
|
||||
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn('$host', ?, ?, '$database')";
|
||||
break;
|
||||
|
||||
default:
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)";
|
||||
break;
|
||||
}
|
||||
|
||||
$class = ADODB_PEAR_ERROR_CLASS;
|
||||
$ADODB_Last_PEAR_Error = new $class($s, $errno,
|
||||
$GLOBALS['_PEAR_default_error_mode'],
|
||||
$GLOBALS['_PEAR_default_error_options'],
|
||||
$errmsg);
|
||||
|
||||
//print "<p>!$s</p>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns last PEAR_Error object. This error might be for an error that
|
||||
* occured several sql statements ago.
|
||||
*/
|
||||
function ADODB_PEAR_Error()
|
||||
{
|
||||
global $ADODB_Last_PEAR_Error;
|
||||
|
||||
return $ADODB_Last_PEAR_Error;
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,82 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @version V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
* Exception-handling code using PHP5 exceptions (try-catch-throw).
|
||||
*/
|
||||
|
||||
|
||||
if (!defined('ADODB_ERROR_HANDLER_TYPE')) define('ADODB_ERROR_HANDLER_TYPE',E_USER_ERROR);
|
||||
define('ADODB_ERROR_HANDLER','adodb_throw');
|
||||
|
||||
class ADODB_Exception extends Exception {
|
||||
var $dbms;
|
||||
var $fn;
|
||||
var $sql = '';
|
||||
var $params = '';
|
||||
var $host = '';
|
||||
var $database = '';
|
||||
|
||||
function __construct($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
|
||||
{
|
||||
switch($fn) {
|
||||
case 'EXECUTE':
|
||||
$this->sql = $p1;
|
||||
$this->params = $p2;
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn(\"$p1\")\n";
|
||||
break;
|
||||
|
||||
case 'PCONNECT':
|
||||
case 'CONNECT':
|
||||
$user = $thisConnection->user;
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, '$user', '****', $p2)\n";
|
||||
break;
|
||||
default:
|
||||
$s = "$dbms error: [$errno: $errmsg] in $fn($p1, $p2)\n";
|
||||
break;
|
||||
}
|
||||
|
||||
$this->dbms = $dbms;
|
||||
if ($thisConnection) {
|
||||
$this->host = $thisConnection->host;
|
||||
$this->database = $thisConnection->database;
|
||||
}
|
||||
$this->fn = $fn;
|
||||
$this->msg = $errmsg;
|
||||
|
||||
if (!is_numeric($errno)) $errno = -1;
|
||||
parent::__construct($s,$errno);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Default Error Handler. This will be called with the following params
|
||||
*
|
||||
* @param $dbms the RDBMS you are connecting to
|
||||
* @param $fn the name of the calling function (in uppercase)
|
||||
* @param $errno the native error number from the database
|
||||
* @param $errmsg the native error msg from the database
|
||||
* @param $p1 $fn specific parameter - see below
|
||||
* @param $P2 $fn specific parameter - see below
|
||||
*/
|
||||
|
||||
function adodb_throw($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection)
|
||||
{
|
||||
global $ADODB_EXCEPTION;
|
||||
|
||||
if (error_reporting() == 0) return; // obey @ protocol
|
||||
if (is_string($ADODB_EXCEPTION)) $errfn = $ADODB_EXCEPTION;
|
||||
else $errfn = 'ADODB_EXCEPTION';
|
||||
throw new $errfn($dbms, $fn, $errno, $errmsg, $p1, $p2, $thisConnection);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4.
|
||||
|
||||
Declares the ADODB Base Class for PHP5 "ADODB_BASE_RS", and supports iteration with
|
||||
the ADODB_Iterator class.
|
||||
|
||||
$rs = $db->Execute("select * from adoxyz");
|
||||
foreach($rs as $k => $v) {
|
||||
echo $k; print_r($v); echo "<br>";
|
||||
}
|
||||
|
||||
|
||||
Iterator code based on http://cvs.php.net/cvs.php/php-src/ext/spl/examples/cachingiterator.inc?login=2
|
||||
|
||||
|
||||
Moved to adodb.inc.php to improve performance.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,190 +0,0 @@
|
||||
<?php
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
global $ADODB_INCLUDED_MEMCACHE;
|
||||
$ADODB_INCLUDED_MEMCACHE = 1;
|
||||
|
||||
global $ADODB_INCLUDED_CSV;
|
||||
if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
|
||||
|
||||
/*
|
||||
|
||||
V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Usage:
|
||||
|
||||
$db = NewADOConnection($driver);
|
||||
$db->memCache = true; /// should we use memCache instead of caching in files
|
||||
$db->memCacheHost = array($ip1, $ip2, $ip3);
|
||||
$db->memCachePort = 11211; /// this is default memCache port
|
||||
$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
|
||||
|
||||
$db->Connect(...);
|
||||
$db->CacheExecute($sql);
|
||||
|
||||
Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect.
|
||||
|
||||
Class instance is stored in $ADODB_CACHE
|
||||
*/
|
||||
|
||||
class ADODB_Cache_MemCache {
|
||||
var $createdir = false; // create caching directory structure?
|
||||
|
||||
//-----------------------------
|
||||
// memcache specific variables
|
||||
|
||||
var $hosts; // array of hosts
|
||||
var $port = 11211;
|
||||
var $compress = false; // memcache compression with zlib
|
||||
|
||||
var $_connected = false;
|
||||
var $_memcache = false;
|
||||
|
||||
function ADODB_Cache_MemCache(&$obj)
|
||||
{
|
||||
$this->hosts = $obj->memCacheHost;
|
||||
$this->port = $obj->memCachePort;
|
||||
$this->compress = $obj->memCacheCompress;
|
||||
}
|
||||
|
||||
// implement as lazy connection. The connection only occurs on CacheExecute call
|
||||
function connect(&$err)
|
||||
{
|
||||
if (!function_exists('memcache_pconnect')) {
|
||||
$err = 'Memcache module PECL extension not found!';
|
||||
return false;
|
||||
}
|
||||
|
||||
$memcache = new MemCache;
|
||||
|
||||
if (!is_array($this->hosts)) $this->hosts = array($this->hosts);
|
||||
|
||||
$failcnt = 0;
|
||||
foreach($this->hosts as $host) {
|
||||
if (!@$memcache->addServer($host,$this->port,true)) {
|
||||
$failcnt += 1;
|
||||
}
|
||||
}
|
||||
if ($failcnt == sizeof($this->hosts)) {
|
||||
$err = 'Can\'t connect to any memcache server';
|
||||
return false;
|
||||
}
|
||||
$this->_connected = true;
|
||||
$this->_memcache = $memcache;
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false. true if successful save
|
||||
function writecache($filename, $contents, $debug, $secs2cache)
|
||||
{
|
||||
if (!$this->_connected) {
|
||||
$err = '';
|
||||
if (!$this->connect($err) && $debug) ADOConnection::outp($err);
|
||||
}
|
||||
if (!$this->_memcache) return false;
|
||||
|
||||
if (!$this->_memcache->set($filename, $contents, $this->compress, $secs2cache)) {
|
||||
if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns a recordset
|
||||
function readcache($filename, &$err, $secs2cache, $rsClass)
|
||||
{
|
||||
$false = false;
|
||||
if (!$this->_connected) $this->connect($err);
|
||||
if (!$this->_memcache) return $false;
|
||||
|
||||
$rs = $this->_memcache->get($filename);
|
||||
if (!$rs) {
|
||||
$err = 'Item with such key doesn\'t exists on the memcached server.';
|
||||
return $false;
|
||||
}
|
||||
|
||||
// hack, should actually use _csv2rs
|
||||
$rs = explode("\n", $rs);
|
||||
unset($rs[0]);
|
||||
$rs = join("\n", $rs);
|
||||
$rs = unserialize($rs);
|
||||
if (! is_object($rs)) {
|
||||
$err = 'Unable to unserialize $rs';
|
||||
return $false;
|
||||
}
|
||||
if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere
|
||||
|
||||
$tdiff = intval($rs->timeCreated+$secs2cache - time());
|
||||
if ($tdiff <= 2) {
|
||||
switch($tdiff) {
|
||||
case 2:
|
||||
if ((rand() & 15) == 0) {
|
||||
$err = "Timeout 2";
|
||||
return $false;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if ((rand() & 3) == 0) {
|
||||
$err = "Timeout 1";
|
||||
return $false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$err = "Timeout 0";
|
||||
return $false;
|
||||
}
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
function flushall($debug=false)
|
||||
{
|
||||
if (!$this->_connected) {
|
||||
$err = '';
|
||||
if (!$this->connect($err) && $debug) ADOConnection::outp($err);
|
||||
}
|
||||
if (!$this->_memcache) return false;
|
||||
|
||||
$del = $this->_memcache->flush();
|
||||
|
||||
if ($debug)
|
||||
if (!$del) ADOConnection::outp("flushall: failed!<br>\n");
|
||||
else ADOConnection::outp("flushall: succeeded!<br>\n");
|
||||
|
||||
return $del;
|
||||
}
|
||||
|
||||
function flushcache($filename, $debug=false)
|
||||
{
|
||||
if (!$this->_connected) {
|
||||
$err = '';
|
||||
if (!$this->connect($err) && $debug) ADOConnection::outp($err);
|
||||
}
|
||||
if (!$this->_memcache) return false;
|
||||
|
||||
$del = $this->_memcache->delete($filename);
|
||||
|
||||
if ($debug)
|
||||
if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!<br>\n");
|
||||
else ADOConnection::outp("flushcache: $key entry flushed from memcached server!<br>\n");
|
||||
|
||||
return $del;
|
||||
}
|
||||
|
||||
// not used for memcache
|
||||
function createdir($dir, $hash)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,297 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
This class provides recordset pagination with
|
||||
First/Prev/Next/Last links.
|
||||
|
||||
Feel free to modify this class for your own use as
|
||||
it is very basic. To learn how to use it, see the
|
||||
example in adodb/tests/testpaging.php.
|
||||
|
||||
"Pablo Costa" <pablo@cbsp.com.br> implemented Render_PageLinks().
|
||||
|
||||
Please note, this class is entirely unsupported,
|
||||
and no free support requests except for bug reports
|
||||
will be entertained by the author.
|
||||
|
||||
*/
|
||||
class ADODB_Pager {
|
||||
var $id; // unique id for pager (defaults to 'adodb')
|
||||
var $db; // ADODB connection object
|
||||
var $sql; // sql used
|
||||
var $rs; // recordset generated
|
||||
var $curr_page; // current page number before Render() called, calculated in constructor
|
||||
var $rows; // number of rows per page
|
||||
var $linksPerPage=10; // number of links per page in navigation bar
|
||||
var $showPageLinks;
|
||||
|
||||
var $gridAttributes = 'width=100% border=1 bgcolor=white';
|
||||
|
||||
// Localize text strings here
|
||||
var $first = '<code>|<</code>';
|
||||
var $prev = '<code><<</code>';
|
||||
var $next = '<code>>></code>';
|
||||
var $last = '<code>>|</code>';
|
||||
var $moreLinks = '...';
|
||||
var $startLinks = '...';
|
||||
var $gridHeader = false;
|
||||
var $htmlSpecialChars = true;
|
||||
var $page = 'Page';
|
||||
var $linkSelectedColor = 'red';
|
||||
var $cache = 0; #secs to cache with CachePageExecute()
|
||||
|
||||
//----------------------------------------------
|
||||
// constructor
|
||||
//
|
||||
// $db adodb connection object
|
||||
// $sql sql statement
|
||||
// $id optional id to identify which pager,
|
||||
// if you have multiple on 1 page.
|
||||
// $id should be only be [a-z0-9]*
|
||||
//
|
||||
function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
|
||||
{
|
||||
global $PHP_SELF;
|
||||
|
||||
$curr_page = $id.'_curr_page';
|
||||
if (!empty($PHP_SELF)) $PHP_SELF = htmlspecialchars($_SERVER['PHP_SELF']); // htmlspecialchars() to prevent XSS attacks
|
||||
|
||||
$this->sql = $sql;
|
||||
$this->id = $id;
|
||||
$this->db = $db;
|
||||
$this->showPageLinks = $showPageLinks;
|
||||
|
||||
$next_page = $id.'_next_page';
|
||||
|
||||
if (isset($_GET[$next_page])) {
|
||||
$_SESSION[$curr_page] = (integer) $_GET[$next_page];
|
||||
}
|
||||
if (empty($_SESSION[$curr_page])) $_SESSION[$curr_page] = 1; ## at first page
|
||||
|
||||
$this->curr_page = $_SESSION[$curr_page];
|
||||
|
||||
}
|
||||
|
||||
//---------------------------
|
||||
// Display link to first page
|
||||
function Render_First($anchor=true)
|
||||
{
|
||||
global $PHP_SELF;
|
||||
if ($anchor) {
|
||||
?>
|
||||
<a href="<?php echo $PHP_SELF,'?',$this->id;?>_next_page=1"><?php echo $this->first;?></a>
|
||||
|
||||
<?php
|
||||
} else {
|
||||
print "$this->first ";
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------
|
||||
// Display link to next page
|
||||
function render_next($anchor=true)
|
||||
{
|
||||
global $PHP_SELF;
|
||||
|
||||
if ($anchor) {
|
||||
?>
|
||||
<a
|
||||
href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() + 1 ?>"><?php echo $this->next;?></a>
|
||||
|
||||
<?php
|
||||
} else {
|
||||
print "$this->next ";
|
||||
}
|
||||
}
|
||||
|
||||
//------------------
|
||||
// Link to last page
|
||||
//
|
||||
// for better performance with large recordsets, you can set
|
||||
// $this->db->pageExecuteCountRows = false, which disables
|
||||
// last page counting.
|
||||
function render_last($anchor=true)
|
||||
{
|
||||
global $PHP_SELF;
|
||||
|
||||
if (!$this->db->pageExecuteCountRows) return;
|
||||
|
||||
if ($anchor) {
|
||||
?>
|
||||
<a
|
||||
href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->LastPageNo() ?>"><?php echo $this->last;?></a>
|
||||
|
||||
<?php
|
||||
} else {
|
||||
print "$this->last ";
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------
|
||||
// original code by "Pablo Costa" <pablo@cbsp.com.br>
|
||||
function render_pagelinks()
|
||||
{
|
||||
global $PHP_SELF;
|
||||
$pages = $this->rs->LastPageNo();
|
||||
$linksperpage = $this->linksPerPage ? $this->linksPerPage : $pages;
|
||||
for($i=1; $i <= $pages; $i+=$linksperpage)
|
||||
{
|
||||
if($this->rs->AbsolutePage() >= $i)
|
||||
{
|
||||
$start = $i;
|
||||
}
|
||||
}
|
||||
$numbers = '';
|
||||
$end = $start+$linksperpage-1;
|
||||
$link = $this->id . "_next_page";
|
||||
if($end > $pages) $end = $pages;
|
||||
|
||||
|
||||
if ($this->startLinks && $start > 1) {
|
||||
$pos = $start - 1;
|
||||
$numbers .= "<a href=$PHP_SELF?$link=$pos>$this->startLinks</a> ";
|
||||
}
|
||||
|
||||
for($i=$start; $i <= $end; $i++) {
|
||||
if ($this->rs->AbsolutePage() == $i)
|
||||
$numbers .= "<font color=$this->linkSelectedColor><b>$i</b></font> ";
|
||||
else
|
||||
$numbers .= "<a href=$PHP_SELF?$link=$i>$i</a> ";
|
||||
|
||||
}
|
||||
if ($this->moreLinks && $end < $pages)
|
||||
$numbers .= "<a href=$PHP_SELF?$link=$i>$this->moreLinks</a> ";
|
||||
print $numbers . ' ';
|
||||
}
|
||||
// Link to previous page
|
||||
function render_prev($anchor=true)
|
||||
{
|
||||
global $PHP_SELF;
|
||||
if ($anchor) {
|
||||
?>
|
||||
<a
|
||||
href="<?php echo $PHP_SELF,'?',$this->id,'_next_page=',$this->rs->AbsolutePage() - 1 ?>"><?php echo $this->prev;?></a>
|
||||
|
||||
<?php
|
||||
} else {
|
||||
print "$this->prev ";
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------
|
||||
// Simply rendering of grid. You should override this for
|
||||
// better control over the format of the grid
|
||||
//
|
||||
// We use output buffering to keep code clean and readable.
|
||||
function RenderGrid()
|
||||
{
|
||||
global $gSQLBlockRows; // used by rs2html to indicate how many rows to display
|
||||
include_once(ADODB_DIR.'/tohtml.inc.php');
|
||||
ob_start();
|
||||
$gSQLBlockRows = $this->rows;
|
||||
rs2html($this->rs,$this->gridAttributes,$this->gridHeader,$this->htmlSpecialChars);
|
||||
$s = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $s;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------
|
||||
// Navigation bar
|
||||
//
|
||||
// we use output buffering to keep the code easy to read.
|
||||
function RenderNav()
|
||||
{
|
||||
ob_start();
|
||||
if (!$this->rs->AtFirstPage()) {
|
||||
$this->Render_First();
|
||||
$this->Render_Prev();
|
||||
} else {
|
||||
$this->Render_First(false);
|
||||
$this->Render_Prev(false);
|
||||
}
|
||||
if ($this->showPageLinks){
|
||||
$this->Render_PageLinks();
|
||||
}
|
||||
if (!$this->rs->AtLastPage()) {
|
||||
$this->Render_Next();
|
||||
$this->Render_Last();
|
||||
} else {
|
||||
$this->Render_Next(false);
|
||||
$this->Render_Last(false);
|
||||
}
|
||||
$s = ob_get_contents();
|
||||
ob_end_clean();
|
||||
return $s;
|
||||
}
|
||||
|
||||
//-------------------
|
||||
// This is the footer
|
||||
function RenderPageCount()
|
||||
{
|
||||
if (!$this->db->pageExecuteCountRows) return '';
|
||||
$lastPage = $this->rs->LastPageNo();
|
||||
if ($lastPage == -1) $lastPage = 1; // check for empty rs.
|
||||
if ($this->curr_page > $lastPage) $this->curr_page = 1;
|
||||
return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";
|
||||
}
|
||||
|
||||
//-----------------------------------
|
||||
// Call this class to draw everything.
|
||||
function Render($rows=10)
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
|
||||
$this->rows = $rows;
|
||||
|
||||
if ($this->db->dataProvider == 'informix') $this->db->cursorType = IFX_SCROLL;
|
||||
|
||||
$savec = $ADODB_COUNTRECS;
|
||||
if ($this->db->pageExecuteCountRows) $ADODB_COUNTRECS = true;
|
||||
if ($this->cache)
|
||||
$rs = $this->db->CachePageExecute($this->cache,$this->sql,$rows,$this->curr_page);
|
||||
else
|
||||
$rs = $this->db->PageExecute($this->sql,$rows,$this->curr_page);
|
||||
$ADODB_COUNTRECS = $savec;
|
||||
|
||||
$this->rs = $rs;
|
||||
if (!$rs) {
|
||||
print "<h3>Query failed: $this->sql</h3>";
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
|
||||
$header = $this->RenderNav();
|
||||
else
|
||||
$header = " ";
|
||||
|
||||
$grid = $this->RenderGrid();
|
||||
$footer = $this->RenderPageCount();
|
||||
|
||||
$this->RenderLayout($header,$grid,$footer);
|
||||
|
||||
$rs->Close();
|
||||
$this->rs = false;
|
||||
}
|
||||
|
||||
//------------------------------------------------------
|
||||
// override this to control overall layout and formating
|
||||
function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
|
||||
{
|
||||
echo "<table ".$attributes."><tr><td>",
|
||||
$header,
|
||||
"</td></tr><tr><td>",
|
||||
$grid,
|
||||
"</td></tr><tr><td>",
|
||||
$footer,
|
||||
"</td></tr></table>";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,374 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* PEAR DB Emulation Layer for ADODB.
|
||||
*
|
||||
* The following code is modelled on PEAR DB code by Stig Bakken <ssb@fast.no> |
|
||||
* and Tomas V.V.Cox <cox@idecnet.com>. Portions (c)1997-2002 The PHP Group.
|
||||
*/
|
||||
|
||||
/*
|
||||
We support:
|
||||
|
||||
DB_Common
|
||||
---------
|
||||
query - returns PEAR_Error on error
|
||||
limitQuery - return PEAR_Error on error
|
||||
prepare - does not return PEAR_Error on error
|
||||
execute - does not return PEAR_Error on error
|
||||
setFetchMode - supports ASSOC and ORDERED
|
||||
errorNative
|
||||
quote
|
||||
nextID
|
||||
disconnect
|
||||
|
||||
getOne
|
||||
getAssoc
|
||||
getRow
|
||||
getCol
|
||||
getAll
|
||||
|
||||
DB_Result
|
||||
---------
|
||||
numRows - returns -1 if not supported
|
||||
numCols
|
||||
fetchInto - does not support passing of fetchmode
|
||||
fetchRows - does not support passing of fetchmode
|
||||
free
|
||||
*/
|
||||
|
||||
define('ADODB_PEAR',dirname(__FILE__));
|
||||
include_once "PEAR.php";
|
||||
include_once ADODB_PEAR."/adodb-errorpear.inc.php";
|
||||
include_once ADODB_PEAR."/adodb.inc.php";
|
||||
|
||||
if (!defined('DB_OK')) {
|
||||
define("DB_OK", 1);
|
||||
define("DB_ERROR",-1);
|
||||
|
||||
// autoExecute constants
|
||||
define('DB_AUTOQUERY_INSERT', 1);
|
||||
define('DB_AUTOQUERY_UPDATE', 2);
|
||||
|
||||
/**
|
||||
* This is a special constant that tells DB the user hasn't specified
|
||||
* any particular get mode, so the default should be used.
|
||||
*/
|
||||
|
||||
define('DB_FETCHMODE_DEFAULT', 0);
|
||||
|
||||
/**
|
||||
* Column data indexed by numbers, ordered from 0 and up
|
||||
*/
|
||||
|
||||
define('DB_FETCHMODE_ORDERED', 1);
|
||||
|
||||
/**
|
||||
* Column data indexed by column names
|
||||
*/
|
||||
|
||||
define('DB_FETCHMODE_ASSOC', 2);
|
||||
|
||||
/* for compatibility */
|
||||
|
||||
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
|
||||
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
|
||||
|
||||
/**
|
||||
* these are constants for the tableInfo-function
|
||||
* they are bitwised or'ed. so if there are more constants to be defined
|
||||
* in the future, adjust DB_TABLEINFO_FULL accordingly
|
||||
*/
|
||||
|
||||
define('DB_TABLEINFO_ORDER', 1);
|
||||
define('DB_TABLEINFO_ORDERTABLE', 2);
|
||||
define('DB_TABLEINFO_FULL', 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* The main "DB" class is simply a container class with some static
|
||||
* methods for creating DB objects as well as some utility functions
|
||||
* common to all parts of DB.
|
||||
*
|
||||
*/
|
||||
|
||||
class DB
|
||||
{
|
||||
/**
|
||||
* Create a new DB object for the specified database type
|
||||
*
|
||||
* @param $type string database type, for example "mysql"
|
||||
*
|
||||
* @return object a newly created DB object, or a DB error code on
|
||||
* error
|
||||
*/
|
||||
|
||||
function factory($type)
|
||||
{
|
||||
include_once(ADODB_DIR."/drivers/adodb-$type.inc.php");
|
||||
$obj = NewADOConnection($type);
|
||||
if (!is_object($obj)) $obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new DB object and connect to the specified database
|
||||
*
|
||||
* @param $dsn mixed "data source name", see the DB::parseDSN
|
||||
* method for a description of the dsn format. Can also be
|
||||
* specified as an array of the format returned by DB::parseDSN.
|
||||
*
|
||||
* @param $options mixed if boolean (or scalar), tells whether
|
||||
* this connection should be persistent (for backends that support
|
||||
* this). This parameter can also be an array of options, see
|
||||
* DB_common::setOption for more information on connection
|
||||
* options.
|
||||
*
|
||||
* @return object a newly created DB connection object, or a DB
|
||||
* error object on error
|
||||
*
|
||||
* @see DB::parseDSN
|
||||
* @see DB::isError
|
||||
*/
|
||||
function connect($dsn, $options = false)
|
||||
{
|
||||
if (is_array($dsn)) {
|
||||
$dsninfo = $dsn;
|
||||
} else {
|
||||
$dsninfo = DB::parseDSN($dsn);
|
||||
}
|
||||
switch ($dsninfo["phptype"]) {
|
||||
case 'pgsql': $type = 'postgres7'; break;
|
||||
case 'ifx': $type = 'informix9'; break;
|
||||
default: $type = $dsninfo["phptype"]; break;
|
||||
}
|
||||
|
||||
if (is_array($options) && isset($options["debug"]) &&
|
||||
$options["debug"] >= 2) {
|
||||
// expose php errors with sufficient debug level
|
||||
@include_once("adodb-$type.inc.php");
|
||||
} else {
|
||||
@include_once("adodb-$type.inc.php");
|
||||
}
|
||||
|
||||
@$obj = NewADOConnection($type);
|
||||
if (!is_object($obj)) {
|
||||
$obj = new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1);
|
||||
return $obj;
|
||||
}
|
||||
if (is_array($options)) {
|
||||
foreach($options as $k => $v) {
|
||||
switch(strtolower($k)) {
|
||||
case 'persist':
|
||||
case 'persistent': $persist = $v; break;
|
||||
#ibase
|
||||
case 'dialect': $obj->dialect = $v; break;
|
||||
case 'charset': $obj->charset = $v; break;
|
||||
case 'buffers': $obj->buffers = $v; break;
|
||||
#ado
|
||||
case 'charpage': $obj->charPage = $v; break;
|
||||
#mysql
|
||||
case 'clientflags': $obj->clientFlags = $v; break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$persist = false;
|
||||
}
|
||||
|
||||
if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket'];
|
||||
else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port'];
|
||||
|
||||
if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
|
||||
else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']);
|
||||
|
||||
if (!$ok) $obj = ADODB_PEAR_Error();
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the DB API version
|
||||
*
|
||||
* @return int the DB API version number
|
||||
*/
|
||||
function apiVersion()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell whether a result code from a DB method is an error
|
||||
*
|
||||
* @param $value int result code
|
||||
*
|
||||
* @return bool whether $value is an error
|
||||
*/
|
||||
function isError($value)
|
||||
{
|
||||
if (!is_object($value)) return false;
|
||||
$class = strtolower(get_class($value));
|
||||
return $class == 'pear_error' || is_subclass_of($value, 'pear_error') ||
|
||||
$class == 'db_error' || is_subclass_of($value, 'db_error');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tell whether a result code from a DB method is a warning.
|
||||
* Warnings differ from errors in that they are generated by DB,
|
||||
* and are not fatal.
|
||||
*
|
||||
* @param $value mixed result value
|
||||
*
|
||||
* @return bool whether $value is a warning
|
||||
*/
|
||||
function isWarning($value)
|
||||
{
|
||||
return false;
|
||||
/*
|
||||
return is_object($value) &&
|
||||
(get_class( $value ) == "db_warning" ||
|
||||
is_subclass_of($value, "db_warning"));*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a data source name
|
||||
*
|
||||
* @param $dsn string Data Source Name to be parsed
|
||||
*
|
||||
* @return array an associative array with the following keys:
|
||||
*
|
||||
* phptype: Database backend used in PHP (mysql, odbc etc.)
|
||||
* dbsyntax: Database used with regards to SQL syntax etc.
|
||||
* protocol: Communication protocol to use (tcp, unix etc.)
|
||||
* hostspec: Host specification (hostname[:port])
|
||||
* database: Database to use on the DBMS server
|
||||
* username: User name for login
|
||||
* password: Password for login
|
||||
*
|
||||
* The format of the supplied DSN is in its fullest form:
|
||||
*
|
||||
* phptype(dbsyntax)://username:password@protocol+hostspec/database
|
||||
*
|
||||
* Most variations are allowed:
|
||||
*
|
||||
* phptype://username:password@protocol+hostspec:110//usr/db_file.db
|
||||
* phptype://username:password@hostspec/database_name
|
||||
* phptype://username:password@hostspec
|
||||
* phptype://username@hostspec
|
||||
* phptype://hostspec/database
|
||||
* phptype://hostspec
|
||||
* phptype(dbsyntax)
|
||||
* phptype
|
||||
*
|
||||
* @author Tomas V.V.Cox <cox@idecnet.com>
|
||||
*/
|
||||
function parseDSN($dsn)
|
||||
{
|
||||
if (is_array($dsn)) {
|
||||
return $dsn;
|
||||
}
|
||||
|
||||
$parsed = array(
|
||||
'phptype' => false,
|
||||
'dbsyntax' => false,
|
||||
'protocol' => false,
|
||||
'hostspec' => false,
|
||||
'database' => false,
|
||||
'username' => false,
|
||||
'password' => false
|
||||
);
|
||||
|
||||
// Find phptype and dbsyntax
|
||||
if (($pos = strpos($dsn, '://')) !== false) {
|
||||
$str = substr($dsn, 0, $pos);
|
||||
$dsn = substr($dsn, $pos + 3);
|
||||
} else {
|
||||
$str = $dsn;
|
||||
$dsn = NULL;
|
||||
}
|
||||
|
||||
// Get phptype and dbsyntax
|
||||
// $str => phptype(dbsyntax)
|
||||
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
|
||||
$parsed['phptype'] = $arr[1];
|
||||
$parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2];
|
||||
} else {
|
||||
$parsed['phptype'] = $str;
|
||||
$parsed['dbsyntax'] = $str;
|
||||
}
|
||||
|
||||
if (empty($dsn)) {
|
||||
return $parsed;
|
||||
}
|
||||
|
||||
// Get (if found): username and password
|
||||
// $dsn => username:password@protocol+hostspec/database
|
||||
if (($at = strpos($dsn,'@')) !== false) {
|
||||
$str = substr($dsn, 0, $at);
|
||||
$dsn = substr($dsn, $at + 1);
|
||||
if (($pos = strpos($str, ':')) !== false) {
|
||||
$parsed['username'] = urldecode(substr($str, 0, $pos));
|
||||
$parsed['password'] = urldecode(substr($str, $pos + 1));
|
||||
} else {
|
||||
$parsed['username'] = urldecode($str);
|
||||
}
|
||||
}
|
||||
|
||||
// Find protocol and hostspec
|
||||
// $dsn => protocol+hostspec/database
|
||||
if (($pos=strpos($dsn, '/')) !== false) {
|
||||
$str = substr($dsn, 0, $pos);
|
||||
$dsn = substr($dsn, $pos + 1);
|
||||
} else {
|
||||
$str = $dsn;
|
||||
$dsn = NULL;
|
||||
}
|
||||
|
||||
// Get protocol + hostspec
|
||||
// $str => protocol+hostspec
|
||||
if (($pos=strpos($str, '+')) !== false) {
|
||||
$parsed['protocol'] = substr($str, 0, $pos);
|
||||
$parsed['hostspec'] = urldecode(substr($str, $pos + 1));
|
||||
} else {
|
||||
$parsed['hostspec'] = urldecode($str);
|
||||
}
|
||||
|
||||
// Get dabase if any
|
||||
// $dsn => database
|
||||
if (!empty($dsn)) {
|
||||
$parsed['database'] = $dsn;
|
||||
}
|
||||
|
||||
return $parsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a PHP database extension if it is not loaded already.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @param $name the base name of the extension (without the .so or
|
||||
* .dll suffix)
|
||||
*
|
||||
* @return bool true if the extension was already or successfully
|
||||
* loaded, false if it could not be loaded
|
||||
*/
|
||||
function assertExtension($name)
|
||||
{
|
||||
if (!extension_loaded($name)) {
|
||||
$dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so';
|
||||
@dl($name . $dlext);
|
||||
}
|
||||
if (!extension_loaded($name)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4.
|
||||
*/
|
||||
|
||||
|
||||
class ADODB_BASE_RS {
|
||||
}
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,183 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Helper functions to convert between ADODB recordset objects and XMLRPC values.
|
||||
* Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs
|
||||
*
|
||||
* @author Daniele Baroncelli
|
||||
* @author Gaetano Giunta
|
||||
* @copyright (c) 2003-2004 Giunta/Baroncelli. All rights reserved.
|
||||
*
|
||||
* @todo some more error checking here and there
|
||||
* @todo document the xmlrpc-struct used to encode recordset info
|
||||
* @todo verify if using xmlrpc_encode($rs->GetArray()) would work with:
|
||||
* - ADODB_FETCH_BOTH
|
||||
* - null values
|
||||
*/
|
||||
|
||||
/**
|
||||
* Include the main libraries
|
||||
*/
|
||||
@require_once('xmlrpc.inc') OR die();
|
||||
if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
|
||||
|
||||
/**
|
||||
* Builds an xmlrpc struct value out of an AdoDB recordset
|
||||
*/
|
||||
function rs2xmlrpcval(&$adodbrs) {
|
||||
|
||||
$header = rs2xmlrpcval_header($adodbrs);
|
||||
$body = rs2xmlrpcval_body($adodbrs);
|
||||
|
||||
// put it all together and build final xmlrpc struct
|
||||
$xmlrpcrs = new xmlrpcval ( array(
|
||||
"header" => $header,
|
||||
"body" => $body,
|
||||
), "struct");
|
||||
|
||||
return $xmlrpcrs;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds an xmlrpc struct value describing an AdoDB recordset
|
||||
*/
|
||||
function rs2xmlrpcval_header($adodbrs)
|
||||
{
|
||||
$numfields = $adodbrs->FieldCount();
|
||||
$numrecords = $adodbrs->RecordCount();
|
||||
|
||||
// build structure holding recordset information
|
||||
$fieldstruct = array();
|
||||
for ($i = 0; $i < $numfields; $i++) {
|
||||
$fld = $adodbrs->FetchField($i);
|
||||
$fieldarray = array();
|
||||
if (isset($fld->name))
|
||||
$fieldarray["name"] = new xmlrpcval ($fld->name);
|
||||
if (isset($fld->type))
|
||||
$fieldarray["type"] = new xmlrpcval ($fld->type);
|
||||
if (isset($fld->max_length))
|
||||
$fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int");
|
||||
if (isset($fld->not_null))
|
||||
$fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean");
|
||||
if (isset($fld->has_default))
|
||||
$fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean");
|
||||
if (isset($fld->default_value))
|
||||
$fieldarray["default_value"] = new xmlrpcval ($fld->default_value);
|
||||
$fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct");
|
||||
}
|
||||
$fieldcount = new xmlrpcval ($numfields, "int");
|
||||
$recordcount = new xmlrpcval ($numrecords, "int");
|
||||
$sql = new xmlrpcval ($adodbrs->sql);
|
||||
$fieldinfo = new xmlrpcval ($fieldstruct, "array");
|
||||
|
||||
$header = new xmlrpcval ( array(
|
||||
"fieldcount" => $fieldcount,
|
||||
"recordcount" => $recordcount,
|
||||
"sql" => $sql,
|
||||
"fieldinfo" => $fieldinfo
|
||||
), "struct");
|
||||
|
||||
return $header;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds an xmlrpc struct value out of an AdoDB recordset
|
||||
* (data values only, no data definition)
|
||||
*/
|
||||
function rs2xmlrpcval_body($adodbrs)
|
||||
{
|
||||
$numfields = $adodbrs->FieldCount();
|
||||
|
||||
// build structure containing recordset data
|
||||
$adodbrs->MoveFirst();
|
||||
$rows = array();
|
||||
while (!$adodbrs->EOF) {
|
||||
$columns = array();
|
||||
// This should work on all cases of fetch mode: assoc, num, both or default
|
||||
if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
|
||||
for ($i = 0; $i < $numfields; $i++)
|
||||
if ($adodbrs->fields[$i] === null)
|
||||
$columns[$i] = new xmlrpcval ('');
|
||||
else
|
||||
$columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]);
|
||||
else
|
||||
foreach ($adodbrs->fields as $val)
|
||||
if ($val === null)
|
||||
$columns[] = new xmlrpcval ('');
|
||||
else
|
||||
$columns[] = xmlrpc_encode ($val);
|
||||
|
||||
$rows[] = new xmlrpcval ($columns, "array");
|
||||
|
||||
$adodbrs->MoveNext();
|
||||
}
|
||||
$body = new xmlrpcval ($rows, "array");
|
||||
|
||||
return $body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an xmlrpc struct value as string out of an AdoDB recordset
|
||||
*/
|
||||
function rs2xmlrpcstring (&$adodbrs) {
|
||||
$xmlrpc = rs2xmlrpcval ($adodbrs);
|
||||
if ($xmlrpc)
|
||||
return $xmlrpc->serialize();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a well-formed xmlrpc struct object returns an AdoDB object
|
||||
*
|
||||
* @todo add some error checking on the input value
|
||||
*/
|
||||
function xmlrpcval2rs (&$xmlrpcval) {
|
||||
|
||||
$fields_array = array();
|
||||
$data_array = array();
|
||||
|
||||
// rebuild column information
|
||||
$header = $xmlrpcval->structmem('header');
|
||||
|
||||
$numfields = $header->structmem('fieldcount');
|
||||
$numfields = $numfields->scalarval();
|
||||
$numrecords = $header->structmem('recordcount');
|
||||
$numrecords = $numrecords->scalarval();
|
||||
$sqlstring = $header->structmem('sql');
|
||||
$sqlstring = $sqlstring->scalarval();
|
||||
|
||||
$fieldinfo = $header->structmem('fieldinfo');
|
||||
for ($i = 0; $i < $numfields; $i++) {
|
||||
$temp = $fieldinfo->arraymem($i);
|
||||
$fld = new ADOFieldObject();
|
||||
while (list($key,$value) = $temp->structeach()) {
|
||||
if ($key == "name") $fld->name = $value->scalarval();
|
||||
if ($key == "type") $fld->type = $value->scalarval();
|
||||
if ($key == "max_length") $fld->max_length = $value->scalarval();
|
||||
if ($key == "not_null") $fld->not_null = $value->scalarval();
|
||||
if ($key == "has_default") $fld->has_default = $value->scalarval();
|
||||
if ($key == "default_value") $fld->default_value = $value->scalarval();
|
||||
} // while
|
||||
$fields_array[] = $fld;
|
||||
} // for
|
||||
|
||||
// fetch recordset information into php array
|
||||
$body = $xmlrpcval->structmem('body');
|
||||
for ($i = 0; $i < $numrecords; $i++) {
|
||||
$data_array[$i]= array();
|
||||
$xmlrpcrs_row = $body->arraymem($i);
|
||||
for ($j = 0; $j < $numfields; $j++) {
|
||||
$temp = $xmlrpcrs_row->arraymem($j);
|
||||
$data_array[$i][$j] = $temp->scalarval();
|
||||
} // for j
|
||||
} // for i
|
||||
|
||||
// finally build in-memory recordset object and return it
|
||||
$rs = new ADORecordSet_array();
|
||||
$rs->InitArrayFields($data_array,$fields_array);
|
||||
return $rs;
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,96 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_access extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'access';
|
||||
var $seqField = false;
|
||||
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'TEXT';
|
||||
case 'XL':
|
||||
case 'X': return 'MEMO';
|
||||
|
||||
case 'C2': return 'TEXT'; // up to 32K
|
||||
case 'X2': return 'MEMO';
|
||||
|
||||
case 'B': return 'BINARY';
|
||||
|
||||
case 'TS':
|
||||
case 'D': return 'DATETIME';
|
||||
case 'T': return 'DATETIME';
|
||||
|
||||
case 'L': return 'BYTE';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'BYTE';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'INTEGER';
|
||||
|
||||
case 'F': return 'DOUBLE';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
if ($fautoinc) {
|
||||
$ftype = 'COUNTER';
|
||||
return '';
|
||||
}
|
||||
if (substr($ftype,0,7) == 'DECIMAL') $ftype = 'DECIMAL';
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) {
|
||||
//$suffix .= " DEFAULT $fdefault";
|
||||
if ($this->debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)");
|
||||
}
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
function CreateDatabase($dbname,$options=false)
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function SetSchema($schema)
|
||||
{
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,144 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_db2 extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'db2';
|
||||
var $seqField = false;
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL': return 'CLOB';
|
||||
case 'X': return 'VARCHAR(3600)';
|
||||
|
||||
case 'C2': return 'VARCHAR'; // up to 32K
|
||||
case 'X2': return 'VARCHAR(3600)'; // up to 32000, but default page size too small
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'DOUBLE';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if ($fautoinc) return ' GENERATED ALWAYS AS IDENTITY'; # as identity start with
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function ChangeTableSQL($tablename, $flds, $tableoptions = false)
|
||||
{
|
||||
|
||||
/**
|
||||
Allow basic table changes to DB2 databases
|
||||
DB2 will fatally reject changes to non character columns
|
||||
|
||||
*/
|
||||
|
||||
$validTypes = array("CHAR","VARC");
|
||||
$invalidTypes = array("BIGI","BLOB","CLOB","DATE", "DECI","DOUB", "INTE", "REAL","SMAL", "TIME");
|
||||
// check table exists
|
||||
$cols = $this->MetaColumns($tablename);
|
||||
if ( empty($cols)) {
|
||||
return $this->CreateTableSQL($tablename, $flds, $tableoptions);
|
||||
}
|
||||
|
||||
// already exists, alter table instead
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$alter = 'ALTER TABLE ' . $this->TableName($tablename);
|
||||
$sql = array();
|
||||
|
||||
foreach ( $lines as $id => $v ) {
|
||||
if ( isset($cols[$id]) && is_object($cols[$id]) ) {
|
||||
/**
|
||||
If the first field of $v is the fieldname, and
|
||||
the second is the field type/size, we assume its an
|
||||
attempt to modify the column size, so check that it is allowed
|
||||
$v can have an indeterminate number of blanks between the
|
||||
fields, so account for that too
|
||||
*/
|
||||
$vargs = explode(' ' , $v);
|
||||
// assume that $vargs[0] is the field name.
|
||||
$i=0;
|
||||
// Find the next non-blank value;
|
||||
for ($i=1;$i<sizeof($vargs);$i++)
|
||||
if ($vargs[$i] != '')
|
||||
break;
|
||||
|
||||
// if $vargs[$i] is one of the following, we are trying to change the
|
||||
// size of the field, if not allowed, simply ignore the request.
|
||||
if (in_array(substr($vargs[$i],0,4),$invalidTypes))
|
||||
continue;
|
||||
// insert the appropriate DB2 syntax
|
||||
if (in_array(substr($vargs[$i],0,4),$validTypes)) {
|
||||
array_splice($vargs,$i,0,array('SET','DATA','TYPE'));
|
||||
}
|
||||
|
||||
// Now Look for the NOT NULL statement as this is not allowed in
|
||||
// the ALTER table statement. If it is in there, remove it
|
||||
if (in_array('NOT',$vargs) && in_array('NULL',$vargs)) {
|
||||
for ($i=1;$i<sizeof($vargs);$i++)
|
||||
if ($vargs[$i] == 'NOT')
|
||||
break;
|
||||
array_splice($vargs,$i,2,'');
|
||||
}
|
||||
$v = implode(' ',$vargs);
|
||||
$sql[] = $alter . $this->alterCol . ' ' . $v;
|
||||
} else {
|
||||
$sql[] = $alter . $this->addCol . ' ' . $v;
|
||||
}
|
||||
}
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,155 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_firebird extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'firebird';
|
||||
var $seqField = false;
|
||||
var $seqPrefix = 'gen_';
|
||||
var $blobSize = 40000;
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL': return 'VARCHAR(32000)';
|
||||
case 'X': return 'VARCHAR(4000)';
|
||||
|
||||
case 'C2': return 'VARCHAR'; // up to 32K
|
||||
case 'X2': return 'VARCHAR(4000)';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'INTEGER';
|
||||
|
||||
case 'F': return 'DOUBLE PRECISION';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function NameQuote($name = NULL)
|
||||
{
|
||||
if (!is_string($name)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$name = trim($name);
|
||||
|
||||
if ( !is_object($this->connection) ) {
|
||||
return $name;
|
||||
}
|
||||
|
||||
$quote = $this->connection->nameQuote;
|
||||
|
||||
// if name is of the form `name`, quote it
|
||||
if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
|
||||
return $quote . $matches[1] . $quote;
|
||||
}
|
||||
|
||||
// if name contains special characters, quote it
|
||||
if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) {
|
||||
return $quote . $name . $quote;
|
||||
}
|
||||
|
||||
return $quote . $name . $quote;
|
||||
}
|
||||
|
||||
function CreateDatabase($dbname, $options=false)
|
||||
{
|
||||
$options = $this->_Options($options);
|
||||
$sql = array();
|
||||
|
||||
$sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'";
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function _DropAutoIncrement($t)
|
||||
{
|
||||
if (strpos($t,'.') !== false) {
|
||||
$tarr = explode('.',$t);
|
||||
return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"';
|
||||
}
|
||||
return 'DROP GENERATOR "GEN_'.$t;
|
||||
}
|
||||
|
||||
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fautoinc) $this->seqField = $fname;
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE or replace TRIGGER jaddress_insert
|
||||
before insert on jaddress
|
||||
for each row
|
||||
begin
|
||||
IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN
|
||||
NEW."seqField" = GEN_ID("GEN_tabname", 1);
|
||||
end;
|
||||
*/
|
||||
function _Triggers($tabname,$tableoptions)
|
||||
{
|
||||
if (!$this->seqField) return array();
|
||||
|
||||
$tab1 = preg_replace( '/"/', '', $tabname );
|
||||
if ($this->schema) {
|
||||
$t = strpos($tab1,'.');
|
||||
if ($t !== false) $tab = substr($tab1,$t+1);
|
||||
else $tab = $tab1;
|
||||
$seqField = $this->seqField;
|
||||
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
|
||||
$trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab;
|
||||
} else {
|
||||
$seqField = $this->seqField;
|
||||
$seqname = $this->seqPrefix.$tab1;
|
||||
$trigname = 'trig_'.$seqname;
|
||||
}
|
||||
if (isset($tableoptions['REPLACE']))
|
||||
{ $sql[] = "DROP GENERATOR \"$seqname\"";
|
||||
$sql[] = "CREATE GENERATOR \"$seqname\"";
|
||||
$sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
|
||||
}
|
||||
else
|
||||
{ $sql[] = "CREATE GENERATOR \"$seqname\"";
|
||||
$sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
|
||||
}
|
||||
|
||||
$this->seqField = false;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,126 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_generic extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'generic';
|
||||
var $seqField = false;
|
||||
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':
|
||||
case 'X': return 'VARCHAR(250)';
|
||||
|
||||
case 'C2': return 'VARCHAR';
|
||||
case 'X2': return 'VARCHAR(250)';
|
||||
|
||||
case 'B': return 'VARCHAR';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'DATE';
|
||||
|
||||
case 'L': return 'DECIMAL(1)';
|
||||
case 'I': return 'DECIMAL(10)';
|
||||
case 'I1': return 'DECIMAL(3)';
|
||||
case 'I2': return 'DECIMAL(5)';
|
||||
case 'I4': return 'DECIMAL(10)';
|
||||
case 'I8': return 'DECIMAL(20)';
|
||||
|
||||
case 'F': return 'DECIMAL(32,8)';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
//db2
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'X': return 'VARCHAR';
|
||||
|
||||
case 'C2': return 'VARCHAR'; // up to 32K
|
||||
case 'X2': return 'VARCHAR';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'DOUBLE';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
// ifx
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';// 255
|
||||
case 'X': return 'TEXT';
|
||||
|
||||
case 'C2': return 'NVARCHAR';
|
||||
case 'X2': return 'TEXT';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'T': return 'DATETIME';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'DECIMAL(20)';
|
||||
|
||||
case 'F': return 'FLOAT';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
*/
|
||||
?>
|
||||
@@ -1,68 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_ibase extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'ibase';
|
||||
var $seqField = false;
|
||||
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':
|
||||
case 'X': return 'VARCHAR(4000)';
|
||||
|
||||
case 'C2': return 'VARCHAR'; // up to 32K
|
||||
case 'X2': return 'VARCHAR(4000)';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'INTEGER';
|
||||
|
||||
case 'F': return 'DOUBLE PRECISION';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,81 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_informix extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'informix';
|
||||
var $seqField = false;
|
||||
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';// 255
|
||||
case 'XL':
|
||||
case 'X': return 'TEXT';
|
||||
|
||||
case 'C2': return 'NVARCHAR';
|
||||
case 'X2': return 'TEXT';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'DATETIME YEAR TO SECOND';
|
||||
|
||||
case 'L': return 'SMALLINT';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'DECIMAL(20)';
|
||||
|
||||
case 'F': return 'FLOAT';
|
||||
case 'N': return 'DECIMAL';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
||||
return array();
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
if ($fautoinc) {
|
||||
$ftype = 'SERIAL';
|
||||
return '';
|
||||
}
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,284 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
|
||||
|
||||
Note Delimiters are for identifiers only. Delimiters cannot be used for keywords,
|
||||
whether or not they are marked as reserved in SQL Server.
|
||||
|
||||
Quoted identifiers are delimited by double quotation marks ("):
|
||||
SELECT * FROM "Blanks in Table Name"
|
||||
|
||||
Bracketed identifiers are delimited by brackets ([ ]):
|
||||
SELECT * FROM [Blanks In Table Name]
|
||||
|
||||
Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default,
|
||||
the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON
|
||||
when they connect.
|
||||
|
||||
In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER,
|
||||
the quoted identifier option of sp_dboption, or the user options option of sp_configure.
|
||||
|
||||
When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
|
||||
|
||||
Syntax
|
||||
|
||||
SET QUOTED_IDENTIFIER { ON | OFF }
|
||||
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_mssql extends ADODB_DataDict {
|
||||
var $databaseType = 'mssql';
|
||||
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||
var $renameTable = "EXEC sp_rename '%s','%s'";
|
||||
var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
|
||||
|
||||
var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000)
|
||||
var $typeXL = 'TEXT';
|
||||
|
||||
//var $alterCol = ' ALTER COLUMN ';
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
$len = -1; // mysql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
case 'R':
|
||||
case 'INT':
|
||||
case 'INTEGER': return 'I';
|
||||
case 'BIT':
|
||||
case 'TINYINT': return 'I1';
|
||||
case 'SMALLINT': return 'I2';
|
||||
case 'BIGINT': return 'I8';
|
||||
case 'SMALLDATETIME': return 'T';
|
||||
case 'REAL':
|
||||
case 'FLOAT': return 'F';
|
||||
default: return parent::MetaType($t,$len,$fieldobj);
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch(strtoupper($meta)) {
|
||||
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
|
||||
case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
|
||||
case 'C2': return 'NVARCHAR';
|
||||
case 'X2': return 'NTEXT';
|
||||
|
||||
case 'B': return 'IMAGE';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
|
||||
case 'TS':
|
||||
case 'T': return 'DATETIME';
|
||||
case 'L': return 'BIT';
|
||||
|
||||
case 'R':
|
||||
case 'I': return 'INT';
|
||||
case 'I1': return 'TINYINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INT';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'REAL';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$f = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$s = "ALTER TABLE $tabname $this->addCol";
|
||||
foreach($lines as $v) {
|
||||
$f[] = "\n $v";
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/*
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
foreach($lines as $v) {
|
||||
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||
}
|
||||
|
||||
return $sql;
|
||||
}
|
||||
*/
|
||||
|
||||
function DropColumnSQL($tabname, $flds, $tableflds='', $tableoptions='')
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
if (!is_array($flds))
|
||||
$flds = explode(',',$flds);
|
||||
$f = array();
|
||||
$s = 'ALTER TABLE ' . $tabname;
|
||||
foreach($flds as $v) {
|
||||
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
else if ($suffix == '') $suffix .= ' NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE TABLE
|
||||
[ database_name.[ owner ] . | owner. ] table_name
|
||||
( { < column_definition >
|
||||
| column_name AS computed_column_expression
|
||||
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||
|
||||
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||
)
|
||||
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||
|
||||
< column_definition > ::= { column_name data_type }
|
||||
[ COLLATE < collation_name > ]
|
||||
[ [ DEFAULT constant_expression ]
|
||||
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||
]
|
||||
[ ROWGUIDCOL]
|
||||
[ < column_constraint > ] [ ...n ]
|
||||
|
||||
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ NULL | NOT NULL ]
|
||||
| [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ON {filegroup | DEFAULT} ] ]
|
||||
]
|
||||
| [ [ FOREIGN KEY ]
|
||||
REFERENCES ref_table [ ( ref_column ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( logical_expression )
|
||||
}
|
||||
|
||||
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
]
|
||||
| FOREIGN KEY
|
||||
[ ( column [ ,...n ] ) ]
|
||||
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( search_conditions )
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||
[ WITH < index_option > [ ,...n] ]
|
||||
[ ON filegroup ]
|
||||
< index_option > :: =
|
||||
{ PAD_INDEX |
|
||||
FILLFACTOR = fillfactor |
|
||||
IGNORE_DUP_KEY |
|
||||
DROP_EXISTING |
|
||||
STATISTICS_NORECOMPUTE |
|
||||
SORT_IN_TEMPDB
|
||||
}
|
||||
*/
|
||||
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||
|
||||
if ( is_array($flds) )
|
||||
$flds = implode(', ',$flds);
|
||||
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||
{
|
||||
switch ($ftype) {
|
||||
case 'INT':
|
||||
case 'SMALLINT':
|
||||
case 'TINYINT':
|
||||
case 'BIGINT':
|
||||
return $ftype;
|
||||
}
|
||||
if ($ty == 'T') return $ftype;
|
||||
return parent::_GetSize($ftype, $ty, $fsize, $fprec);
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,282 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
In ADOdb, named quotes for MS SQL Server use ". From the MSSQL Docs:
|
||||
|
||||
Note Delimiters are for identifiers only. Delimiters cannot be used for keywords,
|
||||
whether or not they are marked as reserved in SQL Server.
|
||||
|
||||
Quoted identifiers are delimited by double quotation marks ("):
|
||||
SELECT * FROM "Blanks in Table Name"
|
||||
|
||||
Bracketed identifiers are delimited by brackets ([ ]):
|
||||
SELECT * FROM [Blanks In Table Name]
|
||||
|
||||
Quoted identifiers are valid only when the QUOTED_IDENTIFIER option is set to ON. By default,
|
||||
the Microsoft OLE DB Provider for SQL Server and SQL Server ODBC driver set QUOTED_IDENTIFIER ON
|
||||
when they connect.
|
||||
|
||||
In Transact-SQL, the option can be set at various levels using SET QUOTED_IDENTIFIER,
|
||||
the quoted identifier option of sp_dboption, or the user options option of sp_configure.
|
||||
|
||||
When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.
|
||||
|
||||
Syntax
|
||||
|
||||
SET QUOTED_IDENTIFIER { ON | OFF }
|
||||
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_mssqlnative extends ADODB_DataDict {
|
||||
var $databaseType = 'mssqlnative';
|
||||
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||
var $renameTable = "EXEC sp_rename '%s','%s'";
|
||||
var $renameColumn = "EXEC sp_rename '%s.%s','%s'";
|
||||
|
||||
var $typeX = 'TEXT'; ## Alternatively, set it to VARCHAR(4000)
|
||||
var $typeXL = 'TEXT';
|
||||
|
||||
//var $alterCol = ' ALTER COLUMN ';
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
$len = -1; // mysql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
case 'R':
|
||||
case 'INT':
|
||||
case 'INTEGER': return 'I';
|
||||
case 'BIT':
|
||||
case 'TINYINT': return 'I1';
|
||||
case 'SMALLINT': return 'I2';
|
||||
case 'BIGINT': return 'I8';
|
||||
|
||||
case 'REAL':
|
||||
case 'FLOAT': return 'F';
|
||||
default: return parent::MetaType($t,$len,$fieldobj);
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch(strtoupper($meta)) {
|
||||
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL': return (isset($this)) ? $this->typeXL : 'TEXT';
|
||||
case 'X': return (isset($this)) ? $this->typeX : 'TEXT'; ## could be varchar(8000), but we want compat with oracle
|
||||
case 'C2': return 'NVARCHAR';
|
||||
case 'X2': return 'NTEXT';
|
||||
|
||||
case 'B': return 'IMAGE';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'T': return 'DATETIME';
|
||||
case 'L': return 'BIT';
|
||||
|
||||
case 'R':
|
||||
case 'I': return 'INT';
|
||||
case 'I1': return 'TINYINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INT';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'REAL';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$f = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$s = "ALTER TABLE $tabname $this->addCol";
|
||||
foreach($lines as $v) {
|
||||
$f[] = "\n $v";
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/*
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
foreach($lines as $v) {
|
||||
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||
}
|
||||
|
||||
return $sql;
|
||||
}
|
||||
*/
|
||||
|
||||
function DropColumnSQL($tabname, $flds, $tableflds='', $tableoptions='')
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
if (!is_array($flds))
|
||||
$flds = explode(',',$flds);
|
||||
$f = array();
|
||||
$s = 'ALTER TABLE ' . $tabname;
|
||||
foreach($flds as $v) {
|
||||
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
else if ($suffix == '') $suffix .= ' NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE TABLE
|
||||
[ database_name.[ owner ] . | owner. ] table_name
|
||||
( { < column_definition >
|
||||
| column_name AS computed_column_expression
|
||||
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||
|
||||
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||
)
|
||||
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||
|
||||
< column_definition > ::= { column_name data_type }
|
||||
[ COLLATE < collation_name > ]
|
||||
[ [ DEFAULT constant_expression ]
|
||||
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||
]
|
||||
[ ROWGUIDCOL]
|
||||
[ < column_constraint > ] [ ...n ]
|
||||
|
||||
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ NULL | NOT NULL ]
|
||||
| [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ON {filegroup | DEFAULT} ] ]
|
||||
]
|
||||
| [ [ FOREIGN KEY ]
|
||||
REFERENCES ref_table [ ( ref_column ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( logical_expression )
|
||||
}
|
||||
|
||||
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
]
|
||||
| FOREIGN KEY
|
||||
[ ( column [ ,...n ] ) ]
|
||||
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( search_conditions )
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||
[ WITH < index_option > [ ,...n] ]
|
||||
[ ON filegroup ]
|
||||
< index_option > :: =
|
||||
{ PAD_INDEX |
|
||||
FILLFACTOR = fillfactor |
|
||||
IGNORE_DUP_KEY |
|
||||
DROP_EXISTING |
|
||||
STATISTICS_NORECOMPUTE |
|
||||
SORT_IN_TEMPDB
|
||||
}
|
||||
*/
|
||||
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||
|
||||
if ( is_array($flds) )
|
||||
$flds = implode(', ',$flds);
|
||||
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||
{
|
||||
switch ($ftype) {
|
||||
case 'INT':
|
||||
case 'SMALLINT':
|
||||
case 'TINYINT':
|
||||
case 'BIGINT':
|
||||
return $ftype;
|
||||
}
|
||||
if ($ty == 'T') return $ftype;
|
||||
return parent::_GetSize($ftype, $ty, $fsize, $fprec);
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,182 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_mysql extends ADODB_DataDict {
|
||||
var $databaseType = 'mysql';
|
||||
var $alterCol = ' MODIFY COLUMN';
|
||||
var $alterTableAddIndex = true;
|
||||
var $dropTable = 'DROP TABLE IF EXISTS %s'; // requires mysql 3.22 or later
|
||||
|
||||
var $dropIndex = 'DROP INDEX %s ON %s';
|
||||
var $renameColumn = 'ALTER TABLE %s CHANGE COLUMN %s %s %s'; // needs column-definition!
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->auto_increment;
|
||||
|
||||
$len = -1; // mysql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
case 'STRING':
|
||||
case 'CHAR':
|
||||
case 'VARCHAR':
|
||||
case 'TINYBLOB':
|
||||
case 'TINYTEXT':
|
||||
case 'ENUM':
|
||||
case 'SET':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 'TEXT':
|
||||
case 'LONGTEXT':
|
||||
case 'MEDIUMTEXT':
|
||||
return 'X';
|
||||
|
||||
// php_mysql extension always returns 'blob' even if 'text'
|
||||
// so we have to check whether binary...
|
||||
case 'IMAGE':
|
||||
case 'LONGBLOB':
|
||||
case 'BLOB':
|
||||
case 'MEDIUMBLOB':
|
||||
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||
|
||||
case 'YEAR':
|
||||
case 'DATE': return 'D';
|
||||
|
||||
case 'TIME':
|
||||
case 'DATETIME':
|
||||
case 'TIMESTAMP': return 'T';
|
||||
|
||||
case 'FLOAT':
|
||||
case 'DOUBLE':
|
||||
return 'F';
|
||||
|
||||
case 'INT':
|
||||
case 'INTEGER': return $is_serial ? 'R' : 'I';
|
||||
case 'TINYINT': return $is_serial ? 'R' : 'I1';
|
||||
case 'SMALLINT': return $is_serial ? 'R' : 'I2';
|
||||
case 'MEDIUMINT': return $is_serial ? 'R' : 'I4';
|
||||
case 'BIGINT': return $is_serial ? 'R' : 'I8';
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch(strtoupper($meta)) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':return 'LONGTEXT';
|
||||
case 'X': return 'TEXT';
|
||||
|
||||
case 'C2': return 'VARCHAR';
|
||||
case 'X2': return 'LONGTEXT';
|
||||
|
||||
case 'B': return 'LONGBLOB';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'DATETIME';
|
||||
case 'L': return 'TINYINT';
|
||||
|
||||
case 'R':
|
||||
case 'I4':
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'TINYINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'DOUBLE';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if ($funsigned) $suffix .= ' UNSIGNED';
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fautoinc) $suffix .= ' AUTO_INCREMENT';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
||||
[table_options] [select_statement]
|
||||
create_definition:
|
||||
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
|
||||
[PRIMARY KEY] [reference_definition]
|
||||
or PRIMARY KEY (index_col_name,...)
|
||||
or KEY [index_name] (index_col_name,...)
|
||||
or INDEX [index_name] (index_col_name,...)
|
||||
or UNIQUE [INDEX] [index_name] (index_col_name,...)
|
||||
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
|
||||
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
|
||||
[reference_definition]
|
||||
or CHECK (expr)
|
||||
*/
|
||||
|
||||
/*
|
||||
CREATE [UNIQUE|FULLTEXT] INDEX index_name
|
||||
ON tbl_name (col_name[(length)],... )
|
||||
*/
|
||||
|
||||
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname";
|
||||
else $sql[] = sprintf($this->dropIndex, $idxname, $tabname);
|
||||
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if (isset($idxoptions['FULLTEXT'])) {
|
||||
$unique = ' FULLTEXT';
|
||||
} elseif (isset($idxoptions['UNIQUE'])) {
|
||||
$unique = ' UNIQUE';
|
||||
} else {
|
||||
$unique = '';
|
||||
}
|
||||
|
||||
if ( is_array($flds) ) $flds = implode(', ',$flds);
|
||||
|
||||
if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname ";
|
||||
else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname;
|
||||
|
||||
$s .= ' (' . $flds . ')';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,297 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_oci8 extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'oci8';
|
||||
var $seqField = false;
|
||||
var $seqPrefix = 'SEQ_';
|
||||
var $dropTable = "DROP TABLE %s CASCADE CONSTRAINTS";
|
||||
var $trigPrefix = 'TRIG_';
|
||||
var $alterCol = ' MODIFY ';
|
||||
var $typeX = 'VARCHAR(4000)';
|
||||
var $typeXL = 'CLOB';
|
||||
|
||||
function MetaType($t,$len=-1)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
switch (strtoupper($t)) {
|
||||
case 'VARCHAR':
|
||||
case 'VARCHAR2':
|
||||
case 'CHAR':
|
||||
case 'VARBINARY':
|
||||
case 'BINARY':
|
||||
if (isset($this) && $len <= $this->blobSize) return 'C';
|
||||
return 'X';
|
||||
|
||||
case 'NCHAR':
|
||||
case 'NVARCHAR2':
|
||||
case 'NVARCHAR':
|
||||
if (isset($this) && $len <= $this->blobSize) return 'C2';
|
||||
return 'X2';
|
||||
|
||||
case 'NCLOB':
|
||||
case 'CLOB':
|
||||
return 'XL';
|
||||
|
||||
case 'LONG RAW':
|
||||
case 'LONG VARBINARY':
|
||||
case 'BLOB':
|
||||
return 'B';
|
||||
|
||||
case 'TIMESTAMP':
|
||||
return 'TS';
|
||||
|
||||
case 'DATE':
|
||||
return 'T';
|
||||
|
||||
case 'INT':
|
||||
case 'SMALLINT':
|
||||
case 'INTEGER':
|
||||
return 'I';
|
||||
|
||||
default:
|
||||
return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'X': return $this->typeX;
|
||||
case 'XL': return $this->typeXL;
|
||||
|
||||
case 'C2': return 'NVARCHAR2';
|
||||
case 'X2': return 'NVARCHAR2(4000)';
|
||||
|
||||
case 'B': return 'BLOB';
|
||||
|
||||
case 'TS':
|
||||
return 'TIMESTAMP';
|
||||
|
||||
case 'D':
|
||||
case 'T': return 'DATE';
|
||||
case 'L': return 'NUMBER(1)';
|
||||
case 'I1': return 'NUMBER(3)';
|
||||
case 'I2': return 'NUMBER(5)';
|
||||
case 'I':
|
||||
case 'I4': return 'NUMBER(10)';
|
||||
|
||||
case 'I8': return 'NUMBER(20)';
|
||||
case 'F': return 'NUMBER';
|
||||
case 'N': return 'NUMBER';
|
||||
case 'R': return 'NUMBER(20)';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function CreateDatabase($dbname, $options=false)
|
||||
{
|
||||
$options = $this->_Options($options);
|
||||
$password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
|
||||
$tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
|
||||
$sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
|
||||
$sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$f = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$s = "ALTER TABLE $tabname ADD (";
|
||||
foreach($lines as $v) {
|
||||
$f[] = "\n $v";
|
||||
}
|
||||
|
||||
$s .= implode(', ',$f).')';
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
$f = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$s = "ALTER TABLE $tabname MODIFY(";
|
||||
foreach($lines as $v) {
|
||||
$f[] = "\n $v";
|
||||
}
|
||||
$s .= implode(', ',$f).')';
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||
foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v);
|
||||
|
||||
$sql = array();
|
||||
$s = "ALTER TABLE $tabname DROP(";
|
||||
$s .= implode(', ',$flds).') CASCADE CONSTRAINTS';
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function _DropAutoIncrement($t)
|
||||
{
|
||||
if (strpos($t,'.') !== false) {
|
||||
$tarr = explode('.',$t);
|
||||
return "drop sequence ".$tarr[0].".seq_".$tarr[1];
|
||||
}
|
||||
return "drop sequence seq_".$t;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
|
||||
if ($fdefault == "''" && $fnotnull) {// this is null in oracle
|
||||
$fnotnull = false;
|
||||
if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
|
||||
}
|
||||
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
|
||||
if ($fautoinc) $this->seqField = $fname;
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE or replace TRIGGER jaddress_insert
|
||||
before insert on jaddress
|
||||
for each row
|
||||
begin
|
||||
select seqaddress.nextval into :new.A_ID from dual;
|
||||
end;
|
||||
*/
|
||||
function _Triggers($tabname,$tableoptions)
|
||||
{
|
||||
if (!$this->seqField) return array();
|
||||
|
||||
if ($this->schema) {
|
||||
$t = strpos($tabname,'.');
|
||||
if ($t !== false) $tab = substr($tabname,$t+1);
|
||||
else $tab = $tabname;
|
||||
$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
|
||||
$trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab;
|
||||
} else {
|
||||
$seqname = $this->seqPrefix.$tabname;
|
||||
$trigname = $this->trigPrefix.$seqname;
|
||||
}
|
||||
|
||||
if (strlen($seqname) > 30) {
|
||||
$seqname = $this->seqPrefix.uniqid('');
|
||||
} // end if
|
||||
if (strlen($trigname) > 30) {
|
||||
$trigname = $this->trigPrefix.uniqid('');
|
||||
} // end if
|
||||
|
||||
if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
|
||||
$seqCache = '';
|
||||
if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
|
||||
$seqIncr = '';
|
||||
if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
|
||||
$seqStart = '';
|
||||
if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
|
||||
$sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
|
||||
$sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
|
||||
|
||||
$this->seqField = false;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
||||
[table_options] [select_statement]
|
||||
create_definition:
|
||||
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
|
||||
[PRIMARY KEY] [reference_definition]
|
||||
or PRIMARY KEY (index_col_name,...)
|
||||
or KEY [index_name] (index_col_name,...)
|
||||
or INDEX [index_name] (index_col_name,...)
|
||||
or UNIQUE [INDEX] [index_name] (index_col_name,...)
|
||||
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
|
||||
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
|
||||
[reference_definition]
|
||||
or CHECK (expr)
|
||||
*/
|
||||
|
||||
|
||||
|
||||
function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if (isset($idxoptions['BITMAP'])) {
|
||||
$unique = ' BITMAP';
|
||||
} elseif (isset($idxoptions['UNIQUE'])) {
|
||||
$unique = ' UNIQUE';
|
||||
} else {
|
||||
$unique = '';
|
||||
}
|
||||
|
||||
if ( is_array($flds) )
|
||||
$flds = implode(', ',$flds);
|
||||
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
if (isset($idxoptions['oci8']))
|
||||
$s .= $idxoptions['oci8'];
|
||||
|
||||
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function GetCommentSQL($table,$col)
|
||||
{
|
||||
$table = $this->connection->qstr($table);
|
||||
$col = $this->connection->qstr($col);
|
||||
return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
|
||||
}
|
||||
|
||||
function SetCommentSQL($table,$col,$cmt)
|
||||
{
|
||||
$cmt = $this->connection->qstr($cmt);
|
||||
return "COMMENT ON COLUMN $table.$col IS $cmt";
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,448 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_postgres extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'postgres';
|
||||
var $seqField = false;
|
||||
var $seqPrefix = 'SEQ_';
|
||||
var $addCol = ' ADD COLUMN';
|
||||
var $quote = '"';
|
||||
var $renameTable = 'ALTER TABLE %s RENAME TO %s'; // at least since 7.1
|
||||
var $dropTable = 'DROP TABLE %s CASCADE';
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique &&
|
||||
$fieldobj->has_default && substr($fieldobj->default_value,0,8) == 'nextval(';
|
||||
|
||||
switch (strtoupper($t)) {
|
||||
case 'INTERVAL':
|
||||
case 'CHAR':
|
||||
case 'CHARACTER':
|
||||
case 'VARCHAR':
|
||||
case 'NAME':
|
||||
case 'BPCHAR':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 'TEXT':
|
||||
return 'X';
|
||||
|
||||
case 'IMAGE': // user defined type
|
||||
case 'BLOB': // user defined type
|
||||
case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
|
||||
case 'VARBIT':
|
||||
case 'BYTEA':
|
||||
return 'B';
|
||||
|
||||
case 'BOOL':
|
||||
case 'BOOLEAN':
|
||||
return 'L';
|
||||
|
||||
case 'DATE':
|
||||
return 'D';
|
||||
|
||||
case 'TIME':
|
||||
case 'DATETIME':
|
||||
case 'TIMESTAMP':
|
||||
case 'TIMESTAMPTZ':
|
||||
return 'T';
|
||||
|
||||
case 'INTEGER': return !$is_serial ? 'I' : 'R';
|
||||
case 'SMALLINT':
|
||||
case 'INT2': return !$is_serial ? 'I2' : 'R';
|
||||
case 'INT4': return !$is_serial ? 'I4' : 'R';
|
||||
case 'BIGINT':
|
||||
case 'INT8': return !$is_serial ? 'I8' : 'R';
|
||||
|
||||
case 'OID':
|
||||
case 'SERIAL':
|
||||
return 'R';
|
||||
|
||||
case 'FLOAT4':
|
||||
case 'FLOAT8':
|
||||
case 'DOUBLE PRECISION':
|
||||
case 'REAL':
|
||||
return 'F';
|
||||
|
||||
default:
|
||||
return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':
|
||||
case 'X': return 'TEXT';
|
||||
|
||||
case 'C2': return 'VARCHAR';
|
||||
case 'X2': return 'TEXT';
|
||||
|
||||
case 'B': return 'BYTEA';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'BOOLEAN';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'SMALLINT';
|
||||
case 'I2': return 'INT2';
|
||||
case 'I4': return 'INT4';
|
||||
case 'I8': return 'INT8';
|
||||
|
||||
case 'F': return 'FLOAT8';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adding a new Column
|
||||
*
|
||||
* reimplementation of the default function as postgres does NOT allow to set the default in the same statement
|
||||
*
|
||||
* @param string $tabname table-name
|
||||
* @param string $flds column-names and types for the changed columns
|
||||
* @return array with SQL strings
|
||||
*/
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
|
||||
foreach($lines as $v) {
|
||||
if (($not_null = preg_match('/NOT NULL/i',$v))) {
|
||||
$v = preg_replace('/NOT NULL/i','',$v);
|
||||
}
|
||||
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||
list(,$colname,$default) = $matches;
|
||||
$sql[] = $alter . str_replace('DEFAULT '.$default,'',$v);
|
||||
$sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default;
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||
} else {
|
||||
$sql[] = $alter . $v;
|
||||
}
|
||||
if ($not_null) {
|
||||
list($colname) = explode(' ',$v);
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||
}
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
function DropIndexSQL ($idxname, $tabname = NULL)
|
||||
{
|
||||
return array(sprintf($this->dropIndex, $this->TableName($idxname), $this->TableName($tabname)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the definition of one column
|
||||
*
|
||||
* Postgres can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||
* to allow, recreating the table and copying the content over to the new table
|
||||
* @param string $tabname table-name
|
||||
* @param string $flds column-name and type for the changed column
|
||||
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||
* @return array with SQL strings
|
||||
*/
|
||||
/*
|
||||
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||
{
|
||||
if (!$tableflds) {
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||
return array();
|
||||
}
|
||||
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||
}*/
|
||||
|
||||
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||
{
|
||||
// Check if alter single column datatype available - works with 8.0+
|
||||
$has_alter_column = 8.0 <= (float) @$this->serverInfo['version'];
|
||||
|
||||
if ($has_alter_column) {
|
||||
$tabname = $this->TableName($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
|
||||
foreach($lines as $v) {
|
||||
if ($not_null = preg_match('/NOT NULL/i',$v)) {
|
||||
$v = preg_replace('/NOT NULL/i','',$v);
|
||||
}
|
||||
// this next block doesn't work - there is no way that I can see to
|
||||
// explicitly ask a column to be null using $flds
|
||||
else if ($set_null = preg_match('/NULL/i',$v)) {
|
||||
// if they didn't specify not null, see if they explicitely asked for null
|
||||
$v = preg_replace('/\sNULL/i','',$v);
|
||||
}
|
||||
|
||||
if (preg_match('/^([^ ]+) .*DEFAULT ([^ ]+)/',$v,$matches)) {
|
||||
list(,$colname,$default) = $matches;
|
||||
$v = preg_replace('/^' . preg_quote($colname) . '\s/', '', $v);
|
||||
$sql[] = $alter . $colname . ' TYPE ' . str_replace('DEFAULT '.$default,'',$v);
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||
}
|
||||
else {
|
||||
// drop default?
|
||||
preg_match ('/^\s*(\S+)\s+(.*)$/',$v,$matches);
|
||||
list (,$colname,$rest) = $matches;
|
||||
$sql[] = $alter . $colname . ' TYPE ' . $rest;
|
||||
}
|
||||
|
||||
list($colname) = explode(' ',$v);
|
||||
if ($not_null) {
|
||||
// this does not error out if the column is already not null
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET NOT NULL';
|
||||
}
|
||||
if ($set_null) {
|
||||
// this does not error out if the column is already null
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' DROP NOT NULL';
|
||||
}
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// does not have alter column
|
||||
if (!$tableflds) {
|
||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL needs a complete table-definiton for PostgreSQL");
|
||||
return array();
|
||||
}
|
||||
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Drop one column
|
||||
*
|
||||
* Postgres < 7.3 can't do that on it's own, you need to supply the complete defintion of the new table,
|
||||
* to allow, recreating the table and copying the content over to the new table
|
||||
* @param string $tabname table-name
|
||||
* @param string $flds column-name and type for the changed column
|
||||
* @param string $tableflds complete defintion of the new table, eg. for postgres, default ''
|
||||
* @param array/ $tableoptions options for the new table see CreateTableSQL, default ''
|
||||
* @return array with SQL strings
|
||||
*/
|
||||
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
||||
{
|
||||
$has_drop_column = 7.3 <= (float) @$this->serverInfo['version'];
|
||||
if (!$has_drop_column && !$tableflds) {
|
||||
if ($this->debug) ADOConnection::outp("DropColumnSQL needs complete table-definiton for PostgreSQL < 7.3");
|
||||
return array();
|
||||
}
|
||||
if ($has_drop_column) {
|
||||
return ADODB_DataDict::DropColumnSQL($tabname, $flds);
|
||||
}
|
||||
return $this->_recreate_copy_table($tabname,$flds,$tableflds,$tableoptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the content into a temp. table, drop and recreate the original table and copy the content back in
|
||||
*
|
||||
* We also take care to set the values of the sequenz and recreate the indexes.
|
||||
* All this is done in a transaction, to not loose the content of the table, if something went wrong!
|
||||
* @internal
|
||||
* @param string $tabname table-name
|
||||
* @param string $dropflds column-names to drop
|
||||
* @param string $tableflds complete defintion of the new table, eg. for postgres
|
||||
* @param array/string $tableoptions options for the new table see CreateTableSQL, default ''
|
||||
* @return array with SQL strings
|
||||
*/
|
||||
function _recreate_copy_table($tabname,$dropflds,$tableflds,$tableoptions='')
|
||||
{
|
||||
if ($dropflds && !is_array($dropflds)) $dropflds = explode(',',$dropflds);
|
||||
$copyflds = array();
|
||||
foreach($this->MetaColumns($tabname) as $fld) {
|
||||
if (!$dropflds || !in_array($fld->name,$dropflds)) {
|
||||
// we need to explicit convert varchar to a number to be able to do an AlterColumn of a char column to a nummeric one
|
||||
if (preg_match('/'.$fld->name.' (I|I2|I4|I8|N|F)/i',$tableflds,$matches) &&
|
||||
in_array($fld->type,array('varchar','char','text','bytea'))) {
|
||||
$copyflds[] = "to_number($fld->name,'S9999999999999D99')";
|
||||
} else {
|
||||
$copyflds[] = $fld->name;
|
||||
}
|
||||
// identify the sequence name and the fld its on
|
||||
if ($fld->primary_key && $fld->has_default &&
|
||||
preg_match("/nextval\('([^']+)'::text\)/",$fld->default_value,$matches)) {
|
||||
$seq_name = $matches[1];
|
||||
$seq_fld = $fld->name;
|
||||
}
|
||||
}
|
||||
}
|
||||
$copyflds = implode(', ',$copyflds);
|
||||
|
||||
$tempname = $tabname.'_tmp';
|
||||
$aSql[] = 'BEGIN'; // we use a transaction, to make sure not to loose the content of the table
|
||||
$aSql[] = "SELECT * INTO TEMPORARY TABLE $tempname FROM $tabname";
|
||||
$aSql = array_merge($aSql,$this->DropTableSQL($tabname));
|
||||
$aSql = array_merge($aSql,$this->CreateTableSQL($tabname,$tableflds,$tableoptions));
|
||||
$aSql[] = "INSERT INTO $tabname SELECT $copyflds FROM $tempname";
|
||||
if ($seq_name && $seq_fld) { // if we have a sequence we need to set it again
|
||||
$seq_name = $tabname.'_'.$seq_fld.'_seq'; // has to be the name of the new implicit sequence
|
||||
$aSql[] = "SELECT setval('$seq_name',MAX($seq_fld)) FROM $tabname";
|
||||
}
|
||||
$aSql[] = "DROP TABLE $tempname";
|
||||
// recreate the indexes, if they not contain one of the droped columns
|
||||
foreach($this->MetaIndexes($tabname) as $idx_name => $idx_data)
|
||||
{
|
||||
if (substr($idx_name,-5) != '_pkey' && (!$dropflds || !count(array_intersect($dropflds,$idx_data['columns'])))) {
|
||||
$aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'],
|
||||
$idx_data['unique'] ? array('UNIQUE') : False));
|
||||
}
|
||||
}
|
||||
$aSql[] = 'COMMIT';
|
||||
return $aSql;
|
||||
}
|
||||
|
||||
function DropTableSQL($tabname)
|
||||
{
|
||||
$sql = ADODB_DataDict::DropTableSQL($tabname);
|
||||
|
||||
$drop_seq = $this->_DropAutoIncrement($tabname);
|
||||
if ($drop_seq) $sql[] = $drop_seq;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
if ($fautoinc) {
|
||||
$ftype = 'SERIAL';
|
||||
return '';
|
||||
}
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
// search for a sequece for the given table (asumes the seqence-name contains the table-name!)
|
||||
// if yes return sql to drop it
|
||||
// this is still necessary if postgres < 7.3 or the SERIAL was created on an earlier version!!!
|
||||
function _DropAutoIncrement($tabname)
|
||||
{
|
||||
$tabname = $this->connection->quote('%'.$tabname.'%');
|
||||
|
||||
$seq = $this->connection->GetOne("SELECT relname FROM pg_class WHERE NOT relname ~ 'pg_.*' AND relname LIKE $tabname AND relkind='S'");
|
||||
|
||||
// check if a tables depends on the sequenz and it therefor cant and dont need to be droped separatly
|
||||
if (!$seq || $this->connection->GetOne("SELECT relname FROM pg_class JOIN pg_depend ON pg_class.relfilenode=pg_depend.objid WHERE relname='$seq' AND relkind='S' AND deptype='i'")) {
|
||||
return False;
|
||||
}
|
||||
return "DROP SEQUENCE ".$seq;
|
||||
}
|
||||
|
||||
function RenameTableSQL($tabname,$newname)
|
||||
{
|
||||
if (!empty($this->schema)) {
|
||||
$rename_from = $this->TableName($tabname);
|
||||
$schema_save = $this->schema;
|
||||
$this->schema = false;
|
||||
$rename_to = $this->TableName($newname);
|
||||
$this->schema = $schema_save;
|
||||
return array (sprintf($this->renameTable, $rename_from, $rename_to));
|
||||
}
|
||||
|
||||
return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
|
||||
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
|
||||
| table_constraint } [, ... ]
|
||||
)
|
||||
[ INHERITS ( parent_table [, ... ] ) ]
|
||||
[ WITH OIDS | WITHOUT OIDS ]
|
||||
where column_constraint is:
|
||||
[ CONSTRAINT constraint_name ]
|
||||
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
|
||||
CHECK (expression) |
|
||||
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
|
||||
[ ON DELETE action ] [ ON UPDATE action ] }
|
||||
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||
and table_constraint is:
|
||||
[ CONSTRAINT constraint_name ]
|
||||
{ UNIQUE ( column_name [, ... ] ) |
|
||||
PRIMARY KEY ( column_name [, ... ] ) |
|
||||
CHECK ( expression ) |
|
||||
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
|
||||
[ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
|
||||
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||
[ USING acc_method ] ( column [ ops_name ] [, ...] )
|
||||
[ WHERE predicate ]
|
||||
CREATE [ UNIQUE ] INDEX index_name ON table
|
||||
[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
|
||||
[ WHERE predicate ]
|
||||
*/
|
||||
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||
|
||||
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
|
||||
|
||||
if (isset($idxoptions['HASH']))
|
||||
$s .= 'USING HASH ';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
if ( is_array($flds) )
|
||||
$flds = implode(', ',$flds);
|
||||
$s .= '(' . $flds . ')';
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function _GetSize($ftype, $ty, $fsize, $fprec)
|
||||
{
|
||||
if (strlen($fsize) && $ty != 'X' && $ty != 'B' && $ty != 'I' && strpos($ftype,'(') === false) {
|
||||
$ftype .= "(".$fsize;
|
||||
if (strlen($fprec)) $ftype .= ",".$fprec;
|
||||
$ftype .= ')';
|
||||
}
|
||||
return $ftype;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,122 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V4.50 6 July 2004 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Modified from datadict-generic.inc.php for sapdb by RalfBecker-AT-outdoor-training.de
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_sapdb extends ADODB_DataDict {
|
||||
|
||||
var $databaseType = 'sapdb';
|
||||
var $seqField = false;
|
||||
var $renameColumn = 'RENAME COLUMN %s.%s TO %s';
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch($meta) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':
|
||||
case 'X': return 'LONG';
|
||||
|
||||
case 'C2': return 'VARCHAR UNICODE';
|
||||
case 'X2': return 'LONG UNICODE';
|
||||
|
||||
case 'B': return 'LONG';
|
||||
|
||||
case 'D': return 'DATE';
|
||||
case 'TS':
|
||||
case 'T': return 'TIMESTAMP';
|
||||
|
||||
case 'L': return 'BOOLEAN';
|
||||
case 'I': return 'INTEGER';
|
||||
case 'I1': return 'FIXED(3)';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INTEGER';
|
||||
case 'I8': return 'FIXED(20)';
|
||||
|
||||
case 'F': return 'FLOAT(38)';
|
||||
case 'N': return 'FIXED';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
static $maxdb_type2adodb = array(
|
||||
'VARCHAR' => 'C',
|
||||
'CHARACTER' => 'C',
|
||||
'LONG' => 'X', // no way to differ between 'X' and 'B' :-(
|
||||
'DATE' => 'D',
|
||||
'TIMESTAMP' => 'T',
|
||||
'BOOLEAN' => 'L',
|
||||
'INTEGER' => 'I4',
|
||||
'SMALLINT' => 'I2',
|
||||
'FLOAT' => 'F',
|
||||
'FIXED' => 'N',
|
||||
);
|
||||
$type = isset($maxdb_type2adodb[$t]) ? $maxdb_type2adodb[$t] : 'C';
|
||||
|
||||
// convert integer-types simulated with fixed back to integer
|
||||
if ($t == 'FIXED' && !$fieldobj->scale && ($len == 20 || $len == 3)) {
|
||||
$type = $len == 20 ? 'I8' : 'I1';
|
||||
}
|
||||
if ($fieldobj->auto_increment) $type = 'R';
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if ($funsigned) $suffix .= ' UNSIGNED';
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
if ($fautoinc) $suffix .= ' DEFAULT SERIAL';
|
||||
elseif (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
return array( 'ALTER TABLE ' . $tabname . ' ADD (' . implode(', ',$lines) . ')' );
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
return array( 'ALTER TABLE ' . $tabname . ' MODIFY (' . implode(', ',$lines) . ')' );
|
||||
}
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||
foreach($flds as $k => $v) {
|
||||
$flds[$k] = $this->NameQuote($v);
|
||||
}
|
||||
return array( 'ALTER TABLE ' . $tabname . ' DROP (' . implode(', ',$flds) . ')' );
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,229 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB2_sybase extends ADODB_DataDict {
|
||||
var $databaseType = 'sybase';
|
||||
|
||||
var $dropIndex = 'DROP INDEX %2$s.%1$s';
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
$len = -1; // mysql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
|
||||
case 'INT':
|
||||
case 'INTEGER': return 'I';
|
||||
case 'BIT':
|
||||
case 'TINYINT': return 'I1';
|
||||
case 'SMALLINT': return 'I2';
|
||||
case 'BIGINT': return 'I8';
|
||||
|
||||
case 'REAL':
|
||||
case 'FLOAT': return 'F';
|
||||
default: return parent::MetaType($t,$len,$fieldobj);
|
||||
}
|
||||
}
|
||||
|
||||
function ActualType($meta)
|
||||
{
|
||||
switch(strtoupper($meta)) {
|
||||
case 'C': return 'VARCHAR';
|
||||
case 'XL':
|
||||
case 'X': return 'TEXT';
|
||||
|
||||
case 'C2': return 'NVARCHAR';
|
||||
case 'X2': return 'NTEXT';
|
||||
|
||||
case 'B': return 'IMAGE';
|
||||
|
||||
case 'D': return 'DATETIME';
|
||||
case 'TS':
|
||||
case 'T': return 'DATETIME';
|
||||
case 'L': return 'BIT';
|
||||
|
||||
case 'I': return 'INT';
|
||||
case 'I1': return 'TINYINT';
|
||||
case 'I2': return 'SMALLINT';
|
||||
case 'I4': return 'INT';
|
||||
case 'I8': return 'BIGINT';
|
||||
|
||||
case 'F': return 'REAL';
|
||||
case 'N': return 'NUMERIC';
|
||||
default:
|
||||
return $meta;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function AddColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$f = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
$s = "ALTER TABLE $tabname $this->addCol";
|
||||
foreach($lines as $v) {
|
||||
$f[] = "\n $v";
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function AlterColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = array();
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
foreach($lines as $v) {
|
||||
$sql[] = "ALTER TABLE $tabname $this->alterCol $v";
|
||||
}
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
function DropColumnSQL($tabname, $flds)
|
||||
{
|
||||
$tabname = $this->TableName($tabname);
|
||||
if (!is_array($flds)) $flds = explode(',',$flds);
|
||||
$f = array();
|
||||
$s = "ALTER TABLE $tabname";
|
||||
foreach($flds as $v) {
|
||||
$f[] = "\n$this->dropCol ".$this->NameQuote($v);
|
||||
}
|
||||
$s .= implode(', ',$f);
|
||||
$sql[] = $s;
|
||||
return $sql;
|
||||
}
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,&$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$suffix = '';
|
||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
||||
if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT';
|
||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
||||
else if ($suffix == '') $suffix .= ' NULL';
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
/*
|
||||
CREATE TABLE
|
||||
[ database_name.[ owner ] . | owner. ] table_name
|
||||
( { < column_definition >
|
||||
| column_name AS computed_column_expression
|
||||
| < table_constraint > ::= [ CONSTRAINT constraint_name ] }
|
||||
|
||||
| [ { PRIMARY KEY | UNIQUE } [ ,...n ]
|
||||
)
|
||||
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
|
||||
|
||||
< column_definition > ::= { column_name data_type }
|
||||
[ COLLATE < collation_name > ]
|
||||
[ [ DEFAULT constant_expression ]
|
||||
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
|
||||
]
|
||||
[ ROWGUIDCOL]
|
||||
[ < column_constraint > ] [ ...n ]
|
||||
|
||||
< column_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ NULL | NOT NULL ]
|
||||
| [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ON {filegroup | DEFAULT} ] ]
|
||||
]
|
||||
| [ [ FOREIGN KEY ]
|
||||
REFERENCES ref_table [ ( ref_column ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( logical_expression )
|
||||
}
|
||||
|
||||
< table_constraint > ::= [ CONSTRAINT constraint_name ]
|
||||
{ [ { PRIMARY KEY | UNIQUE }
|
||||
[ CLUSTERED | NONCLUSTERED ]
|
||||
{ ( column [ ASC | DESC ] [ ,...n ] ) }
|
||||
[ WITH FILLFACTOR = fillfactor ]
|
||||
[ ON { filegroup | DEFAULT } ]
|
||||
]
|
||||
| FOREIGN KEY
|
||||
[ ( column [ ,...n ] ) ]
|
||||
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
|
||||
[ ON DELETE { CASCADE | NO ACTION } ]
|
||||
[ ON UPDATE { CASCADE | NO ACTION } ]
|
||||
[ NOT FOR REPLICATION ]
|
||||
| CHECK [ NOT FOR REPLICATION ]
|
||||
( search_conditions )
|
||||
}
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
|
||||
ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
|
||||
[ WITH < index_option > [ ,...n] ]
|
||||
[ ON filegroup ]
|
||||
< index_option > :: =
|
||||
{ PAD_INDEX |
|
||||
FILLFACTOR = fillfactor |
|
||||
IGNORE_DUP_KEY |
|
||||
DROP_EXISTING |
|
||||
STATISTICS_NORECOMPUTE |
|
||||
SORT_IN_TEMPDB
|
||||
}
|
||||
*/
|
||||
function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
|
||||
{
|
||||
$sql = array();
|
||||
|
||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
$unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
|
||||
$clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
|
||||
|
||||
if ( is_array($flds) )
|
||||
$flds = implode(', ',$flds);
|
||||
$s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
||||
|
||||
if ( isset($idxoptions[$this->upperName]) )
|
||||
$s .= $idxoptions[$this->upperName];
|
||||
|
||||
$sql[] = $s;
|
||||
|
||||
return $sql;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,87 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft Access data driver. Requires ODBC. Works only on MS Windows.
|
||||
*/
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
if (!defined('_ADODB_ACCESS')) {
|
||||
define('_ADODB_ACCESS',1);
|
||||
|
||||
class ADODB_access extends ADODB_odbc {
|
||||
var $databaseType = 'access';
|
||||
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||
var $fmtDate = "#Y-m-d#";
|
||||
var $fmtTimeStamp = "#Y-m-d h:i:sA#"; // note not comma
|
||||
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
|
||||
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||
var $sysTimeStamp = 'NOW';
|
||||
var $hasTransactions = false;
|
||||
var $upperCase = 'ucase';
|
||||
|
||||
function ADODB_access()
|
||||
{
|
||||
global $ADODB_EXTENSION;
|
||||
|
||||
$ADODB_EXTENSION = false;
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function Time()
|
||||
{
|
||||
return time();
|
||||
}
|
||||
|
||||
function BeginTrans() { return false;}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " IIF(IsNull($field), $ifNull, $field) "; // if Access
|
||||
}
|
||||
/*
|
||||
function MetaTables()
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = odbc_tables($this->_connectionID);
|
||||
$rs = new ADORecordSet_odbc($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) return false;
|
||||
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
//print_pre($arr);
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE')
|
||||
$arr2[] = $arr[$i][2];
|
||||
}
|
||||
return $arr2;
|
||||
}*/
|
||||
}
|
||||
|
||||
|
||||
class ADORecordSet_access extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = "access";
|
||||
|
||||
function ADORecordSet_access($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
}// class
|
||||
}
|
||||
?>
|
||||
@@ -1,660 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft ADO data driver. Requires ADO. Works only on MS Windows.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_ADO_LAYER", 1 );
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class ADODB_ado extends ADOConnection {
|
||||
var $databaseType = "ado";
|
||||
var $_bindInputArray = false;
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $dataProvider = "ado";
|
||||
var $hasAffectedRows = true;
|
||||
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
|
||||
var $_affectedRows = false;
|
||||
var $_thisTransactions;
|
||||
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
|
||||
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
|
||||
var $_lock_type = -1;
|
||||
var $_execute_option = -1;
|
||||
var $poorAffectedRows = true;
|
||||
var $charPage;
|
||||
|
||||
function ADODB_ado()
|
||||
{
|
||||
$this->_affectedRows = new VARIANT;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
|
||||
return array('description' => $desc, 'version' => '');
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
if (PHP_VERSION >= 5) return $this->_affectedRows;
|
||||
|
||||
return $this->_affectedRows->value;
|
||||
}
|
||||
|
||||
// you can also pass a connection string like this:
|
||||
//
|
||||
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
|
||||
{
|
||||
$u = 'UID';
|
||||
$p = 'PWD';
|
||||
|
||||
if (!empty($this->charPage))
|
||||
$dbc = new COM('ADODB.Connection',null,$this->charPage);
|
||||
else
|
||||
$dbc = new COM('ADODB.Connection');
|
||||
|
||||
if (! $dbc) return false;
|
||||
|
||||
/* special support if provider is mssql or access */
|
||||
if ($argProvider=='mssql') {
|
||||
$u = 'User Id'; //User parameter name for OLEDB
|
||||
$p = 'Password';
|
||||
$argProvider = "SQLOLEDB"; // SQL Server Provider
|
||||
|
||||
// not yet
|
||||
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
|
||||
|
||||
//use trusted conection for SQL if username not specified
|
||||
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
|
||||
} else if ($argProvider=='access')
|
||||
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
|
||||
|
||||
if ($argProvider) $dbc->Provider = $argProvider;
|
||||
|
||||
if ($argUsername) $argHostname .= ";$u=$argUsername";
|
||||
if ($argPassword)$argHostname .= ";$p=$argPassword";
|
||||
|
||||
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
|
||||
// @ added below for php 4.0.1 and earlier
|
||||
@$dbc->Open((string) $argHostname);
|
||||
|
||||
$this->_connectionID = $dbc;
|
||||
|
||||
$dbc->CursorLocation = $this->_cursor_location;
|
||||
return $dbc->State > 0;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
|
||||
{
|
||||
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
|
||||
}
|
||||
|
||||
/*
|
||||
adSchemaCatalogs = 1,
|
||||
adSchemaCharacterSets = 2,
|
||||
adSchemaCollations = 3,
|
||||
adSchemaColumns = 4,
|
||||
adSchemaCheckConstraints = 5,
|
||||
adSchemaConstraintColumnUsage = 6,
|
||||
adSchemaConstraintTableUsage = 7,
|
||||
adSchemaKeyColumnUsage = 8,
|
||||
adSchemaReferentialContraints = 9,
|
||||
adSchemaTableConstraints = 10,
|
||||
adSchemaColumnsDomainUsage = 11,
|
||||
adSchemaIndexes = 12,
|
||||
adSchemaColumnPrivileges = 13,
|
||||
adSchemaTablePrivileges = 14,
|
||||
adSchemaUsagePrivileges = 15,
|
||||
adSchemaProcedures = 16,
|
||||
adSchemaSchemata = 17,
|
||||
adSchemaSQLLanguages = 18,
|
||||
adSchemaStatistics = 19,
|
||||
adSchemaTables = 20,
|
||||
adSchemaTranslations = 21,
|
||||
adSchemaProviderTypes = 22,
|
||||
adSchemaViews = 23,
|
||||
adSchemaViewColumnUsage = 24,
|
||||
adSchemaViewTableUsage = 25,
|
||||
adSchemaProcedureParameters = 26,
|
||||
adSchemaForeignKeys = 27,
|
||||
adSchemaPrimaryKeys = 28,
|
||||
adSchemaProcedureColumns = 29,
|
||||
adSchemaDBInfoKeywords = 30,
|
||||
adSchemaDBInfoLiterals = 31,
|
||||
adSchemaCubes = 32,
|
||||
adSchemaDimensions = 33,
|
||||
adSchemaHierarchies = 34,
|
||||
adSchemaLevels = 35,
|
||||
adSchemaMeasures = 36,
|
||||
adSchemaProperties = 37,
|
||||
adSchemaMembers = 38
|
||||
|
||||
*/
|
||||
|
||||
function MetaTables()
|
||||
{
|
||||
$arr= array();
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
$adors=@$dbc->OpenSchema(20);//tables
|
||||
if ($adors){
|
||||
$f = $adors->Fields(2);//table/view name
|
||||
$t = $adors->Fields(3);//table type
|
||||
while (!$adors->EOF){
|
||||
$tt=substr($t->value,0,6);
|
||||
if ($tt!='SYSTEM' && $tt !='ACCESS')
|
||||
$arr[]=$f->value;
|
||||
//print $f->value . ' ' . $t->value.'<br>';
|
||||
$adors->MoveNext();
|
||||
}
|
||||
$adors->Close();
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
$table = strtoupper($table);
|
||||
$arr = array();
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
$adors=@$dbc->OpenSchema(4);//tables
|
||||
|
||||
if ($adors){
|
||||
$t = $adors->Fields(2);//table/view name
|
||||
while (!$adors->EOF){
|
||||
|
||||
|
||||
if (strtoupper($t->Value) == $table) {
|
||||
|
||||
$fld = new ADOFieldObject();
|
||||
$c = $adors->Fields(3);
|
||||
$fld->name = $c->Value;
|
||||
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||
$fld->max_length = -1;
|
||||
$arr[strtoupper($fld->name)]=$fld;
|
||||
}
|
||||
|
||||
$adors->MoveNext();
|
||||
}
|
||||
$adors->Close();
|
||||
}
|
||||
$false = false;
|
||||
return empty($arr) ? $false : $arr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
|
||||
$dbc = $this->_connectionID;
|
||||
$false = false;
|
||||
|
||||
// return rs
|
||||
if ($inputarr) {
|
||||
|
||||
if (!empty($this->charPage))
|
||||
$oCmd = new COM('ADODB.Command',null,$this->charPage);
|
||||
else
|
||||
$oCmd = new COM('ADODB.Command');
|
||||
$oCmd->ActiveConnection = $dbc;
|
||||
$oCmd->CommandText = $sql;
|
||||
$oCmd->CommandType = 1;
|
||||
|
||||
// Map by http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthcreateparam.asp
|
||||
// Check issue http://bugs.php.net/bug.php?id=40664 !!!
|
||||
while(list(, $val) = each($inputarr)) {
|
||||
$type = gettype($val);
|
||||
$len=strlen($val);
|
||||
if ($type == 'boolean')
|
||||
$this->adoParameterType = 11;
|
||||
else if ($type == 'integer')
|
||||
$this->adoParameterType = 3;
|
||||
else if ($type == 'double')
|
||||
$this->adoParameterType = 5;
|
||||
elseif ($type == 'string')
|
||||
$this->adoParameterType = 202;
|
||||
else if (($val === null) || (!defined($val)))
|
||||
$len=1;
|
||||
else
|
||||
$this->adoParameterType = 130;
|
||||
|
||||
// name, type, direction 1 = input, len,
|
||||
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val);
|
||||
|
||||
$oCmd->Parameters->Append($p);
|
||||
}
|
||||
$p = false;
|
||||
$rs = $oCmd->Execute();
|
||||
$e = $dbc->Errors;
|
||||
if ($dbc->Errors->Count > 0) return $false;
|
||||
return $rs;
|
||||
}
|
||||
|
||||
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
|
||||
|
||||
if ($dbc->Errors->Count > 0) return $false;
|
||||
if (! $rs) return $false;
|
||||
|
||||
if ($rs->State == 0) {
|
||||
$true = true;
|
||||
return $true; // 0 = adStateClosed means no records returned
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
|
||||
if (isset($this->_thisTransactions))
|
||||
if (!$this->_thisTransactions) return false;
|
||||
else {
|
||||
$o = $this->_connectionID->Properties("Transaction DDL");
|
||||
$this->_thisTransactions = $o ? true : false;
|
||||
if (!$o) return false;
|
||||
}
|
||||
@$this->_connectionID->BeginTrans();
|
||||
$this->transCnt += 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transOff) return true;
|
||||
|
||||
@$this->_connectionID->CommitTrans();
|
||||
if ($this->transCnt) @$this->transCnt -= 1;
|
||||
return true;
|
||||
}
|
||||
function RollbackTrans() {
|
||||
if ($this->transOff) return true;
|
||||
@$this->_connectionID->RollbackTrans();
|
||||
if ($this->transCnt) @$this->transCnt -= 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation */
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if (!$this->_connectionID) return "No connection established";
|
||||
$errc = $this->_connectionID->Errors;
|
||||
if (!$errc) return "No Errors object found";
|
||||
if ($errc->Count == 0) return '';
|
||||
$err = $errc->Item($errc->Count-1);
|
||||
return $err->Description;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
$errc = $this->_connectionID->Errors;
|
||||
if ($errc->Count == 0) return 0;
|
||||
$err = $errc->Item($errc->Count-1);
|
||||
return $err->NativeError;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
if ($this->_connectionID) $this->_connectionID->Close();
|
||||
$this->_connectionID = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_ado extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "ado";
|
||||
var $dataProvider = "ado";
|
||||
var $_tarr = false; // caches the types
|
||||
var $_flds; // and field objects
|
||||
var $canSeek = true;
|
||||
var $hideErrors = true;
|
||||
|
||||
function ADORecordSet_ado($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
return $this->ADORecordSet($id,$mode);
|
||||
}
|
||||
|
||||
|
||||
// returns the field object
|
||||
function FetchField($fieldOffset = -1) {
|
||||
$off=$fieldOffset+1; // offsets begin at 1
|
||||
|
||||
$o= new ADOFieldObject();
|
||||
$rs = $this->_queryID;
|
||||
$f = $rs->Fields($fieldOffset);
|
||||
$o->name = $f->Name;
|
||||
$t = $f->Type;
|
||||
$o->type = $this->MetaType($t);
|
||||
$o->max_length = $f->DefinedSize;
|
||||
$o->ado_type = $t;
|
||||
|
||||
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
|
||||
return $o;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _initrs()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
$this->_numOfRows = $rs->RecordCount;
|
||||
|
||||
$f = $rs->Fields;
|
||||
$this->_numOfFields = $f->Count;
|
||||
}
|
||||
|
||||
|
||||
// should only be used to move forward as we normally use forward-only cursors
|
||||
function _seek($row)
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
// absoluteposition doesn't work -- my maths is wrong ?
|
||||
// $rs->AbsolutePosition->$row-2;
|
||||
// return true;
|
||||
if ($this->_currentRow > $row) return false;
|
||||
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
OLEDB types
|
||||
|
||||
enum DBTYPEENUM
|
||||
{ DBTYPE_EMPTY = 0,
|
||||
DBTYPE_NULL = 1,
|
||||
DBTYPE_I2 = 2,
|
||||
DBTYPE_I4 = 3,
|
||||
DBTYPE_R4 = 4,
|
||||
DBTYPE_R8 = 5,
|
||||
DBTYPE_CY = 6,
|
||||
DBTYPE_DATE = 7,
|
||||
DBTYPE_BSTR = 8,
|
||||
DBTYPE_IDISPATCH = 9,
|
||||
DBTYPE_ERROR = 10,
|
||||
DBTYPE_BOOL = 11,
|
||||
DBTYPE_VARIANT = 12,
|
||||
DBTYPE_IUNKNOWN = 13,
|
||||
DBTYPE_DECIMAL = 14,
|
||||
DBTYPE_UI1 = 17,
|
||||
DBTYPE_ARRAY = 0x2000,
|
||||
DBTYPE_BYREF = 0x4000,
|
||||
DBTYPE_I1 = 16,
|
||||
DBTYPE_UI2 = 18,
|
||||
DBTYPE_UI4 = 19,
|
||||
DBTYPE_I8 = 20,
|
||||
DBTYPE_UI8 = 21,
|
||||
DBTYPE_GUID = 72,
|
||||
DBTYPE_VECTOR = 0x1000,
|
||||
DBTYPE_RESERVED = 0x8000,
|
||||
DBTYPE_BYTES = 128,
|
||||
DBTYPE_STR = 129,
|
||||
DBTYPE_WSTR = 130,
|
||||
DBTYPE_NUMERIC = 131,
|
||||
DBTYPE_UDT = 132,
|
||||
DBTYPE_DBDATE = 133,
|
||||
DBTYPE_DBTIME = 134,
|
||||
DBTYPE_DBTIMESTAMP = 135
|
||||
|
||||
ADO Types
|
||||
|
||||
adEmpty = 0,
|
||||
adTinyInt = 16,
|
||||
adSmallInt = 2,
|
||||
adInteger = 3,
|
||||
adBigInt = 20,
|
||||
adUnsignedTinyInt = 17,
|
||||
adUnsignedSmallInt = 18,
|
||||
adUnsignedInt = 19,
|
||||
adUnsignedBigInt = 21,
|
||||
adSingle = 4,
|
||||
adDouble = 5,
|
||||
adCurrency = 6,
|
||||
adDecimal = 14,
|
||||
adNumeric = 131,
|
||||
adBoolean = 11,
|
||||
adError = 10,
|
||||
adUserDefined = 132,
|
||||
adVariant = 12,
|
||||
adIDispatch = 9,
|
||||
adIUnknown = 13,
|
||||
adGUID = 72,
|
||||
adDate = 7,
|
||||
adDBDate = 133,
|
||||
adDBTime = 134,
|
||||
adDBTimeStamp = 135,
|
||||
adBSTR = 8,
|
||||
adChar = 129,
|
||||
adVarChar = 200,
|
||||
adLongVarChar = 201,
|
||||
adWChar = 130,
|
||||
adVarWChar = 202,
|
||||
adLongVarWChar = 203,
|
||||
adBinary = 128,
|
||||
adVarBinary = 204,
|
||||
adLongVarBinary = 205,
|
||||
adChapter = 136,
|
||||
adFileTime = 64,
|
||||
adDBFileTime = 137,
|
||||
adPropVariant = 138,
|
||||
adVarNumeric = 139
|
||||
*/
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
if (!is_numeric($t)) return $t;
|
||||
|
||||
switch ($t) {
|
||||
case 0:
|
||||
case 12: // variant
|
||||
case 8: // bstr
|
||||
case 129: //char
|
||||
case 130: //wc
|
||||
case 200: // varc
|
||||
case 202:// varWC
|
||||
case 128: // bin
|
||||
case 204: // varBin
|
||||
case 72: // guid
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 201:
|
||||
case 203:
|
||||
return 'X';
|
||||
case 128:
|
||||
case 204:
|
||||
case 205:
|
||||
return 'B';
|
||||
case 7:
|
||||
case 133: return 'D';
|
||||
|
||||
case 134:
|
||||
case 135: return 'T';
|
||||
|
||||
case 11: return 'L';
|
||||
|
||||
case 16:// adTinyInt = 16,
|
||||
case 2://adSmallInt = 2,
|
||||
case 3://adInteger = 3,
|
||||
case 4://adBigInt = 20,
|
||||
case 17://adUnsignedTinyInt = 17,
|
||||
case 18://adUnsignedSmallInt = 18,
|
||||
case 19://adUnsignedInt = 19,
|
||||
case 20://adUnsignedBigInt = 21,
|
||||
return 'I';
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
// time stamp not supported yet
|
||||
function _fetch()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
if (!$rs or $rs->EOF) {
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
$this->fields = array();
|
||||
|
||||
if (!$this->_tarr) {
|
||||
$tarr = array();
|
||||
$flds = array();
|
||||
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||
$f = $rs->Fields($i);
|
||||
$flds[] = $f;
|
||||
$tarr[] = $f->Type;
|
||||
}
|
||||
// bind types and flds only once
|
||||
$this->_tarr = $tarr;
|
||||
$this->_flds = $flds;
|
||||
}
|
||||
$t = reset($this->_tarr);
|
||||
$f = reset($this->_flds);
|
||||
|
||||
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
|
||||
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
|
||||
switch($t) {
|
||||
case 135: // timestamp
|
||||
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||
else {
|
||||
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
|
||||
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
|
||||
$val=(float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
|
||||
else
|
||||
$val = $f->value;
|
||||
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||
}
|
||||
break;
|
||||
case 133:// A date value (yyyymmdd)
|
||||
if ($val = $f->value) {
|
||||
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
|
||||
} else
|
||||
$this->fields[] = false;
|
||||
break;
|
||||
case 7: // adDate
|
||||
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||
else {
|
||||
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
|
||||
else $val = $f->value;
|
||||
|
||||
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
|
||||
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||
}
|
||||
break;
|
||||
case 1: // null
|
||||
$this->fields[] = false;
|
||||
break;
|
||||
case 6: // currency is not supported properly;
|
||||
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
|
||||
$this->fields[] = (float) $f->value;
|
||||
break;
|
||||
case 11: //BIT;
|
||||
$val = "";
|
||||
if(is_bool($f->value)) {
|
||||
if($f->value==true) $val = 1;
|
||||
else $val = 0;
|
||||
}
|
||||
if(is_null($f->value)) $val = null;
|
||||
|
||||
$this->fields[] = $val;
|
||||
break;
|
||||
default:
|
||||
$this->fields[] = $f->value;
|
||||
break;
|
||||
}
|
||||
//print " $f->value $t, ";
|
||||
$f = next($this->_flds);
|
||||
$t = next($this->_tarr);
|
||||
} // for
|
||||
if ($this->hideErrors) error_reporting($olde);
|
||||
@$rs->MoveNext(); // @ needed for some versions of PHP!
|
||||
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function NextRecordSet()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
$this->_queryID = $rs->NextRecordSet();
|
||||
//$this->_queryID = $this->_QueryId->NextRecordSet();
|
||||
if ($this->_queryID == null) return false;
|
||||
|
||||
$this->_currentRow = -1;
|
||||
$this->_currentPage = -1;
|
||||
$this->bind = false;
|
||||
$this->fields = false;
|
||||
$this->_flds = false;
|
||||
$this->_tarr = false;
|
||||
|
||||
$this->_inited = false;
|
||||
$this->Init();
|
||||
return true;
|
||||
}
|
||||
|
||||
function _close() {
|
||||
$this->_flds = false;
|
||||
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
|
||||
$this->_queryID = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,708 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft ADO data driver. Requires ADO. Works only on MS Windows. PHP5 compat version.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_ADO_LAYER", 1 );
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class ADODB_ado extends ADOConnection {
|
||||
var $databaseType = "ado";
|
||||
var $_bindInputArray = false;
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $dataProvider = "ado";
|
||||
var $hasAffectedRows = true;
|
||||
var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary
|
||||
var $_affectedRows = false;
|
||||
var $_thisTransactions;
|
||||
var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic
|
||||
var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;
|
||||
var $_lock_type = -1;
|
||||
var $_execute_option = -1;
|
||||
var $poorAffectedRows = true;
|
||||
var $charPage;
|
||||
|
||||
function ADODB_ado()
|
||||
{
|
||||
$this->_affectedRows = new VARIANT;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
|
||||
return array('description' => $desc, 'version' => '');
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
if (PHP_VERSION >= 5) return $this->_affectedRows;
|
||||
|
||||
return $this->_affectedRows->value;
|
||||
}
|
||||
|
||||
// you can also pass a connection string like this:
|
||||
//
|
||||
// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
|
||||
function _connect($argHostname, $argUsername, $argPassword,$argDBorProvider, $argProvider= '')
|
||||
{
|
||||
// two modes
|
||||
// - if $argProvider is empty, we assume that $argDBorProvider holds provider -- this is for backward compat
|
||||
// - if $argProvider is not empty, then $argDBorProvider holds db
|
||||
|
||||
|
||||
if ($argProvider) {
|
||||
$argDatabasename = $argDBorProvider;
|
||||
} else {
|
||||
$argDatabasename = '';
|
||||
if ($argDBorProvider) $argProvider = $argDBorProvider;
|
||||
else if (stripos($argHostname,'PROVIDER') === false) /* full conn string is not in $argHostname */
|
||||
$argProvider = 'MSDASQL';
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
$u = 'UID';
|
||||
$p = 'PWD';
|
||||
|
||||
if (!empty($this->charPage))
|
||||
$dbc = new COM('ADODB.Connection',null,$this->charPage);
|
||||
else
|
||||
$dbc = new COM('ADODB.Connection');
|
||||
|
||||
if (! $dbc) return false;
|
||||
|
||||
/* special support if provider is mssql or access */
|
||||
if ($argProvider=='mssql') {
|
||||
$u = 'User Id'; //User parameter name for OLEDB
|
||||
$p = 'Password';
|
||||
$argProvider = "SQLOLEDB"; // SQL Server Provider
|
||||
|
||||
// not yet
|
||||
//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
|
||||
|
||||
//use trusted conection for SQL if username not specified
|
||||
if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
|
||||
} else if ($argProvider=='access')
|
||||
$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
|
||||
|
||||
if ($argProvider) $dbc->Provider = $argProvider;
|
||||
|
||||
if ($argProvider) $argHostname = "PROVIDER=$argProvider;DRIVER={SQL Server};SERVER=$argHostname";
|
||||
|
||||
|
||||
if ($argDatabasename) $argHostname .= ";DATABASE=$argDatabasename";
|
||||
if ($argUsername) $argHostname .= ";$u=$argUsername";
|
||||
if ($argPassword)$argHostname .= ";$p=$argPassword";
|
||||
|
||||
if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");
|
||||
// @ added below for php 4.0.1 and earlier
|
||||
@$dbc->Open((string) $argHostname);
|
||||
|
||||
$this->_connectionID = $dbc;
|
||||
|
||||
$dbc->CursorLocation = $this->_cursor_location;
|
||||
return $dbc->State > 0;
|
||||
} catch (exception $e) {
|
||||
if ($this->debug);echo "<pre>",$argHostname,"\n",$e,"</pre>\n";
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
|
||||
{
|
||||
return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
|
||||
}
|
||||
|
||||
/*
|
||||
adSchemaCatalogs = 1,
|
||||
adSchemaCharacterSets = 2,
|
||||
adSchemaCollations = 3,
|
||||
adSchemaColumns = 4,
|
||||
adSchemaCheckConstraints = 5,
|
||||
adSchemaConstraintColumnUsage = 6,
|
||||
adSchemaConstraintTableUsage = 7,
|
||||
adSchemaKeyColumnUsage = 8,
|
||||
adSchemaReferentialContraints = 9,
|
||||
adSchemaTableConstraints = 10,
|
||||
adSchemaColumnsDomainUsage = 11,
|
||||
adSchemaIndexes = 12,
|
||||
adSchemaColumnPrivileges = 13,
|
||||
adSchemaTablePrivileges = 14,
|
||||
adSchemaUsagePrivileges = 15,
|
||||
adSchemaProcedures = 16,
|
||||
adSchemaSchemata = 17,
|
||||
adSchemaSQLLanguages = 18,
|
||||
adSchemaStatistics = 19,
|
||||
adSchemaTables = 20,
|
||||
adSchemaTranslations = 21,
|
||||
adSchemaProviderTypes = 22,
|
||||
adSchemaViews = 23,
|
||||
adSchemaViewColumnUsage = 24,
|
||||
adSchemaViewTableUsage = 25,
|
||||
adSchemaProcedureParameters = 26,
|
||||
adSchemaForeignKeys = 27,
|
||||
adSchemaPrimaryKeys = 28,
|
||||
adSchemaProcedureColumns = 29,
|
||||
adSchemaDBInfoKeywords = 30,
|
||||
adSchemaDBInfoLiterals = 31,
|
||||
adSchemaCubes = 32,
|
||||
adSchemaDimensions = 33,
|
||||
adSchemaHierarchies = 34,
|
||||
adSchemaLevels = 35,
|
||||
adSchemaMeasures = 36,
|
||||
adSchemaProperties = 37,
|
||||
adSchemaMembers = 38
|
||||
|
||||
*/
|
||||
|
||||
function MetaTables()
|
||||
{
|
||||
$arr= array();
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
$adors=@$dbc->OpenSchema(20);//tables
|
||||
if ($adors){
|
||||
$f = $adors->Fields(2);//table/view name
|
||||
$t = $adors->Fields(3);//table type
|
||||
while (!$adors->EOF){
|
||||
$tt=substr($t->value,0,6);
|
||||
if ($tt!='SYSTEM' && $tt !='ACCESS')
|
||||
$arr[]=$f->value;
|
||||
//print $f->value . ' ' . $t->value.'<br>';
|
||||
$adors->MoveNext();
|
||||
}
|
||||
$adors->Close();
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
$table = strtoupper($table);
|
||||
$arr= array();
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
$adors=@$dbc->OpenSchema(4);//tables
|
||||
|
||||
if ($adors){
|
||||
$t = $adors->Fields(2);//table/view name
|
||||
while (!$adors->EOF){
|
||||
|
||||
|
||||
if (strtoupper($t->Value) == $table) {
|
||||
|
||||
$fld = new ADOFieldObject();
|
||||
$c = $adors->Fields(3);
|
||||
$fld->name = $c->Value;
|
||||
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||
$fld->max_length = -1;
|
||||
$arr[strtoupper($fld->name)]=$fld;
|
||||
}
|
||||
|
||||
$adors->MoveNext();
|
||||
}
|
||||
$adors->Close();
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
try { // In PHP5, all COM errors are exceptions, so to maintain old behaviour...
|
||||
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
// return rs
|
||||
|
||||
$false = false;
|
||||
|
||||
if ($inputarr) {
|
||||
|
||||
if (!empty($this->charPage))
|
||||
$oCmd = new COM('ADODB.Command',null,$this->charPage);
|
||||
else
|
||||
$oCmd = new COM('ADODB.Command');
|
||||
$oCmd->ActiveConnection = $dbc;
|
||||
$oCmd->CommandText = $sql;
|
||||
$oCmd->CommandType = 1;
|
||||
|
||||
while(list(, $val) = each($inputarr)) {
|
||||
$type = gettype($val);
|
||||
$len=strlen($val);
|
||||
if ($type == 'boolean')
|
||||
$this->adoParameterType = 11;
|
||||
else if ($type == 'integer')
|
||||
$this->adoParameterType = 3;
|
||||
else if ($type == 'double')
|
||||
$this->adoParameterType = 5;
|
||||
elseif ($type == 'string')
|
||||
$this->adoParameterType = 202;
|
||||
else if (($val === null) || (!defined($val)))
|
||||
$len=1;
|
||||
else
|
||||
$this->adoParameterType = 130;
|
||||
|
||||
// name, type, direction 1 = input, len,
|
||||
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,$len,$val);
|
||||
|
||||
$oCmd->Parameters->Append($p);
|
||||
}
|
||||
|
||||
$p = false;
|
||||
$rs = $oCmd->Execute();
|
||||
$e = $dbc->Errors;
|
||||
if ($dbc->Errors->Count > 0) return $false;
|
||||
return $rs;
|
||||
}
|
||||
|
||||
$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
|
||||
|
||||
if ($dbc->Errors->Count > 0) return $false;
|
||||
if (! $rs) return $false;
|
||||
|
||||
if ($rs->State == 0) {
|
||||
$true = true;
|
||||
return $true; // 0 = adStateClosed means no records returned
|
||||
}
|
||||
return $rs;
|
||||
|
||||
} catch (exception $e) {
|
||||
|
||||
}
|
||||
return $false;
|
||||
}
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
|
||||
if (isset($this->_thisTransactions))
|
||||
if (!$this->_thisTransactions) return false;
|
||||
else {
|
||||
$o = $this->_connectionID->Properties("Transaction DDL");
|
||||
$this->_thisTransactions = $o ? true : false;
|
||||
if (!$o) return false;
|
||||
}
|
||||
@$this->_connectionID->BeginTrans();
|
||||
$this->transCnt += 1;
|
||||
return true;
|
||||
}
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transOff) return true;
|
||||
|
||||
@$this->_connectionID->CommitTrans();
|
||||
if ($this->transCnt) @$this->transCnt -= 1;
|
||||
return true;
|
||||
}
|
||||
function RollbackTrans() {
|
||||
if ($this->transOff) return true;
|
||||
@$this->_connectionID->RollbackTrans();
|
||||
if ($this->transCnt) @$this->transCnt -= 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation */
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if (!$this->_connectionID) return "No connection established";
|
||||
$errmsg = '';
|
||||
|
||||
try {
|
||||
$errc = $this->_connectionID->Errors;
|
||||
if (!$errc) return "No Errors object found";
|
||||
if ($errc->Count == 0) return '';
|
||||
$err = $errc->Item($errc->Count-1);
|
||||
$errmsg = $err->Description;
|
||||
}catch(exception $e) {
|
||||
}
|
||||
return $errmsg;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
$errc = $this->_connectionID->Errors;
|
||||
if ($errc->Count == 0) return 0;
|
||||
$err = $errc->Item($errc->Count-1);
|
||||
return $err->NativeError;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
if ($this->_connectionID) $this->_connectionID->Close();
|
||||
$this->_connectionID = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_ado extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "ado";
|
||||
var $dataProvider = "ado";
|
||||
var $_tarr = false; // caches the types
|
||||
var $_flds; // and field objects
|
||||
var $canSeek = true;
|
||||
var $hideErrors = true;
|
||||
|
||||
function ADORecordSet_ado($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
return $this->ADORecordSet($id,$mode);
|
||||
}
|
||||
|
||||
|
||||
// returns the field object
|
||||
function FetchField($fieldOffset = -1) {
|
||||
$off=$fieldOffset+1; // offsets begin at 1
|
||||
|
||||
$o= new ADOFieldObject();
|
||||
$rs = $this->_queryID;
|
||||
if (!$rs) return false;
|
||||
|
||||
$f = $rs->Fields($fieldOffset);
|
||||
$o->name = $f->Name;
|
||||
$t = $f->Type;
|
||||
$o->type = $this->MetaType($t);
|
||||
$o->max_length = $f->DefinedSize;
|
||||
$o->ado_type = $t;
|
||||
|
||||
|
||||
//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";
|
||||
return $o;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _initrs()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
|
||||
try {
|
||||
$this->_numOfRows = $rs->RecordCount;
|
||||
} catch (Exception $e) {
|
||||
$this->_numOfRows = -1;
|
||||
}
|
||||
$f = $rs->Fields;
|
||||
$this->_numOfFields = $f->Count;
|
||||
}
|
||||
|
||||
|
||||
// should only be used to move forward as we normally use forward-only cursors
|
||||
function _seek($row)
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
// absoluteposition doesn't work -- my maths is wrong ?
|
||||
// $rs->AbsolutePosition->$row-2;
|
||||
// return true;
|
||||
if ($this->_currentRow > $row) return false;
|
||||
@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
OLEDB types
|
||||
|
||||
enum DBTYPEENUM
|
||||
{ DBTYPE_EMPTY = 0,
|
||||
DBTYPE_NULL = 1,
|
||||
DBTYPE_I2 = 2,
|
||||
DBTYPE_I4 = 3,
|
||||
DBTYPE_R4 = 4,
|
||||
DBTYPE_R8 = 5,
|
||||
DBTYPE_CY = 6,
|
||||
DBTYPE_DATE = 7,
|
||||
DBTYPE_BSTR = 8,
|
||||
DBTYPE_IDISPATCH = 9,
|
||||
DBTYPE_ERROR = 10,
|
||||
DBTYPE_BOOL = 11,
|
||||
DBTYPE_VARIANT = 12,
|
||||
DBTYPE_IUNKNOWN = 13,
|
||||
DBTYPE_DECIMAL = 14,
|
||||
DBTYPE_UI1 = 17,
|
||||
DBTYPE_ARRAY = 0x2000,
|
||||
DBTYPE_BYREF = 0x4000,
|
||||
DBTYPE_I1 = 16,
|
||||
DBTYPE_UI2 = 18,
|
||||
DBTYPE_UI4 = 19,
|
||||
DBTYPE_I8 = 20,
|
||||
DBTYPE_UI8 = 21,
|
||||
DBTYPE_GUID = 72,
|
||||
DBTYPE_VECTOR = 0x1000,
|
||||
DBTYPE_RESERVED = 0x8000,
|
||||
DBTYPE_BYTES = 128,
|
||||
DBTYPE_STR = 129,
|
||||
DBTYPE_WSTR = 130,
|
||||
DBTYPE_NUMERIC = 131,
|
||||
DBTYPE_UDT = 132,
|
||||
DBTYPE_DBDATE = 133,
|
||||
DBTYPE_DBTIME = 134,
|
||||
DBTYPE_DBTIMESTAMP = 135
|
||||
|
||||
ADO Types
|
||||
|
||||
adEmpty = 0,
|
||||
adTinyInt = 16,
|
||||
adSmallInt = 2,
|
||||
adInteger = 3,
|
||||
adBigInt = 20,
|
||||
adUnsignedTinyInt = 17,
|
||||
adUnsignedSmallInt = 18,
|
||||
adUnsignedInt = 19,
|
||||
adUnsignedBigInt = 21,
|
||||
adSingle = 4,
|
||||
adDouble = 5,
|
||||
adCurrency = 6,
|
||||
adDecimal = 14,
|
||||
adNumeric = 131,
|
||||
adBoolean = 11,
|
||||
adError = 10,
|
||||
adUserDefined = 132,
|
||||
adVariant = 12,
|
||||
adIDispatch = 9,
|
||||
adIUnknown = 13,
|
||||
adGUID = 72,
|
||||
adDate = 7,
|
||||
adDBDate = 133,
|
||||
adDBTime = 134,
|
||||
adDBTimeStamp = 135,
|
||||
adBSTR = 8,
|
||||
adChar = 129,
|
||||
adVarChar = 200,
|
||||
adLongVarChar = 201,
|
||||
adWChar = 130,
|
||||
adVarWChar = 202,
|
||||
adLongVarWChar = 203,
|
||||
adBinary = 128,
|
||||
adVarBinary = 204,
|
||||
adLongVarBinary = 205,
|
||||
adChapter = 136,
|
||||
adFileTime = 64,
|
||||
adDBFileTime = 137,
|
||||
adPropVariant = 138,
|
||||
adVarNumeric = 139
|
||||
*/
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
if (!is_numeric($t)) return $t;
|
||||
|
||||
switch ($t) {
|
||||
case 0:
|
||||
case 12: // variant
|
||||
case 8: // bstr
|
||||
case 129: //char
|
||||
case 130: //wc
|
||||
case 200: // varc
|
||||
case 202:// varWC
|
||||
case 128: // bin
|
||||
case 204: // varBin
|
||||
case 72: // guid
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 201:
|
||||
case 203:
|
||||
return 'X';
|
||||
case 128:
|
||||
case 204:
|
||||
case 205:
|
||||
return 'B';
|
||||
case 7:
|
||||
case 133: return 'D';
|
||||
|
||||
case 134:
|
||||
case 135: return 'T';
|
||||
|
||||
case 11: return 'L';
|
||||
|
||||
case 16:// adTinyInt = 16,
|
||||
case 2://adSmallInt = 2,
|
||||
case 3://adInteger = 3,
|
||||
case 4://adBigInt = 20,
|
||||
case 17://adUnsignedTinyInt = 17,
|
||||
case 18://adUnsignedSmallInt = 18,
|
||||
case 19://adUnsignedInt = 19,
|
||||
case 20://adUnsignedBigInt = 21,
|
||||
return 'I';
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
// time stamp not supported yet
|
||||
function _fetch()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
if (!$rs or $rs->EOF) {
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
$this->fields = array();
|
||||
|
||||
if (!$this->_tarr) {
|
||||
$tarr = array();
|
||||
$flds = array();
|
||||
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||
$f = $rs->Fields($i);
|
||||
$flds[] = $f;
|
||||
$tarr[] = $f->Type;
|
||||
}
|
||||
// bind types and flds only once
|
||||
$this->_tarr = $tarr;
|
||||
$this->_flds = $flds;
|
||||
}
|
||||
$t = reset($this->_tarr);
|
||||
$f = reset($this->_flds);
|
||||
|
||||
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
|
||||
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
|
||||
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
|
||||
switch($t) {
|
||||
case 135: // timestamp
|
||||
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||
else {
|
||||
if (!is_numeric($f->value)) # $val = variant_date_to_timestamp($f->value);
|
||||
// VT_DATE stores dates as (float) fractional days since 1899/12/30 00:00:00
|
||||
$val= (float) variant_cast($f->value,VT_R8)*3600*24-2209161600;
|
||||
else
|
||||
$val = $f->value;
|
||||
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||
}
|
||||
break;
|
||||
case 133:// A date value (yyyymmdd)
|
||||
if ($val = $f->value) {
|
||||
$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
|
||||
} else
|
||||
$this->fields[] = false;
|
||||
break;
|
||||
case 7: // adDate
|
||||
if (!strlen((string)$f->value)) $this->fields[] = false;
|
||||
else {
|
||||
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
|
||||
else $val = $f->value;
|
||||
|
||||
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
|
||||
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
|
||||
}
|
||||
break;
|
||||
case 1: // null
|
||||
$this->fields[] = false;
|
||||
break;
|
||||
case 20:
|
||||
case 21: // bigint (64 bit)
|
||||
$this->fields[] = (float) $f->value; // if 64 bit PHP, could use (int)
|
||||
break;
|
||||
case 6: // currency is not supported properly;
|
||||
ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');
|
||||
$this->fields[] = (float) $f->value;
|
||||
break;
|
||||
case 11: //BIT;
|
||||
$val = "";
|
||||
if(is_bool($f->value)) {
|
||||
if($f->value==true) $val = 1;
|
||||
else $val = 0;
|
||||
}
|
||||
if(is_null($f->value)) $val = null;
|
||||
|
||||
$this->fields[] = $val;
|
||||
break;
|
||||
default:
|
||||
$this->fields[] = $f->value;
|
||||
break;
|
||||
}
|
||||
//print " $f->value $t, ";
|
||||
$f = next($this->_flds);
|
||||
$t = next($this->_tarr);
|
||||
} // for
|
||||
if ($this->hideErrors) error_reporting($olde);
|
||||
@$rs->MoveNext(); // @ needed for some versions of PHP!
|
||||
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function NextRecordSet()
|
||||
{
|
||||
$rs = $this->_queryID;
|
||||
$this->_queryID = $rs->NextRecordSet();
|
||||
//$this->_queryID = $this->_QueryId->NextRecordSet();
|
||||
if ($this->_queryID == null) return false;
|
||||
|
||||
$this->_currentRow = -1;
|
||||
$this->_currentPage = -1;
|
||||
$this->bind = false;
|
||||
$this->fields = false;
|
||||
$this->_flds = false;
|
||||
$this->_tarr = false;
|
||||
|
||||
$this->_inited = false;
|
||||
$this->Init();
|
||||
return true;
|
||||
}
|
||||
|
||||
function _close() {
|
||||
$this->_flds = false;
|
||||
try {
|
||||
@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
|
||||
} catch (Exception $e) {
|
||||
}
|
||||
$this->_queryID = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,54 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft Access ADO data driver. Requires ADO and ODBC. Works only on MS Windows.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ADO_LAYER')) {
|
||||
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
|
||||
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
|
||||
}
|
||||
|
||||
class ADODB_ado_access extends ADODB_ado {
|
||||
var $databaseType = 'ado_access';
|
||||
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||
var $fmtDate = "#Y-m-d#";
|
||||
var $fmtTimeStamp = "#Y-m-d h:i:sA#";// note no comma
|
||||
var $sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||
var $sysTimeStamp = 'NOW';
|
||||
var $upperCase = 'ucase';
|
||||
|
||||
function ADODB_ado_access()
|
||||
{
|
||||
$this->ADODB_ado();
|
||||
}
|
||||
|
||||
/*function BeginTrans() { return false;}
|
||||
|
||||
function CommitTrans() { return false;}
|
||||
|
||||
function RollbackTrans() { return false;}*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
class ADORecordSet_ado_access extends ADORecordSet_ado {
|
||||
|
||||
var $databaseType = "ado_access";
|
||||
|
||||
function ADORecordSet_ado_access($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_ado($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,154 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft SQL Server ADO data driver. Requires ADO and MSSQL client.
|
||||
Works only on MS Windows.
|
||||
|
||||
Warning: Some versions of PHP (esp PHP4) leak memory when ADO/COM is used.
|
||||
Please check http://bugs.php.net/ for more info.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ADO_LAYER')) {
|
||||
if (PHP_VERSION >= 5) include(ADODB_DIR."/drivers/adodb-ado5.inc.php");
|
||||
else include(ADODB_DIR."/drivers/adodb-ado.inc.php");
|
||||
}
|
||||
|
||||
|
||||
class ADODB_ado_mssql extends ADODB_ado {
|
||||
var $databaseType = 'ado_mssql';
|
||||
var $hasTop = 'top';
|
||||
var $hasInsertID = true;
|
||||
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||
var $sysTimeStamp = 'GetDate()';
|
||||
var $leftOuter = '*=';
|
||||
var $rightOuter = '=*';
|
||||
var $ansiOuter = true; // for mssql7 or later
|
||||
var $substr = "substring";
|
||||
var $length = 'len';
|
||||
var $_dropSeqSQL = "drop table %s";
|
||||
|
||||
//var $_inTransaction = 1; // always open recordsets, so no transaction problems.
|
||||
|
||||
function ADODB_ado_mssql()
|
||||
{
|
||||
$this->ADODB_ado();
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return $this->GetOne('select SCOPE_IDENTITY()');
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->GetOne('select @@rowcount');
|
||||
}
|
||||
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
function qstr($s,$magic_quotes=false)
|
||||
{
|
||||
$s = ADOConnection::qstr($s, $magic_quotes);
|
||||
return str_replace("\0", "\\\\000", $s);
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
$table = strtoupper($table);
|
||||
$arr= array();
|
||||
$dbc = $this->_connectionID;
|
||||
|
||||
$osoptions = array();
|
||||
$osoptions[0] = null;
|
||||
$osoptions[1] = null;
|
||||
$osoptions[2] = $table;
|
||||
$osoptions[3] = null;
|
||||
|
||||
$adors=@$dbc->OpenSchema(4, $osoptions);//tables
|
||||
|
||||
if ($adors){
|
||||
while (!$adors->EOF){
|
||||
$fld = new ADOFieldObject();
|
||||
$c = $adors->Fields(3);
|
||||
$fld->name = $c->Value;
|
||||
$fld->type = 'CHAR'; // cannot discover type in ADO!
|
||||
$fld->max_length = -1;
|
||||
$arr[strtoupper($fld->name)]=$fld;
|
||||
|
||||
$adors->MoveNext();
|
||||
}
|
||||
$adors->Close();
|
||||
}
|
||||
$false = false;
|
||||
return empty($arr) ? $false : $arr;
|
||||
}
|
||||
|
||||
function CreateSequence($seq='adodbseq',$start=1)
|
||||
{
|
||||
|
||||
$this->Execute('BEGIN TRANSACTION adodbseq');
|
||||
$start -= 1;
|
||||
$this->Execute("create table $seq (id float(53))");
|
||||
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||
if (!$ok) {
|
||||
$this->Execute('ROLLBACK TRANSACTION adodbseq');
|
||||
return false;
|
||||
}
|
||||
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||
return true;
|
||||
}
|
||||
|
||||
function GenID($seq='adodbseq',$start=1)
|
||||
{
|
||||
//$this->debug=1;
|
||||
$this->Execute('BEGIN TRANSACTION adodbseq');
|
||||
$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
|
||||
if (!$ok) {
|
||||
$this->Execute("create table $seq (id float(53))");
|
||||
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||
if (!$ok) {
|
||||
$this->Execute('ROLLBACK TRANSACTION adodbseq');
|
||||
return false;
|
||||
}
|
||||
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||
return $start;
|
||||
}
|
||||
$num = $this->GetOne("select id from $seq");
|
||||
$this->Execute('COMMIT TRANSACTION adodbseq');
|
||||
return $num;
|
||||
|
||||
// in old implementation, pre 1.90, we returned GUID...
|
||||
//return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'");
|
||||
}
|
||||
|
||||
} // end class
|
||||
|
||||
class ADORecordSet_ado_mssql extends ADORecordSet_ado {
|
||||
|
||||
var $databaseType = 'ado_mssql';
|
||||
|
||||
function ADORecordSet_ado_mssql($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_ado($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,796 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
(c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
|
||||
Portions Copyright (c) 2007-2009, iAnywhere Solutions, Inc.
|
||||
All rights reserved. All unpublished rights reserved.
|
||||
|
||||
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.
|
||||
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
|
||||
NOTE: This driver requires the Advantage PHP client libraries, which
|
||||
can be downloaded for free via:
|
||||
http://devzone.advantagedatabase.com/dz/content.aspx?key=20
|
||||
|
||||
DELPHI FOR PHP USERS:
|
||||
The following steps can be taken to utilize this driver from the
|
||||
CodeGear Delphi for PHP product:
|
||||
1 - See note above, download and install the Advantage PHP client.
|
||||
2 - Copy the following files to the Delphi for PHP\X.X\php\ext directory:
|
||||
ace32.dll
|
||||
axcws32.dll
|
||||
adsloc32.dll
|
||||
php_advantage.dll (rename the existing php_advantage.dll.5.x.x file)
|
||||
3 - Add the following line to the Delphi for PHP\X.X\php\php.ini.template file:
|
||||
extension=php_advantage.dll
|
||||
4 - To use: enter "ads" as the DriverName on a connection component, and set
|
||||
a Host property similar to "DataDirectory=c:\". See the Advantage PHP
|
||||
help file topic for ads_connect for details on connection path options
|
||||
and formatting.
|
||||
5 - (optional) - Modify the Delphi for PHP\X.X\vcl\packages\database.packages.php
|
||||
file and add ads to the list of strings returned when registering the
|
||||
Database object's DriverName property.
|
||||
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_ADS_LAYER", 2 );
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class ADODB_ads extends ADOConnection {
|
||||
var $databaseType = "ads";
|
||||
var $fmt = "'m-d-Y'";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $concat_operator = '';
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $dataProvider = "ads";
|
||||
var $hasAffectedRows = true;
|
||||
var $binmode = ODBC_BINMODE_RETURN;
|
||||
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
|
||||
// breaking backward-compat
|
||||
//var $longreadlen = 8000; // default number of chars to return for a Blob/Long field
|
||||
var $_bindInputArray = false;
|
||||
var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
|
||||
var $_genSeqSQL = "create table %s (id integer)";
|
||||
var $_autocommit = true;
|
||||
var $_haserrorfunctions = true;
|
||||
var $_has_stupid_odbc_fetch_api_change = true;
|
||||
var $_lastAffectedRows = 0;
|
||||
var $uCaseTables = true; // for meta* functions, uppercase table names
|
||||
|
||||
|
||||
function ADODB_ads()
|
||||
{
|
||||
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
|
||||
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('ads_connect')) return null;
|
||||
|
||||
if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') {
|
||||
ADOConnection::outp("For Advantage Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||
}
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword);
|
||||
else $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('ads_connect')) return null;
|
||||
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if ($this->debug && $argDatabasename) {
|
||||
ADOConnection::outp("For PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||
}
|
||||
// print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush();
|
||||
if ($this->curmode === false) $this->_connectionID = ads_connect($argDSN,$argUsername,$argPassword);
|
||||
else $this->_connectionID = ads_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if ($this->_connectionID && $this->autoRollback) @ads_rollback($this->_connectionID);
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
// returns the Server version and Description
|
||||
function ServerInfo()
|
||||
{
|
||||
|
||||
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
|
||||
$stmt = $this->Prepare('EXECUTE PROCEDURE sp_mgGetInstallInfo()');
|
||||
$res = $this->Execute($stmt);
|
||||
if(!$res)
|
||||
print $this->ErrorMsg();
|
||||
else{
|
||||
$ret["version"]= $res->fields[3];
|
||||
$ret["description"]="Advantage Database Server";
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return ADOConnection::ServerInfo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// returns true or false
|
||||
function CreateSequence( $seqname,$start=1)
|
||||
{
|
||||
$res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE");
|
||||
if(!$res){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function DropSequence($seqname)
|
||||
{
|
||||
$res = $this->Execute("DROP TABLE $seqname");
|
||||
if(!$res){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// returns the generated ID or false
|
||||
// checks if the table already exists, else creates the table and inserts a record into the table
|
||||
// and gets the ID number of the last inserted record.
|
||||
function GenID($seqname,$start=1)
|
||||
{
|
||||
$go = $this->Execute("select * from $seqname");
|
||||
if (!$go){
|
||||
$res = $this->Execute("CREATE TABLE $seqname ( ID autoinc( 1 ) ) IN DATABASE");
|
||||
if(!res){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$res = $this->Execute("INSERT INTO $seqname VALUES( DEFAULT )");
|
||||
if(!$res){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
$gen = $this->Execute("SELECT LastAutoInc( STATEMENT ) FROM system.iota");
|
||||
$ret = $gen->fields[0];
|
||||
return $ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||
if (empty($this->_connectionID)) return @ads_errormsg();
|
||||
return @ads_errormsg($this->_connectionID);
|
||||
} else return ADOConnection::ErrorMsg();
|
||||
}
|
||||
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorCode !== false) {
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
|
||||
}
|
||||
|
||||
if (empty($this->_connectionID)) $e = @ads_error();
|
||||
else $e = @ads_error($this->_connectionID);
|
||||
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
// so we check and patch
|
||||
if (strlen($e)<=2) return 0;
|
||||
return $e;
|
||||
} else return ADOConnection::ErrorNo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->_autocommit = false;
|
||||
return ads_autocommit($this->_connectionID,false);
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = ads_commit($this->_connectionID);
|
||||
ads_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = ads_rollback($this->_connectionID);
|
||||
ads_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
// Returns tables,Views or both on succesfull execution. Returns
|
||||
// tables by default on succesfull execustion.
|
||||
function &MetaTables($ttype)
|
||||
{
|
||||
$recordSet1 = $this->Execute("select * from system.tables");
|
||||
if(!$recordSet1){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
$recordSet2 = $this->Execute("select * from system.views");
|
||||
if(!$recordSet2){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
$i=0;
|
||||
while (!$recordSet1->EOF){
|
||||
$arr["$i"] = $recordSet1->fields[0];
|
||||
$recordSet1->MoveNext();
|
||||
$i=$i+1;
|
||||
}
|
||||
if($ttype=='FALSE'){
|
||||
while (!$recordSet2->EOF){
|
||||
$arr["$i"] = $recordSet2->fields[0];
|
||||
$recordSet2->MoveNext();
|
||||
$i=$i+1;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
elseif($ttype=='VIEWS'){
|
||||
while (!$recordSet2->EOF){
|
||||
$arrV["$i"] = $recordSet2->fields[0];
|
||||
$recordSet2->MoveNext();
|
||||
$i=$i+1;
|
||||
}
|
||||
return $arrV;
|
||||
}
|
||||
else{
|
||||
return $arr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function &MetaPrimaryKeys($table)
|
||||
{
|
||||
$recordSet = $this->Execute("select table_primary_key from system.tables where name='$table'");
|
||||
if(!$recordSet){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
$i=0;
|
||||
while (!$recordSet->EOF){
|
||||
$arr["$i"] = $recordSet->fields[0];
|
||||
$recordSet->MoveNext();
|
||||
$i=$i+1;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/*
|
||||
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp
|
||||
/ SQL data type codes /
|
||||
#define SQL_UNKNOWN_TYPE 0
|
||||
#define SQL_CHAR 1
|
||||
#define SQL_NUMERIC 2
|
||||
#define SQL_DECIMAL 3
|
||||
#define SQL_INTEGER 4
|
||||
#define SQL_SMALLINT 5
|
||||
#define SQL_FLOAT 6
|
||||
#define SQL_REAL 7
|
||||
#define SQL_DOUBLE 8
|
||||
#if (ODBCVER >= 0x0300)
|
||||
#define SQL_DATETIME 9
|
||||
#endif
|
||||
#define SQL_VARCHAR 12
|
||||
|
||||
|
||||
/ One-parameter shortcuts for date/time data types /
|
||||
#if (ODBCVER >= 0x0300)
|
||||
#define SQL_TYPE_DATE 91
|
||||
#define SQL_TYPE_TIME 92
|
||||
#define SQL_TYPE_TIMESTAMP 93
|
||||
|
||||
#define SQL_UNICODE (-95)
|
||||
#define SQL_UNICODE_VARCHAR (-96)
|
||||
#define SQL_UNICODE_LONGVARCHAR (-97)
|
||||
*/
|
||||
function ODBCTypes($t)
|
||||
{
|
||||
switch ((integer)$t) {
|
||||
case 1:
|
||||
case 12:
|
||||
case 0:
|
||||
case -95:
|
||||
case -96:
|
||||
return 'C';
|
||||
case -97:
|
||||
case -1: //text
|
||||
return 'X';
|
||||
case -4: //image
|
||||
return 'B';
|
||||
|
||||
case 9:
|
||||
case 91:
|
||||
return 'D';
|
||||
|
||||
case 10:
|
||||
case 11:
|
||||
case 92:
|
||||
case 93:
|
||||
return 'T';
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
case -6:
|
||||
return 'I';
|
||||
|
||||
case -11: // uniqidentifier
|
||||
return 'R';
|
||||
case -7: //bit
|
||||
return 'L';
|
||||
|
||||
default:
|
||||
return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function &MetaColumns($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
/*if (false) { // after testing, confirmed that the following does not work becoz of a bug
|
||||
$qid2 = ads_tables($this->_connectionID);
|
||||
$rs = new ADORecordSet_ads($qid2);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) return false;
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
$rs->_fetch();
|
||||
|
||||
while (!$rs->EOF) {
|
||||
if ($table == strtoupper($rs->fields[2])) {
|
||||
$q = $rs->fields[0];
|
||||
$o = $rs->fields[1];
|
||||
break;
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
|
||||
$qid = ads_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
|
||||
} */
|
||||
|
||||
switch ($this->databaseType) {
|
||||
case 'access':
|
||||
case 'vfp':
|
||||
$qid = ads_columns($this->_connectionID);#,'%','',strtoupper($table),'%');
|
||||
break;
|
||||
|
||||
|
||||
case 'db2':
|
||||
$colname = "%";
|
||||
$qid = ads_columns($this->_connectionID, "", $schema, $table, $colname);
|
||||
break;
|
||||
|
||||
default:
|
||||
$qid = @ads_columns($this->_connectionID,'%','%',strtoupper($table),'%');
|
||||
if (empty($qid)) $qid = ads_columns($this->_connectionID);
|
||||
break;
|
||||
}
|
||||
if (empty($qid)) return $false;
|
||||
|
||||
$rs = new ADORecordSet_ads($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return $false;
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
$rs->_fetch();
|
||||
|
||||
$retarr = array();
|
||||
|
||||
/*
|
||||
$rs->fields indices
|
||||
0 TABLE_QUALIFIER
|
||||
1 TABLE_SCHEM
|
||||
2 TABLE_NAME
|
||||
3 COLUMN_NAME
|
||||
4 DATA_TYPE
|
||||
5 TYPE_NAME
|
||||
6 PRECISION
|
||||
7 LENGTH
|
||||
8 SCALE
|
||||
9 RADIX
|
||||
10 NULLABLE
|
||||
11 REMARKS
|
||||
*/
|
||||
while (!$rs->EOF) {
|
||||
// adodb_pr($rs->fields);
|
||||
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[3];
|
||||
$fld->type = $this->ODBCTypes($rs->fields[4]);
|
||||
|
||||
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
|
||||
// access uses precision to store length for char/varchar
|
||||
if ($fld->type == 'C' or $fld->type == 'X') {
|
||||
if ($this->databaseType == 'access')
|
||||
$fld->max_length = $rs->fields[6];
|
||||
else if ($rs->fields[4] <= -95) // UNICODE
|
||||
$fld->max_length = $rs->fields[7]/2;
|
||||
else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
} else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
$fld->not_null = !empty($rs->fields[10]);
|
||||
$fld->scale = $rs->fields[8];
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
} else if (sizeof($retarr)>0)
|
||||
break;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close(); //-- crashes 4.03pl1 -- why?
|
||||
|
||||
if (empty($retarr)) $retarr = false;
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
// Returns an array of columns names for a given table
|
||||
function &MetaColumnNames($table)
|
||||
{
|
||||
$recordSet = $this->Execute("select name from system.columns where parent='$table'");
|
||||
if(!$recordSet){
|
||||
print $this->ErrorMsg();
|
||||
return false;
|
||||
}
|
||||
else{
|
||||
$i=0;
|
||||
while (!$recordSet->EOF){
|
||||
$arr["FIELD$i"] = $recordSet->fields[0];
|
||||
$recordSet->MoveNext();
|
||||
$i=$i+1;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
if (! $this->_bindInputArray) return $sql; // no binding
|
||||
$stmt = ads_prepare($this->_connectionID,$sql);
|
||||
if (!$stmt) {
|
||||
// we don't know whether odbc driver is parsing prepared stmts, so just return sql
|
||||
return $sql;
|
||||
}
|
||||
return array($sql,$stmt,false);
|
||||
}
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
GLOBAL $php_errormsg;
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_error = '';
|
||||
|
||||
if ($inputarr) {
|
||||
if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
} else {
|
||||
$stmtid = ads_prepare($this->_connectionID,$sql);
|
||||
|
||||
if ($stmtid == false) {
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! ads_execute($stmtid,$inputarr)) {
|
||||
//@ads_free_result($stmtid);
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = ads_errormsg();
|
||||
$this->_errorCode = ads_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} else if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
if (!ads_execute($stmtid)) {
|
||||
//@ads_free_result($stmtid);
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = ads_errormsg();
|
||||
$this->_errorCode = ads_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
{
|
||||
|
||||
$stmtid = ads_exec($this->_connectionID,$sql);
|
||||
|
||||
}
|
||||
|
||||
$this->_lastAffectedRows = 0;
|
||||
|
||||
if ($stmtid)
|
||||
{
|
||||
|
||||
if (@ads_num_fields($stmtid) == 0) {
|
||||
$this->_lastAffectedRows = ads_num_rows($stmtid);
|
||||
$stmtid = true;
|
||||
|
||||
} else {
|
||||
|
||||
$this->_lastAffectedRows = 0;
|
||||
ads_binmode($stmtid,$this->binmode);
|
||||
ads_longreadlen($stmtid,$this->maxblobsize);
|
||||
|
||||
}
|
||||
|
||||
if ($this->_haserrorfunctions)
|
||||
{
|
||||
|
||||
$this->_errorMsg = '';
|
||||
$this->_errorCode = 0;
|
||||
}
|
||||
else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = ads_errormsg();
|
||||
$this->_errorCode = ads_error();
|
||||
} else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
}
|
||||
|
||||
return $stmtid;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
$sql = "UPDATE $table SET $column=? WHERE $where";
|
||||
$stmtid = ads_prepare($this->_connectionID,$sql);
|
||||
if ($stmtid == false){
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
return false;
|
||||
}
|
||||
if (! ads_execute($stmtid,array($val),array(SQL_BINARY) )){
|
||||
if ($this->_haserrorfunctions){
|
||||
$this->_errorMsg = ads_errormsg();
|
||||
$this->_errorCode = ads_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
$ret = @ads_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->_lastAffectedRows;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_ads extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "ads";
|
||||
var $dataProvider = "ads";
|
||||
var $useFetchArray;
|
||||
var $_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
function ADORecordSet_ads($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
|
||||
$this->_queryID = $id;
|
||||
|
||||
// the following is required for mysql odbc driver in 4.3.1 -- why?
|
||||
$this->EOF = false;
|
||||
$this->_currentRow = -1;
|
||||
//$this->ADORecordSet($id);
|
||||
}
|
||||
|
||||
|
||||
// returns the field object
|
||||
function &FetchField($fieldOffset = -1)
|
||||
{
|
||||
|
||||
$off=$fieldOffset+1; // offsets begin at 1
|
||||
|
||||
$o= new ADOFieldObject();
|
||||
$o->name = @ads_field_name($this->_queryID,$off);
|
||||
$o->type = @ads_field_type($this->_queryID,$off);
|
||||
$o->max_length = @ads_field_len($this->_queryID,$off);
|
||||
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||
return $o;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS) ? @ads_num_rows($this->_queryID) : -1;
|
||||
$this->_numOfFields = @ads_num_fields($this->_queryID);
|
||||
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
|
||||
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
|
||||
//$this->useFetchArray = $this->connection->useFetchArray;
|
||||
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
|
||||
function &GetArrayLimit($nrows,$offset=-1)
|
||||
{
|
||||
if ($offset <= 0) {
|
||||
$rs =& $this->GetArray($nrows);
|
||||
return $rs;
|
||||
}
|
||||
$savem = $this->fetchMode;
|
||||
$this->fetchMode = ADODB_FETCH_NUM;
|
||||
$this->Move($offset);
|
||||
$this->fetchMode = $savem;
|
||||
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
|
||||
$results = array();
|
||||
$cnt = 0;
|
||||
while (!$this->EOF && $nrows != $cnt) {
|
||||
$results[$cnt++] = $this->fields;
|
||||
$this->MoveNext();
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if ($this->_numOfRows != 0 && !$this->EOF) {
|
||||
$this->_currentRow++;
|
||||
|
||||
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||
$rez = @ads_fetch_into($this->_queryID,$this->fields);
|
||||
else {
|
||||
$row = 0;
|
||||
$rez = @ads_fetch_into($this->_queryID,$row,$this->fields);
|
||||
}
|
||||
if ($rez) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->fields = false;
|
||||
$this->EOF = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
|
||||
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||
$rez = @ads_fetch_into($this->_queryID,$this->fields);
|
||||
else {
|
||||
$row = 0;
|
||||
$rez = @ads_fetch_into($this->_queryID,$row,$this->fields);
|
||||
}
|
||||
if ($rez) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
return @ads_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,92 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Support Borland Interbase 6.5 and later
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
|
||||
|
||||
class ADODB_borland_ibase extends ADODB_ibase {
|
||||
var $databaseType = "borland_ibase";
|
||||
|
||||
|
||||
function ADODB_borland_ibase()
|
||||
{
|
||||
$this->ADODB_ibase();
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->autoCommit = false;
|
||||
$this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
|
||||
return $this->_transactionID;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['dialect'] = $this->dialect;
|
||||
switch($arr['dialect']) {
|
||||
case '':
|
||||
case '1': $s = 'Interbase 6.5, Dialect 1'; break;
|
||||
case '2': $s = 'Interbase 6.5, Dialect 2'; break;
|
||||
default:
|
||||
case '3': $s = 'Interbase 6.5, Dialect 3'; break;
|
||||
}
|
||||
$arr['version'] = '6.5';
|
||||
$arr['description'] = $s;
|
||||
return $arr;
|
||||
}
|
||||
|
||||
// Note that Interbase 6.5 uses ROWS instead - don't you love forking wars!
|
||||
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
|
||||
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
|
||||
// Firebird uses
|
||||
// SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
if ($nrows > 0) {
|
||||
if ($offset <= 0) $str = " ROWS $nrows ";
|
||||
else {
|
||||
$a = $offset+1;
|
||||
$b = $offset+$nrows;
|
||||
$str = " ROWS $a TO $b";
|
||||
}
|
||||
} else {
|
||||
// ok, skip
|
||||
$a = $offset + 1;
|
||||
$str = " ROWS $a TO 999999999"; // 999 million
|
||||
}
|
||||
$sql .= $str;
|
||||
|
||||
return ($secs2cache) ?
|
||||
$this->CacheExecute($secs2cache,$sql,$inputarr)
|
||||
:
|
||||
$this->Execute($sql,$inputarr);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_borland_ibase extends ADORecordSet_ibase {
|
||||
|
||||
var $databaseType = "borland_ibase";
|
||||
|
||||
function ADORecordSet_borland_ibase($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_ibase($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,207 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4.
|
||||
|
||||
Currently unsupported: MetaDatabases, MetaTables and MetaColumns, and also inputarr in Execute.
|
||||
Native types have been converted to MetaTypes.
|
||||
Transactions not supported yet.
|
||||
|
||||
Limitation of url length. For IIS, see MaxClientRequestBuffer registry value.
|
||||
|
||||
http://support.microsoft.com/default.aspx?scid=kb;en-us;260694
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (! defined("_ADODB_CSV_LAYER")) {
|
||||
define("_ADODB_CSV_LAYER", 1 );
|
||||
|
||||
include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
|
||||
|
||||
class ADODB_csv extends ADOConnection {
|
||||
var $databaseType = 'csv';
|
||||
var $databaseProvider = 'csv';
|
||||
var $hasInsertID = true;
|
||||
var $hasAffectedRows = true;
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $_affectedrows=0;
|
||||
var $_insertid=0;
|
||||
var $_url;
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $hasTransactions = false;
|
||||
var $_errorNo = false;
|
||||
|
||||
function ADODB_csv()
|
||||
{
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return $this->_insertid;
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->_affectedrows;
|
||||
}
|
||||
|
||||
function MetaDatabases()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
|
||||
$this->_url = $argHostname;
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
|
||||
$this->_url = $argHostname;
|
||||
return true;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// parameters use PostgreSQL convention, not MySQL
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=".
|
||||
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE).
|
||||
"&offset=$offset";
|
||||
$err = false;
|
||||
$rs = csv2rs($url,$err,false);
|
||||
|
||||
if ($this->debug) print "$url<br><i>$err</i><br>";
|
||||
|
||||
$at = strpos($err,'::::');
|
||||
if ($at === false) {
|
||||
$this->_errorMsg = $err;
|
||||
$this->_errorNo = (integer)$err;
|
||||
} else {
|
||||
$this->_errorMsg = substr($err,$at+4,1024);
|
||||
$this->_errorNo = -9999;
|
||||
}
|
||||
if ($this->_errorNo)
|
||||
if ($fn = $this->raiseErrorFn) {
|
||||
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,'');
|
||||
}
|
||||
|
||||
if (is_object($rs)) {
|
||||
|
||||
$rs->databaseType='csv';
|
||||
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
|
||||
$rs->connection = $this;
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
// returns queryID or false
|
||||
function _Execute($sql,$inputarr=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
if (!$this->_bindInputArray && $inputarr) {
|
||||
$sqlarr = explode('?',$sql);
|
||||
$sql = '';
|
||||
$i = 0;
|
||||
foreach($inputarr as $v) {
|
||||
|
||||
$sql .= $sqlarr[$i];
|
||||
if (gettype($v) == 'string')
|
||||
$sql .= $this->qstr($v);
|
||||
else if ($v === null)
|
||||
$sql .= 'NULL';
|
||||
else
|
||||
$sql .= $v;
|
||||
$i += 1;
|
||||
|
||||
}
|
||||
$sql .= $sqlarr[$i];
|
||||
if ($i+1 != sizeof($sqlarr))
|
||||
print "Input Array does not match ?: ".htmlspecialchars($sql);
|
||||
$inputarr = false;
|
||||
}
|
||||
|
||||
$url = $this->_url.'?sql='.urlencode($sql)."&fetch=".
|
||||
(($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE);
|
||||
$err = false;
|
||||
|
||||
|
||||
$rs = csv2rs($url,$err,false);
|
||||
if ($this->debug) print urldecode($url)."<br><i>$err</i><br>";
|
||||
$at = strpos($err,'::::');
|
||||
if ($at === false) {
|
||||
$this->_errorMsg = $err;
|
||||
$this->_errorNo = (integer)$err;
|
||||
} else {
|
||||
$this->_errorMsg = substr($err,$at+4,1024);
|
||||
$this->_errorNo = -9999;
|
||||
}
|
||||
|
||||
if ($this->_errorNo)
|
||||
if ($fn = $this->raiseErrorFn) {
|
||||
$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr);
|
||||
}
|
||||
if (is_object($rs)) {
|
||||
$rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
|
||||
|
||||
$this->_affectedrows = $rs->affectedrows;
|
||||
$this->_insertid = $rs->insertid;
|
||||
$rs->databaseType='csv';
|
||||
$rs->connection = $this;
|
||||
}
|
||||
return $rs;
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation */
|
||||
function ErrorMsg()
|
||||
{
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
/* Returns: the last error number from previous database operation */
|
||||
function ErrorNo()
|
||||
{
|
||||
return $this->_errorNo;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
} // class
|
||||
|
||||
class ADORecordset_csv extends ADORecordset {
|
||||
function ADORecordset_csv($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset($id,$mode);
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
} // define
|
||||
|
||||
?>
|
||||
@@ -1,860 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.06 16 Oct 2008 (c) 2006 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
|
||||
This is a version of the ADODB driver for DB2. It uses the 'ibm_db2' PECL extension
|
||||
for PHP (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2 or
|
||||
higher.
|
||||
|
||||
Originally tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
|
||||
More recently tested with PHP 5.1.2 and Apache 2.0.55 on Windows XP SP2.
|
||||
|
||||
This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard#rogers.com".
|
||||
I ripped out what I believed to be a lot of redundant or obsolete code, but there are
|
||||
probably still some remnants of the ODBC support in this file; I'm relying on reviewers
|
||||
of this code to point out any other things that can be removed.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_DB2_LAYER", 2 );
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class ADODB_db2 extends ADOConnection {
|
||||
var $databaseType = "db2";
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $concat_operator = '||';
|
||||
|
||||
var $sysTime = 'CURRENT TIME';
|
||||
var $sysDate = 'CURRENT DATE';
|
||||
var $sysTimeStamp = 'CURRENT TIMESTAMP';
|
||||
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $dataProvider = "db2";
|
||||
var $hasAffectedRows = true;
|
||||
|
||||
var $binmode = DB2_BINARY;
|
||||
|
||||
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
|
||||
// breaking backward-compat
|
||||
var $_bindInputArray = false;
|
||||
var $_genIDSQL = "VALUES NEXTVAL FOR %s";
|
||||
var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s NO MAXVALUE NO CYCLE";
|
||||
var $_dropSeqSQL = "DROP SEQUENCE %s";
|
||||
var $_autocommit = true;
|
||||
var $_haserrorfunctions = true;
|
||||
var $_lastAffectedRows = 0;
|
||||
var $uCaseTables = true; // for meta* functions, uppercase table names
|
||||
var $hasInsertID = true;
|
||||
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return ADOConnection::GetOne('VALUES IDENTITY_VAL_LOCAL()');
|
||||
}
|
||||
|
||||
function ADODB_db2()
|
||||
{
|
||||
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('db2_connect')) {
|
||||
ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension which is not installed.");
|
||||
return null;
|
||||
}
|
||||
// This needs to be set before the connect().
|
||||
// Replaces the odbc_binmode() call that was in Execute()
|
||||
ini_set('ibm_db2.binmode', $this->binmode);
|
||||
|
||||
if ($argDatabasename && empty($argDSN)) {
|
||||
|
||||
if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_connect($argDatabasename,null,null);
|
||||
else $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
|
||||
} else {
|
||||
if ($argDatabasename) $schema = $argDatabasename;
|
||||
if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_connect($argDSN,null,null);
|
||||
else $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword);
|
||||
}
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
|
||||
// For db2_connect(), there is an optional 4th arg. If present, it must be
|
||||
// an array of valid options. So far, we don't use them.
|
||||
|
||||
$this->_errorMsg = @db2_conn_errormsg();
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema");
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('db2_connect')) return null;
|
||||
|
||||
// This needs to be set before the connect().
|
||||
// Replaces the odbc_binmode() call that was in Execute()
|
||||
ini_set('ibm_db2.binmode', $this->binmode);
|
||||
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
|
||||
if ($argDatabasename && empty($argDSN)) {
|
||||
|
||||
if (stripos($argDatabasename,'UID=') && stripos($argDatabasename,'PWD=')) $this->_connectionID = db2_pconnect($argDatabasename,null,null);
|
||||
else $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
|
||||
} else {
|
||||
if ($argDatabasename) $schema = $argDatabasename;
|
||||
if (stripos($argDSN,'UID=') && stripos($argDSN,'PWD=')) $this->_connectionID = db2_pconnect($argDSN,null,null);
|
||||
else $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword);
|
||||
}
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
|
||||
$this->_errorMsg = @db2_conn_errormsg();
|
||||
if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
if ($this->_connectionID && isset($schema)) $this->Execute("SET SCHEMA=$schema");
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
// format and return date string in database timestamp format
|
||||
function DBTimeStamp($ts)
|
||||
{
|
||||
if (empty($ts) && $ts !== 0) return 'null';
|
||||
if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
|
||||
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')";
|
||||
}
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
// use right() and replace() ?
|
||||
if (!$col) $col = $this->sysDate;
|
||||
|
||||
/* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */
|
||||
if ($fmt== 'Y-m-d H:i:s')
|
||||
return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')";
|
||||
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= $this->concat_operator;
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
if ($len==1) return "year($col)";
|
||||
$s .= "char(year($col))";
|
||||
break;
|
||||
case 'M':
|
||||
if ($len==1) return "monthname($col)";
|
||||
$s .= "substr(monthname($col),1,3)";
|
||||
break;
|
||||
case 'm':
|
||||
if ($len==1) return "month($col)";
|
||||
$s .= "right(digits(month($col)),2)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
if ($len==1) return "day($col)";
|
||||
$s .= "right(digits(day($col)),2)";
|
||||
break;
|
||||
case 'H':
|
||||
case 'h':
|
||||
if ($len==1) return "hour($col)";
|
||||
if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
case 'i':
|
||||
case 'I':
|
||||
if ($len==1) return "minute($col)";
|
||||
if ($col != $this->sysDate)
|
||||
$s .= "right(digits(minute($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
if ($len==1) return "second($col)";
|
||||
if ($col != $this->sysDate)
|
||||
$s .= "right(digits(second($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
|
||||
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
|
||||
$dsn = strtoupper($this->host);
|
||||
$first = true;
|
||||
$found = false;
|
||||
|
||||
if (!function_exists('db2_data_source')) return false;
|
||||
|
||||
while(true) {
|
||||
|
||||
$rez = @db2_data_source($this->_connectionID,
|
||||
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
|
||||
$first = false;
|
||||
if (!is_array($rez)) break;
|
||||
if (strtoupper($rez['server']) == $dsn) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$found) return ADOConnection::ServerInfo();
|
||||
if (!isset($rez['version'])) $rez['version'] = '';
|
||||
return $rez;
|
||||
} else {
|
||||
return ADOConnection::ServerInfo();
|
||||
}
|
||||
}
|
||||
|
||||
function CreateSequence($seqname='adodbseq',$start=1)
|
||||
{
|
||||
if (empty($this->_genSeqSQL)) return false;
|
||||
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$start));
|
||||
if (!$ok) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function DropSequence($seqname)
|
||||
{
|
||||
if (empty($this->_dropSeqSQL)) return false;
|
||||
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
|
||||
{
|
||||
$nrows = (integer) $nrows;
|
||||
if ($offset <= 0) {
|
||||
// could also use " OPTIMIZE FOR $nrows ROWS "
|
||||
if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||
$rs = $this->Execute($sql,$inputArr);
|
||||
} else {
|
||||
if ($offset > 0 && $nrows < 0);
|
||||
else {
|
||||
$nrows += $offset;
|
||||
$sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||
}
|
||||
$rs = ADOConnection::SelectLimit($sql,-1,$offset,$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.
|
||||
*/
|
||||
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!
|
||||
$num = $this->GetOne("VALUES NEXTVAL FOR $seq");
|
||||
return $num;
|
||||
}
|
||||
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||
if (empty($this->_connectionID)) return @db2_conn_errormsg();
|
||||
return @db2_conn_errormsg($this->_connectionID);
|
||||
} else return ADOConnection::ErrorMsg();
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorCode !== false) {
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
|
||||
}
|
||||
|
||||
if (empty($this->_connectionID)) $e = @db2_conn_error();
|
||||
else $e = @db2_conn_error($this->_connectionID);
|
||||
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
// so we check and patch
|
||||
if (strlen($e)<=2) return 0;
|
||||
return $e;
|
||||
} else return ADOConnection::ErrorNo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->_autocommit = false;
|
||||
return db2_autocommit($this->_connectionID,false);
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = db2_commit($this->_connectionID);
|
||||
db2_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = db2_rollback($this->_connectionID);
|
||||
db2_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaPrimaryKeys($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = @db2_primarykeys($this->_connectionID,'',$schema,$table);
|
||||
|
||||
if (!$qid) {
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
return false;
|
||||
}
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return false;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
$rs->Close();
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table);
|
||||
if (!$qid) {
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
return false;
|
||||
}
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
/*
|
||||
$rs->fields indices
|
||||
0 PKTABLE_CAT
|
||||
1 PKTABLE_SCHEM
|
||||
2 PKTABLE_NAME
|
||||
3 PKCOLUMN_NAME
|
||||
4 FKTABLE_CAT
|
||||
5 FKTABLE_SCHEM
|
||||
6 FKTABLE_NAME
|
||||
7 FKCOLUMN_NAME
|
||||
*/
|
||||
if (!$rs) return false;
|
||||
|
||||
$foreign_keys = array();
|
||||
while (!$rs->EOF) {
|
||||
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||
if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]]))
|
||||
$foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array();
|
||||
$foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3];
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
|
||||
$rs->Close();
|
||||
return $foreign_key;
|
||||
}
|
||||
|
||||
|
||||
function MetaTables($ttype=false,$schema=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = db2_tables($this->_connectionID);
|
||||
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
$rs->Close();
|
||||
$arr2 = array();
|
||||
|
||||
if ($ttype) {
|
||||
$isview = strncmp($ttype,'V',1) === 0;
|
||||
}
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if (!$arr[$i][2]) continue;
|
||||
$type = $arr[$i][3];
|
||||
$owner = $arr[$i][1];
|
||||
$schemaval = ($schema) ? $arr[$i][1].'.' : '';
|
||||
if ($ttype) {
|
||||
if ($isview) {
|
||||
if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||
} else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||
} else if (strncmp($owner,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
/*
|
||||
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2datetime_data_type_changes.asp
|
||||
/ SQL data type codes /
|
||||
#define SQL_UNKNOWN_TYPE 0
|
||||
#define SQL_CHAR 1
|
||||
#define SQL_NUMERIC 2
|
||||
#define SQL_DECIMAL 3
|
||||
#define SQL_INTEGER 4
|
||||
#define SQL_SMALLINT 5
|
||||
#define SQL_FLOAT 6
|
||||
#define SQL_REAL 7
|
||||
#define SQL_DOUBLE 8
|
||||
#if (DB2VER >= 0x0300)
|
||||
#define SQL_DATETIME 9
|
||||
#endif
|
||||
#define SQL_VARCHAR 12
|
||||
|
||||
|
||||
/ One-parameter shortcuts for date/time data types /
|
||||
#if (DB2VER >= 0x0300)
|
||||
#define SQL_TYPE_DATE 91
|
||||
#define SQL_TYPE_TIME 92
|
||||
#define SQL_TYPE_TIMESTAMP 93
|
||||
|
||||
#define SQL_UNICODE (-95)
|
||||
#define SQL_UNICODE_VARCHAR (-96)
|
||||
#define SQL_UNICODE_LONGVARCHAR (-97)
|
||||
*/
|
||||
function DB2Types($t)
|
||||
{
|
||||
switch ((integer)$t) {
|
||||
case 1:
|
||||
case 12:
|
||||
case 0:
|
||||
case -95:
|
||||
case -96:
|
||||
return 'C';
|
||||
case -97:
|
||||
case -1: //text
|
||||
return 'X';
|
||||
case -4: //image
|
||||
return 'B';
|
||||
|
||||
case 9:
|
||||
case 91:
|
||||
return 'D';
|
||||
|
||||
case 10:
|
||||
case 11:
|
||||
case 92:
|
||||
case 93:
|
||||
return 'T';
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
case -6:
|
||||
return 'I';
|
||||
|
||||
case -11: // uniqidentifier
|
||||
return 'R';
|
||||
case -7: //bit
|
||||
return 'L';
|
||||
|
||||
default:
|
||||
return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
$colname = "%";
|
||||
$qid = db2_columns($this->_connectionID, "", $schema, $table, $colname);
|
||||
if (empty($qid)) return $false;
|
||||
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return $false;
|
||||
$rs->_fetch();
|
||||
|
||||
$retarr = array();
|
||||
|
||||
/*
|
||||
$rs->fields indices
|
||||
0 TABLE_QUALIFIER
|
||||
1 TABLE_SCHEM
|
||||
2 TABLE_NAME
|
||||
3 COLUMN_NAME
|
||||
4 DATA_TYPE
|
||||
5 TYPE_NAME
|
||||
6 PRECISION
|
||||
7 LENGTH
|
||||
8 SCALE
|
||||
9 RADIX
|
||||
10 NULLABLE
|
||||
11 REMARKS
|
||||
*/
|
||||
while (!$rs->EOF) {
|
||||
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[3];
|
||||
$fld->type = $this->DB2Types($rs->fields[4]);
|
||||
|
||||
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
|
||||
// access uses precision to store length for char/varchar
|
||||
if ($fld->type == 'C' or $fld->type == 'X') {
|
||||
if ($rs->fields[4] <= -95) // UNICODE
|
||||
$fld->max_length = $rs->fields[7]/2;
|
||||
else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
} else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
$fld->not_null = !empty($rs->fields[10]);
|
||||
$fld->scale = $rs->fields[8];
|
||||
$fld->primary_key = false;
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
} else if (sizeof($retarr)>0)
|
||||
break;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
if (empty($retarr)) $retarr = false;
|
||||
|
||||
$qid = db2_primary_keys($this->_connectionID, "", $schema, $table);
|
||||
if (empty($qid)) return $false;
|
||||
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return $retarr;
|
||||
$rs->_fetch();
|
||||
|
||||
/*
|
||||
$rs->fields indices
|
||||
0 TABLE_CAT
|
||||
1 TABLE_SCHEM
|
||||
2 TABLE_NAME
|
||||
3 COLUMN_NAME
|
||||
4 KEY_SEQ
|
||||
5 PK_NAME
|
||||
*/
|
||||
while (!$rs->EOF) {
|
||||
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||
$retarr[strtoupper($rs->fields[3])]->primary_key = true;
|
||||
} else if (sizeof($retarr)>0)
|
||||
break;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
|
||||
if (empty($retarr)) $retarr = false;
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
if (! $this->_bindInputArray) return $sql; // no binding
|
||||
$stmt = db2_prepare($this->_connectionID,$sql);
|
||||
if (!$stmt) {
|
||||
// we don't know whether db2 driver is parsing prepared stmts, so just return sql
|
||||
return $sql;
|
||||
}
|
||||
return array($sql,$stmt,false);
|
||||
}
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
GLOBAL $php_errormsg;
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_error = '';
|
||||
|
||||
if ($inputarr) {
|
||||
if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
} else {
|
||||
$stmtid = db2_prepare($this->_connectionID,$sql);
|
||||
|
||||
if ($stmtid == false) {
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! db2_execute($stmtid,$inputarr)) {
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = db2_stmt_errormsg();
|
||||
$this->_errorCode = db2_stmt_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} else if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
if (!db2_execute($stmtid)) {
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = db2_stmt_errormsg();
|
||||
$this->_errorCode = db2_stmt_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
$stmtid = @db2_exec($this->_connectionID,$sql);
|
||||
|
||||
$this->_lastAffectedRows = 0;
|
||||
if ($stmtid) {
|
||||
if (@db2_num_fields($stmtid) == 0) {
|
||||
$this->_lastAffectedRows = db2_num_rows($stmtid);
|
||||
$stmtid = true;
|
||||
} else {
|
||||
$this->_lastAffectedRows = 0;
|
||||
}
|
||||
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = '';
|
||||
$this->_errorCode = 0;
|
||||
} else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
} else {
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = db2_stmt_errormsg();
|
||||
$this->_errorCode = db2_stmt_error();
|
||||
} else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
|
||||
}
|
||||
return $stmtid;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
$ret = @db2_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->_lastAffectedRows;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_db2 extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "db2";
|
||||
var $dataProvider = "db2";
|
||||
var $useFetchArray;
|
||||
|
||||
function ADORecordSet_db2($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
|
||||
$this->_queryID = $id;
|
||||
}
|
||||
|
||||
|
||||
// returns the field object
|
||||
function FetchField($offset = -1)
|
||||
{
|
||||
$o= new ADOFieldObject();
|
||||
$o->name = @db2_field_name($this->_queryID,$offset);
|
||||
$o->type = @db2_field_type($this->_queryID,$offset);
|
||||
$o->max_length = db2_field_width($this->_queryID,$offset);
|
||||
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||
return $o;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1;
|
||||
$this->_numOfFields = @db2_num_fields($this->_queryID);
|
||||
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
|
||||
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
|
||||
function GetArrayLimit($nrows,$offset=-1)
|
||||
{
|
||||
if ($offset <= 0) {
|
||||
$rs = $this->GetArray($nrows);
|
||||
return $rs;
|
||||
}
|
||||
$savem = $this->fetchMode;
|
||||
$this->fetchMode = ADODB_FETCH_NUM;
|
||||
$this->Move($offset);
|
||||
$this->fetchMode = $savem;
|
||||
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
|
||||
$results = array();
|
||||
$cnt = 0;
|
||||
while (!$this->EOF && $nrows != $cnt) {
|
||||
$results[$cnt++] = $this->fields;
|
||||
$this->MoveNext();
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if ($this->_numOfRows != 0 && !$this->EOF) {
|
||||
$this->_currentRow++;
|
||||
|
||||
$this->fields = @db2_fetch_array($this->_queryID);
|
||||
if ($this->fields) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->fields = false;
|
||||
$this->EOF = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
|
||||
$this->fields = db2_fetch_array($this->_queryID);
|
||||
if ($this->fields) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
return @db2_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,230 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
include(ADODB_DIR."/drivers/adodb-db2.inc.php");
|
||||
|
||||
|
||||
if (!defined('ADODB_DB2OCI')){
|
||||
define('ADODB_DB2OCI',1);
|
||||
|
||||
/*
|
||||
// regex code for smart remapping of :0, :1 bind vars to ? ?
|
||||
function _colontrack($p)
|
||||
{
|
||||
global $_COLONARR,$_COLONSZ;
|
||||
$v = (integer) substr($p,1);
|
||||
if ($v > $_COLONSZ) return $p;
|
||||
$_COLONARR[] = $v;
|
||||
return '?';
|
||||
}
|
||||
|
||||
// smart remapping of :0, :1 bind vars to ? ?
|
||||
function _colonscope($sql,$arr)
|
||||
{
|
||||
global $_COLONARR,$_COLONSZ;
|
||||
|
||||
$_COLONARR = array();
|
||||
$_COLONSZ = sizeof($arr);
|
||||
|
||||
$sql2 = preg_replace("/(:[0-9]+)/e","_colontrack('\\1')",$sql);
|
||||
|
||||
if (empty($_COLONARR)) return array($sql,$arr);
|
||||
|
||||
foreach($_COLONARR as $k => $v) {
|
||||
$arr2[] = $arr[$v];
|
||||
}
|
||||
|
||||
return array($sql2,$arr2);
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
Smart remapping of :0, :1 bind vars to ? ?
|
||||
|
||||
Handles colons in comments -- and / * * / and in quoted strings.
|
||||
*/
|
||||
|
||||
function _colonparser($sql,$arr)
|
||||
{
|
||||
$lensql = strlen($sql);
|
||||
$arrsize = sizeof($arr);
|
||||
$state = 'NORM';
|
||||
$at = 1;
|
||||
$ch = $sql[0];
|
||||
$ch2 = @$sql[1];
|
||||
$sql2 = '';
|
||||
$arr2 = array();
|
||||
$nprev = 0;
|
||||
|
||||
|
||||
while (strlen($ch)) {
|
||||
|
||||
switch($ch) {
|
||||
case '/':
|
||||
if ($state == 'NORM' && $ch2 == '*') {
|
||||
$state = 'COMMENT';
|
||||
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
}
|
||||
break;
|
||||
|
||||
case '*':
|
||||
if ($state == 'COMMENT' && $ch2 == '/') {
|
||||
$state = 'NORM';
|
||||
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
}
|
||||
break;
|
||||
|
||||
case "\n":
|
||||
case "\r":
|
||||
if ($state == 'COMMENT2') $state = 'NORM';
|
||||
break;
|
||||
|
||||
case "'":
|
||||
do {
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
} while ($ch !== "'");
|
||||
break;
|
||||
|
||||
case ':':
|
||||
if ($state == 'COMMENT' || $state == 'COMMENT2') break;
|
||||
|
||||
//echo "$at=$ch $ch2, ";
|
||||
if ('0' <= $ch2 && $ch2 <= '9') {
|
||||
$n = '';
|
||||
$nat = $at;
|
||||
do {
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$n .= $ch;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
} while ('0' <= $ch && $ch <= '9');
|
||||
#echo "$n $arrsize ] ";
|
||||
$n = (integer) $n;
|
||||
if ($n < $arrsize) {
|
||||
$sql2 .= substr($sql,$nprev,$nat-$nprev-1).'?';
|
||||
$nprev = $at-1;
|
||||
$arr2[] = $arr[$n];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case '-':
|
||||
if ($state == 'NORM') {
|
||||
if ($ch2 == '-') $state = 'COMMENT2';
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$at += 1;
|
||||
$ch = $ch2;
|
||||
$ch2 = $at < $lensql ? $sql[$at] : '';
|
||||
}
|
||||
|
||||
if ($nprev == 0) {
|
||||
$sql2 = $sql;
|
||||
} else {
|
||||
$sql2 .= substr($sql,$nprev);
|
||||
}
|
||||
|
||||
return array($sql2,$arr2);
|
||||
}
|
||||
|
||||
class ADODB_db2oci extends ADODB_db2 {
|
||||
var $databaseType = "db2oci";
|
||||
var $sysTimeStamp = 'sysdate';
|
||||
var $sysDate = 'trunc(sysdate)';
|
||||
var $_bindInputArray = true;
|
||||
|
||||
function ADODB_db2oci()
|
||||
{
|
||||
parent::ADODB_db2();
|
||||
}
|
||||
|
||||
function Param($name,$type=false)
|
||||
{
|
||||
return ':'.$name;
|
||||
}
|
||||
|
||||
|
||||
function MetaTables($ttype=false,$schema=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = db2_tables($this->_connectionID);
|
||||
|
||||
$rs = new ADORecordSet_db2($qid);
|
||||
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
$rs->Close();
|
||||
$arr2 = array();
|
||||
// adodb_pr($arr);
|
||||
if ($ttype) {
|
||||
$isview = strncmp($ttype,'V',1) === 0;
|
||||
}
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if (!$arr[$i][2]) continue;
|
||||
$type = $arr[$i][3];
|
||||
$schemaval = ($schema) ? $arr[$i][1].'.' : '';
|
||||
$name = $schemaval.$arr[$i][2];
|
||||
$owner = $arr[$i][1];
|
||||
if (substr($name,0,8) == 'EXPLAIN_') continue;
|
||||
if ($ttype) {
|
||||
if ($isview) {
|
||||
if (strncmp($type,'V',1) === 0) $arr2[] = $name;
|
||||
} else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name;
|
||||
} else if (strncmp($type,'T',1) === 0 && strncmp($owner,'SYS',3) !== 0) $arr2[] = $name;
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function _Execute($sql, $inputarr=false )
|
||||
{
|
||||
if ($inputarr) list($sql,$inputarr) = _colonparser($sql, $inputarr);
|
||||
return parent::_Execute($sql, $inputarr);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_db2oci extends ADORecordSet_db2 {
|
||||
|
||||
var $databaseType = "db2oci";
|
||||
|
||||
function ADORecordSet_db2oci($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_db2($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
} //define
|
||||
?>
|
||||
@@ -1,266 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
@version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Contribution by Frank M. Kromann <frank@frontbase.com>.
|
||||
Set tabs to 8.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (! defined("_ADODB_FBSQL_LAYER")) {
|
||||
define("_ADODB_FBSQL_LAYER", 1 );
|
||||
|
||||
class ADODB_fbsql extends ADOConnection {
|
||||
var $databaseType = 'fbsql';
|
||||
var $hasInsertID = true;
|
||||
var $hasAffectedRows = true;
|
||||
var $metaTablesSQL = "SHOW TABLES";
|
||||
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $hasLimit = false;
|
||||
|
||||
function ADODB_fbsql()
|
||||
{
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return fbsql_insert_id($this->_connectionID);
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return fbsql_affected_rows($this->_connectionID);
|
||||
}
|
||||
|
||||
function MetaDatabases()
|
||||
{
|
||||
$qid = fbsql_list_dbs($this->_connectionID);
|
||||
$arr = array();
|
||||
$i = 0;
|
||||
$max = fbsql_num_rows($qid);
|
||||
while ($i < $max) {
|
||||
$arr[] = fbsql_tablename($qid,$i);
|
||||
$i += 1;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
// returns concatenated string
|
||||
function Concat()
|
||||
{
|
||||
$s = "";
|
||||
$arr = func_get_args();
|
||||
$first = true;
|
||||
|
||||
$s = implode(',',$arr);
|
||||
if (sizeof($arr) > 0) return "CONCAT($s)";
|
||||
else return '';
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
$this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
$this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
if ($this->metaColumnsSQL) {
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||
|
||||
if ($rs === false) return false;
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF){
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$fld->type = $rs->fields[1];
|
||||
|
||||
// split type into type(length):
|
||||
if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$fld->max_length = $query_array[2];
|
||||
} else {
|
||||
$fld->max_length = -1;
|
||||
}
|
||||
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||
$fld->binary = (strpos($fld->type,'blob') !== false);
|
||||
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
$this->database = $dbName;
|
||||
if ($this->_connectionID) {
|
||||
return @fbsql_select_db($dbName,$this->_connectionID);
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
|
||||
// returns queryID or false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
return fbsql_query("$sql;",$this->_connectionID);
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation */
|
||||
function ErrorMsg()
|
||||
{
|
||||
$this->_errorMsg = @fbsql_error($this->_connectionID);
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
/* Returns: the last error number from previous database operation */
|
||||
function ErrorNo()
|
||||
{
|
||||
return @fbsql_errno($this->_connectionID);
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
return @fbsql_close($this->_connectionID);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_fbsql extends ADORecordSet{
|
||||
|
||||
var $databaseType = "fbsql";
|
||||
var $canSeek = true;
|
||||
|
||||
function ADORecordSet_fbsql($queryID,$mode=false)
|
||||
{
|
||||
if (!$mode) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode) {
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break;
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = FBSQL_BOTH; break;
|
||||
}
|
||||
return $this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
GLOBAL $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1;
|
||||
$this->_numOfFields = @fbsql_num_fields($this->_queryID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function FetchField($fieldOffset = -1) {
|
||||
if ($fieldOffset != -1) {
|
||||
$o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
|
||||
//$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
|
||||
$f = @fbsql_field_flags($this->_queryID,$fieldOffset);
|
||||
$o->binary = (strpos($f,'binary')!== false);
|
||||
}
|
||||
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||
$o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable
|
||||
//$o->max_length = -1;
|
||||
}
|
||||
|
||||
return $o;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return @fbsql_data_seek($this->_queryID,$row);
|
||||
}
|
||||
|
||||
function _fetch($ignore_fields=false)
|
||||
{
|
||||
$this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode);
|
||||
return ($this->fields == true);
|
||||
}
|
||||
|
||||
function _close() {
|
||||
return @fbsql_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
$len = -1; // fbsql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
case 'CHARACTER':
|
||||
case 'CHARACTER VARYING':
|
||||
case 'BLOB':
|
||||
case 'CLOB':
|
||||
case 'BIT':
|
||||
case 'BIT VARYING':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
// so we have to check whether binary...
|
||||
case 'IMAGE':
|
||||
case 'LONGBLOB':
|
||||
case 'BLOB':
|
||||
case 'MEDIUMBLOB':
|
||||
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||
|
||||
case 'DATE': return 'D';
|
||||
|
||||
case 'TIME':
|
||||
case 'TIME WITH TIME ZONE':
|
||||
case 'TIMESTAMP':
|
||||
case 'TIMESTAMP WITH TIME ZONE': return 'T';
|
||||
|
||||
case 'PRIMARY_KEY':
|
||||
return 'R';
|
||||
case 'INTEGER':
|
||||
case 'SMALLINT':
|
||||
case 'BOOLEAN':
|
||||
|
||||
if (!empty($fieldobj->primary_key)) return 'R';
|
||||
else return 'I';
|
||||
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
} //class
|
||||
} // defined
|
||||
?>
|
||||
@@ -1,77 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
|
||||
|
||||
class ADODB_firebird extends ADODB_ibase {
|
||||
var $databaseType = "firebird";
|
||||
var $dialect = 3;
|
||||
|
||||
var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
|
||||
|
||||
function ADODB_firebird()
|
||||
{
|
||||
$this->ADODB_ibase();
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['dialect'] = $this->dialect;
|
||||
switch($arr['dialect']) {
|
||||
case '':
|
||||
case '1': $s = 'Firebird Dialect 1'; break;
|
||||
case '2': $s = 'Firebird Dialect 2'; break;
|
||||
default:
|
||||
case '3': $s = 'Firebird Dialect 3'; break;
|
||||
}
|
||||
$arr['version'] = ADOConnection::_findvers($s);
|
||||
$arr['description'] = $s;
|
||||
return $arr;
|
||||
}
|
||||
|
||||
// Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars!
|
||||
// SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
|
||||
// SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0)
|
||||
{
|
||||
$nrows = (integer) $nrows;
|
||||
$offset = (integer) $offset;
|
||||
$str = 'SELECT ';
|
||||
if ($nrows >= 0) $str .= "FIRST $nrows ";
|
||||
$str .=($offset>=0) ? "SKIP $offset " : '';
|
||||
|
||||
$sql = preg_replace('/^[ \t]*select/i',$str,$sql);
|
||||
if ($secs)
|
||||
$rs = $this->CacheExecute($secs,$sql,$inputarr);
|
||||
else
|
||||
$rs = $this->Execute($sql,$inputarr);
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_firebird extends ADORecordSet_ibase {
|
||||
|
||||
var $databaseType = "firebird";
|
||||
|
||||
function ADORecordSet_firebird($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_ibase($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,887 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.sourceforge.net
|
||||
|
||||
Interbase data driver. Requires interbase client. Works on Windows and Unix.
|
||||
|
||||
3 Jan 2002 -- suggestions by Hans-Peter Oeri <kampfcaspar75@oeri.ch>
|
||||
changed transaction handling and added experimental blob stuff
|
||||
|
||||
Docs to interbase at the website
|
||||
http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html
|
||||
|
||||
To use gen_id(), see
|
||||
http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen
|
||||
|
||||
$rs = $conn->Execute('select gen_id(adodb,1) from rdb$database');
|
||||
$id = $rs->fields[0];
|
||||
$conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)");
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB_ibase extends ADOConnection {
|
||||
var $databaseType = "ibase";
|
||||
var $dataProvider = "ibase";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $ibase_datefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S';
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $ibase_timestampfmt = "%Y-%m-%d %H:%M:%S";
|
||||
var $ibase_timefmt = "%H:%M:%S";
|
||||
var $fmtTimeStamp = "'Y-m-d, H:i:s'";
|
||||
var $concat_operator='||';
|
||||
var $_transactionID;
|
||||
var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
|
||||
//OPN STUFF start
|
||||
var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc";
|
||||
//OPN STUFF end
|
||||
var $ibasetrans;
|
||||
var $hasGenID = true;
|
||||
var $_bindInputArray = true;
|
||||
var $buffers = 0;
|
||||
var $dialect = 1;
|
||||
var $sysDate = "cast('TODAY' as timestamp)";
|
||||
var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
|
||||
var $ansiOuter = true;
|
||||
var $hasAffectedRows = false;
|
||||
var $poorAffectedRows = true;
|
||||
var $blobEncodeType = 'C';
|
||||
var $role = false;
|
||||
|
||||
function ADODB_ibase()
|
||||
{
|
||||
if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
|
||||
}
|
||||
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
|
||||
{
|
||||
if (!function_exists('ibase_pconnect')) return null;
|
||||
if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
|
||||
$fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
|
||||
if ($this->role)
|
||||
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
|
||||
$this->charSet,$this->buffers,$this->dialect,$this->role);
|
||||
else
|
||||
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
|
||||
$this->charSet,$this->buffers,$this->dialect);
|
||||
|
||||
if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
|
||||
$this->replaceQuote = "''";
|
||||
}
|
||||
if ($this->_connectionID === false) {
|
||||
$this->_handleerror();
|
||||
return false;
|
||||
}
|
||||
|
||||
// PHP5 change.
|
||||
if (function_exists('ibase_timefmt')) {
|
||||
ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
|
||||
if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
|
||||
else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
|
||||
ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
|
||||
|
||||
} else {
|
||||
ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
|
||||
ini_set("ibase.dateformat", $this->ibase_datefmt);
|
||||
ini_set("ibase.timeformat", $this->ibase_timefmt);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
|
||||
}
|
||||
|
||||
|
||||
function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
|
||||
{
|
||||
if ($internalKey) return array('RDB$DB_KEY');
|
||||
|
||||
$table = strtoupper($table);
|
||||
|
||||
$sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME
|
||||
FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME
|
||||
WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
|
||||
ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
|
||||
|
||||
$a = $this->GetCol($sql,false,true);
|
||||
if ($a && sizeof($a)>0) return $a;
|
||||
return false;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['dialect'] = $this->dialect;
|
||||
switch($arr['dialect']) {
|
||||
case '':
|
||||
case '1': $s = 'Interbase 5.5 or earlier'; break;
|
||||
case '2': $s = 'Interbase 5.6'; break;
|
||||
default:
|
||||
case '3': $s = 'Interbase 6.0'; break;
|
||||
}
|
||||
$arr['version'] = ADOConnection::_findvers($s);
|
||||
$arr['description'] = $s;
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->autoCommit = false;
|
||||
$this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID);
|
||||
return $this->_transactionID;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$ret = false;
|
||||
$this->autoCommit = true;
|
||||
if ($this->_transactionID) {
|
||||
//print ' commit ';
|
||||
$ret = ibase_commit($this->_transactionID);
|
||||
}
|
||||
$this->_transactionID = false;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
// there are some compat problems with ADODB_COUNTRECS=false and $this->_logsql currently.
|
||||
// it appears that ibase extension cannot support multiple concurrent queryid's
|
||||
function _Execute($sql,$inputarr=false)
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
|
||||
if ($this->_logsql) {
|
||||
$savecrecs = $ADODB_COUNTRECS;
|
||||
$ADODB_COUNTRECS = true; // force countrecs
|
||||
$ret = ADOConnection::_Execute($sql,$inputarr);
|
||||
$ADODB_COUNTRECS = $savecrecs;
|
||||
} else {
|
||||
$ret = ADOConnection::_Execute($sql,$inputarr);
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$ret = false;
|
||||
$this->autoCommit = true;
|
||||
if ($this->_transactionID)
|
||||
$ret = ibase_rollback($this->_transactionID);
|
||||
$this->_transactionID = false;
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaIndexes ($table, $primary = FALSE, $owner=false)
|
||||
{
|
||||
// save old fetch mode
|
||||
global $ADODB_FETCH_MODE;
|
||||
$false = false;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
$table = strtoupper($table);
|
||||
$sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
|
||||
if (!$primary) {
|
||||
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
|
||||
} else {
|
||||
$sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
|
||||
}
|
||||
// get index details
|
||||
$rs = $this->Execute($sql);
|
||||
if (!is_object($rs)) {
|
||||
// restore fetchmode
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$indexes = array();
|
||||
while ($row = $rs->FetchRow()) {
|
||||
$index = $row[0];
|
||||
if (!isset($indexes[$index])) {
|
||||
if (is_null($row[3])) {$row[3] = 0;}
|
||||
$indexes[$index] = array(
|
||||
'unique' => ($row[3] == 1),
|
||||
'columns' => array()
|
||||
);
|
||||
}
|
||||
$sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$index."' ORDER BY RDB\$FIELD_POSITION ASC";
|
||||
$rs1 = $this->Execute($sql);
|
||||
while ($row1 = $rs1->FetchRow()) {
|
||||
$indexes[$index]['columns'][$row1[2]] = $row1[1];
|
||||
}
|
||||
}
|
||||
// restore fetchmode
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
|
||||
// See http://community.borland.com/article/0,1410,25844,00.html
|
||||
function RowLock($tables,$where,$col=false)
|
||||
{
|
||||
if ($this->autoCommit) $this->BeginTrans();
|
||||
$this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim?
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
function CreateSequence($seqname,$startID=1)
|
||||
{
|
||||
$ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
|
||||
if (!$ok) return false;
|
||||
return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
|
||||
}
|
||||
|
||||
function DropSequence($seqname)
|
||||
{
|
||||
$seqname = strtoupper($seqname);
|
||||
$this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
|
||||
}
|
||||
|
||||
function GenID($seqname='adodbseq',$startID=1)
|
||||
{
|
||||
$getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
|
||||
$rs = @$this->Execute($getnext);
|
||||
if (!$rs) {
|
||||
$this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
|
||||
$this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
|
||||
$rs = $this->Execute($getnext);
|
||||
}
|
||||
if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields);
|
||||
else $this->genID = 0; // false
|
||||
|
||||
if ($rs) $rs->Close();
|
||||
|
||||
return $this->genID;
|
||||
}
|
||||
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function _handleerror()
|
||||
{
|
||||
$this->_errorMsg = ibase_errmsg();
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1];
|
||||
else return 0;
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
$stmt = ibase_prepare($this->_connectionID,$sql);
|
||||
if (!$stmt) return false;
|
||||
return array($sql,$stmt);
|
||||
}
|
||||
|
||||
// returns query ID if successful, otherwise false
|
||||
// there have been reports of problems with nested queries - the code is probably not re-entrant?
|
||||
function _query($sql,$iarr=false)
|
||||
{
|
||||
|
||||
if (!$this->autoCommit && $this->_transactionID) {
|
||||
$conn = $this->_transactionID;
|
||||
$docommit = false;
|
||||
} else {
|
||||
$conn = $this->_connectionID;
|
||||
$docommit = true;
|
||||
}
|
||||
if (is_array($sql)) {
|
||||
$fn = 'ibase_execute';
|
||||
$sql = $sql[1];
|
||||
if (is_array($iarr)) {
|
||||
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
|
||||
if ( !isset($iarr[0]) ) $iarr[0] = ''; // PHP5 compat hack
|
||||
$fnarr = array_merge( array($sql) , $iarr);
|
||||
$ret = call_user_func_array($fn,$fnarr);
|
||||
} else {
|
||||
switch(sizeof($iarr)) {
|
||||
case 1: $ret = $fn($sql,$iarr[0]); break;
|
||||
case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break;
|
||||
case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break;
|
||||
case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
|
||||
case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
|
||||
case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
|
||||
case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
|
||||
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
|
||||
case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
|
||||
}
|
||||
}
|
||||
} else $ret = $fn($sql);
|
||||
} else {
|
||||
$fn = 'ibase_query';
|
||||
|
||||
if (is_array($iarr)) {
|
||||
if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
|
||||
if (sizeof($iarr) == 0) $iarr[0] = ''; // PHP5 compat hack
|
||||
$fnarr = array_merge( array($conn,$sql) , $iarr);
|
||||
$ret = call_user_func_array($fn,$fnarr);
|
||||
} else {
|
||||
switch(sizeof($iarr)) {
|
||||
case 1: $ret = $fn($conn,$sql,$iarr[0]); break;
|
||||
case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break;
|
||||
case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break;
|
||||
case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
|
||||
case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
|
||||
case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
|
||||
case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
|
||||
default: ADOConnection::outp( "Too many parameters to ibase query $sql");
|
||||
case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
|
||||
}
|
||||
}
|
||||
} else $ret = $fn($conn,$sql);
|
||||
}
|
||||
if ($docommit && $ret === true) ibase_commit($this->_connectionID);
|
||||
|
||||
$this->_handleerror();
|
||||
return $ret;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
if (!$this->autoCommit) @ibase_rollback($this->_connectionID);
|
||||
return @ibase_close($this->_connectionID);
|
||||
}
|
||||
|
||||
//OPN STUFF start
|
||||
function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $dialect3)
|
||||
{
|
||||
$fscale = abs($fscale);
|
||||
$fld->max_length = $flen;
|
||||
$fld->scale = null;
|
||||
switch($ftype){
|
||||
case 7:
|
||||
case 8:
|
||||
if ($dialect3) {
|
||||
switch($fsubtype){
|
||||
case 0:
|
||||
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
|
||||
break;
|
||||
case 1:
|
||||
$fld->type = 'numeric';
|
||||
$fld->max_length = $fprecision;
|
||||
$fld->scale = $fscale;
|
||||
break;
|
||||
case 2:
|
||||
$fld->type = 'decimal';
|
||||
$fld->max_length = $fprecision;
|
||||
$fld->scale = $fscale;
|
||||
break;
|
||||
} // switch
|
||||
} else {
|
||||
if ($fscale !=0) {
|
||||
$fld->type = 'decimal';
|
||||
$fld->scale = $fscale;
|
||||
$fld->max_length = ($ftype == 7 ? 4 : 9);
|
||||
} else {
|
||||
$fld->type = ($ftype == 7 ? 'smallint' : 'integer');
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 16:
|
||||
if ($dialect3) {
|
||||
switch($fsubtype){
|
||||
case 0:
|
||||
$fld->type = 'decimal';
|
||||
$fld->max_length = 18;
|
||||
$fld->scale = 0;
|
||||
break;
|
||||
case 1:
|
||||
$fld->type = 'numeric';
|
||||
$fld->max_length = $fprecision;
|
||||
$fld->scale = $fscale;
|
||||
break;
|
||||
case 2:
|
||||
$fld->type = 'decimal';
|
||||
$fld->max_length = $fprecision;
|
||||
$fld->scale = $fscale;
|
||||
break;
|
||||
} // switch
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
$fld->type = 'float';
|
||||
break;
|
||||
case 14:
|
||||
$fld->type = 'char';
|
||||
break;
|
||||
case 27:
|
||||
if ($fscale !=0) {
|
||||
$fld->type = 'decimal';
|
||||
$fld->max_length = 15;
|
||||
$fld->scale = 5;
|
||||
} else {
|
||||
$fld->type = 'double';
|
||||
}
|
||||
break;
|
||||
case 35:
|
||||
if ($dialect3) {
|
||||
$fld->type = 'timestamp';
|
||||
} else {
|
||||
$fld->type = 'date';
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
$fld->type = 'date';
|
||||
break;
|
||||
case 13:
|
||||
$fld->type = 'time';
|
||||
break;
|
||||
case 37:
|
||||
$fld->type = 'varchar';
|
||||
break;
|
||||
case 40:
|
||||
$fld->type = 'cstring';
|
||||
break;
|
||||
case 261:
|
||||
$fld->type = 'blob';
|
||||
$fld->max_length = -1;
|
||||
break;
|
||||
} // switch
|
||||
}
|
||||
//OPN STUFF end
|
||||
// returns array of ADOFieldObjects for current table
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
$false = false;
|
||||
if ($rs === false) {
|
||||
return $false;
|
||||
}
|
||||
|
||||
$retarr = array();
|
||||
//OPN STUFF start
|
||||
$dialect3 = ($this->dialect==3 ? true : false);
|
||||
//OPN STUFF end
|
||||
while (!$rs->EOF) { //print_r($rs->fields);
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = trim($rs->fields[0]);
|
||||
//OPN STUFF start
|
||||
$this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $dialect3);
|
||||
if (isset($rs->fields[1]) && $rs->fields[1]) {
|
||||
$fld->not_null = true;
|
||||
}
|
||||
if (isset($rs->fields[2])) {
|
||||
|
||||
$fld->has_default = true;
|
||||
$d = substr($rs->fields[2],strlen('default '));
|
||||
switch ($fld->type)
|
||||
{
|
||||
case 'smallint':
|
||||
case 'integer': $fld->default_value = (int) $d; break;
|
||||
case 'char':
|
||||
case 'blob':
|
||||
case 'text':
|
||||
case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break;
|
||||
case 'double':
|
||||
case 'float': $fld->default_value = (float) $d; break;
|
||||
default: $fld->default_value = $d; break;
|
||||
}
|
||||
// case 35:$tt = 'TIMESTAMP'; break;
|
||||
}
|
||||
if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
|
||||
$fld->sub_type = $rs->fields[5];
|
||||
} else {
|
||||
$fld->sub_type = null;
|
||||
}
|
||||
//OPN STUFF end
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||
else $retarr[strtoupper($fld->name)] = $fld;
|
||||
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
if ( empty($retarr)) return $false;
|
||||
else return $retarr;
|
||||
}
|
||||
|
||||
function BlobEncode( $blob )
|
||||
{
|
||||
$blobid = ibase_blob_create( $this->_connectionID);
|
||||
ibase_blob_add( $blobid, $blob );
|
||||
return ibase_blob_close( $blobid );
|
||||
}
|
||||
|
||||
// since we auto-decode all blob's since 2.42,
|
||||
// BlobDecode should not do any transforms
|
||||
function BlobDecode($blob)
|
||||
{
|
||||
return $blob;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// old blobdecode function
|
||||
// still used to auto-decode all blob's
|
||||
function _BlobDecode_old( $blob )
|
||||
{
|
||||
$blobid = ibase_blob_open($this->_connectionID, $blob );
|
||||
$realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr>
|
||||
while($string = ibase_blob_get($blobid, 8192)){
|
||||
$realblob .= $string;
|
||||
}
|
||||
ibase_blob_close( $blobid );
|
||||
|
||||
return( $realblob );
|
||||
}
|
||||
|
||||
function _BlobDecode( $blob )
|
||||
{
|
||||
if (ADODB_PHPVER >= 0x5000) {
|
||||
$blob_data = ibase_blob_info($this->_connectionID, $blob );
|
||||
$blobid = ibase_blob_open($this->_connectionID, $blob );
|
||||
} else {
|
||||
|
||||
$blob_data = ibase_blob_info( $blob );
|
||||
$blobid = ibase_blob_open( $blob );
|
||||
}
|
||||
|
||||
if( $blob_data[0] > $this->maxblobsize ) {
|
||||
|
||||
$realblob = ibase_blob_get($blobid, $this->maxblobsize);
|
||||
|
||||
while($string = ibase_blob_get($blobid, 8192)){
|
||||
$realblob .= $string;
|
||||
}
|
||||
} else {
|
||||
$realblob = ibase_blob_get($blobid, $blob_data[0]);
|
||||
}
|
||||
|
||||
ibase_blob_close( $blobid );
|
||||
return( $realblob );
|
||||
}
|
||||
|
||||
function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
|
||||
{
|
||||
$fd = fopen($path,'rb');
|
||||
if ($fd === false) return false;
|
||||
$blob_id = ibase_blob_create($this->_connectionID);
|
||||
|
||||
/* fill with data */
|
||||
|
||||
while ($val = fread($fd,32768)){
|
||||
ibase_blob_add($blob_id, $val);
|
||||
}
|
||||
|
||||
/* close and get $blob_id_str for inserting into table */
|
||||
$blob_id_str = ibase_blob_close($blob_id);
|
||||
|
||||
fclose($fd);
|
||||
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
$blob_id = ibase_blob_create($this->_connectionID);
|
||||
|
||||
// ibase_blob_add($blob_id, $val);
|
||||
|
||||
// replacement that solves the problem by which only the first modulus 64K /
|
||||
// of $val are stored at the blob field ////////////////////////////////////
|
||||
// Thx Abel Berenstein aberenstein#afip.gov.ar
|
||||
$len = strlen($val);
|
||||
$chunk_size = 32768;
|
||||
$tail_size = $len % $chunk_size;
|
||||
$n_chunks = ($len - $tail_size) / $chunk_size;
|
||||
|
||||
for ($n = 0; $n < $n_chunks; $n++) {
|
||||
$start = $n * $chunk_size;
|
||||
$data = substr($val, $start, $chunk_size);
|
||||
ibase_blob_add($blob_id, $data);
|
||||
}
|
||||
|
||||
if ($tail_size) {
|
||||
$start = $n_chunks * $chunk_size;
|
||||
$data = substr($val, $start, $tail_size);
|
||||
ibase_blob_add($blob_id, $data);
|
||||
}
|
||||
// end replacement /////////////////////////////////////////////////////////
|
||||
|
||||
$blob_id_str = ibase_blob_close($blob_id);
|
||||
|
||||
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
function OldUpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
$blob_id = ibase_blob_create($this->_connectionID);
|
||||
ibase_blob_add($blob_id, $val);
|
||||
$blob_id_str = ibase_blob_close($blob_id);
|
||||
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blob_id_str)) != false;
|
||||
}
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
// Only since Interbase 6.0 - uses EXTRACT
|
||||
// problem - does not zero-fill the day and month yet
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
if (!$col) $col = $this->sysDate;
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= '||';
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= "extract(year from $col)";
|
||||
break;
|
||||
case 'M':
|
||||
case 'm':
|
||||
$s .= "extract(month from $col)";
|
||||
break;
|
||||
case 'Q':
|
||||
case 'q':
|
||||
$s .= "cast(((extract(month from $col)+2) / 3) as integer)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= "(extract(day from $col))";
|
||||
break;
|
||||
case 'H':
|
||||
case 'h':
|
||||
$s .= "(extract(hour from $col))";
|
||||
break;
|
||||
case 'I':
|
||||
case 'i':
|
||||
$s .= "(extract(minute from $col))";
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
$s .= "CAST((extract(second from $col)) AS INTEGER)";
|
||||
break;
|
||||
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_ibase extends ADORecordSet
|
||||
{
|
||||
|
||||
var $databaseType = "ibase";
|
||||
var $bind=false;
|
||||
var $_cacheType;
|
||||
|
||||
function ADORecordset_ibase($id,$mode=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$this->fetchMode = ($mode === false) ? $ADODB_FETCH_MODE : $mode;
|
||||
$this->ADORecordSet($id);
|
||||
}
|
||||
|
||||
/* Returns: an object containing field information.
|
||||
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||
fetchField() is retrieved. */
|
||||
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
$fld = new ADOFieldObject;
|
||||
$ibf = ibase_field_info($this->_queryID,$fieldOffset);
|
||||
switch (ADODB_ASSOC_CASE) {
|
||||
case 2: // the default
|
||||
$fld->name = ($ibf['alias']);
|
||||
if (empty($fld->name)) $fld->name = ($ibf['name']);
|
||||
break;
|
||||
case 0:
|
||||
$fld->name = strtoupper($ibf['alias']);
|
||||
if (empty($fld->name)) $fld->name = strtoupper($ibf['name']);
|
||||
break;
|
||||
case 1:
|
||||
$fld->name = strtolower($ibf['alias']);
|
||||
if (empty($fld->name)) $fld->name = strtolower($ibf['name']);
|
||||
break;
|
||||
}
|
||||
|
||||
$fld->type = $ibf['type'];
|
||||
$fld->max_length = $ibf['length'];
|
||||
|
||||
/* This needs to be populated from the metadata */
|
||||
$fld->not_null = false;
|
||||
$fld->has_default = false;
|
||||
$fld->default_value = 'null';
|
||||
return $fld;
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
$this->_numOfRows = -1;
|
||||
$this->_numOfFields = @ibase_num_fields($this->_queryID);
|
||||
|
||||
// cache types for blob decode check
|
||||
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
|
||||
$f1 = $this->FetchField($i);
|
||||
$this->_cacheType[] = $f1->type;
|
||||
}
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
$f = @ibase_fetch_row($this->_queryID);
|
||||
if ($f === false) {
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
// OPN stuff start - optimized
|
||||
// fix missing nulls and decode blobs automatically
|
||||
|
||||
global $ADODB_ANSI_PADDING_OFF;
|
||||
//$ADODB_ANSI_PADDING_OFF=1;
|
||||
$rtrim = !empty($ADODB_ANSI_PADDING_OFF);
|
||||
|
||||
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
|
||||
if ($this->_cacheType[$i]=="BLOB") {
|
||||
if (isset($f[$i])) {
|
||||
$f[$i] = $this->connection->_BlobDecode($f[$i]);
|
||||
} else {
|
||||
$f[$i] = null;
|
||||
}
|
||||
} else {
|
||||
if (!isset($f[$i])) {
|
||||
$f[$i] = null;
|
||||
} else if ($rtrim && is_string($f[$i])) {
|
||||
$f[$i] = rtrim($f[$i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
// OPN stuff end
|
||||
|
||||
$this->fields = $f;
|
||||
if ($this->fetchMode == ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
} else if ($this->fetchMode == ADODB_FETCH_BOTH) {
|
||||
$this->fields = array_merge($this->fields,$this->GetRowAssoc(ADODB_ASSOC_CASE));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _close()
|
||||
{
|
||||
return @ibase_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
switch (strtoupper($t)) {
|
||||
case 'CHAR':
|
||||
return 'C';
|
||||
|
||||
case 'TEXT':
|
||||
case 'VARCHAR':
|
||||
case 'VARYING':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
return 'X';
|
||||
case 'BLOB':
|
||||
return 'B';
|
||||
|
||||
case 'TIMESTAMP':
|
||||
case 'DATE': return 'D';
|
||||
case 'TIME': return 'T';
|
||||
//case 'T': return 'T';
|
||||
|
||||
//case 'L': return 'L';
|
||||
case 'INT':
|
||||
case 'SHORT':
|
||||
case 'INTEGER': return 'I';
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
* Informix 9 driver that supports SELECT FIRST
|
||||
*
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-informix72.inc.php');
|
||||
|
||||
class ADODB_informix extends ADODB_informix72 {
|
||||
var $databaseType = "informix";
|
||||
var $hasTop = 'FIRST';
|
||||
var $ansiOuter = true;
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " NVL($field, $ifNull) "; // if Informix 9.X or 10.X
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordset_informix extends ADORecordset_informix72 {
|
||||
var $databaseType = "informix";
|
||||
|
||||
function ADORecordset_informix($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_informix72($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,475 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim. All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Informix port by Mitchell T. Young (mitch@youngfamily.org)
|
||||
|
||||
Further mods by "Samuel CARRIERE" <samuel_carriere@hotmail.com>
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('IFX_SCROLL')) define('IFX_SCROLL',1);
|
||||
|
||||
class ADODB_informix72 extends ADOConnection {
|
||||
var $databaseType = "informix72";
|
||||
var $dataProvider = "informix";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $hasInsertID = true;
|
||||
var $hasAffectedRows = true;
|
||||
var $substr = 'substr';
|
||||
var $metaTablesSQL="select tabname,tabtype from systables where tabtype in ('T','V') and owner!='informix'"; //Don't get informix tables and pseudo-tables
|
||||
|
||||
|
||||
var $metaColumnsSQL =
|
||||
"select c.colname, c.coltype, c.collength, d.default,c.colno
|
||||
from syscolumns c, systables t,outer sysdefaults d
|
||||
where c.tabid=t.tabid and d.tabid=t.tabid and d.colno=c.colno
|
||||
and tabname='%s' order by c.colno";
|
||||
|
||||
var $metaPrimaryKeySQL =
|
||||
"select part1,part2,part3,part4,part5,part6,part7,part8 from
|
||||
systables t,sysconstraints s,sysindexes i where t.tabname='%s'
|
||||
and s.tabid=t.tabid and s.constrtype='P'
|
||||
and i.idxname=s.idxname";
|
||||
|
||||
var $concat_operator = '||';
|
||||
|
||||
var $lastQuery = false;
|
||||
var $has_insertid = true;
|
||||
|
||||
var $_autocommit = true;
|
||||
var $_bindInputArray = true; // set to true if ADOConnection.Execute() permits binding of array parameters.
|
||||
var $sysDate = 'TODAY';
|
||||
var $sysTimeStamp = 'CURRENT';
|
||||
var $cursorType = IFX_SCROLL; // IFX_SCROLL or IFX_HOLD or 0
|
||||
|
||||
function ADODB_informix72()
|
||||
{
|
||||
// alternatively, use older method:
|
||||
//putenv("DBDATE=Y4MD-");
|
||||
|
||||
// force ISO date format
|
||||
putenv('GL_DATE=%Y-%m-%d');
|
||||
|
||||
if (function_exists('ifx_byteasvarchar')) {
|
||||
ifx_byteasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
|
||||
ifx_textasvarchar(1); // Mode "0" will return a blob id, and mode "1" will return a varchar with text content.
|
||||
ifx_blobinfile_mode(0); // Mode "0" means save Byte-Blobs in memory, and mode "1" means save Byte-Blobs in a file.
|
||||
}
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
if (isset($this->version)) return $this->version;
|
||||
|
||||
$arr['description'] = $this->GetOne("select DBINFO('version','full') from systables where tabid = 1");
|
||||
$arr['version'] = $this->GetOne("select DBINFO('version','major') || DBINFO('version','minor') from systables where tabid = 1");
|
||||
$this->version = $arr;
|
||||
return $arr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
$sqlca =ifx_getsqlca($this->lastQuery);
|
||||
return @$sqlca["sqlerrd1"];
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
if ($this->lastQuery) {
|
||||
return @ifx_affected_rows ($this->lastQuery);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->Execute('BEGIN');
|
||||
$this->_autocommit = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->Execute('COMMIT');
|
||||
$this->_autocommit = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->Execute('ROLLBACK');
|
||||
$this->_autocommit = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
function RowLock($tables,$where,$col='1 as ignore')
|
||||
{
|
||||
if ($this->_autocommit) $this->BeginTrans();
|
||||
return $this->GetOne("select $col from $tables where $where for update");
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation
|
||||
Note: This function is NOT available for Microsoft SQL Server. */
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if (!empty($this->_logsql)) return $this->_errorMsg;
|
||||
$this->_errorMsg = ifx_errormsg();
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
preg_match("/.*SQLCODE=([^\]]*)/",ifx_error(),$parse);
|
||||
if (is_array($parse) && isset($parse[1])) return (int)$parse[1];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
if (!empty($this->metaColumnsSQL)) {
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
if ($rs === false) return $false;
|
||||
$rspkey = $this->Execute(sprintf($this->metaPrimaryKeySQL,$table)); //Added to get primary key colno items
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) { //print_r($rs->fields);
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
/* //!eos.
|
||||
$rs->fields[1] is not the correct adodb type
|
||||
$rs->fields[2] is not correct max_length, because can include not-null bit
|
||||
|
||||
$fld->type = $rs->fields[1];
|
||||
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields); //Added to set primary key flag
|
||||
$fld->max_length = $rs->fields[2];*/
|
||||
$pr=ifx_props($rs->fields[1],$rs->fields[2]); //!eos
|
||||
$fld->type = $pr[0] ;//!eos
|
||||
$fld->primary_key=$rspkey->fields && array_search($rs->fields[4],$rspkey->fields);
|
||||
$fld->max_length = $pr[1]; //!eos
|
||||
$fld->precision = $pr[2] ;//!eos
|
||||
$fld->not_null = $pr[3]=="N"; //!eos
|
||||
|
||||
if (trim($rs->fields[3]) != "AAAAAA 0") {
|
||||
$fld->has_default = 1;
|
||||
$fld->default_value = $rs->fields[3];
|
||||
} else {
|
||||
$fld->has_default = 0;
|
||||
}
|
||||
|
||||
$retarr[strtolower($fld->name)] = $fld;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
|
||||
$rs->Close();
|
||||
$rspkey->Close(); //!eos
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
return $false;
|
||||
}
|
||||
|
||||
function xMetaColumns($table)
|
||||
{
|
||||
return ADOConnection::MetaColumns($table,false);
|
||||
}
|
||||
|
||||
function MetaForeignKeys($table, $owner=false, $upper=false) //!Eos
|
||||
{
|
||||
$sql = "
|
||||
select tr.tabname,updrule,delrule,
|
||||
i.part1 o1,i2.part1 d1,i.part2 o2,i2.part2 d2,i.part3 o3,i2.part3 d3,i.part4 o4,i2.part4 d4,
|
||||
i.part5 o5,i2.part5 d5,i.part6 o6,i2.part6 d6,i.part7 o7,i2.part7 d7,i.part8 o8,i2.part8 d8
|
||||
from systables t,sysconstraints s,sysindexes i,
|
||||
sysreferences r,systables tr,sysconstraints s2,sysindexes i2
|
||||
where t.tabname='$table'
|
||||
and s.tabid=t.tabid and s.constrtype='R' and r.constrid=s.constrid
|
||||
and i.idxname=s.idxname and tr.tabid=r.ptabid
|
||||
and s2.constrid=r.primary and i2.idxname=s2.idxname";
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
if (!$rs || $rs->EOF) return false;
|
||||
$arr = $rs->GetArray();
|
||||
$a = array();
|
||||
foreach($arr as $v) {
|
||||
$coldest=$this->metaColumnNames($v["tabname"]);
|
||||
$colorig=$this->metaColumnNames($table);
|
||||
$colnames=array();
|
||||
for($i=1;$i<=8 && $v["o$i"] ;$i++) {
|
||||
$colnames[]=$coldest[$v["d$i"]-1]."=".$colorig[$v["o$i"]-1];
|
||||
}
|
||||
if($upper)
|
||||
$a[strtoupper($v["tabname"])] = $colnames;
|
||||
else
|
||||
$a[$v["tabname"]] = $colnames;
|
||||
}
|
||||
return $a;
|
||||
}
|
||||
|
||||
function UpdateBlob($table, $column, $val, $where, $blobtype = 'BLOB')
|
||||
{
|
||||
$type = ($blobtype == 'TEXT') ? 1 : 0;
|
||||
$blobid = ifx_create_blob($type,0,$val);
|
||||
return $this->Execute("UPDATE $table SET $column=(?) WHERE $where",array($blobid));
|
||||
}
|
||||
|
||||
function BlobDecode($blobid)
|
||||
{
|
||||
return function_exists('ifx_byteasvarchar') ? $blobid : @ifx_get_blob($blobid);
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!function_exists('ifx_connect')) return null;
|
||||
|
||||
$dbs = $argDatabasename . "@" . $argHostname;
|
||||
if ($argHostname) putenv("INFORMIXSERVER=$argHostname");
|
||||
putenv("INFORMIXSERVER=".trim($argHostname));
|
||||
$this->_connectionID = ifx_connect($dbs,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!function_exists('ifx_connect')) return null;
|
||||
|
||||
$dbs = $argDatabasename . "@" . $argHostname;
|
||||
putenv("INFORMIXSERVER=".trim($argHostname));
|
||||
$this->_connectionID = ifx_pconnect($dbs,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
#if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
/*
|
||||
// ifx_do does not accept bind parameters - weird ???
|
||||
function Prepare($sql)
|
||||
{
|
||||
$stmt = ifx_prepare($sql);
|
||||
if (!$stmt) return $sql;
|
||||
else return array($sql,$stmt);
|
||||
}
|
||||
*/
|
||||
// returns query ID if successful, otherwise false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
|
||||
// String parameters have to be converted using ifx_create_char
|
||||
if ($inputarr) {
|
||||
foreach($inputarr as $v) {
|
||||
if (gettype($v) == 'string') {
|
||||
$tab[] = ifx_create_char($v);
|
||||
}
|
||||
else {
|
||||
$tab[] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// In case of select statement, we use a scroll cursor in order
|
||||
// to be able to call "move", or "movefirst" statements
|
||||
if (!$ADODB_COUNTRECS && preg_match("/^\s*select/is", $sql)) {
|
||||
if ($inputarr) {
|
||||
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType, $tab);
|
||||
}
|
||||
else {
|
||||
$this->lastQuery = ifx_query($sql,$this->_connectionID, $this->cursorType);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ($inputarr) {
|
||||
$this->lastQuery = ifx_query($sql,$this->_connectionID, $tab);
|
||||
}
|
||||
else {
|
||||
$this->lastQuery = ifx_query($sql,$this->_connectionID);
|
||||
}
|
||||
}
|
||||
|
||||
// Following line have been commented because autocommit mode is
|
||||
// not supported by informix SE 7.2
|
||||
|
||||
//if ($this->_autocommit) ifx_query('COMMIT',$this->_connectionID);
|
||||
|
||||
return $this->lastQuery;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
$this->lastQuery = false;
|
||||
return ifx_close($this->_connectionID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_informix72 extends ADORecordSet {
|
||||
|
||||
var $databaseType = "informix72";
|
||||
var $canSeek = true;
|
||||
var $_fieldprops = false;
|
||||
|
||||
function ADORecordset_informix72($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
return $this->ADORecordSet($id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Returns: an object containing field information.
|
||||
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||
fetchField() is retrieved. */
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
if (empty($this->_fieldprops)) {
|
||||
$fp = ifx_fieldproperties($this->_queryID);
|
||||
foreach($fp as $k => $v) {
|
||||
$o = new ADOFieldObject;
|
||||
$o->name = $k;
|
||||
$arr = explode(';',$v); //"SQLTYPE;length;precision;scale;ISNULLABLE"
|
||||
$o->type = $arr[0];
|
||||
$o->max_length = $arr[1];
|
||||
$this->_fieldprops[] = $o;
|
||||
$o->not_null = $arr[4]=="N";
|
||||
}
|
||||
}
|
||||
$ret = $this->_fieldprops[$fieldOffset];
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
$this->_numOfRows = -1; // ifx_affected_rows not reliable, only returns estimate -- ($ADODB_COUNTRECS)? ifx_affected_rows($this->_queryID):-1;
|
||||
$this->_numOfFields = ifx_num_fields($this->_queryID);
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return @ifx_fetch_row($this->_queryID, (int) $row);
|
||||
}
|
||||
|
||||
function MoveLast()
|
||||
{
|
||||
$this->fields = @ifx_fetch_row($this->_queryID, "LAST");
|
||||
if ($this->fields) $this->EOF = false;
|
||||
$this->_currentRow = -1;
|
||||
|
||||
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||
foreach($this->fields as $v) {
|
||||
$arr[] = $v;
|
||||
}
|
||||
$this->fields = $arr;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function MoveFirst()
|
||||
{
|
||||
$this->fields = @ifx_fetch_row($this->_queryID, "FIRST");
|
||||
if ($this->fields) $this->EOF = false;
|
||||
$this->_currentRow = 0;
|
||||
|
||||
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||
foreach($this->fields as $v) {
|
||||
$arr[] = $v;
|
||||
}
|
||||
$this->fields = $arr;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function _fetch($ignore_fields=false)
|
||||
{
|
||||
|
||||
$this->fields = @ifx_fetch_row($this->_queryID);
|
||||
|
||||
if (!is_array($this->fields)) return false;
|
||||
|
||||
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||
foreach($this->fields as $v) {
|
||||
$arr[] = $v;
|
||||
}
|
||||
$this->fields = $arr;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||
function _close()
|
||||
{
|
||||
return ifx_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
}
|
||||
/** !Eos
|
||||
* Auxiliar function to Parse coltype,collength. Used by Metacolumns
|
||||
* return: array ($mtype,$length,$precision,$nullable) (similar to ifx_fieldpropierties)
|
||||
*/
|
||||
function ifx_props($coltype,$collength){
|
||||
$itype=fmod($coltype+1,256);
|
||||
$nullable=floor(($coltype+1) /256) ?"N":"Y";
|
||||
$mtype=substr(" CIIFFNNDN TBXCC ",$itype,1);
|
||||
switch ($itype){
|
||||
case 2:
|
||||
$length=4;
|
||||
case 6:
|
||||
case 9:
|
||||
case 14:
|
||||
$length=floor($collength/256);
|
||||
$precision=fmod($collength,256);
|
||||
break;
|
||||
default:
|
||||
$precision=0;
|
||||
$length=$collength;
|
||||
}
|
||||
return array($mtype,$length,$precision,$nullable);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,423 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
Revision 1: (02/25/2005) Updated codebase to include the _inject_bind_options function. This allows
|
||||
users to access the options in the ldap_set_option function appropriately. Most importantly
|
||||
LDAP Version 3 is now supported. See the examples for more information. Also fixed some minor
|
||||
bugs that surfaced when PHP error levels were set high.
|
||||
|
||||
Joshua Eldridge (joshuae74#hotmail.com)
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('LDAP_ASSOC')) {
|
||||
define('LDAP_ASSOC',ADODB_FETCH_ASSOC);
|
||||
define('LDAP_NUM',ADODB_FETCH_NUM);
|
||||
define('LDAP_BOTH',ADODB_FETCH_BOTH);
|
||||
}
|
||||
|
||||
class ADODB_ldap extends ADOConnection {
|
||||
var $databaseType = 'ldap';
|
||||
var $dataProvider = 'ldap';
|
||||
|
||||
# Connection information
|
||||
var $username = false;
|
||||
var $password = false;
|
||||
|
||||
# Used during searches
|
||||
var $filter;
|
||||
var $dn;
|
||||
var $version;
|
||||
var $port = 389;
|
||||
|
||||
# Options configuration information
|
||||
var $LDAP_CONNECT_OPTIONS;
|
||||
|
||||
# error on binding, eg. "Binding: invalid credentials"
|
||||
var $_bind_errmsg = "Binding: %s";
|
||||
|
||||
function ADODB_ldap()
|
||||
{
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
|
||||
function _connect( $host, $username, $password, $ldapbase)
|
||||
{
|
||||
global $LDAP_CONNECT_OPTIONS;
|
||||
|
||||
if ( !function_exists( 'ldap_connect' ) ) return null;
|
||||
|
||||
if (strpos('ldap://',$host) === 0 || strpos('ldaps://',$host) === 0) {
|
||||
$this->_connectionID = @ldap_connect($host);
|
||||
} else {
|
||||
$conn_info = array( $host,$this->port);
|
||||
|
||||
if ( strstr( $host, ':' ) ) {
|
||||
$conn_info = explode( ':', $host );
|
||||
}
|
||||
|
||||
$this->_connectionID = @ldap_connect( $conn_info[0], $conn_info[1] );
|
||||
}
|
||||
if (!$this->_connectionID) {
|
||||
$e = 'Could not connect to ' . $conn_info[0];
|
||||
$this->_errorMsg = $e;
|
||||
if ($this->debug) ADOConnection::outp($e);
|
||||
return false;
|
||||
}
|
||||
if( count( $LDAP_CONNECT_OPTIONS ) > 0 ) {
|
||||
$this->_inject_bind_options( $LDAP_CONNECT_OPTIONS );
|
||||
}
|
||||
|
||||
if ($username) {
|
||||
$bind = @ldap_bind( $this->_connectionID, $username, $password );
|
||||
} else {
|
||||
$username = 'anonymous';
|
||||
$bind = @ldap_bind( $this->_connectionID );
|
||||
}
|
||||
|
||||
if (!$bind) {
|
||||
$e = sprintf($this->_bind_errmsg,ldap_error($this->_connectionID));
|
||||
$this->_errorMsg = $e;
|
||||
if ($this->debug) ADOConnection::outp($e);
|
||||
return false;
|
||||
}
|
||||
$this->_errorMsg = '';
|
||||
$this->database = $ldapbase;
|
||||
return $this->_connectionID;
|
||||
}
|
||||
|
||||
/*
|
||||
Valid Domain Values for LDAP Options:
|
||||
|
||||
LDAP_OPT_DEREF (integer)
|
||||
LDAP_OPT_SIZELIMIT (integer)
|
||||
LDAP_OPT_TIMELIMIT (integer)
|
||||
LDAP_OPT_PROTOCOL_VERSION (integer)
|
||||
LDAP_OPT_ERROR_NUMBER (integer)
|
||||
LDAP_OPT_REFERRALS (boolean)
|
||||
LDAP_OPT_RESTART (boolean)
|
||||
LDAP_OPT_HOST_NAME (string)
|
||||
LDAP_OPT_ERROR_STRING (string)
|
||||
LDAP_OPT_MATCHED_DN (string)
|
||||
LDAP_OPT_SERVER_CONTROLS (array)
|
||||
LDAP_OPT_CLIENT_CONTROLS (array)
|
||||
|
||||
Make sure to set this BEFORE calling Connect()
|
||||
|
||||
Example:
|
||||
|
||||
$LDAP_CONNECT_OPTIONS = Array(
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_DEREF,
|
||||
"OPTION_VALUE"=>2
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_SIZELIMIT,
|
||||
"OPTION_VALUE"=>100
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_TIMELIMIT,
|
||||
"OPTION_VALUE"=>30
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_PROTOCOL_VERSION,
|
||||
"OPTION_VALUE"=>3
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_ERROR_NUMBER,
|
||||
"OPTION_VALUE"=>13
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_REFERRALS,
|
||||
"OPTION_VALUE"=>FALSE
|
||||
),
|
||||
Array (
|
||||
"OPTION_NAME"=>LDAP_OPT_RESTART,
|
||||
"OPTION_VALUE"=>FALSE
|
||||
)
|
||||
);
|
||||
*/
|
||||
|
||||
function _inject_bind_options( $options ) {
|
||||
foreach( $options as $option ) {
|
||||
ldap_set_option( $this->_connectionID, $option["OPTION_NAME"], $option["OPTION_VALUE"] )
|
||||
or die( "Unable to set server option: " . $option["OPTION_NAME"] );
|
||||
}
|
||||
}
|
||||
|
||||
/* returns _queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
$rs = @ldap_search( $this->_connectionID, $this->database, $sql );
|
||||
$this->_errorMsg = ($rs) ? '' : 'Search error on '.$sql.': '.ldap_error($this->_connectionID);
|
||||
return $rs;
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
return @ldap_errno($this->_connectionID);
|
||||
}
|
||||
|
||||
/* closes the LDAP connection */
|
||||
function _close()
|
||||
{
|
||||
@ldap_close( $this->_connectionID );
|
||||
$this->_connectionID = false;
|
||||
}
|
||||
|
||||
function SelectDB($db) {
|
||||
$this->database = $db;
|
||||
return true;
|
||||
} // SelectDB
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
if( !empty( $this->version ) ) return $this->version;
|
||||
$version = array();
|
||||
/*
|
||||
Determines how aliases are handled during search.
|
||||
LDAP_DEREF_NEVER (0x00)
|
||||
LDAP_DEREF_SEARCHING (0x01)
|
||||
LDAP_DEREF_FINDING (0x02)
|
||||
LDAP_DEREF_ALWAYS (0x03)
|
||||
The LDAP_DEREF_SEARCHING value means aliases are dereferenced during the search but
|
||||
not when locating the base object of the search. The LDAP_DEREF_FINDING value means
|
||||
aliases are dereferenced when locating the base object but not during the search.
|
||||
Default: LDAP_DEREF_NEVER
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_DEREF, $version['LDAP_OPT_DEREF'] ) ;
|
||||
switch ( $version['LDAP_OPT_DEREF'] ) {
|
||||
case 0:
|
||||
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_NEVER';
|
||||
case 1:
|
||||
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_SEARCHING';
|
||||
case 2:
|
||||
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_FINDING';
|
||||
case 3:
|
||||
$version['LDAP_OPT_DEREF'] = 'LDAP_DEREF_ALWAYS';
|
||||
}
|
||||
|
||||
/*
|
||||
A limit on the number of entries to return from a search.
|
||||
LDAP_NO_LIMIT (0) means no limit.
|
||||
Default: LDAP_NO_LIMIT
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_SIZELIMIT, $version['LDAP_OPT_SIZELIMIT'] );
|
||||
if ( $version['LDAP_OPT_SIZELIMIT'] == 0 ) {
|
||||
$version['LDAP_OPT_SIZELIMIT'] = 'LDAP_NO_LIMIT';
|
||||
}
|
||||
|
||||
/*
|
||||
A limit on the number of seconds to spend on a search.
|
||||
LDAP_NO_LIMIT (0) means no limit.
|
||||
Default: LDAP_NO_LIMIT
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_TIMELIMIT, $version['LDAP_OPT_TIMELIMIT'] );
|
||||
if ( $version['LDAP_OPT_TIMELIMIT'] == 0 ) {
|
||||
$version['LDAP_OPT_TIMELIMIT'] = 'LDAP_NO_LIMIT';
|
||||
}
|
||||
|
||||
/*
|
||||
Determines whether the LDAP library automatically follows referrals returned by LDAP servers or not.
|
||||
LDAP_OPT_ON
|
||||
LDAP_OPT_OFF
|
||||
Default: ON
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_REFERRALS, $version['LDAP_OPT_REFERRALS'] );
|
||||
if ( $version['LDAP_OPT_REFERRALS'] == 0 ) {
|
||||
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_OFF';
|
||||
} else {
|
||||
$version['LDAP_OPT_REFERRALS'] = 'LDAP_OPT_ON';
|
||||
|
||||
}
|
||||
/*
|
||||
Determines whether LDAP I/O operations are automatically restarted if they abort prematurely.
|
||||
LDAP_OPT_ON
|
||||
LDAP_OPT_OFF
|
||||
Default: OFF
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_RESTART, $version['LDAP_OPT_RESTART'] );
|
||||
if ( $version['LDAP_OPT_RESTART'] == 0 ) {
|
||||
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_OFF';
|
||||
} else {
|
||||
$version['LDAP_OPT_RESTART'] = 'LDAP_OPT_ON';
|
||||
|
||||
}
|
||||
/*
|
||||
This option indicates the version of the LDAP protocol used when communicating with the primary LDAP server.
|
||||
LDAP_VERSION2 (2)
|
||||
LDAP_VERSION3 (3)
|
||||
Default: LDAP_VERSION2 (2)
|
||||
*/
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_PROTOCOL_VERSION, $version['LDAP_OPT_PROTOCOL_VERSION'] );
|
||||
if ( $version['LDAP_OPT_PROTOCOL_VERSION'] == 2 ) {
|
||||
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION2';
|
||||
} else {
|
||||
$version['LDAP_OPT_PROTOCOL_VERSION'] = 'LDAP_VERSION3';
|
||||
|
||||
}
|
||||
/* The host name (or list of hosts) for the primary LDAP server. */
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_HOST_NAME, $version['LDAP_OPT_HOST_NAME'] );
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_NUMBER, $version['LDAP_OPT_ERROR_NUMBER'] );
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_ERROR_STRING, $version['LDAP_OPT_ERROR_STRING'] );
|
||||
ldap_get_option( $this->_connectionID, LDAP_OPT_MATCHED_DN, $version['LDAP_OPT_MATCHED_DN'] );
|
||||
|
||||
return $this->version = $version;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_ldap extends ADORecordSet{
|
||||
|
||||
var $databaseType = "ldap";
|
||||
var $canSeek = false;
|
||||
var $_entryID; /* keeps track of the entry resource identifier */
|
||||
|
||||
function ADORecordSet_ldap($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM:
|
||||
$this->fetchMode = LDAP_NUM;
|
||||
break;
|
||||
case ADODB_FETCH_ASSOC:
|
||||
$this->fetchMode = LDAP_ASSOC;
|
||||
break;
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = LDAP_BOTH;
|
||||
break;
|
||||
}
|
||||
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
/*
|
||||
This could be teaked to respect the $COUNTRECS directive from ADODB
|
||||
It's currently being used in the _fetch() function and the
|
||||
GetAssoc() function
|
||||
*/
|
||||
$this->_numOfRows = ldap_count_entries( $this->connection->_connectionID, $this->_queryID );
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Return whole recordset as a multi-dimensional associative array
|
||||
*/
|
||||
function GetAssoc($force_array = false, $first2cols = false)
|
||||
{
|
||||
$records = $this->_numOfRows;
|
||||
$results = array();
|
||||
for ( $i=0; $i < $records; $i++ ) {
|
||||
foreach ( $this->fields as $k=>$v ) {
|
||||
if ( is_array( $v ) ) {
|
||||
if ( $v['count'] == 1 ) {
|
||||
$results[$i][$k] = $v[0];
|
||||
} else {
|
||||
array_shift( $v );
|
||||
$results[$i][$k] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
function GetRowAssoc()
|
||||
{
|
||||
$results = array();
|
||||
foreach ( $this->fields as $k=>$v ) {
|
||||
if ( is_array( $v ) ) {
|
||||
if ( $v['count'] == 1 ) {
|
||||
$results[$k] = $v[0];
|
||||
} else {
|
||||
array_shift( $v );
|
||||
$results[$k] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
function GetRowNums()
|
||||
{
|
||||
$results = array();
|
||||
foreach ( $this->fields as $k=>$v ) {
|
||||
static $i = 0;
|
||||
if (is_array( $v )) {
|
||||
if ( $v['count'] == 1 ) {
|
||||
$results[$i] = $v[0];
|
||||
} else {
|
||||
array_shift( $v );
|
||||
$results[$i] = $v;
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
return $results;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
if ( $this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0 )
|
||||
return false;
|
||||
|
||||
if ( $this->_currentRow == 0 ) {
|
||||
$this->_entryID = ldap_first_entry( $this->connection->_connectionID, $this->_queryID );
|
||||
} else {
|
||||
$this->_entryID = ldap_next_entry( $this->connection->_connectionID, $this->_entryID );
|
||||
}
|
||||
|
||||
$this->fields = ldap_get_attributes( $this->connection->_connectionID, $this->_entryID );
|
||||
$this->_numOfFields = $this->fields['count'];
|
||||
switch ( $this->fetchMode ) {
|
||||
|
||||
case LDAP_ASSOC:
|
||||
$this->fields = $this->GetRowAssoc();
|
||||
break;
|
||||
|
||||
case LDAP_NUM:
|
||||
$this->fields = array_merge($this->GetRowNums(),$this->GetRowAssoc());
|
||||
break;
|
||||
|
||||
case LDAP_BOTH:
|
||||
default:
|
||||
$this->fields = $this->GetRowNums();
|
||||
break;
|
||||
}
|
||||
return ( is_array( $this->fields ) );
|
||||
}
|
||||
|
||||
function _close() {
|
||||
@ldap_free_result( $this->_queryID );
|
||||
$this->_queryID = false;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,171 +0,0 @@
|
||||
<?php
|
||||
|
||||
/// $Id $
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// //
|
||||
// NOTICE OF COPYRIGHT //
|
||||
// //
|
||||
// ADOdb - Database Abstraction Library for PHP //
|
||||
// http://adodb.sourceforge.net/ //
|
||||
// //
|
||||
// Copyright (C) 2000-2009 John Lim (jlim\@natsoft.com.my) //
|
||||
// All rights reserved. //
|
||||
// Released under both BSD license and LGPL library license. //
|
||||
// Whenever there is any discrepancy between the two licenses, //
|
||||
// the BSD license will take precedence //
|
||||
// //
|
||||
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
|
||||
// http://moodle.com //
|
||||
// //
|
||||
// Copyright (C) 2001-3001 Martin Dougiamas http://dougiamas.com //
|
||||
// (C) 2001-3001 Eloy Lafuente (stronk7) http://contiento.com //
|
||||
// //
|
||||
// This program is free software; you can redistribute it and/or modify //
|
||||
// it under the terms of the GNU General Public License as published by //
|
||||
// the Free Software Foundation; either version 2 of the License, or //
|
||||
// (at your option) any later version. //
|
||||
// //
|
||||
// This program is distributed in the hope that it will be useful, //
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||
// GNU General Public License for more details: //
|
||||
// //
|
||||
// http://www.gnu.org/copyleft/gpl.html //
|
||||
// //
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* MSSQL Driver with auto-prepended "N" for correct unicode storage
|
||||
* of SQL literal strings. Intended to be used with MSSQL drivers that
|
||||
* are sending UCS-2 data to MSSQL (FreeTDS and ODBTP) in order to get
|
||||
* true cross-db compatibility from the application point of view.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
// one useful constant
|
||||
if (!defined('SINGLEQUOTE')) define('SINGLEQUOTE', "'");
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php');
|
||||
|
||||
class ADODB_mssql_n extends ADODB_mssql {
|
||||
var $databaseType = "mssql_n";
|
||||
|
||||
function ADODB_mssqlpo()
|
||||
{
|
||||
ADODB_mssql::ADODB_mssql();
|
||||
}
|
||||
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
$sql = $this->_appendN($sql);
|
||||
return ADODB_mssql::_query($sql,$inputarr);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will intercept all the literals used in the SQL, prepending the "N" char to them
|
||||
* in order to allow mssql to store properly data sent in the correct UCS-2 encoding (by freeTDS
|
||||
* and ODBTP) keeping SQL compatibility at ADOdb level (instead of hacking every project to add
|
||||
* the "N" notation when working against MSSQL.
|
||||
*
|
||||
* Note that this hack only must be used if ALL the char-based columns in your DB are of type nchar,
|
||||
* nvarchar and ntext
|
||||
*/
|
||||
function _appendN($sql) {
|
||||
|
||||
$result = $sql;
|
||||
|
||||
/// Check we have some single quote in the query. Exit ok.
|
||||
if (strpos($sql, SINGLEQUOTE) === false) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/// Check we haven't an odd number of single quotes (this can cause problems below
|
||||
/// and should be considered one wrong SQL). Exit with debug info.
|
||||
if ((substr_count($sql, SINGLEQUOTE) & 1)) {
|
||||
if ($this->debug) {
|
||||
ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Wrong number of quotes (odd)");
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/// Check we haven't any backslash + single quote combination. It should mean wrong
|
||||
/// backslashes use (bad magic_quotes_sybase?). Exit with debug info.
|
||||
$regexp = '/(\\\\' . SINGLEQUOTE . '[^' . SINGLEQUOTE . '])/';
|
||||
if (preg_match($regexp, $sql)) {
|
||||
if ($this->debug) {
|
||||
ADOConnection::outp("{$this->databaseType} internal transformation: not converted. Found bad use of backslash + single quote");
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
/// Remove pairs of single-quotes
|
||||
$pairs = array();
|
||||
$regexp = '/(' . SINGLEQUOTE . SINGLEQUOTE . ')/';
|
||||
preg_match_all($regexp, $result, $list_of_pairs);
|
||||
if ($list_of_pairs) {
|
||||
foreach (array_unique($list_of_pairs[0]) as $key=>$value) {
|
||||
$pairs['<@#@#@PAIR-'.$key.'@#@#@>'] = $value;
|
||||
}
|
||||
if (!empty($pairs)) {
|
||||
$result = str_replace($pairs, array_keys($pairs), $result);
|
||||
}
|
||||
}
|
||||
|
||||
/// Remove the rest of literals present in the query
|
||||
$literals = array();
|
||||
$regexp = '/(N?' . SINGLEQUOTE . '.*?' . SINGLEQUOTE . ')/is';
|
||||
preg_match_all($regexp, $result, $list_of_literals);
|
||||
if ($list_of_literals) {
|
||||
foreach (array_unique($list_of_literals[0]) as $key=>$value) {
|
||||
$literals['<#@#@#LITERAL-'.$key.'#@#@#>'] = $value;
|
||||
}
|
||||
if (!empty($literals)) {
|
||||
$result = str_replace($literals, array_keys($literals), $result);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Analyse literals to prepend the N char to them if their contents aren't numeric
|
||||
if (!empty($literals)) {
|
||||
foreach ($literals as $key=>$value) {
|
||||
if (!is_numeric(trim($value, SINGLEQUOTE))) {
|
||||
/// Non numeric string, prepend our dear N
|
||||
$literals[$key] = 'N' . trim($value, 'N'); //Trimming potentially existing previous "N"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Re-apply literals to the text
|
||||
if (!empty($literals)) {
|
||||
$result = str_replace(array_keys($literals), $literals, $result);
|
||||
}
|
||||
|
||||
/// Any pairs followed by N' must be switched to N' followed by those pairs
|
||||
/// (or strings beginning with single quotes will fail)
|
||||
$result = preg_replace("/((<@#@#@PAIR-(\d+)@#@#@>)+)N'/", "N'$1", $result);
|
||||
|
||||
/// Re-apply pairs of single-quotes to the text
|
||||
if (!empty($pairs)) {
|
||||
$result = str_replace(array_keys($pairs), $pairs, $result);
|
||||
}
|
||||
|
||||
/// Print transformation if debug = on
|
||||
if ($result != $sql && $this->debug) {
|
||||
ADOConnection::outp("{$this->databaseType} internal transformation:<br>{$sql}<br>to<br>{$result}");
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordset_mssql_n extends ADORecordset_mssql {
|
||||
var $databaseType = "mssql_n";
|
||||
function ADORecordset_mssql_n($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_mssql($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,975 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.11 5 May 2010 (c) 2000-2010 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Native mssql driver. Requires mssql client. Works on Windows.
|
||||
http://www.microsoft.com/sql/technologies/php/default.mspx
|
||||
To configure for Unix, see
|
||||
http://phpbuilder.com/columns/alberto20000919.php3
|
||||
|
||||
$stream = sqlsrv_get_field($stmt, $index, SQLSRV_SQLTYPE_STREAM(SQLSRV_ENC_BINARY));
|
||||
stream_filter_append($stream, "convert.iconv.ucs-2/utf-8"); // Voila, UTF-8 can be read directly from $stream
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!function_exists('sqlsrv_configure')) {
|
||||
die("mssqlnative extension not installed");
|
||||
}
|
||||
|
||||
if (!function_exists('sqlsrv_set_error_handling')) {
|
||||
function sqlsrv_set_error_handling($constant) {
|
||||
sqlsrv_configure("WarningsReturnAsErrors", $constant);
|
||||
}
|
||||
}
|
||||
if (!function_exists('sqlsrv_log_set_severity')) {
|
||||
function sqlsrv_log_set_severity($constant) {
|
||||
sqlsrv_configure("LogSeverity", $constant);
|
||||
}
|
||||
}
|
||||
if (!function_exists('sqlsrv_log_set_subsystems')) {
|
||||
function sqlsrv_log_set_subsystems($constant) {
|
||||
sqlsrv_configure("LogSubsystems", $constant);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------
|
||||
// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002
|
||||
// and this causes tons of problems because localized versions of
|
||||
// MSSQL will return the dates in dmy or mdy order; and also the
|
||||
// month strings depends on what language has been configured. The
|
||||
// following two variables allow you to control the localization
|
||||
// settings - Ugh.
|
||||
//
|
||||
// MORE LOCALIZATION INFO
|
||||
// ----------------------
|
||||
// To configure datetime, look for and modify sqlcommn.loc,
|
||||
// typically found in c:\mssql\install
|
||||
// Also read :
|
||||
// http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918
|
||||
// Alternatively use:
|
||||
// CONVERT(char(12),datecol,120)
|
||||
//
|
||||
// Also if your month is showing as month-1,
|
||||
// e.g. Jan 13, 2002 is showing as 13/0/2002, then see
|
||||
// http://phplens.com/lens/lensforum/msgs.php?id=7048&x=1
|
||||
// it's a localisation problem.
|
||||
//----------------------------------------------------------------
|
||||
|
||||
|
||||
// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_assoc
|
||||
if (ADODB_PHPVER >= 0x4300) {
|
||||
// docs say 4.2.0, but testing shows only since 4.3.0 does it work!
|
||||
ini_set('mssql.datetimeconvert',0);
|
||||
} else {
|
||||
global $ADODB_mssql_mths; // array, months must be upper-case
|
||||
$ADODB_mssql_date_order = 'mdy';
|
||||
$ADODB_mssql_mths = array(
|
||||
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
|
||||
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Call this to autoset $ADODB_mssql_date_order at the beginning of your code,
|
||||
// just after you connect to the database. Supports mdy and dmy only.
|
||||
// Not required for PHP 4.2.0 and above.
|
||||
function AutoDetect_MSSQL_Date_Order($conn)
|
||||
{
|
||||
global $ADODB_mssql_date_order;
|
||||
$adate = $conn->GetOne('select getdate()');
|
||||
if ($adate) {
|
||||
$anum = (int) $adate;
|
||||
if ($anum > 0) {
|
||||
if ($anum > 31) {
|
||||
//ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently");
|
||||
} else
|
||||
$ADODB_mssql_date_order = 'dmy';
|
||||
} else
|
||||
$ADODB_mssql_date_order = 'mdy';
|
||||
}
|
||||
}
|
||||
|
||||
class ADODB_mssqlnative extends ADOConnection {
|
||||
var $databaseType = "mssqlnative";
|
||||
var $dataProvider = "mssqlnative";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $hasInsertID = true;
|
||||
var $substr = "substring";
|
||||
var $length = 'len';
|
||||
var $hasAffectedRows = true;
|
||||
var $poorAffectedRows = false;
|
||||
var $metaDatabasesSQL = "select name from sys.sysdatabases where name <> 'master'";
|
||||
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))";
|
||||
var $metaColumnsSQL = # xtype==61 is datetime
|
||||
"select c.name,t.name,c.length,
|
||||
(case when c.xusertype=61 then 0 else c.xprec end),
|
||||
(case when c.xusertype=61 then 0 else c.xscale end)
|
||||
from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
|
||||
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||
var $hasGenID = true;
|
||||
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||
var $sysTimeStamp = 'GetDate()';
|
||||
var $maxParameterLen = 4000;
|
||||
var $arrayClass = 'ADORecordSet_array_mssqlnative';
|
||||
var $uniqueSort = true;
|
||||
var $leftOuter = '*=';
|
||||
var $rightOuter = '=*';
|
||||
var $ansiOuter = true; // for mssql7 or later
|
||||
var $identitySQL = 'select SCOPE_IDENTITY()'; // 'select SCOPE_IDENTITY'; # for mssql 2000
|
||||
var $uniqueOrderBy = true;
|
||||
var $_bindInputArray = true;
|
||||
var $_dropSeqSQL = "drop table %s";
|
||||
|
||||
function ADODB_mssqlnative()
|
||||
{
|
||||
if ($this->debug) {
|
||||
error_log("<pre>");
|
||||
sqlsrv_set_error_handling( SQLSRV_ERRORS_LOG_ALL );
|
||||
sqlsrv_log_set_severity( SQLSRV_LOG_SEVERITY_ALL );
|
||||
sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
|
||||
sqlsrv_configure('warnings_return_as_errors', 0);
|
||||
} else {
|
||||
sqlsrv_set_error_handling(0);
|
||||
sqlsrv_log_set_severity(0);
|
||||
sqlsrv_log_set_subsystems(SQLSRV_LOG_SYSTEM_ALL);
|
||||
sqlsrv_configure('warnings_return_as_errors', 0);
|
||||
}
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
if ($this->fetchMode === false) {
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
} else
|
||||
$savem = $this->SetFetchMode(ADODB_FETCH_NUM);
|
||||
$arrServerInfo = sqlsrv_server_info($this->_connectionID);
|
||||
$arr['description'] = $arrServerInfo['SQLServerName'].' connected to '.$arrServerInfo['CurrentDatabase'];
|
||||
$arr['version'] = $arrServerInfo['SQLServerVersion'];//ADOConnection::_findvers($arr['description']);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " ISNULL($field, $ifNull) "; // if MS SQL Server
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
// SCOPE_IDENTITY()
|
||||
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||
// function, or batch. Thus, two statements are in the same scope if
|
||||
// they are in the same stored procedure, function, or batch.
|
||||
return $this->GetOne($this->identitySQL);
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return @sqlsrv_rows_affected($this->_queryID);
|
||||
}
|
||||
|
||||
function CreateSequence($seq='adodbseq',$start=1)
|
||||
{
|
||||
if($this->debug) error_log("<hr>CreateSequence($seq,$start)");
|
||||
sqlsrv_begin_transaction($this->_connectionID);
|
||||
$start -= 1;
|
||||
$this->Execute("create table $seq (id int)");//was float(53)
|
||||
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||
if (!$ok) {
|
||||
if($this->debug) error_log("<hr>Error: ROLLBACK");
|
||||
sqlsrv_rollback($this->_connectionID);
|
||||
return false;
|
||||
}
|
||||
sqlsrv_commit($this->_connectionID);
|
||||
return true;
|
||||
}
|
||||
|
||||
function GenID($seq='adodbseq',$start=1)
|
||||
{
|
||||
if($this->debug) error_log("<hr>GenID($seq,$start)");
|
||||
sqlsrv_begin_transaction($this->_connectionID);
|
||||
$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");
|
||||
if (!$ok) {
|
||||
$this->Execute("create table $seq (id int)");
|
||||
$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");
|
||||
if (!$ok) {
|
||||
if($this->debug) error_log("<hr>Error: ROLLBACK");
|
||||
sqlsrv_rollback($this->_connectionID);
|
||||
return false;
|
||||
}
|
||||
sqlsrv_commit($this->_connectionID);
|
||||
return $start;
|
||||
}
|
||||
$num = $this->GetOne("select id from $seq");
|
||||
sqlsrv_commit($this->_connectionID);
|
||||
if($this->debug) error_log(" Returning: $num");
|
||||
return $num;
|
||||
}
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
if (!$col) $col = $this->sysTimeStamp;
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= '+';
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= "datename(yyyy,$col)";
|
||||
break;
|
||||
case 'M':
|
||||
$s .= "convert(char(3),$col,0)";
|
||||
break;
|
||||
case 'm':
|
||||
$s .= "replace(str(month($col),2),' ','0')";
|
||||
break;
|
||||
case 'Q':
|
||||
case 'q':
|
||||
$s .= "datename(quarter,$col)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= "replace(str(day($col),2),' ','0')";
|
||||
break;
|
||||
case 'h':
|
||||
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
|
||||
break;
|
||||
case 's':
|
||||
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
|
||||
break;
|
||||
case 'a':
|
||||
case 'A':
|
||||
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||
break;
|
||||
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
if ($this->debug) error_log('<hr>begin transaction');
|
||||
sqlsrv_begin_transaction($this->_connectionID);
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->debug) error_log('<hr>commit transaction');
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
sqlsrv_commit($this->_connectionID);
|
||||
return true;
|
||||
}
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->debug) error_log('<hr>rollback transaction');
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
sqlsrv_rollback($this->_connectionID);
|
||||
return true;
|
||||
}
|
||||
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
/*
|
||||
Usage:
|
||||
|
||||
$this->BeginTrans();
|
||||
$this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables
|
||||
|
||||
# some operation on both tables table1 and table2
|
||||
|
||||
$this->CommitTrans();
|
||||
|
||||
See http://www.swynk.com/friends/achigrik/SQL70Locks.asp
|
||||
*/
|
||||
function RowLock($tables,$where,$col='1 as adodbignore')
|
||||
{
|
||||
if ($col == '1 as adodbignore') $col = 'top 1 null as ignore';
|
||||
if (!$this->transCnt) $this->BeginTrans();
|
||||
return $this->GetOne("select $col from $tables with (ROWLOCK,HOLDLOCK) where $where");
|
||||
}
|
||||
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
$this->database = $dbName;
|
||||
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||
if ($this->_connectionID) {
|
||||
$rs = $this->Execute('USE '.$dbName);
|
||||
if($rs) {
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
$retErrors = sqlsrv_errors(SQLSRV_ERR_ALL);
|
||||
if($retErrors != null) {
|
||||
foreach($retErrors as $arrError) {
|
||||
$this->_errorMsg .= "SQLState: ".$arrError[ 'SQLSTATE']."\n";
|
||||
$this->_errorMsg .= "Error Code: ".$arrError[ 'code']."\n";
|
||||
$this->_errorMsg .= "Message: ".$arrError[ 'message']."\n";
|
||||
}
|
||||
} else {
|
||||
$this->_errorMsg = "No errors found";
|
||||
}
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode;
|
||||
$err = sqlsrv_errors(SQLSRV_ERR_ALL);
|
||||
if($err[0]) return $err[0]['code'];
|
||||
else return -1;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!function_exists('sqlsrv_connect')) return null;
|
||||
$connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword);
|
||||
if ($this->debug) error_log("<hr>connecting... hostname: $argHostname params: ".var_export($connectionInfo,true));
|
||||
//if ($this->debug) error_log("<hr>_connectionID before: ".serialize($this->_connectionID));
|
||||
if(!($this->_connectionID = sqlsrv_connect($argHostname,$connectionInfo))) {
|
||||
if ($this->debug) error_log( "<hr><b>errors</b>: ".print_r( sqlsrv_errors(), true));
|
||||
return false;
|
||||
}
|
||||
//if ($this->debug) error_log(" _connectionID after: ".serialize($this->_connectionID));
|
||||
//if ($this->debug) error_log("<hr>defined functions: <pre>".var_export(get_defined_functions(),true)."</pre>");
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
//return null;//not implemented. NOTE: Persistent connections have no effect if PHP is used as a CGI program. (FastCGI!)
|
||||
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
|
||||
}
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
$stmt = sqlsrv_prepare( $this->_connectionID, $sql);
|
||||
if (!$stmt) return $sql;
|
||||
return array($sql,$stmt);
|
||||
}
|
||||
|
||||
// returns concatenated string
|
||||
// MSSQL requires integers to be cast as strings
|
||||
// automatically cast every datatype to VARCHAR(255)
|
||||
// @author David Rogers (introspectshun)
|
||||
function Concat()
|
||||
{
|
||||
$s = "";
|
||||
$arr = func_get_args();
|
||||
|
||||
// Split single record on commas, if possible
|
||||
if (sizeof($arr) == 1) {
|
||||
foreach ($arr as $arg) {
|
||||
$args = explode(',', $arg);
|
||||
}
|
||||
$arr = $args;
|
||||
}
|
||||
|
||||
array_walk($arr, create_function('&$v', '$v = "CAST(" . $v . " AS VARCHAR(255))";'));
|
||||
$s = implode('+',$arr);
|
||||
if (sizeof($arr) > 0) return "$s";
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/*
|
||||
Unfortunately, it appears that mssql cannot handle varbinary > 255 chars
|
||||
So all your blobs must be of type "image".
|
||||
|
||||
Remember to set in php.ini the following...
|
||||
|
||||
; Valid range 0 - 2147483647. Default = 4096.
|
||||
mssql.textlimit = 0 ; zero to pass through
|
||||
|
||||
; Valid range 0 - 2147483647. Default = 4096.
|
||||
mssql.textsize = 0 ; zero to pass through
|
||||
*/
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
|
||||
if (strtoupper($blobtype) == 'CLOB') {
|
||||
$sql = "UPDATE $table SET $column='" . $val . "' WHERE $where";
|
||||
return $this->Execute($sql) != false;
|
||||
}
|
||||
$sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where";
|
||||
return $this->Execute($sql) != false;
|
||||
}
|
||||
|
||||
// returns query ID if successful, otherwise false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
$this->_errorMsg = false;
|
||||
if (is_array($inputarr)) {
|
||||
$rez = sqlsrv_query($this->_connectionID,$sql,$inputarr);
|
||||
} else if (is_array($sql)) {
|
||||
$rez = sqlsrv_query($this->_connectionID,$sql[1],$inputarr);
|
||||
} else {
|
||||
$rez = sqlsrv_query($this->_connectionID,$sql);
|
||||
}
|
||||
if ($this->debug) error_log("<hr>running query: ".var_export($sql,true)."<hr>input array: ".var_export($inputarr,true)."<hr>result: ".var_export($rez,true));//"<hr>connection: ".serialize($this->_connectionID)
|
||||
//fix for returning true on anything besides select statements
|
||||
if (is_array($sql)) $sql = $sql[1];
|
||||
$sql = ltrim($sql);
|
||||
if(stripos($sql, 'SELECT') !== 0 && $rez !== false) {
|
||||
if ($this->debug) error_log(" isn't a select query, returning boolean true");
|
||||
return true;
|
||||
}
|
||||
//end fix
|
||||
if(!$rez) $rez = false;
|
||||
return $rez;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
if ($this->transCnt) $this->RollbackTrans();
|
||||
$rez = @sqlsrv_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
return $rez;
|
||||
}
|
||||
|
||||
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||
static function UnixDate($v)
|
||||
{
|
||||
return ADORecordSet_array_mssql::UnixDate($v);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
return ADORecordSet_array_mssql::UnixTimeStamp($v);
|
||||
}
|
||||
|
||||
function &MetaIndexes($table,$primary=false)
|
||||
{
|
||||
$table = $this->qstr($table);
|
||||
|
||||
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
|
||||
ORDER BY O.name, I.Name, K.keyno";
|
||||
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!is_object($rs)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$indexes = array();
|
||||
while ($row = $rs->FetchRow()) {
|
||||
if (!$primary && $row[5]) continue;
|
||||
|
||||
$indexes[$row[0]]['unique'] = $row[6];
|
||||
$indexes[$row[0]]['columns'][] = $row[1];
|
||||
}
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$table = $this->qstr(strtoupper($table));
|
||||
|
||||
$sql =
|
||||
"select object_name(constid) as constraint_name,
|
||||
col_name(fkeyid, fkey) as column_name,
|
||||
object_name(rkeyid) as referenced_table_name,
|
||||
col_name(rkeyid, rkey) as referenced_column_name
|
||||
from sysforeignkeys
|
||||
where upper(object_name(fkeyid)) = $table
|
||||
order by constraint_name, referenced_table_name, keyno";
|
||||
|
||||
$constraints =& $this->GetArray($sql);
|
||||
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
$arr = false;
|
||||
foreach($constraints as $constr) {
|
||||
//print_r($constr);
|
||||
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
|
||||
}
|
||||
if (!$arr) return false;
|
||||
|
||||
$arr2 = false;
|
||||
|
||||
foreach($arr as $k => $v) {
|
||||
foreach($v as $a => $b) {
|
||||
if ($upper) $a = strtoupper($a);
|
||||
$arr2[$a] = $b;
|
||||
}
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
//From: Fernando Moreira <FMoreira@imediata.pt>
|
||||
function MetaDatabases()
|
||||
{
|
||||
$this->SelectDB("master");
|
||||
$rs =& $this->Execute($this->metaDatabasesSQL);
|
||||
$rows = $rs->GetRows();
|
||||
$ret = array();
|
||||
for($i=0;$i<count($rows);$i++) {
|
||||
$ret[] = $rows[$i][0];
|
||||
}
|
||||
$this->SelectDB($this->database);
|
||||
if($ret)
|
||||
return $ret;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
// "Stein-Aksel Basma" <basma@accelero.no>
|
||||
// tested with MSSQL 2000
|
||||
function &MetaPrimaryKeys($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
if (!$schema) $schema = $this->database;
|
||||
if ($schema) $schema = "and k.table_catalog like '$schema%'";
|
||||
|
||||
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
|
||||
information_schema.table_constraints tc
|
||||
where tc.constraint_name = k.constraint_name and tc.constraint_type =
|
||||
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$a = $this->GetCol($sql);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if ($a && sizeof($a)>0) return $a;
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
|
||||
function &MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
if ($mask) {
|
||||
$save = $this->metaTablesSQL;
|
||||
$mask = $this->qstr(($mask));
|
||||
$this->metaTablesSQL .= " AND name like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
if ($mask) {
|
||||
$this->metaTablesSQL = $save;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_mssqlnative extends ADORecordSet {
|
||||
|
||||
var $databaseType = "mssqlnative";
|
||||
var $canSeek = false;
|
||||
var $fieldOffset = 0;
|
||||
// _mths works only in non-localised system
|
||||
|
||||
function ADORecordset_mssqlnative($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
return $this->ADORecordSet($id,$mode);
|
||||
}
|
||||
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
if ($this->connection->debug) error_log("(before) ADODB_COUNTRECS: {$ADODB_COUNTRECS} _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}");
|
||||
/*$retRowsAff = sqlsrv_rows_affected($this->_queryID);//"If you need to determine the number of rows a query will return before retrieving the actual results, appending a SELECT COUNT ... query would let you get that information, and then a call to next_result would move you to the "real" results."
|
||||
error_log("rowsaff: ".serialize($retRowsAff));
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS)? $retRowsAff:-1;*/
|
||||
$this->_numOfRows = -1;//not supported
|
||||
$fieldmeta = sqlsrv_field_metadata($this->_queryID);
|
||||
$this->_numOfFields = ($fieldmeta)? count($fieldmeta):-1;
|
||||
if ($this->connection->debug) error_log("(after) _numOfRows: {$this->_numOfRows} _numOfFields: {$this->_numOfFields}");
|
||||
}
|
||||
|
||||
|
||||
//Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se>
|
||||
// get next resultset - requires PHP 4.0.5 or later
|
||||
function NextRecordSet()
|
||||
{
|
||||
if (!sqlsrv_next_result($this->_queryID)) return false;
|
||||
$this->_inited = false;
|
||||
$this->bind = false;
|
||||
$this->_currentRow = -1;
|
||||
$this->Init();
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode != ADODB_FETCH_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)]];
|
||||
}
|
||||
|
||||
/* Returns: an object containing field information.
|
||||
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||
fetchField() is retrieved. */
|
||||
|
||||
function &FetchField($fieldOffset = -1)
|
||||
{
|
||||
$_typeConversion = array(
|
||||
-155 => 'datetimeoffset',
|
||||
-154 => 'time',
|
||||
-152 => 'xml',
|
||||
-151 => 'udt',
|
||||
-11 => 'uniqueidentifier',
|
||||
-10 => 'ntext',
|
||||
-9 => 'nvarchar',
|
||||
-8 => 'nchar',
|
||||
-7 => 'bit',
|
||||
-6 => 'tinyint',
|
||||
-5 => 'bigint',
|
||||
-4 => 'image',
|
||||
-3 => 'varbinary',
|
||||
-2 => 'timestamp',
|
||||
-1 => 'text',
|
||||
1 => 'char',
|
||||
2 => 'numeric',
|
||||
3 => 'decimal',
|
||||
4 => 'int',
|
||||
5 => 'smallint',
|
||||
6 => 'float',
|
||||
7 => 'real',
|
||||
12 => 'varchar',
|
||||
91 => 'date',
|
||||
93 => 'datetime'
|
||||
);
|
||||
|
||||
$fa = @sqlsrv_field_metadata($this->_queryID);
|
||||
if ($fieldOffset != -1) {
|
||||
$fa = $fa[$fieldOffset];
|
||||
}
|
||||
$false = false;
|
||||
if (empty($fa)) {
|
||||
$f = false;//PHP Notice: Only variable references should be returned by reference
|
||||
}
|
||||
else
|
||||
{
|
||||
// Convert to an object
|
||||
$fa = array_change_key_case($fa, CASE_LOWER);
|
||||
$fb = array();
|
||||
if ($fieldOffset != -1)
|
||||
{
|
||||
$fb = array(
|
||||
'name' => $fa['name'],
|
||||
'max_length' => $fa['size'],
|
||||
'column_source' => $fa['name'],
|
||||
'type' => $_typeConversion[$fa['type']]
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($fa as $key => $value)
|
||||
{
|
||||
$fb[] = array(
|
||||
'name' => $value['name'],
|
||||
'max_length' => $value['size'],
|
||||
'column_source' => $value['name'],
|
||||
'type' => $_typeConversion[$value['type']]
|
||||
);
|
||||
}
|
||||
}
|
||||
$f = (object) $fb;
|
||||
}
|
||||
return $f;
|
||||
}
|
||||
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;//There is no support for cursors in the driver at this time. All data is returned via forward-only streams.
|
||||
}
|
||||
|
||||
// speedup
|
||||
function MoveNext()
|
||||
{
|
||||
if ($this->connection->debug) error_log("movenext()");
|
||||
//if ($this->connection->debug) error_log("eof (beginning): ".$this->EOF);
|
||||
if ($this->EOF) return false;
|
||||
|
||||
$this->_currentRow++;
|
||||
if ($this->connection->debug) error_log("_currentRow: ".$this->_currentRow);
|
||||
|
||||
if ($this->_fetch()) return true;
|
||||
$this->EOF = true;
|
||||
//if ($this->connection->debug) error_log("eof (end): ".$this->EOF);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// INSERT UPDATE DELETE returns false even if no error occurs in 4.0.4
|
||||
// also the date format has been changed from YYYY-mm-dd to dd MMM YYYY in 4.0.4. Idiot!
|
||||
function _fetch($ignore_fields=false)
|
||||
{
|
||||
if ($this->connection->debug) error_log("_fetch()");
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
if ($this->fetchMode & ADODB_FETCH_NUM) {
|
||||
if ($this->connection->debug) error_log("fetch mode: both");
|
||||
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_BOTH);
|
||||
} else {
|
||||
if ($this->connection->debug) error_log("fetch mode: assoc");
|
||||
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_ASSOC);
|
||||
}
|
||||
|
||||
if (ADODB_ASSOC_CASE == 0) {
|
||||
foreach($this->fields as $k=>$v) {
|
||||
$this->fields[strtolower($k)] = $v;
|
||||
}
|
||||
} else if (ADODB_ASSOC_CASE == 1) {
|
||||
foreach($this->fields as $k=>$v) {
|
||||
$this->fields[strtoupper($k)] = $v;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($this->connection->debug) error_log("fetch mode: num");
|
||||
$this->fields = @sqlsrv_fetch_array($this->_queryID,SQLSRV_FETCH_NUMERIC);
|
||||
}
|
||||
if(is_array($this->fields) && array_key_exists(1,$this->fields) && !array_key_exists(0,$this->fields)) {//fix fetch numeric keys since they're not 0 based
|
||||
$arrFixed = array();
|
||||
foreach($this->fields as $key=>$value) {
|
||||
if(is_numeric($key)) {
|
||||
$arrFixed[$key-1] = $value;
|
||||
} else {
|
||||
$arrFixed[$key] = $value;
|
||||
}
|
||||
}
|
||||
//if($this->connection->debug) error_log("<hr>fixing non 0 based return array, old: ".print_r($this->fields,true)." new: ".print_r($arrFixed,true));
|
||||
$this->fields = $arrFixed;
|
||||
}
|
||||
if(is_array($this->fields)) {
|
||||
foreach($this->fields as $key=>$value) {
|
||||
if (is_object($value) && method_exists($value, 'format')) {//is DateTime object
|
||||
$this->fields[$key] = $value->format("Y-m-d H:i:s");
|
||||
}
|
||||
}
|
||||
}
|
||||
if($this->fields === null) $this->fields = false;
|
||||
if ($this->connection->debug) error_log("<hr>after _fetch, fields: <pre>".print_r($this->fields,true)." backtrace: ".adodb_backtrace(false));
|
||||
return $this->fields;
|
||||
}
|
||||
|
||||
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||
function _close()
|
||||
{
|
||||
$rez = sqlsrv_free_stmt($this->_queryID);
|
||||
$this->_queryID = false;
|
||||
return $rez;
|
||||
}
|
||||
|
||||
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||
static function UnixDate($v)
|
||||
{
|
||||
return ADORecordSet_array_mssqlnative::UnixDate($v);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
return ADORecordSet_array_mssqlnative::UnixTimeStamp($v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ADORecordSet_array_mssqlnative extends ADORecordSet_array {
|
||||
function ADORecordSet_array_mssqlnative($id=-1,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_array($id,$mode);
|
||||
}
|
||||
|
||||
// mssql uses a default date like Dec 30 2000 12:00AM
|
||||
static function UnixDate($v)
|
||||
{
|
||||
|
||||
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixDate($v);
|
||||
|
||||
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
|
||||
|
||||
//Dec 30 2000 12:00AM
|
||||
if ($ADODB_mssql_date_order == 'dmy') {
|
||||
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
|
||||
return parent::UnixDate($v);
|
||||
}
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$theday = $rr[1];
|
||||
$themth = substr(strtoupper($rr[2]),0,3);
|
||||
} else {
|
||||
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})|" ,$v, $rr)) {
|
||||
return parent::UnixDate($v);
|
||||
}
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$theday = $rr[2];
|
||||
$themth = substr(strtoupper($rr[1]),0,3);
|
||||
}
|
||||
$themth = $ADODB_mssql_mths[$themth];
|
||||
if ($themth <= 0) return false;
|
||||
// h-m-s-MM-DD-YY
|
||||
return mktime(0,0,0,$themth,$theday,$rr[3]);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
|
||||
if (is_numeric(substr($v,0,1)) && ADODB_PHPVER >= 0x4200) return parent::UnixTimeStamp($v);
|
||||
|
||||
global $ADODB_mssql_mths,$ADODB_mssql_date_order;
|
||||
|
||||
//Dec 30 2000 12:00AM
|
||||
if ($ADODB_mssql_date_order == 'dmy') {
|
||||
if (!preg_match( "|^([0-9]{1,2})[-/\. ]+([A-Za-z]{3})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
|
||||
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$theday = $rr[1];
|
||||
$themth = substr(strtoupper($rr[2]),0,3);
|
||||
} else {
|
||||
if (!preg_match( "|^([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})|"
|
||||
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$theday = $rr[2];
|
||||
$themth = substr(strtoupper($rr[1]),0,3);
|
||||
}
|
||||
|
||||
$themth = $ADODB_mssql_mths[$themth];
|
||||
if ($themth <= 0) return false;
|
||||
|
||||
switch (strtoupper($rr[6])) {
|
||||
case 'P':
|
||||
if ($rr[4]<12) $rr[4] += 12;
|
||||
break;
|
||||
case 'A':
|
||||
if ($rr[4]==12) $rr[4] = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// h-m-s-MM-DD-YY
|
||||
return mktime($rr[4],$rr[5],0,$themth,$theday,$rr[3]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Code Example 1:
|
||||
|
||||
select object_name(constid) as constraint_name,
|
||||
object_name(fkeyid) as table_name,
|
||||
col_name(fkeyid, fkey) as column_name,
|
||||
object_name(rkeyid) as referenced_table_name,
|
||||
col_name(rkeyid, rkey) as referenced_column_name
|
||||
from sysforeignkeys
|
||||
where object_name(fkeyid) = x
|
||||
order by constraint_name, table_name, referenced_table_name, keyno
|
||||
|
||||
Code Example 2:
|
||||
select constraint_name,
|
||||
column_name,
|
||||
ordinal_position
|
||||
from information_schema.key_column_usage
|
||||
where constraint_catalog = db_name()
|
||||
and table_name = x
|
||||
order by constraint_name, ordinal_position
|
||||
|
||||
http://www.databasejournal.com/scripts/article.php/1440551
|
||||
*/
|
||||
|
||||
?>
|
||||
@@ -1,62 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
* Portable MSSQL Driver that supports || instead of +
|
||||
*
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
|
||||
/*
|
||||
The big difference between mssqlpo and it's parent mssql is that mssqlpo supports
|
||||
the more standard || string concatenation operator.
|
||||
*/
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-mssql.inc.php');
|
||||
|
||||
class ADODB_mssqlpo extends ADODB_mssql {
|
||||
var $databaseType = "mssqlpo";
|
||||
var $concat_operator = '||';
|
||||
|
||||
function ADODB_mssqlpo()
|
||||
{
|
||||
ADODB_mssql::ADODB_mssql();
|
||||
}
|
||||
|
||||
function PrepareSP($sql)
|
||||
{
|
||||
if (!$this->_has_mssql_init) {
|
||||
ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
|
||||
return $sql;
|
||||
}
|
||||
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||
$stmt = mssql_init($sql,$this->_connectionID);
|
||||
if (!$stmt) return $sql;
|
||||
return array($sql,$stmt);
|
||||
}
|
||||
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||
return ADODB_mssql::_query($sql,$inputarr);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordset_mssqlpo extends ADORecordset_mssql {
|
||||
var $databaseType = "mssqlpo";
|
||||
function ADORecordset_mssqlpo($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_mssql($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,794 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
MySQL code that does not support transactions. Use mysqlt if you need transactions.
|
||||
Requires mysql client. Works on Windows and Unix.
|
||||
|
||||
28 Feb 2001: MetaColumns bug fix - suggested by Freek Dijkstra (phpeverywhere@macfreek.com)
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (! defined("_ADODB_MYSQL_LAYER")) {
|
||||
define("_ADODB_MYSQL_LAYER", 1 );
|
||||
|
||||
class ADODB_mysql extends ADOConnection {
|
||||
var $databaseType = 'mysql';
|
||||
var $dataProvider = 'mysql';
|
||||
var $hasInsertID = true;
|
||||
var $hasAffectedRows = true;
|
||||
var $metaTablesSQL = "SHOW TABLES";
|
||||
var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $hasLimit = true;
|
||||
var $hasMoveFirst = true;
|
||||
var $hasGenID = true;
|
||||
var $isoDates = true; // accepts dates in ISO format
|
||||
var $sysDate = 'CURDATE()';
|
||||
var $sysTimeStamp = 'NOW()';
|
||||
var $hasTransactions = false;
|
||||
var $forceNewConnect = false;
|
||||
var $poorAffectedRows = true;
|
||||
var $clientFlags = 0;
|
||||
var $substr = "substring";
|
||||
var $nameQuote = '`'; /// string to use to quote identifiers and names
|
||||
var $compat323 = false; // true if compat with mysql 3.23
|
||||
|
||||
function ADODB_mysql()
|
||||
{
|
||||
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " IFNULL($field, $ifNull) "; // if MySQL
|
||||
}
|
||||
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
$save = $this->metaTablesSQL;
|
||||
if ($showSchema && is_string($showSchema)) {
|
||||
$this->metaTablesSQL .= " from $showSchema";
|
||||
}
|
||||
|
||||
if ($mask) {
|
||||
$mask = $this->qstr($mask);
|
||||
$this->metaTablesSQL .= " like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
$this->metaTablesSQL = $save;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
function MetaIndexes ($table, $primary = FALSE, $owner=false)
|
||||
{
|
||||
// save old fetch mode
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
|
||||
// get index details
|
||||
$rs = $this->Execute(sprintf('SHOW INDEX FROM %s',$table));
|
||||
|
||||
// restore fetchmode
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!is_object($rs)) {
|
||||
return $false;
|
||||
}
|
||||
|
||||
$indexes = array ();
|
||||
|
||||
// parse index data into array
|
||||
while ($row = $rs->FetchRow()) {
|
||||
if ($primary == FALSE AND $row[2] == 'PRIMARY') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($indexes[$row[2]])) {
|
||||
$indexes[$row[2]] = array(
|
||||
'unique' => ($row[1] == 0),
|
||||
'columns' => array()
|
||||
);
|
||||
}
|
||||
|
||||
$indexes[$row[2]]['columns'][$row[3] - 1] = $row[4];
|
||||
}
|
||||
|
||||
// sort columns by order in the index
|
||||
foreach ( array_keys ($indexes) as $index )
|
||||
{
|
||||
ksort ($indexes[$index]['columns']);
|
||||
}
|
||||
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
|
||||
// if magic quotes disabled, use mysql_real_escape_string()
|
||||
function qstr($s,$magic_quotes=false)
|
||||
{
|
||||
if (is_null($s)) return 'NULL';
|
||||
if (!$magic_quotes) {
|
||||
|
||||
if (ADODB_PHPVER >= 0x4300) {
|
||||
if (is_resource($this->_connectionID))
|
||||
return "'".mysql_real_escape_string($s,$this->_connectionID)."'";
|
||||
}
|
||||
if ($this->replaceQuote[0] == '\\'){
|
||||
$s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
|
||||
}
|
||||
return "'".str_replace("'",$this->replaceQuote,$s)."'";
|
||||
}
|
||||
|
||||
// undo magic quotes for "
|
||||
$s = str_replace('\\"','"',$s);
|
||||
return "'$s'";
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return ADOConnection::GetOne('SELECT LAST_INSERT_ID()');
|
||||
//return mysql_insert_id($this->_connectionID);
|
||||
}
|
||||
|
||||
function GetOne($sql,$inputarr=false)
|
||||
{
|
||||
if ($this->compat323 == false && strncasecmp($sql,'sele',4) == 0) {
|
||||
$rs = $this->SelectLimit($sql,1,-1,$inputarr);
|
||||
if ($rs) {
|
||||
$rs->Close();
|
||||
if ($rs->EOF) return null;
|
||||
return reset($rs->fields);
|
||||
}
|
||||
} else {
|
||||
return ADOConnection::GetOne($sql,$inputarr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return mysql_affected_rows($this->_connectionID);
|
||||
}
|
||||
|
||||
// See http://www.mysql.com/doc/M/i/Miscellaneous_functions.html
|
||||
// Reference on Last_Insert_ID on the recommended way to simulate sequences
|
||||
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
|
||||
var $_genSeqSQL = "create table %s (id int not null)";
|
||||
var $_genSeqCountSQL = "select count(*) from %s";
|
||||
var $_genSeq2SQL = "insert into %s values (%s)";
|
||||
var $_dropSeqSQL = "drop table %s";
|
||||
|
||||
function CreateSequence($seqname='adodbseq',$startID=1)
|
||||
{
|
||||
if (empty($this->_genSeqSQL)) return false;
|
||||
$u = strtoupper($seqname);
|
||||
|
||||
$ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||
if (!$ok) return false;
|
||||
return $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
|
||||
}
|
||||
|
||||
|
||||
function GenID($seqname='adodbseq',$startID=1)
|
||||
{
|
||||
// post-nuke sets hasGenID to false
|
||||
if (!$this->hasGenID) return false;
|
||||
|
||||
$savelog = $this->_logsql;
|
||||
$this->_logsql = false;
|
||||
$getnext = sprintf($this->_genIDSQL,$seqname);
|
||||
$holdtransOK = $this->_transOK; // save the current status
|
||||
$rs = @$this->Execute($getnext);
|
||||
if (!$rs) {
|
||||
if ($holdtransOK) $this->_transOK = true; //if the status was ok before reset
|
||||
$u = strtoupper($seqname);
|
||||
$this->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||
$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seqname));
|
||||
if (!$cnt) $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
|
||||
$rs = $this->Execute($getnext);
|
||||
}
|
||||
|
||||
if ($rs) {
|
||||
$this->genID = mysql_insert_id($this->_connectionID);
|
||||
$rs->Close();
|
||||
} else
|
||||
$this->genID = 0;
|
||||
|
||||
$this->_logsql = $savelog;
|
||||
return $this->genID;
|
||||
}
|
||||
|
||||
function MetaDatabases()
|
||||
{
|
||||
$qid = mysql_list_dbs($this->_connectionID);
|
||||
$arr = array();
|
||||
$i = 0;
|
||||
$max = mysql_num_rows($qid);
|
||||
while ($i < $max) {
|
||||
$db = mysql_tablename($qid,$i);
|
||||
if ($db != 'mysql') $arr[] = $db;
|
||||
$i += 1;
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
if (!$col) $col = $this->sysTimeStamp;
|
||||
$s = 'DATE_FORMAT('.$col.",'";
|
||||
$concat = false;
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
/** FALL THROUGH */
|
||||
case '-':
|
||||
case '/':
|
||||
$s .= $ch;
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= '%Y';
|
||||
break;
|
||||
case 'M':
|
||||
$s .= '%b';
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
$s .= '%m';
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= '%d';
|
||||
break;
|
||||
|
||||
case 'Q':
|
||||
case 'q':
|
||||
$s .= "'),Quarter($col)";
|
||||
|
||||
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
|
||||
else $s .= ",('";
|
||||
$concat = true;
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
$s .= '%H';
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
$s .= '%I';
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
$s .= '%i';
|
||||
break;
|
||||
|
||||
case 's':
|
||||
$s .= '%s';
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
case 'A':
|
||||
$s .= '%p';
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
$s .= '%w';
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
$s .= '%U';
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
$s .= '%W';
|
||||
break;
|
||||
}
|
||||
}
|
||||
$s.="')";
|
||||
if ($concat) $s = "CONCAT($s)";
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
// returns concatenated string
|
||||
// much easier to run "mysqld --ansi" or "mysqld --sql-mode=PIPES_AS_CONCAT" and use || operator
|
||||
function Concat()
|
||||
{
|
||||
$s = "";
|
||||
$arr = func_get_args();
|
||||
|
||||
// suggestion by andrew005@mnogo.ru
|
||||
$s = implode(',',$arr);
|
||||
if (strlen($s) > 0) return "CONCAT($s)";
|
||||
else return '';
|
||||
}
|
||||
|
||||
function OffsetDate($dayFraction,$date=false)
|
||||
{
|
||||
if (!$date) $date = $this->sysDate;
|
||||
|
||||
$fraction = $dayFraction * 24 * 3600;
|
||||
return '('. $date . ' + INTERVAL ' . $fraction.' SECOND)';
|
||||
|
||||
// return "from_unixtime(unix_timestamp($date)+$fraction)";
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!empty($this->port)) $argHostname .= ":".$this->port;
|
||||
|
||||
if (ADODB_PHPVER >= 0x4300)
|
||||
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
|
||||
$this->forceNewConnect,$this->clientFlags);
|
||||
else if (ADODB_PHPVER >= 0x4200)
|
||||
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword,
|
||||
$this->forceNewConnect);
|
||||
else
|
||||
$this->_connectionID = mysql_connect($argHostname,$argUsername,$argPassword);
|
||||
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!empty($this->port)) $argHostname .= ":".$this->port;
|
||||
|
||||
if (ADODB_PHPVER >= 0x4300)
|
||||
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
|
||||
else
|
||||
$this->_connectionID = mysql_pconnect($argHostname,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($this->autoRollback) $this->RollbackTrans();
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
$this->forceNewConnect = true;
|
||||
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
$this->_findschema($table,$schema);
|
||||
if ($schema) {
|
||||
$dbName = $this->database;
|
||||
$this->SelectDB($schema);
|
||||
}
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||
|
||||
if ($schema) {
|
||||
$this->SelectDB($dbName);
|
||||
}
|
||||
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
if (!is_object($rs)) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF){
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$type = $rs->fields[1];
|
||||
|
||||
// split type into type(length):
|
||||
$fld->scale = null;
|
||||
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
|
||||
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$arr = explode(",",$query_array[2]);
|
||||
$fld->enums = $arr;
|
||||
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
|
||||
$fld->max_length = ($zlen > 0) ? $zlen : 1;
|
||||
} else {
|
||||
$fld->type = $type;
|
||||
$fld->max_length = -1;
|
||||
}
|
||||
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||
$fld->binary = (strpos($type,'blob') !== false || strpos($type,'binary') !== false);
|
||||
$fld->unsigned = (strpos($type,'unsigned') !== false);
|
||||
$fld->zerofill = (strpos($type,'zerofill') !== false);
|
||||
|
||||
if (!$fld->binary) {
|
||||
$d = $rs->fields[4];
|
||||
if ($d != '' && $d != 'NULL') {
|
||||
$fld->has_default = true;
|
||||
$fld->default_value = $d;
|
||||
} else {
|
||||
$fld->has_default = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($save == ADODB_FETCH_NUM) {
|
||||
$retarr[] = $fld;
|
||||
} else {
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
$this->database = $dbName;
|
||||
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||
if ($this->_connectionID) {
|
||||
return @mysql_select_db($dbName,$this->_connectionID);
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
// parameters use PostgreSQL convention, not MySQL
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
|
||||
{
|
||||
$offsetStr =($offset>=0) ? ((integer)$offset)."," : '';
|
||||
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
|
||||
if ($nrows < 0) $nrows = '18446744073709551615';
|
||||
|
||||
if ($secs)
|
||||
$rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
|
||||
else
|
||||
$rs = $this->Execute($sql." LIMIT $offsetStr".((integer)$nrows),$inputarr);
|
||||
return $rs;
|
||||
}
|
||||
|
||||
// returns queryID or false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
//global $ADODB_COUNTRECS;
|
||||
//if($ADODB_COUNTRECS)
|
||||
return mysql_query($sql,$this->_connectionID);
|
||||
//else return @mysql_unbuffered_query($sql,$this->_connectionID); // requires PHP >= 4.0.6
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation */
|
||||
function ErrorMsg()
|
||||
{
|
||||
|
||||
if ($this->_logsql) return $this->_errorMsg;
|
||||
if (empty($this->_connectionID)) $this->_errorMsg = @mysql_error();
|
||||
else $this->_errorMsg = @mysql_error($this->_connectionID);
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
/* Returns: the last error number from previous database operation */
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_logsql) return $this->_errorCode;
|
||||
if (empty($this->_connectionID)) return @mysql_errno();
|
||||
else return @mysql_errno($this->_connectionID);
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
@mysql_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Maximum size of C field
|
||||
*/
|
||||
function CharMax()
|
||||
{
|
||||
return 255;
|
||||
}
|
||||
|
||||
/*
|
||||
* Maximum size of X field
|
||||
*/
|
||||
function TextMax()
|
||||
{
|
||||
return 4294967295;
|
||||
}
|
||||
|
||||
// "Innox - Juan Carlos Gonzalez" <jgonzalez#innox.com.mx>
|
||||
function MetaForeignKeys( $table, $owner = FALSE, $upper = FALSE, $associative = FALSE )
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_ASSOC || $this->fetchMode == ADODB_FETCH_ASSOC) $associative = true;
|
||||
|
||||
if ( !empty($owner) ) {
|
||||
$table = "$owner.$table";
|
||||
}
|
||||
$a_create_table = $this->getRow(sprintf('SHOW CREATE TABLE %s', $table));
|
||||
if ($associative) {
|
||||
$create_sql = isset($a_create_table["Create Table"]) ? $a_create_table["Create Table"] : $a_create_table["Create View"];
|
||||
} else $create_sql = $a_create_table[1];
|
||||
|
||||
$matches = array();
|
||||
|
||||
if (!preg_match_all("/FOREIGN KEY \(`(.*?)`\) REFERENCES `(.*?)` \(`(.*?)`\)/", $create_sql, $matches)) return false;
|
||||
$foreign_keys = array();
|
||||
$num_keys = count($matches[0]);
|
||||
for ( $i = 0; $i < $num_keys; $i ++ ) {
|
||||
$my_field = explode('`, `', $matches[1][$i]);
|
||||
$ref_table = $matches[2][$i];
|
||||
$ref_field = explode('`, `', $matches[3][$i]);
|
||||
|
||||
if ( $upper ) {
|
||||
$ref_table = strtoupper($ref_table);
|
||||
}
|
||||
|
||||
// see https://sourceforge.net/tracker/index.php?func=detail&aid=2287278&group_id=42718&atid=433976
|
||||
if (!isset($foreign_keys[$ref_table])) {
|
||||
$foreign_keys[$ref_table] = array();
|
||||
}
|
||||
$num_fields = count($my_field);
|
||||
for ( $j = 0; $j < $num_fields; $j ++ ) {
|
||||
if ( $associative ) {
|
||||
$foreign_keys[$ref_table][$ref_field[$j]] = $my_field[$j];
|
||||
} else {
|
||||
$foreign_keys[$ref_table][] = "{$my_field[$j]}={$ref_field[$j]}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $foreign_keys;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class ADORecordSet_mysql extends ADORecordSet{
|
||||
|
||||
var $databaseType = "mysql";
|
||||
var $canSeek = true;
|
||||
|
||||
function ADORecordSet_mysql($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
//GLOBAL $ADODB_COUNTRECS;
|
||||
// $this->_numOfRows = ($ADODB_COUNTRECS) ? @mysql_num_rows($this->_queryID):-1;
|
||||
$this->_numOfRows = @mysql_num_rows($this->_queryID);
|
||||
$this->_numOfFields = @mysql_num_fields($this->_queryID);
|
||||
}
|
||||
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
if ($fieldOffset != -1) {
|
||||
$o = @mysql_fetch_field($this->_queryID, $fieldOffset);
|
||||
$f = @mysql_field_flags($this->_queryID,$fieldOffset);
|
||||
if ($o) $o->max_length = @mysql_field_len($this->_queryID,$fieldOffset); // suggested by: Jim Nicholson (jnich#att.com)
|
||||
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
|
||||
if ($o) $o->binary = (strpos($f,'binary')!== false);
|
||||
}
|
||||
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||
$o = @mysql_fetch_field($this->_queryID);
|
||||
if ($o) $o->max_length = @mysql_field_len($this->_queryID); // suggested by: Jim Nicholson (jnich#att.com)
|
||||
//$o->max_length = -1; // mysql returns the max length less spaces -- so it is unrealiable
|
||||
}
|
||||
|
||||
return $o;
|
||||
}
|
||||
|
||||
function GetRowAssoc($upper=true)
|
||||
{
|
||||
if ($this->fetchMode == MYSQL_ASSOC && !$upper) $row = $this->fields;
|
||||
else $row = ADORecordSet::GetRowAssoc($upper);
|
||||
return $row;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
// added @ by "Michael William Miller" <mille562@pilot.msu.edu>
|
||||
if ($this->fetchMode != MYSQL_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)
|
||||
{
|
||||
if ($this->_numOfRows == 0) return false;
|
||||
return @mysql_data_seek($this->_queryID,$row);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
//return adodb_movenext($this);
|
||||
//if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
|
||||
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||
$this->_currentRow += 1;
|
||||
return true;
|
||||
}
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow += 1;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
$this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode);
|
||||
return is_array($this->fields);
|
||||
}
|
||||
|
||||
function _close() {
|
||||
@mysql_free_result($this->_queryID);
|
||||
$this->_queryID = false;
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
$len = -1; // mysql max_length is not accurate
|
||||
switch (strtoupper($t)) {
|
||||
case 'STRING':
|
||||
case 'CHAR':
|
||||
case 'VARCHAR':
|
||||
case 'TINYBLOB':
|
||||
case 'TINYTEXT':
|
||||
case 'ENUM':
|
||||
case 'SET':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 'TEXT':
|
||||
case 'LONGTEXT':
|
||||
case 'MEDIUMTEXT':
|
||||
return 'X';
|
||||
|
||||
// php_mysql extension always returns 'blob' even if 'text'
|
||||
// so we have to check whether binary...
|
||||
case 'IMAGE':
|
||||
case 'LONGBLOB':
|
||||
case 'BLOB':
|
||||
case 'MEDIUMBLOB':
|
||||
case 'BINARY':
|
||||
return !empty($fieldobj->binary) ? 'B' : 'X';
|
||||
|
||||
case 'YEAR':
|
||||
case 'DATE': return 'D';
|
||||
|
||||
case 'TIME':
|
||||
case 'DATETIME':
|
||||
case 'TIMESTAMP': return 'T';
|
||||
|
||||
case 'INT':
|
||||
case 'INTEGER':
|
||||
case 'BIGINT':
|
||||
case 'TINYINT':
|
||||
case 'MEDIUMINT':
|
||||
case 'SMALLINT':
|
||||
|
||||
if (!empty($fieldobj->primary_key)) return 'R';
|
||||
else return 'I';
|
||||
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
|
||||
function ADORecordSet_ext_mysql($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
return @adodb_movenext($this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,138 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
MySQL code that supports transactions. For MySQL 3.23 or later.
|
||||
Code from James Poon <jpoon88@yahoo.com>
|
||||
|
||||
Requires mysql client. Works on Windows and Unix.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php");
|
||||
|
||||
|
||||
class ADODB_mysqlt extends ADODB_mysql {
|
||||
var $databaseType = 'mysqlt';
|
||||
var $ansiOuter = true; // for Version 3.23.17 or later
|
||||
var $hasTransactions = true;
|
||||
var $autoRollback = true; // apparently mysql does not autorollback properly
|
||||
|
||||
function ADODB_mysqlt()
|
||||
{
|
||||
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->Execute('SET AUTOCOMMIT=0');
|
||||
$this->Execute('BEGIN');
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->Execute('COMMIT');
|
||||
$this->Execute('SET AUTOCOMMIT=1');
|
||||
return true;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->Execute('ROLLBACK');
|
||||
$this->Execute('SET AUTOCOMMIT=1');
|
||||
return true;
|
||||
}
|
||||
|
||||
function RowLock($tables,$where='',$col='1 as adodb_ignore')
|
||||
{
|
||||
if ($this->transCnt==0) $this->BeginTrans();
|
||||
if ($where) $where = ' where '.$where;
|
||||
$rs = $this->Execute("select $col from $tables $where for update");
|
||||
return !empty($rs);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ADORecordSet_mysqlt extends ADORecordSet_mysql{
|
||||
var $databaseType = "mysqlt";
|
||||
|
||||
function ADORecordSet_mysqlt($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default: $this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||
$this->_currentRow += 1;
|
||||
return true;
|
||||
}
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow += 1;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
|
||||
|
||||
function ADORecordSet_ext_mysqlt($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
return adodb_movenext($this);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,155 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
MySQL code that supports transactions. For MySQL 3.23 or later.
|
||||
Code from James Poon <jpoon88@yahoo.com>
|
||||
|
||||
Requires mysql client. Works on Windows and Unix.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR."/drivers/adodb-mysql.inc.php");
|
||||
|
||||
|
||||
class ADODB_mysqlt extends ADODB_mysql {
|
||||
var $databaseType = 'mysqlt';
|
||||
var $ansiOuter = true; // for Version 3.23.17 or later
|
||||
var $hasTransactions = true;
|
||||
var $autoRollback = true; // apparently mysql does not autorollback properly
|
||||
|
||||
function ADODB_mysqlt()
|
||||
{
|
||||
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
|
||||
}
|
||||
|
||||
/* set transaction mode
|
||||
|
||||
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
|
||||
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
|
||||
|
||||
*/
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->Execute('SET AUTOCOMMIT=0');
|
||||
$this->Execute('BEGIN');
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$ok = $this->Execute('COMMIT');
|
||||
$this->Execute('SET AUTOCOMMIT=1');
|
||||
return $ok ? true : false;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$ok = $this->Execute('ROLLBACK');
|
||||
$this->Execute('SET AUTOCOMMIT=1');
|
||||
return $ok ? true : false;
|
||||
}
|
||||
|
||||
function RowLock($tables,$where='',$col='1 as adodb_ignore')
|
||||
{
|
||||
if ($this->transCnt==0) $this->BeginTrans();
|
||||
if ($where) $where = ' where '.$where;
|
||||
$rs = $this->Execute("select $col from $tables $where for update");
|
||||
return !empty($rs);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ADORecordSet_mysqlt extends ADORecordSet_mysql{
|
||||
var $databaseType = "mysqlt";
|
||||
|
||||
function ADORecordSet_mysqlt($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default: $this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if (@$this->fields = mysql_fetch_array($this->_queryID,$this->fetchMode)) {
|
||||
$this->_currentRow += 1;
|
||||
return true;
|
||||
}
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow += 1;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
|
||||
|
||||
function ADORecordSet_ext_mysqlt($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default:
|
||||
$this->fetchMode = MYSQL_BOTH; break;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
return adodb_movenext($this);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,170 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
|
||||
First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com
|
||||
Based on the previous postgres drivers.
|
||||
http://www.netezza.com/
|
||||
Major Additions/Changes:
|
||||
MetaDatabasesSQL, MetaTablesSQL, MetaColumnsSQL
|
||||
Note: You have to have admin privileges to access the system tables
|
||||
Removed non-working keys code (Netezza has no concept of keys)
|
||||
Fixed the way data types and lengths are returned in MetaColumns()
|
||||
as well as added the default lengths for certain types
|
||||
Updated public variables for Netezza
|
||||
Still need to remove blob functions, as Netezza doesn't suppport blob
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-postgres64.inc.php');
|
||||
|
||||
class ADODB_netezza extends ADODB_postgres64 {
|
||||
var $databaseType = 'netezza';
|
||||
var $dataProvider = 'netezza';
|
||||
var $hasInsertID = false;
|
||||
var $_resultid = false;
|
||||
var $concat_operator='||';
|
||||
var $random = 'random';
|
||||
var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1";
|
||||
var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1";
|
||||
var $isoDates = true; // accepts dates in ISO format
|
||||
var $sysDate = "CURRENT_DATE";
|
||||
var $sysTimeStamp = "CURRENT_TIMESTAMP";
|
||||
var $blobEncodeType = 'C';
|
||||
var $metaColumnsSQL = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
|
||||
var $metaColumnsSQL1 = "SELECT attname, atttype FROM _v_relation_column_def WHERE name = '%s' AND attnum > 0 ORDER BY attnum";
|
||||
// netezza doesn't have keys. it does have distributions, so maybe this is
|
||||
// something that can be pulled from the system tables
|
||||
var $metaKeySQL = "";
|
||||
var $hasAffectedRows = true;
|
||||
var $hasLimit = true;
|
||||
var $true = 't'; // string that represents TRUE for a database
|
||||
var $false = 'f'; // string that represents FALSE for a database
|
||||
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
|
||||
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
|
||||
var $ansiOuter = true;
|
||||
var $autoRollback = true; // apparently pgsql does not autorollback properly before 4.3.4
|
||||
// http://bugs.php.net/bug.php?id=25404
|
||||
|
||||
|
||||
function ADODB_netezza()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
function MetaColumns($table,$upper=true)
|
||||
{
|
||||
|
||||
// Changed this function to support Netezza which has no concept of keys
|
||||
// could posisbly work on other things from the system table later.
|
||||
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$table = strtolower($table);
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if ($rs === false) return false;
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
|
||||
// since we're returning type and length as one string,
|
||||
// split them out here.
|
||||
|
||||
if ($first = strstr($rs->fields[1], "(")) {
|
||||
$fld->max_length = trim($first, "()");
|
||||
} else {
|
||||
$fld->max_length = -1;
|
||||
}
|
||||
|
||||
if ($first = strpos($rs->fields[1], "(")) {
|
||||
$fld->type = substr($rs->fields[1], 0, $first);
|
||||
} else {
|
||||
$fld->type = $rs->fields[1];
|
||||
}
|
||||
|
||||
switch ($fld->type) {
|
||||
case "byteint":
|
||||
case "boolean":
|
||||
$fld->max_length = 1;
|
||||
break;
|
||||
case "smallint":
|
||||
$fld->max_length = 2;
|
||||
break;
|
||||
case "integer":
|
||||
case "numeric":
|
||||
case "date":
|
||||
$fld->max_length = 4;
|
||||
break;
|
||||
case "bigint":
|
||||
case "time":
|
||||
case "timestamp":
|
||||
$fld->max_length = 8;
|
||||
break;
|
||||
case "timetz":
|
||||
case "time with time zone":
|
||||
$fld->max_length = 12;
|
||||
break;
|
||||
}
|
||||
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||
else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld;
|
||||
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_netezza extends ADORecordSet_postgres64
|
||||
{
|
||||
var $databaseType = "netezza";
|
||||
var $canSeek = true;
|
||||
|
||||
function ADORecordSet_netezza($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
switch ($mode)
|
||||
{
|
||||
case ADODB_FETCH_NUM: $this->fetchMode = PGSQL_NUM; break;
|
||||
case ADODB_FETCH_ASSOC:$this->fetchMode = PGSQL_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_DEFAULT:
|
||||
case ADODB_FETCH_BOTH:
|
||||
default: $this->fetchMode = PGSQL_BOTH; break;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
// _initrs modified to disable blob handling
|
||||
function _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($this->_queryID):-1;
|
||||
$this->_numOfFields = @pg_numfields($this->_queryID);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,59 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
* 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.
|
||||
*
|
||||
* Set tabs to 4 for best viewing.
|
||||
*
|
||||
* Latest version is available at http://php.weblogs.com
|
||||
*
|
||||
* Oracle 8.0.5 driver
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
|
||||
|
||||
class ADODB_oci805 extends ADODB_oci8 {
|
||||
var $databaseType = "oci805";
|
||||
var $connectSID = true;
|
||||
|
||||
function ADODB_oci805()
|
||||
{
|
||||
$this->ADODB_oci8();
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||
{
|
||||
// seems that oracle only supports 1 hint comment in 8i
|
||||
if (strpos($sql,'/*+') !== false)
|
||||
$sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
|
||||
else
|
||||
$sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
|
||||
|
||||
/*
|
||||
The following is only available from 8.1.5 because order by in inline views not
|
||||
available before then...
|
||||
http://www.jlcomp.demon.co.uk/faq/top_sql.html
|
||||
if ($nrows > 0) {
|
||||
if ($offset > 0) $nrows += $offset;
|
||||
$sql = "select * from ($sql) where rownum <= $nrows";
|
||||
$nrows = -1;
|
||||
}
|
||||
*/
|
||||
|
||||
return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordset_oci805 extends ADORecordset_oci8 {
|
||||
var $databaseType = "oci805";
|
||||
function ADORecordset_oci805($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_oci8($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,218 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim. All rights reserved.
|
||||
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.sourceforge.net
|
||||
|
||||
Portable version of oci8 driver, to make it more similar to other database drivers.
|
||||
The main differences are
|
||||
|
||||
1. that the OCI_ASSOC names are in lowercase instead of uppercase.
|
||||
2. bind variables are mapped using ? instead of :<bindvar>
|
||||
|
||||
Should some emulation of RecordCount() be implemented?
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
|
||||
|
||||
class ADODB_oci8po extends ADODB_oci8 {
|
||||
var $databaseType = 'oci8po';
|
||||
var $dataProvider = 'oci8';
|
||||
var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
|
||||
var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
|
||||
|
||||
function ADODB_oci8po()
|
||||
{
|
||||
$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
|
||||
# oci8po does not support adodb extension: adodb_movenext()
|
||||
}
|
||||
|
||||
function Param($name)
|
||||
{
|
||||
return '?';
|
||||
}
|
||||
|
||||
function Prepare($sql,$cursor=false)
|
||||
{
|
||||
$sqlarr = explode('?',$sql);
|
||||
$sql = $sqlarr[0];
|
||||
for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
|
||||
$sql .= ':'.($i-1) . $sqlarr[$i];
|
||||
}
|
||||
return ADODB_oci8::Prepare($sql,$cursor);
|
||||
}
|
||||
|
||||
// emulate handling of parameters ? ?, replacing with :bind0 :bind1
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
if (is_array($inputarr)) {
|
||||
$i = 0;
|
||||
if (is_array($sql)) {
|
||||
foreach($inputarr as $v) {
|
||||
$arr['bind'.$i++] = $v;
|
||||
}
|
||||
} else {
|
||||
$sqlarr = explode('?',$sql);
|
||||
$sql = $sqlarr[0];
|
||||
foreach($inputarr as $k => $v) {
|
||||
$sql .= ":$k" . $sqlarr[++$i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return ADODB_oci8::_query($sql,$inputarr);
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_oci8po extends ADORecordset_oci8 {
|
||||
|
||||
var $databaseType = 'oci8po';
|
||||
|
||||
function ADORecordset_oci8po($queryID,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_oci8($queryID,$mode);
|
||||
}
|
||||
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & OCI_ASSOC) 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)]];
|
||||
}
|
||||
|
||||
// lowercase field names...
|
||||
function _FetchField($fieldOffset = -1)
|
||||
{
|
||||
$fld = new ADOFieldObject;
|
||||
$fieldOffset += 1;
|
||||
$fld->name = OCIcolumnname($this->_queryID, $fieldOffset);
|
||||
if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name);
|
||||
$fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
|
||||
$fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
|
||||
if ($fld->type == 'NUMBER') {
|
||||
//$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
|
||||
$sc = OCIColumnScale($this->_queryID, $fieldOffset);
|
||||
if ($sc == 0) $fld->type = 'INT';
|
||||
}
|
||||
return $fld;
|
||||
}
|
||||
/*
|
||||
function MoveNext()
|
||||
{
|
||||
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||
$this->_currentRow += 1;
|
||||
return true;
|
||||
}
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow += 1;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}*/
|
||||
|
||||
// 10% speedup to move MoveNext to child class
|
||||
function MoveNext()
|
||||
{
|
||||
if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||
global $ADODB_ANSI_PADDING_OFF;
|
||||
$this->_currentRow++;
|
||||
|
||||
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||
if (!empty($ADODB_ANSI_PADDING_OFF)) {
|
||||
foreach($this->fields as $k => $v) {
|
||||
if (is_string($v)) $this->fields[$k] = rtrim($v);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (!$this->EOF) {
|
||||
$this->EOF = true;
|
||||
$this->_currentRow++;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
|
||||
function GetArrayLimit($nrows,$offset=-1)
|
||||
{
|
||||
if ($offset <= 0) {
|
||||
$arr = $this->GetArray($nrows);
|
||||
return $arr;
|
||||
}
|
||||
for ($i=1; $i < $offset; $i++)
|
||||
if (!@OCIFetch($this->_queryID)) {
|
||||
$arr = array();
|
||||
return $arr;
|
||||
}
|
||||
if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
|
||||
$arr = array();
|
||||
return $arr;
|
||||
}
|
||||
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||
$results = array();
|
||||
$cnt = 0;
|
||||
while (!$this->EOF && $nrows != $cnt) {
|
||||
$results[$cnt++] = $this->fields;
|
||||
$this->MoveNext();
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
// Create associative array
|
||||
function _updatefields()
|
||||
{
|
||||
if (ADODB_ASSOC_CASE == 2) return; // native
|
||||
|
||||
$arr = array();
|
||||
$lowercase = (ADODB_ASSOC_CASE == 0);
|
||||
|
||||
foreach($this->fields as $k => $v) {
|
||||
if (is_integer($k)) $arr[$k] = $v;
|
||||
else {
|
||||
if ($lowercase)
|
||||
$arr[strtolower($k)] = $v;
|
||||
else
|
||||
$arr[strtoupper($k)] = $v;
|
||||
}
|
||||
}
|
||||
$this->fields = $arr;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
$ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
|
||||
if ($ret) {
|
||||
global $ADODB_ANSI_PADDING_OFF;
|
||||
|
||||
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
|
||||
if (!empty($ADODB_ANSI_PADDING_OFF)) {
|
||||
foreach($this->fields as $k => $v) {
|
||||
if (is_string($v)) $this->fields[$k] = rtrim($v);
|
||||
}
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -1,738 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Requires ODBC. Works on Windows and Unix.
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_ODBC_LAYER", 2 );
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
class ADODB_odbc extends ADOConnection {
|
||||
var $databaseType = "odbc";
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $dataProvider = "odbc";
|
||||
var $hasAffectedRows = true;
|
||||
var $binmode = ODBC_BINMODE_RETURN;
|
||||
var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
|
||||
// breaking backward-compat
|
||||
//var $longreadlen = 8000; // default number of chars to return for a Blob/Long field
|
||||
var $_bindInputArray = false;
|
||||
var $curmode = SQL_CUR_USE_DRIVER; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
|
||||
var $_genSeqSQL = "create table %s (id integer)";
|
||||
var $_autocommit = true;
|
||||
var $_haserrorfunctions = true;
|
||||
var $_has_stupid_odbc_fetch_api_change = true;
|
||||
var $_lastAffectedRows = 0;
|
||||
var $uCaseTables = true; // for meta* functions, uppercase table names
|
||||
|
||||
function ADODB_odbc()
|
||||
{
|
||||
$this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
|
||||
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('odbc_connect')) return null;
|
||||
|
||||
if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') {
|
||||
ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||
}
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
|
||||
else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
if (!function_exists('odbc_connect')) return null;
|
||||
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if ($this->debug && $argDatabasename) {
|
||||
ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
|
||||
}
|
||||
// print "dsn=$argDSN u=$argUsername p=$argPassword<br>"; flush();
|
||||
if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
|
||||
else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
|
||||
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID);
|
||||
if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
|
||||
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
|
||||
if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
|
||||
$dsn = strtoupper($this->host);
|
||||
$first = true;
|
||||
$found = false;
|
||||
|
||||
if (!function_exists('odbc_data_source')) return false;
|
||||
|
||||
while(true) {
|
||||
|
||||
$rez = @odbc_data_source($this->_connectionID,
|
||||
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
|
||||
$first = false;
|
||||
if (!is_array($rez)) break;
|
||||
if (strtoupper($rez['server']) == $dsn) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$found) return ADOConnection::ServerInfo();
|
||||
if (!isset($rez['version'])) $rez['version'] = '';
|
||||
return $rez;
|
||||
} else {
|
||||
return ADOConnection::ServerInfo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
if (empty($this->_dropSeqSQL)) return false;
|
||||
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||
}
|
||||
|
||||
/*
|
||||
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.
|
||||
*/
|
||||
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 ErrorMsg()
|
||||
{
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||
if (empty($this->_connectionID)) return @odbc_errormsg();
|
||||
return @odbc_errormsg($this->_connectionID);
|
||||
} else return ADOConnection::ErrorMsg();
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
|
||||
if ($this->_haserrorfunctions) {
|
||||
if ($this->_errorCode !== false) {
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
|
||||
}
|
||||
|
||||
if (empty($this->_connectionID)) $e = @odbc_error();
|
||||
else $e = @odbc_error($this->_connectionID);
|
||||
|
||||
// bug in 4.0.6, error number can be corrupted string (should be 6 digits)
|
||||
// so we check and patch
|
||||
if (strlen($e)<=2) return 0;
|
||||
return $e;
|
||||
} else return ADOConnection::ErrorNo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->_autocommit = false;
|
||||
return odbc_autocommit($this->_connectionID,false);
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = odbc_commit($this->_connectionID);
|
||||
odbc_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
$ret = odbc_rollback($this->_connectionID);
|
||||
odbc_autocommit($this->_connectionID,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaPrimaryKeys($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table);
|
||||
|
||||
if (!$qid) {
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
return false;
|
||||
}
|
||||
$rs = new ADORecordSet_odbc($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return false;
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
$rs->Close();
|
||||
//print_r($arr);
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function MetaTables($ttype=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = odbc_tables($this->_connectionID);
|
||||
|
||||
$rs = new ADORecordSet_odbc($qid);
|
||||
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
//print_r($arr);
|
||||
|
||||
$rs->Close();
|
||||
$arr2 = array();
|
||||
|
||||
if ($ttype) {
|
||||
$isview = strncmp($ttype,'V',1) === 0;
|
||||
}
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if (!$arr[$i][2]) continue;
|
||||
$type = $arr[$i][3];
|
||||
if ($ttype) {
|
||||
if ($isview) {
|
||||
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
|
||||
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
|
||||
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
/*
|
||||
See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbcdatetime_data_type_changes.asp
|
||||
/ SQL data type codes /
|
||||
#define SQL_UNKNOWN_TYPE 0
|
||||
#define SQL_CHAR 1
|
||||
#define SQL_NUMERIC 2
|
||||
#define SQL_DECIMAL 3
|
||||
#define SQL_INTEGER 4
|
||||
#define SQL_SMALLINT 5
|
||||
#define SQL_FLOAT 6
|
||||
#define SQL_REAL 7
|
||||
#define SQL_DOUBLE 8
|
||||
#if (ODBCVER >= 0x0300)
|
||||
#define SQL_DATETIME 9
|
||||
#endif
|
||||
#define SQL_VARCHAR 12
|
||||
|
||||
|
||||
/ One-parameter shortcuts for date/time data types /
|
||||
#if (ODBCVER >= 0x0300)
|
||||
#define SQL_TYPE_DATE 91
|
||||
#define SQL_TYPE_TIME 92
|
||||
#define SQL_TYPE_TIMESTAMP 93
|
||||
|
||||
#define SQL_UNICODE (-95)
|
||||
#define SQL_UNICODE_VARCHAR (-96)
|
||||
#define SQL_UNICODE_LONGVARCHAR (-97)
|
||||
*/
|
||||
function ODBCTypes($t)
|
||||
{
|
||||
switch ((integer)$t) {
|
||||
case 1:
|
||||
case 12:
|
||||
case 0:
|
||||
case -95:
|
||||
case -96:
|
||||
return 'C';
|
||||
case -97:
|
||||
case -1: //text
|
||||
return 'X';
|
||||
case -4: //image
|
||||
return 'B';
|
||||
|
||||
case 9:
|
||||
case 91:
|
||||
return 'D';
|
||||
|
||||
case 10:
|
||||
case 11:
|
||||
case 92:
|
||||
case 93:
|
||||
return 'T';
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
case -6:
|
||||
return 'I';
|
||||
|
||||
case -11: // uniqidentifier
|
||||
return 'R';
|
||||
case -7: //bit
|
||||
return 'L';
|
||||
|
||||
default:
|
||||
return 'N';
|
||||
}
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
if ($this->uCaseTables) $table = strtoupper($table);
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
/*if (false) { // after testing, confirmed that the following does not work becoz of a bug
|
||||
$qid2 = odbc_tables($this->_connectionID);
|
||||
$rs = new ADORecordSet_odbc($qid2);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) return false;
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
$rs->_fetch();
|
||||
|
||||
while (!$rs->EOF) {
|
||||
if ($table == strtoupper($rs->fields[2])) {
|
||||
$q = $rs->fields[0];
|
||||
$o = $rs->fields[1];
|
||||
break;
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
|
||||
$qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
|
||||
} */
|
||||
|
||||
switch ($this->databaseType) {
|
||||
case 'access':
|
||||
case 'vfp':
|
||||
$qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%');
|
||||
break;
|
||||
|
||||
|
||||
case 'db2':
|
||||
$colname = "%";
|
||||
$qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname);
|
||||
break;
|
||||
|
||||
default:
|
||||
$qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%');
|
||||
if (empty($qid)) $qid = odbc_columns($this->_connectionID);
|
||||
break;
|
||||
}
|
||||
if (empty($qid)) return $false;
|
||||
|
||||
$rs = new ADORecordSet_odbc($qid);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs) return $false;
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
$rs->_fetch();
|
||||
|
||||
$retarr = array();
|
||||
|
||||
/*
|
||||
$rs->fields indices
|
||||
0 TABLE_QUALIFIER
|
||||
1 TABLE_SCHEM
|
||||
2 TABLE_NAME
|
||||
3 COLUMN_NAME
|
||||
4 DATA_TYPE
|
||||
5 TYPE_NAME
|
||||
6 PRECISION
|
||||
7 LENGTH
|
||||
8 SCALE
|
||||
9 RADIX
|
||||
10 NULLABLE
|
||||
11 REMARKS
|
||||
*/
|
||||
while (!$rs->EOF) {
|
||||
// adodb_pr($rs->fields);
|
||||
if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[3];
|
||||
$fld->type = $this->ODBCTypes($rs->fields[4]);
|
||||
|
||||
// ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
|
||||
// access uses precision to store length for char/varchar
|
||||
if ($fld->type == 'C' or $fld->type == 'X') {
|
||||
if ($this->databaseType == 'access')
|
||||
$fld->max_length = $rs->fields[6];
|
||||
else if ($rs->fields[4] <= -95) // UNICODE
|
||||
$fld->max_length = $rs->fields[7]/2;
|
||||
else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
} else
|
||||
$fld->max_length = $rs->fields[7];
|
||||
$fld->not_null = !empty($rs->fields[10]);
|
||||
$fld->scale = $rs->fields[8];
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
} else if (sizeof($retarr)>0)
|
||||
break;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close(); //-- crashes 4.03pl1 -- why?
|
||||
|
||||
if (empty($retarr)) $retarr = false;
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
if (! $this->_bindInputArray) return $sql; // no binding
|
||||
$stmt = odbc_prepare($this->_connectionID,$sql);
|
||||
if (!$stmt) {
|
||||
// we don't know whether odbc driver is parsing prepared stmts, so just return sql
|
||||
return $sql;
|
||||
}
|
||||
return array($sql,$stmt,false);
|
||||
}
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
GLOBAL $php_errormsg;
|
||||
if (isset($php_errormsg)) $php_errormsg = '';
|
||||
$this->_error = '';
|
||||
|
||||
if ($inputarr) {
|
||||
if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
} else {
|
||||
$stmtid = odbc_prepare($this->_connectionID,$sql);
|
||||
|
||||
if ($stmtid == false) {
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (! odbc_execute($stmtid,$inputarr)) {
|
||||
//@odbc_free_result($stmtid);
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = odbc_errormsg();
|
||||
$this->_errorCode = odbc_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} else if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
if (!odbc_execute($stmtid)) {
|
||||
//@odbc_free_result($stmtid);
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = odbc_errormsg();
|
||||
$this->_errorCode = odbc_error();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else
|
||||
$stmtid = odbc_exec($this->_connectionID,$sql);
|
||||
|
||||
$this->_lastAffectedRows = 0;
|
||||
if ($stmtid) {
|
||||
if (@odbc_num_fields($stmtid) == 0) {
|
||||
$this->_lastAffectedRows = odbc_num_rows($stmtid);
|
||||
$stmtid = true;
|
||||
} else {
|
||||
$this->_lastAffectedRows = 0;
|
||||
odbc_binmode($stmtid,$this->binmode);
|
||||
odbc_longreadlen($stmtid,$this->maxblobsize);
|
||||
}
|
||||
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = '';
|
||||
$this->_errorCode = 0;
|
||||
} else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
} else {
|
||||
if ($this->_haserrorfunctions) {
|
||||
$this->_errorMsg = odbc_errormsg();
|
||||
$this->_errorCode = odbc_error();
|
||||
} else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
|
||||
}
|
||||
return $stmtid;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
$ret = @odbc_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->_lastAffectedRows;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_odbc extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "odbc";
|
||||
var $dataProvider = "odbc";
|
||||
var $useFetchArray;
|
||||
var $_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
function ADORecordSet_odbc($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
|
||||
$this->_queryID = $id;
|
||||
|
||||
// the following is required for mysql odbc driver in 4.3.1 -- why?
|
||||
$this->EOF = false;
|
||||
$this->_currentRow = -1;
|
||||
//$this->ADORecordSet($id);
|
||||
}
|
||||
|
||||
|
||||
// returns the field object
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
|
||||
$off=$fieldOffset+1; // offsets begin at 1
|
||||
|
||||
$o= new ADOFieldObject();
|
||||
$o->name = @odbc_field_name($this->_queryID,$off);
|
||||
$o->type = @odbc_field_type($this->_queryID,$off);
|
||||
$o->max_length = @odbc_field_len($this->_queryID,$off);
|
||||
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||
return $o;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) 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 _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1;
|
||||
$this->_numOfFields = @odbc_num_fields($this->_queryID);
|
||||
// some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
|
||||
if ($this->_numOfRows == 0) $this->_numOfRows = -1;
|
||||
//$this->useFetchArray = $this->connection->useFetchArray;
|
||||
$this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
|
||||
function GetArrayLimit($nrows,$offset=-1)
|
||||
{
|
||||
if ($offset <= 0) {
|
||||
$rs = $this->GetArray($nrows);
|
||||
return $rs;
|
||||
}
|
||||
$savem = $this->fetchMode;
|
||||
$this->fetchMode = ADODB_FETCH_NUM;
|
||||
$this->Move($offset);
|
||||
$this->fetchMode = $savem;
|
||||
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
|
||||
$results = array();
|
||||
$cnt = 0;
|
||||
while (!$this->EOF && $nrows != $cnt) {
|
||||
$results[$cnt++] = $this->fields;
|
||||
$this->MoveNext();
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if ($this->_numOfRows != 0 && !$this->EOF) {
|
||||
$this->_currentRow++;
|
||||
|
||||
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
|
||||
else {
|
||||
$row = 0;
|
||||
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
|
||||
}
|
||||
if ($rez) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->fields = false;
|
||||
$this->EOF = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
|
||||
if ($this->_has_stupid_odbc_fetch_api_change)
|
||||
$rez = @odbc_fetch_into($this->_queryID,$this->fields);
|
||||
else {
|
||||
$row = 0;
|
||||
$rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
|
||||
}
|
||||
if ($rez) {
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
$this->fields = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
return @odbc_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,368 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
DB2 data driver. Requires ODBC.
|
||||
|
||||
From phpdb list:
|
||||
|
||||
Hi Andrew,
|
||||
|
||||
thanks a lot for your help. Today we discovered what
|
||||
our real problem was:
|
||||
|
||||
After "playing" a little bit with the php-scripts that try
|
||||
to connect to the IBM DB2, we set the optional parameter
|
||||
Cursortype when calling odbc_pconnect(....).
|
||||
|
||||
And the exciting thing: When we set the cursor type
|
||||
to SQL_CUR_USE_ODBC Cursor Type, then
|
||||
the whole query speed up from 1 till 10 seconds
|
||||
to 0.2 till 0.3 seconds for 100 records. Amazing!!!
|
||||
|
||||
Therfore, PHP is just almost fast as calling the DB2
|
||||
from Servlets using JDBC (don't take too much care
|
||||
about the speed at whole: the database was on a
|
||||
completely other location, so the whole connection
|
||||
was made over a slow network connection).
|
||||
|
||||
I hope this helps when other encounter the same
|
||||
problem when trying to connect to DB2 from
|
||||
PHP.
|
||||
|
||||
Kind regards,
|
||||
Christian Szardenings
|
||||
|
||||
2 Oct 2001
|
||||
Mark Newnham has discovered that the SQL_CUR_USE_ODBC is not supported by
|
||||
IBM's DB2 ODBC driver, so this must be a 3rd party ODBC driver.
|
||||
|
||||
From the IBM CLI Reference:
|
||||
|
||||
SQL_ATTR_ODBC_CURSORS (DB2 CLI v5)
|
||||
This connection attribute is defined by ODBC, but is not supported by DB2
|
||||
CLI. Any attempt to set or get this attribute will result in an SQLSTATE of
|
||||
HYC00 (Driver not capable).
|
||||
|
||||
A 32-bit option specifying how the Driver Manager uses the ODBC cursor
|
||||
library.
|
||||
|
||||
So I guess this means the message [above] was related to using a 3rd party
|
||||
odbc driver.
|
||||
|
||||
Setting SQL_CUR_USE_ODBC
|
||||
========================
|
||||
To set SQL_CUR_USE_ODBC for drivers that require it, do this:
|
||||
|
||||
$db = NewADOConnection('odbc_db2');
|
||||
$db->curMode = SQL_CUR_USE_ODBC;
|
||||
$db->Connect($dsn, $userid, $pwd);
|
||||
|
||||
|
||||
|
||||
USING CLI INTERFACE
|
||||
===================
|
||||
|
||||
I have had reports that the $host and $database params have to be reversed in
|
||||
Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu:
|
||||
|
||||
> The symptom is that if I change the database engine from postgres or any other to DB2 then the following
|
||||
> connection command becomes wrong despite being described this version to be correct in the docs.
|
||||
>
|
||||
> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME )
|
||||
>
|
||||
> In case of DB2 I had to swap the first and last arguments in order to connect properly.
|
||||
|
||||
|
||||
System Error 5
|
||||
==============
|
||||
IF you get a System Error 5 when trying to Connect/Load, it could be a permission problem. Give the user connecting
|
||||
to DB2 full rights to the DB2 SQLLIB directory, and place the user in the DBUSERS group.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
if (!defined('ADODB_ODBC_DB2')){
|
||||
define('ADODB_ODBC_DB2',1);
|
||||
|
||||
class ADODB_ODBC_DB2 extends ADODB_odbc {
|
||||
var $databaseType = "db2";
|
||||
var $concat_operator = '||';
|
||||
var $sysTime = 'CURRENT TIME';
|
||||
var $sysDate = 'CURRENT DATE';
|
||||
var $sysTimeStamp = 'CURRENT TIMESTAMP';
|
||||
// The complete string representation of a timestamp has the form
|
||||
// yyyy-mm-dd-hh.mm.ss.nnnnnn.
|
||||
var $fmtTimeStamp = "'Y-m-d-H.i.s'";
|
||||
var $ansiOuter = true;
|
||||
var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
|
||||
var $_bindInputArray = true;
|
||||
var $hasInsertID = true;
|
||||
var $rsPrefix = 'ADORecordset_odbc_';
|
||||
|
||||
function ADODB_DB2()
|
||||
{
|
||||
if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " COALESCE($field, $ifNull) "; // if DB2 UDB
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
//odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/);
|
||||
$vers = $this->GetOne('select versionnumber from sysibm.sysversions');
|
||||
//odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/);
|
||||
return array('description'=>'DB2 ODBC driver', 'version'=>$vers);
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return $this->GetOne($this->identitySQL);
|
||||
}
|
||||
|
||||
function RowLock($tables,$where,$col='1 as ignore')
|
||||
{
|
||||
if ($this->_autocommit) $this->BeginTrans();
|
||||
return $this->GetOne("select $col from $tables where $where for update");
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%")
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, "");
|
||||
|
||||
$rs = new ADORecordSet_odbc($qid);
|
||||
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
if (!$rs) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
$rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
//print_r($arr);
|
||||
|
||||
$rs->Close();
|
||||
$arr2 = array();
|
||||
|
||||
if ($ttype) {
|
||||
$isview = strncmp($ttype,'V',1) === 0;
|
||||
}
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
|
||||
if (!$arr[$i][2]) continue;
|
||||
if (strncmp($arr[$i][1],'SYS',3) === 0) continue;
|
||||
|
||||
$type = $arr[$i][3];
|
||||
|
||||
if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2];
|
||||
|
||||
if ($ttype) {
|
||||
if ($isview) {
|
||||
if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
|
||||
} else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2];
|
||||
} else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaIndexes ($table, $primary = FALSE, $owner=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);
|
||||
}
|
||||
$false = false;
|
||||
// get index details
|
||||
$table = strtoupper($table);
|
||||
$SQL="SELECT NAME, UNIQUERULE, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME='$table'";
|
||||
if ($primary)
|
||||
$SQL.= " AND UNIQUERULE='P'";
|
||||
$rs = $this->Execute($SQL);
|
||||
if (!is_object($rs)) {
|
||||
if (isset($savem))
|
||||
$this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
return $false;
|
||||
}
|
||||
$indexes = array ();
|
||||
// parse index data into array
|
||||
while ($row = $rs->FetchRow()) {
|
||||
$indexes[$row[0]] = array(
|
||||
'unique' => ($row[1] == 'U' || $row[1] == 'P'),
|
||||
'columns' => array()
|
||||
);
|
||||
$cols = ltrim($row[2],'+');
|
||||
$indexes[$row[0]]['columns'] = explode('+', $cols);
|
||||
}
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
}
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
// use right() and replace() ?
|
||||
if (!$col) $col = $this->sysDate;
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= '||';
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= "char(year($col))";
|
||||
break;
|
||||
case 'M':
|
||||
$s .= "substr(monthname($col),1,3)";
|
||||
break;
|
||||
case 'm':
|
||||
$s .= "right(digits(month($col)),2)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= "right(digits(day($col)),2)";
|
||||
break;
|
||||
case 'H':
|
||||
case 'h':
|
||||
if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
case 'i':
|
||||
case 'I':
|
||||
if ($col != $this->sysDate)
|
||||
$s .= "right(digits(minute($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
case 'S':
|
||||
case 's':
|
||||
if ($col != $this->sysDate)
|
||||
$s .= "right(digits(second($col)),2)";
|
||||
else $s .= "''";
|
||||
break;
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
|
||||
{
|
||||
$nrows = (integer) $nrows;
|
||||
if ($offset <= 0) {
|
||||
// could also use " OPTIMIZE FOR $nrows ROWS "
|
||||
if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||
$rs = $this->Execute($sql,$inputArr);
|
||||
} else {
|
||||
if ($offset > 0 && $nrows < 0);
|
||||
else {
|
||||
$nrows += $offset;
|
||||
$sql .= " FETCH FIRST $nrows ROWS ONLY ";
|
||||
}
|
||||
$rs = ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
|
||||
}
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_odbc_db2 extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = "db2";
|
||||
|
||||
function ADORecordSet_db2($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
switch (strtoupper($t)) {
|
||||
case 'VARCHAR':
|
||||
case 'CHAR':
|
||||
case 'CHARACTER':
|
||||
case 'C':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
case 'LONGCHAR':
|
||||
case 'TEXT':
|
||||
case 'CLOB':
|
||||
case 'DBCLOB': // double-byte
|
||||
case 'X':
|
||||
return 'X';
|
||||
|
||||
case 'BLOB':
|
||||
case 'GRAPHIC':
|
||||
case 'VARGRAPHIC':
|
||||
return 'B';
|
||||
|
||||
case 'DATE':
|
||||
case 'D':
|
||||
return 'D';
|
||||
|
||||
case 'TIME':
|
||||
case 'TIMESTAMP':
|
||||
case 'T':
|
||||
return 'T';
|
||||
|
||||
//case 'BOOLEAN':
|
||||
//case 'BIT':
|
||||
// return 'L';
|
||||
|
||||
//case 'COUNTER':
|
||||
// return 'R';
|
||||
|
||||
case 'INT':
|
||||
case 'INTEGER':
|
||||
case 'BIGINT':
|
||||
case 'SMALLINT':
|
||||
case 'I':
|
||||
return 'I';
|
||||
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} //define
|
||||
?>
|
||||
@@ -1,305 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix.
|
||||
For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
|
||||
|
||||
class ADODB_odbc_mssql extends ADODB_odbc {
|
||||
var $databaseType = 'odbc_mssql';
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $_bindInputArray = true;
|
||||
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))";
|
||||
var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
|
||||
var $hasTop = 'top'; // support mssql/interbase SELECT TOP 10 * FROM TABLE
|
||||
var $sysDate = 'GetDate()';
|
||||
var $sysTimeStamp = 'GetDate()';
|
||||
var $leftOuter = '*=';
|
||||
var $rightOuter = '=*';
|
||||
var $substr = 'substring';
|
||||
var $length = 'len';
|
||||
var $ansiOuter = true; // for mssql7 or later
|
||||
var $identitySQL = 'select @@identity'; // 'select SCOPE_IDENTITY'; # for mssql 2000
|
||||
var $hasInsertID = true;
|
||||
var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON,
|
||||
# concatenating a null value with a string yields a NULL result
|
||||
|
||||
function ADODB_odbc_mssql()
|
||||
{
|
||||
$this->ADODB_odbc();
|
||||
//$this->curmode = SQL_CUR_USE_ODBC;
|
||||
}
|
||||
|
||||
// crashes php...
|
||||
function ServerInfo()
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save=$this->SetFetchMode(ADODB_FETCH_NUM);
|
||||
$row = $this->GetRow("execute sp_server_info 2");
|
||||
$this->SetFetchMode($save);
|
||||
if (!is_array($row)) return false;
|
||||
$arr['description'] = $row[2];
|
||||
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
return " ISNULL($field, $ifNull) "; // if MS SQL Server
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
// SCOPE_IDENTITY()
|
||||
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||
// function, or batch. Thus, two statements are in the same scope if
|
||||
// they are in the same stored procedure, function, or batch.
|
||||
return $this->GetOne($this->identitySQL);
|
||||
}
|
||||
|
||||
|
||||
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$table = $this->qstr(strtoupper($table));
|
||||
|
||||
$sql =
|
||||
"select object_name(constid) as constraint_name,
|
||||
col_name(fkeyid, fkey) as column_name,
|
||||
object_name(rkeyid) as referenced_table_name,
|
||||
col_name(rkeyid, rkey) as referenced_column_name
|
||||
from sysforeignkeys
|
||||
where upper(object_name(fkeyid)) = $table
|
||||
order by constraint_name, referenced_table_name, keyno";
|
||||
|
||||
$constraints = $this->GetArray($sql);
|
||||
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
$arr = false;
|
||||
foreach($constraints as $constr) {
|
||||
//print_r($constr);
|
||||
$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
|
||||
}
|
||||
if (!$arr) return false;
|
||||
|
||||
$arr2 = false;
|
||||
|
||||
foreach($arr as $k => $v) {
|
||||
foreach($v as $a => $b) {
|
||||
if ($upper) $a = strtoupper($a);
|
||||
$arr2[$a] = $b;
|
||||
}
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
if ($mask) {
|
||||
$save = $this->metaTablesSQL;
|
||||
$mask = $this->qstr($mask);
|
||||
$this->metaTablesSQL .= " AND name like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
if ($mask) {
|
||||
$this->metaTablesSQL = $save;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
$arr = ADOConnection::MetaColumns($table);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
|
||||
function MetaIndexes($table,$primary=false, $owner=false)
|
||||
{
|
||||
$table = $this->qstr($table);
|
||||
|
||||
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
|
||||
ORDER BY O.name, I.Name, K.keyno";
|
||||
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!is_object($rs)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$indexes = array();
|
||||
while ($row = $rs->FetchRow()) {
|
||||
if (!$primary && $row[5]) continue;
|
||||
|
||||
$indexes[$row[0]]['unique'] = $row[6];
|
||||
$indexes[$row[0]]['columns'][] = $row[1];
|
||||
}
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
if (is_string($sql)) $sql = str_replace('||','+',$sql);
|
||||
return ADODB_odbc::_query($sql,$inputarr);
|
||||
}
|
||||
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
// "Stein-Aksel Basma" <basma@accelero.no>
|
||||
// tested with MSSQL 2000
|
||||
function MetaPrimaryKeys($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$schema = '';
|
||||
$this->_findschema($table,$schema);
|
||||
//if (!$schema) $schema = $this->database;
|
||||
if ($schema) $schema = "and k.table_catalog like '$schema%'";
|
||||
|
||||
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
|
||||
information_schema.table_constraints tc
|
||||
where tc.constraint_name = k.constraint_name and tc.constraint_type =
|
||||
'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||
$a = $this->GetCol($sql);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if ($a && sizeof($a)>0) return $a;
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||
{
|
||||
if ($nrows > 0 && $offset <= 0) {
|
||||
$sql = preg_replace(
|
||||
'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);
|
||||
$rs = $this->Execute($sql,$inputarr);
|
||||
} else
|
||||
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
if (!$col) $col = $this->sysTimeStamp;
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= '+';
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= "datename(yyyy,$col)";
|
||||
break;
|
||||
case 'M':
|
||||
$s .= "convert(char(3),$col,0)";
|
||||
break;
|
||||
case 'm':
|
||||
$s .= "replace(str(month($col),2),' ','0')";
|
||||
break;
|
||||
case 'Q':
|
||||
case 'q':
|
||||
$s .= "datename(quarter,$col)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= "replace(str(day($col),2),' ','0')";
|
||||
break;
|
||||
case 'h':
|
||||
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
$s .= "replace(str(datepart(hh,$col),2),' ','0')";
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
$s .= "replace(str(datepart(mi,$col),2),' ','0')";
|
||||
break;
|
||||
case 's':
|
||||
$s .= "replace(str(datepart(ss,$col),2),' ','0')";
|
||||
break;
|
||||
case 'a':
|
||||
case 'A':
|
||||
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||
break;
|
||||
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ADORecordSet_odbc_mssql extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = 'odbc_mssql';
|
||||
|
||||
function ADORecordSet_odbc_mssql($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,115 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Oracle support via ODBC. Requires ODBC. Works on Windows.
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
|
||||
|
||||
class ADODB_odbc_oracle extends ADODB_odbc {
|
||||
var $databaseType = 'odbc_oracle';
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $concat_operator='||';
|
||||
var $fmtDate = "'Y-m-d 00:00:00'";
|
||||
var $fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||
var $metaTablesSQL = 'select table_name from cat';
|
||||
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
|
||||
var $sysDate = "TRUNC(SYSDATE)";
|
||||
var $sysTimeStamp = 'SYSDATE';
|
||||
|
||||
//var $_bindInputArray = false;
|
||||
|
||||
function ADODB_odbc_oracle()
|
||||
{
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function MetaTables()
|
||||
{
|
||||
$false = false;
|
||||
$rs = $this->Execute($this->metaTablesSQL);
|
||||
if ($rs === false) return $false;
|
||||
$arr = $rs->GetArray();
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
$arr2[] = $arr[$i][0];
|
||||
}
|
||||
$rs->Close();
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaColumns($table, $normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||
if ($rs === false) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) { //print_r($rs->fields);
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$fld->type = $rs->fields[1];
|
||||
$fld->max_length = $rs->fields[2];
|
||||
|
||||
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||
else $retarr[strtoupper($fld->name)] = $fld;
|
||||
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
$php_errormsg = '';
|
||||
$this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
|
||||
$this->_errorMsg = $php_errormsg;
|
||||
|
||||
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
|
||||
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
// returns true or false
|
||||
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
global $php_errormsg;
|
||||
$php_errormsg = '';
|
||||
$this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,SQL_CUR_USE_ODBC );
|
||||
$this->_errorMsg = $php_errormsg;
|
||||
|
||||
$this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'");
|
||||
//if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
|
||||
return $this->_connectionID != false;
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbc_oracle extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = 'odbc_oracle';
|
||||
|
||||
function ADORecordSet_odbc_oracle($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,836 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
*/
|
||||
// Code contributed by "stefan bogdan" <sbogdan#rsb.ro>
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
define("_ADODB_ODBTP_LAYER", 2 );
|
||||
|
||||
class ADODB_odbtp extends ADOConnection{
|
||||
var $databaseType = "odbtp";
|
||||
var $dataProvider = "odbtp";
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $odbc_driver = 0;
|
||||
var $hasAffectedRows = true;
|
||||
var $hasInsertID = false;
|
||||
var $hasGenID = true;
|
||||
var $hasMoveFirst = true;
|
||||
|
||||
var $_genSeqSQL = "create table %s (seq_name char(30) not null unique , seq_value integer not null)";
|
||||
var $_dropSeqSQL = "delete from adodb_seq where seq_name = '%s'";
|
||||
var $_bindInputArray = false;
|
||||
var $_useUnicodeSQL = false;
|
||||
var $_canPrepareSP = false;
|
||||
var $_dontPoolDBC = true;
|
||||
|
||||
function ADODB_odbtp()
|
||||
{
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
return array('description' => @odbtp_get_attr( ODB_ATTR_DBMSNAME, $this->_connectionID),
|
||||
'version' => @odbtp_get_attr( ODB_ATTR_DBMSVER, $this->_connectionID));
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||
if (empty($this->_connectionID)) return @odbtp_last_error();
|
||||
return @odbtp_last_error($this->_connectionID);
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_errorCode !== false) return $this->_errorCode;
|
||||
if (empty($this->_connectionID)) return @odbtp_last_error_state();
|
||||
return @odbtp_last_error_state($this->_connectionID);
|
||||
}
|
||||
/*
|
||||
function DBDate($d,$isfld=false)
|
||||
{
|
||||
if (empty($d) && $d !== 0) return 'null';
|
||||
if ($isfld) return "convert(date, $d, 120)";
|
||||
|
||||
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
|
||||
$d = adodb_date($this->fmtDate,$d);
|
||||
return "convert(date, $d, 120)";
|
||||
}
|
||||
|
||||
function DBTimeStamp($d,$isfld=false)
|
||||
{
|
||||
if (empty($d) && $d !== 0) return 'null';
|
||||
if ($isfld) return "convert(datetime, $d, 120)";
|
||||
|
||||
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
|
||||
$d = adodb_date($this->fmtDate,$d);
|
||||
return "convert(datetime, $d, 120)";
|
||||
}
|
||||
*/
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
// SCOPE_IDENTITY()
|
||||
// Returns the last IDENTITY value inserted into an IDENTITY column in
|
||||
// the same scope. A scope is a module -- a stored procedure, trigger,
|
||||
// function, or batch. Thus, two statements are in the same scope if
|
||||
// they are in the same stored procedure, function, or batch.
|
||||
return $this->GetOne($this->identitySQL);
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
if ($this->_queryID) {
|
||||
return @odbtp_affected_rows ($this->_queryID);
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
|
||||
function CreateSequence($seqname='adodbseq',$start=1)
|
||||
{
|
||||
//verify existence
|
||||
$num = $this->GetOne("select seq_value from adodb_seq");
|
||||
$seqtab='adodb_seq';
|
||||
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
|
||||
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
|
||||
//if using vfp dbc file
|
||||
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
|
||||
$path = substr($path,0,strrpos($path,'\/'));
|
||||
$seqtab = $path . '/' . $seqtab;
|
||||
}
|
||||
if($num == false) {
|
||||
if (empty($this->_genSeqSQL)) return false;
|
||||
$ok = $this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
|
||||
}
|
||||
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seqname'");
|
||||
if ($num) {
|
||||
return false;
|
||||
}
|
||||
$start -= 1;
|
||||
return $this->Execute("insert into adodb_seq values('$seqname',$start)");
|
||||
}
|
||||
|
||||
function DropSequence($seqname)
|
||||
{
|
||||
if (empty($this->_dropSeqSQL)) return false;
|
||||
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
||||
}
|
||||
|
||||
function GenID($seq='adodbseq',$start=1)
|
||||
{
|
||||
$seqtab='adodb_seq';
|
||||
if( $this->odbc_driver == ODB_DRIVER_FOXPRO) {
|
||||
$path = @odbtp_get_attr( ODB_ATTR_DATABASENAME, $this->_connectionID );
|
||||
//if using vfp dbc file
|
||||
if( !strcasecmp(strrchr($path, '.'), '.dbc') )
|
||||
$path = substr($path,0,strrpos($path,'\/'));
|
||||
$seqtab = $path . '/' . $seqtab;
|
||||
}
|
||||
$MAXLOOPS = 100;
|
||||
while (--$MAXLOOPS>=0) {
|
||||
$num = $this->GetOne("select seq_value from adodb_seq where seq_name='$seq'");
|
||||
if ($num === false) {
|
||||
//verify if abodb_seq table exist
|
||||
$ok = $this->GetOne("select seq_value from adodb_seq ");
|
||||
if(!$ok) {
|
||||
//creating the sequence table adodb_seq
|
||||
$this->Execute(sprintf($this->_genSeqSQL ,$seqtab));
|
||||
}
|
||||
$start -= 1;
|
||||
$num = '0';
|
||||
$ok = $this->Execute("insert into adodb_seq values('$seq',$start)");
|
||||
if (!$ok) return false;
|
||||
}
|
||||
$ok = $this->Execute("update adodb_seq set seq_value=seq_value+1 where seq_name='$seq'");
|
||||
if($ok) {
|
||||
$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;
|
||||
}
|
||||
|
||||
//example for $UserOrDSN
|
||||
//for visual fox : DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBF;SOURCEDB=c:\YourDbfFileDir;EXCLUSIVE=NO;
|
||||
//for visual fox dbc: DRIVER={Microsoft Visual FoxPro Driver};SOURCETYPE=DBC;SOURCEDB=c:\YourDbcFileDir\mydb.dbc;EXCLUSIVE=NO;
|
||||
//for access : DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\path_to_access_db\base_test.mdb;UID=root;PWD=;
|
||||
//for mssql : DRIVER={SQL Server};SERVER=myserver;UID=myuid;PWD=mypwd;DATABASE=OdbtpTest;
|
||||
//if uid & pwd can be separate
|
||||
function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
|
||||
{
|
||||
$this->_connectionID = odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase);
|
||||
if ($this->_connectionID === false) {
|
||||
$this->_errorMsg = $this->ErrorMsg() ;
|
||||
return false;
|
||||
}
|
||||
|
||||
odbtp_convert_datetime($this->_connectionID,true);
|
||||
|
||||
if ($this->_dontPoolDBC) {
|
||||
if (function_exists('odbtp_dont_pool_dbc'))
|
||||
@odbtp_dont_pool_dbc($this->_connectionID);
|
||||
}
|
||||
else {
|
||||
$this->_dontPoolDBC = true;
|
||||
}
|
||||
$this->odbc_driver = @odbtp_get_attr(ODB_ATTR_DRIVER, $this->_connectionID);
|
||||
$dbms = strtolower(@odbtp_get_attr(ODB_ATTR_DBMSNAME, $this->_connectionID));
|
||||
$this->odbc_name = $dbms;
|
||||
|
||||
// Account for inconsistent DBMS names
|
||||
if( $this->odbc_driver == ODB_DRIVER_ORACLE )
|
||||
$dbms = 'oracle';
|
||||
else if( $this->odbc_driver == ODB_DRIVER_SYBASE )
|
||||
$dbms = 'sybase';
|
||||
|
||||
// Set DBMS specific attributes
|
||||
switch( $dbms ) {
|
||||
case 'microsoft sql server':
|
||||
$this->databaseType = 'odbtp_mssql';
|
||||
$this->fmtDate = "'Y-m-d'";
|
||||
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||
$this->sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||
$this->sysTimeStamp = 'GetDate()';
|
||||
$this->ansiOuter = true;
|
||||
$this->leftOuter = '*=';
|
||||
$this->rightOuter = '=*';
|
||||
$this->hasTop = 'top';
|
||||
$this->hasInsertID = true;
|
||||
$this->hasTransactions = true;
|
||||
$this->_bindInputArray = true;
|
||||
$this->_canSelectDb = true;
|
||||
$this->substr = "substring";
|
||||
$this->length = 'len';
|
||||
$this->identitySQL = 'select SCOPE_IDENTITY()';
|
||||
$this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'";
|
||||
$this->_canPrepareSP = true;
|
||||
break;
|
||||
case 'access':
|
||||
$this->databaseType = 'odbtp_access';
|
||||
$this->fmtDate = "#Y-m-d#";
|
||||
$this->fmtTimeStamp = "#Y-m-d h:i:sA#";
|
||||
$this->sysDate = "FORMAT(NOW,'yyyy-mm-dd')";
|
||||
$this->sysTimeStamp = 'NOW';
|
||||
$this->hasTop = 'top';
|
||||
$this->hasTransactions = false;
|
||||
$this->_canPrepareSP = true; // For MS Access only.
|
||||
break;
|
||||
case 'visual foxpro':
|
||||
$this->databaseType = 'odbtp_vfp';
|
||||
$this->fmtDate = "{^Y-m-d}";
|
||||
$this->fmtTimeStamp = "{^Y-m-d, h:i:sA}";
|
||||
$this->sysDate = 'date()';
|
||||
$this->sysTimeStamp = 'datetime()';
|
||||
$this->ansiOuter = true;
|
||||
$this->hasTop = 'top';
|
||||
$this->hasTransactions = false;
|
||||
$this->replaceQuote = "'+chr(39)+'";
|
||||
$this->true = '.T.';
|
||||
$this->false = '.F.';
|
||||
|
||||
break;
|
||||
case 'oracle':
|
||||
$this->databaseType = 'odbtp_oci8';
|
||||
$this->fmtDate = "'Y-m-d 00:00:00'";
|
||||
$this->fmtTimeStamp = "'Y-m-d h:i:sA'";
|
||||
$this->sysDate = 'TRUNC(SYSDATE)';
|
||||
$this->sysTimeStamp = 'SYSDATE';
|
||||
$this->hasTransactions = true;
|
||||
$this->_bindInputArray = true;
|
||||
$this->concat_operator = '||';
|
||||
break;
|
||||
case 'sybase':
|
||||
$this->databaseType = 'odbtp_sybase';
|
||||
$this->fmtDate = "'Y-m-d'";
|
||||
$this->fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
$this->sysDate = 'GetDate()';
|
||||
$this->sysTimeStamp = 'GetDate()';
|
||||
$this->leftOuter = '*=';
|
||||
$this->rightOuter = '=*';
|
||||
$this->hasInsertID = true;
|
||||
$this->hasTransactions = true;
|
||||
$this->identitySQL = 'select SCOPE_IDENTITY()';
|
||||
break;
|
||||
default:
|
||||
$this->databaseType = 'odbtp';
|
||||
if( @odbtp_get_attr(ODB_ATTR_TXNCAPABLE, $this->_connectionID) )
|
||||
$this->hasTransactions = true;
|
||||
else
|
||||
$this->hasTransactions = false;
|
||||
}
|
||||
@odbtp_set_attr(ODB_ATTR_FULLCOLINFO, TRUE, $this->_connectionID );
|
||||
|
||||
if ($this->_useUnicodeSQL )
|
||||
@odbtp_set_attr(ODB_ATTR_UNICODESQL, TRUE, $this->_connectionID);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function _pconnect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
|
||||
{
|
||||
$this->_dontPoolDBC = false;
|
||||
return $this->_connect($HostOrInterface, $UserOrDSN, $argPassword, $argDatabase);
|
||||
}
|
||||
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
if (!@odbtp_select_db($dbName, $this->_connectionID)) {
|
||||
return false;
|
||||
}
|
||||
$this->database = $dbName;
|
||||
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||
return true;
|
||||
}
|
||||
|
||||
function MetaTables($ttype='',$showSchema=false,$mask=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
|
||||
|
||||
$arr = $this->GetArray("||SQLTables||||$ttype");
|
||||
|
||||
if (isset($savefm)) $this->SetFetchMode($savefm);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if ($arr[$i][3] == 'SYSTEM TABLE' ) continue;
|
||||
if ($arr[$i][2])
|
||||
$arr2[] = $showSchema && $arr[$i][1]? $arr[$i][1].'.'.$arr[$i][2] : $arr[$i][2];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaColumns($table,$upper=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$schema = false;
|
||||
$this->_findschema($table,$schema);
|
||||
if ($upper) $table = strtoupper($table);
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savefm = $this->SetFetchMode(false);
|
||||
|
||||
$rs = $this->Execute( "||SQLColumns||$schema|$table" );
|
||||
|
||||
if (isset($savefm)) $this->SetFetchMode($savefm);
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
if (!$rs || $rs->EOF) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) {
|
||||
//print_r($rs->fields);
|
||||
if (strtoupper($rs->fields[2]) == $table) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[3];
|
||||
$fld->type = $rs->fields[5];
|
||||
$fld->max_length = $rs->fields[6];
|
||||
$fld->not_null = !empty($rs->fields[9]);
|
||||
$fld->scale = $rs->fields[7];
|
||||
if (isset($rs->fields[12])) // vfp does not have field 12
|
||||
if (!is_null($rs->fields[12])) {
|
||||
$fld->has_default = true;
|
||||
$fld->default_value = $rs->fields[12];
|
||||
}
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
} else if (!empty($retarr))
|
||||
break;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
function MetaPrimaryKeys($table, $owner='')
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$arr = $this->GetArray("||SQLPrimaryKeys||$owner|$table");
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
//print_r($arr);
|
||||
$arr2 = array();
|
||||
for ($i=0; $i < sizeof($arr); $i++) {
|
||||
if ($arr[$i][3]) $arr2[] = $arr[$i][3];
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function MetaForeignKeys($table, $owner='', $upper=false)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$savem = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
$constraints = $this->GetArray("||SQLForeignKeys|||||$owner|$table");
|
||||
$ADODB_FETCH_MODE = $savem;
|
||||
|
||||
$arr = false;
|
||||
foreach($constraints as $constr) {
|
||||
//print_r($constr);
|
||||
$arr[$constr[11]][$constr[2]][] = $constr[7].'='.$constr[3];
|
||||
}
|
||||
if (!$arr) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$arr2 = array();
|
||||
|
||||
foreach($arr as $k => $v) {
|
||||
foreach($v as $a => $b) {
|
||||
if ($upper) $a = strtoupper($a);
|
||||
$arr2[$a] = $b;
|
||||
}
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->autoCommit = false;
|
||||
if (defined('ODB_TXN_DEFAULT'))
|
||||
$txn = ODB_TXN_DEFAULT;
|
||||
else
|
||||
$txn = ODB_TXN_READUNCOMMITTED;
|
||||
$rs = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS,$txn,$this->_connectionID);
|
||||
if(!$rs) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->autoCommit = true;
|
||||
if( ($ret = @odbtp_commit($this->_connectionID)) )
|
||||
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->autoCommit = true;
|
||||
if( ($ret = @odbtp_rollback($this->_connectionID)) )
|
||||
$ret = @odbtp_set_attr(ODB_ATTR_TRANSACTIONS, ODB_TXN_NONE, $this->_connectionID);//set transaction off
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||
{
|
||||
// TOP requires ORDER BY for Visual FoxPro
|
||||
if( $this->odbc_driver == ODB_DRIVER_FOXPRO ) {
|
||||
if (!preg_match('/ORDER[ \t\r\n]+BY/is',$sql)) $sql .= ' ORDER BY 1';
|
||||
}
|
||||
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
if (! $this->_bindInputArray) return $sql; // no binding
|
||||
|
||||
$this->_errorMsg = false;
|
||||
$this->_errorCode = false;
|
||||
|
||||
$stmt = @odbtp_prepare($sql,$this->_connectionID);
|
||||
if (!$stmt) {
|
||||
// print "Prepare Error for ($sql) ".$this->ErrorMsg()."<br>";
|
||||
return $sql;
|
||||
}
|
||||
return array($sql,$stmt,false);
|
||||
}
|
||||
|
||||
function PrepareSP($sql)
|
||||
{
|
||||
if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures
|
||||
|
||||
$this->_errorMsg = false;
|
||||
$this->_errorCode = false;
|
||||
|
||||
$stmt = @odbtp_prepare_proc($sql,$this->_connectionID);
|
||||
if (!$stmt) return false;
|
||||
return array($sql,$stmt);
|
||||
}
|
||||
|
||||
/*
|
||||
Usage:
|
||||
$stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group
|
||||
|
||||
# note that the parameter does not have @ in front!
|
||||
$db->Parameter($stmt,$id,'myid');
|
||||
$db->Parameter($stmt,$group,'group',false,64);
|
||||
$db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY);
|
||||
$db->Execute($stmt);
|
||||
|
||||
@param $stmt Statement returned by Prepare() or PrepareSP().
|
||||
@param $var PHP variable to bind to. Can set to null (for isNull support).
|
||||
@param $name Name of stored procedure variable name to bind to.
|
||||
@param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp.
|
||||
@param [$maxLen] Holds an maximum length of the variable.
|
||||
@param [$type] The data type of $var. Legal values depend on driver.
|
||||
|
||||
See odbtp_attach_param documentation at http://odbtp.sourceforge.net.
|
||||
*/
|
||||
function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0)
|
||||
{
|
||||
if ( $this->odbc_driver == ODB_DRIVER_JET ) {
|
||||
$name = '['.$name.']';
|
||||
if( !$type && $this->_useUnicodeSQL
|
||||
&& @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR )
|
||||
{
|
||||
$type = ODB_WCHAR;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$name = '@'.$name;
|
||||
}
|
||||
return @odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen);
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
|
||||
function UpdateBlob($table,$column,$val,$where,$blobtype='image')
|
||||
{
|
||||
$sql = "UPDATE $table SET $column = ? WHERE $where";
|
||||
if( !($stmt = @odbtp_prepare($sql, $this->_connectionID)) )
|
||||
return false;
|
||||
if( !@odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) )
|
||||
return false;
|
||||
if( !@odbtp_set( $stmt, 1, $val ) )
|
||||
return false;
|
||||
return @odbtp_execute( $stmt ) != false;
|
||||
}
|
||||
|
||||
function MetaIndexes($table,$primary=false, $owner=false)
|
||||
{
|
||||
switch ( $this->odbc_driver) {
|
||||
case ODB_DRIVER_MSSQL:
|
||||
return $this->MetaIndexes_mssql($table, $primary);
|
||||
default:
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
function MetaIndexes_mssql($table,$primary=false)
|
||||
{
|
||||
$table = strtolower($this->qstr($table));
|
||||
|
||||
$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,
|
||||
CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
|
||||
CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
|
||||
FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id
|
||||
INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid
|
||||
INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
|
||||
WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND lower(O.Name) = $table
|
||||
ORDER BY O.name, I.Name, K.keyno";
|
||||
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!is_object($rs)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$indexes = array();
|
||||
while ($row = $rs->FetchRow()) {
|
||||
if ($primary && !$row[5]) continue;
|
||||
|
||||
$indexes[$row[0]]['unique'] = $row[6];
|
||||
$indexes[$row[0]]['columns'][] = $row[1];
|
||||
}
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
function IfNull( $field, $ifNull )
|
||||
{
|
||||
switch( $this->odbc_driver ) {
|
||||
case ODB_DRIVER_MSSQL:
|
||||
return " ISNULL($field, $ifNull) ";
|
||||
case ODB_DRIVER_JET:
|
||||
return " IIF(IsNull($field), $ifNull, $field) ";
|
||||
}
|
||||
return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
|
||||
}
|
||||
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
global $php_errormsg;
|
||||
|
||||
$this->_errorMsg = false;
|
||||
$this->_errorCode = false;
|
||||
|
||||
if ($inputarr) {
|
||||
if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
} else {
|
||||
$stmtid = @odbtp_prepare($sql,$this->_connectionID);
|
||||
if ($stmtid == false) {
|
||||
$this->_errorMsg = $php_errormsg;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$num_params = @odbtp_num_params( $stmtid );
|
||||
/*
|
||||
for( $param = 1; $param <= $num_params; $param++ ) {
|
||||
@odbtp_input( $stmtid, $param );
|
||||
@odbtp_set( $stmtid, $param, $inputarr[$param-1] );
|
||||
}*/
|
||||
|
||||
$param = 1;
|
||||
foreach($inputarr as $v) {
|
||||
@odbtp_input( $stmtid, $param );
|
||||
@odbtp_set( $stmtid, $param, $v );
|
||||
$param += 1;
|
||||
if ($param > $num_params) break;
|
||||
}
|
||||
|
||||
if (!@odbtp_execute($stmtid) ) {
|
||||
return false;
|
||||
}
|
||||
} else if (is_array($sql)) {
|
||||
$stmtid = $sql[1];
|
||||
if (!@odbtp_execute($stmtid)) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
$stmtid = odbtp_query($sql,$this->_connectionID);
|
||||
}
|
||||
$this->_lastAffectedRows = 0;
|
||||
if ($stmtid) {
|
||||
$this->_lastAffectedRows = @odbtp_affected_rows($stmtid);
|
||||
}
|
||||
return $stmtid;
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
$ret = @odbtp_close($this->_connectionID);
|
||||
$this->_connectionID = false;
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp extends ADORecordSet {
|
||||
|
||||
var $databaseType = 'odbtp';
|
||||
var $canSeek = true;
|
||||
|
||||
function ADORecordSet_odbtp($queryID,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
$this->ADORecordSet($queryID);
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
$this->_numOfFields = @odbtp_num_fields($this->_queryID);
|
||||
if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID)))
|
||||
$this->_numOfRows = -1;
|
||||
|
||||
if (!$this->connection->_useUnicodeSQL) return;
|
||||
|
||||
if ($this->connection->odbc_driver == ODB_DRIVER_JET) {
|
||||
if (!@odbtp_get_attr(ODB_ATTR_MAPCHARTOWCHAR,
|
||||
$this->connection->_connectionID))
|
||||
{
|
||||
for ($f = 0; $f < $this->_numOfFields; $f++) {
|
||||
if (@odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR)
|
||||
@odbtp_bind_field($this->_queryID, $f, ODB_WCHAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function FetchField($fieldOffset = 0)
|
||||
{
|
||||
$off=$fieldOffset; // offsets begin at 0
|
||||
$o= new ADOFieldObject();
|
||||
$o->name = @odbtp_field_name($this->_queryID,$off);
|
||||
$o->type = @odbtp_field_type($this->_queryID,$off);
|
||||
$o->max_length = @odbtp_field_length($this->_queryID,$off);
|
||||
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||
return $o;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return @odbtp_data_seek($this->_queryID, $row);
|
||||
}
|
||||
|
||||
function fields($colname)
|
||||
{
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
|
||||
|
||||
if (!$this->bind) {
|
||||
$this->bind = array();
|
||||
for ($i=0; $i < $this->_numOfFields; $i++) {
|
||||
$name = @odbtp_field_name( $this->_queryID, $i );
|
||||
$this->bind[strtoupper($name)] = $i;
|
||||
}
|
||||
}
|
||||
return $this->fields[$this->bind[strtoupper($colname)]];
|
||||
}
|
||||
|
||||
function _fetch_odbtp($type=0)
|
||||
{
|
||||
switch ($this->fetchMode) {
|
||||
case ADODB_FETCH_NUM:
|
||||
$this->fields = @odbtp_fetch_row($this->_queryID, $type);
|
||||
break;
|
||||
case ADODB_FETCH_ASSOC:
|
||||
$this->fields = @odbtp_fetch_assoc($this->_queryID, $type);
|
||||
break;
|
||||
default:
|
||||
$this->fields = @odbtp_fetch_array($this->_queryID, $type);
|
||||
}
|
||||
if ($this->databaseType = 'odbtp_vfp') {
|
||||
if ($this->fields)
|
||||
foreach($this->fields as $k => $v) {
|
||||
if (strncmp($v,'1899-12-30',10) == 0) $this->fields[$k] = '';
|
||||
}
|
||||
}
|
||||
return is_array($this->fields);
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
return $this->_fetch_odbtp();
|
||||
}
|
||||
|
||||
function MoveFirst()
|
||||
{
|
||||
if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false;
|
||||
$this->EOF = false;
|
||||
$this->_currentRow = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
function MoveLast()
|
||||
{
|
||||
if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false;
|
||||
$this->EOF = false;
|
||||
$this->_currentRow = $this->_numOfRows - 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
function NextRecordSet()
|
||||
{
|
||||
if (!@odbtp_next_result($this->_queryID)) return false;
|
||||
$this->_inited = false;
|
||||
$this->bind = false;
|
||||
$this->_currentRow = -1;
|
||||
$this->Init();
|
||||
return true;
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
return @odbtp_free_query($this->_queryID);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp_mssql extends ADORecordSet_odbtp {
|
||||
|
||||
var $databaseType = 'odbtp_mssql';
|
||||
|
||||
function ADORecordSet_odbtp_mssql($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbtp($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp_access extends ADORecordSet_odbtp {
|
||||
|
||||
var $databaseType = 'odbtp_access';
|
||||
|
||||
function ADORecordSet_odbtp_access($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbtp($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp_vfp extends ADORecordSet_odbtp {
|
||||
|
||||
var $databaseType = 'odbtp_vfp';
|
||||
|
||||
function ADORecordSet_odbtp_vfp($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbtp($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp_oci8 extends ADORecordSet_odbtp {
|
||||
|
||||
var $databaseType = 'odbtp_oci8';
|
||||
|
||||
function ADORecordSet_odbtp_oci8($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbtp($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_odbtp_sybase extends ADORecordSet_odbtp {
|
||||
|
||||
var $databaseType = 'odbtp_sybase';
|
||||
|
||||
function ADORecordSet_odbtp_sybase($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbtp($id,$mode);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
*/
|
||||
|
||||
// Code contributed by "Robert Twitty" <rtwitty#neutron.ushmm.org>
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
/*
|
||||
Because the ODBTP server sends and reads UNICODE text data using UTF-8
|
||||
encoding, the following HTML meta tag must be included within the HTML
|
||||
head section of every HTML form and script page:
|
||||
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
Also, all SQL query strings must be submitted as UTF-8 encoded text.
|
||||
*/
|
||||
|
||||
if (!defined('_ADODB_ODBTP_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbtp.inc.php");
|
||||
}
|
||||
|
||||
class ADODB_odbtp_unicode extends ADODB_odbtp {
|
||||
var $databaseType = 'odbtp';
|
||||
var $_useUnicodeSQL = true;
|
||||
|
||||
function ADODB_odbtp_unicode()
|
||||
{
|
||||
$this->ADODB_odbtp();
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,342 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.sourceforge.net
|
||||
|
||||
Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7.
|
||||
|
||||
If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB_oracle extends ADOConnection {
|
||||
var $databaseType = "oracle";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $concat_operator='||';
|
||||
var $_curs;
|
||||
var $_initdate = true; // init date to YYYY-MM-DD
|
||||
var $metaTablesSQL = 'select table_name from cat';
|
||||
var $metaColumnsSQL = "select cname,coltype,width from col where tname='%s' order by colno";
|
||||
var $sysDate = "TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD')";
|
||||
var $sysTimeStamp = 'SYSDATE';
|
||||
var $connectSID = true;
|
||||
|
||||
function ADODB_oracle()
|
||||
{
|
||||
}
|
||||
|
||||
// format and return date string in database date format
|
||||
function DBDate($d)
|
||||
{
|
||||
if (is_string($d)) $d = ADORecordSet::UnixDate($d);
|
||||
if (is_object($d)) $ds = $d->format($this->fmtDate);
|
||||
else $ds = adodb_date($this->fmtDate,$d);
|
||||
return 'TO_DATE('.$ds.",'YYYY-MM-DD')";
|
||||
}
|
||||
|
||||
// format and return date string in database timestamp format
|
||||
function DBTimeStamp($ts)
|
||||
{
|
||||
|
||||
if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
|
||||
if (is_object($ts)) $ds = $ts->format($this->fmtDate);
|
||||
else $ds = adodb_date($this->fmtTimeStamp,$ts);
|
||||
return 'TO_DATE('.$ds.",'RRRR-MM-DD, HH:MI:SS AM')";
|
||||
}
|
||||
|
||||
|
||||
function BindDate($d)
|
||||
{
|
||||
$d = ADOConnection::DBDate($d);
|
||||
if (strncmp($d,"'",1)) return $d;
|
||||
|
||||
return substr($d,1,strlen($d)-2);
|
||||
}
|
||||
|
||||
function BindTimeStamp($d)
|
||||
{
|
||||
$d = ADOConnection::DBTimeStamp($d);
|
||||
if (strncmp($d,"'",1)) return $d;
|
||||
|
||||
return substr($d,1,strlen($d)-2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
$this->autoCommit = false;
|
||||
ora_commitoff($this->_connectionID);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
$ret = ora_commit($this->_connectionID);
|
||||
ora_commiton($this->_connectionID);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
$ret = ora_rollback($this->_connectionID);
|
||||
ora_commiton($this->_connectionID);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
/* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_errorMsg !== false) return $this->_errorMsg;
|
||||
|
||||
if (is_resource($this->_curs)) $this->_errorMsg = @ora_error($this->_curs);
|
||||
if (empty($this->_errorMsg)) $this->_errorMsg = @ora_error($this->_connectionID);
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_errorCode !== false) return $this->_errorCode;
|
||||
|
||||
if (is_resource($this->_curs)) $this->_errorCode = @ora_errorcode($this->_curs);
|
||||
if (empty($this->_errorCode)) $this->_errorCode = @ora_errorcode($this->_connectionID);
|
||||
return $this->_errorCode;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
|
||||
{
|
||||
if (!function_exists('ora_plogon')) return null;
|
||||
|
||||
// <G. Giunta 2003/03/03/> Reset error messages before connecting
|
||||
$this->_errorMsg = false;
|
||||
$this->_errorCode = false;
|
||||
|
||||
// G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set
|
||||
// the oracle home to the host name of remote DB?
|
||||
// if ($argHostname) putenv("ORACLE_HOME=$argHostname");
|
||||
|
||||
if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen <jorma.tuomainen@ppoy.fi>
|
||||
if (empty($argDatabasename)) $argDatabasename = $argHostname;
|
||||
else {
|
||||
if(strpos($argHostname,":")) {
|
||||
$argHostinfo=explode(":",$argHostname);
|
||||
$argHostname=$argHostinfo[0];
|
||||
$argHostport=$argHostinfo[1];
|
||||
} else {
|
||||
$argHostport="1521";
|
||||
}
|
||||
|
||||
|
||||
if ($this->connectSID) {
|
||||
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
|
||||
.")(PORT=$argHostport))(CONNECT_DATA=(SID=$argDatabasename)))";
|
||||
} else
|
||||
$argDatabasename="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=".$argHostname
|
||||
.")(PORT=$argHostport))(CONNECT_DATA=(SERVICE_NAME=$argDatabasename)))";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($argDatabasename) $argUsername .= "@$argDatabasename";
|
||||
|
||||
//if ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
|
||||
if ($mode == 1)
|
||||
$this->_connectionID = ora_plogon($argUsername,$argPassword);
|
||||
else
|
||||
$this->_connectionID = ora_logon($argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($this->autoCommit) ora_commiton($this->_connectionID);
|
||||
if ($this->_initdate) {
|
||||
$rs = $this->_query("ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD'");
|
||||
if ($rs) ora_close($rs);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, 1);
|
||||
}
|
||||
|
||||
|
||||
// returns query ID if successful, otherwise false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
// <G. Giunta 2003/03/03/> Reset error messages before executing
|
||||
$this->_errorMsg = false;
|
||||
$this->_errorCode = false;
|
||||
|
||||
$curs = ora_open($this->_connectionID);
|
||||
|
||||
if ($curs === false) return false;
|
||||
$this->_curs = $curs;
|
||||
if (!ora_parse($curs,$sql)) return false;
|
||||
if (ora_exec($curs)) return $curs;
|
||||
// <G. Giunta 2004/03/03> before we close the cursor, we have to store the error message
|
||||
// that we can obtain ONLY from the cursor (and not from the connection)
|
||||
$this->_errorCode = @ora_errorcode($curs);
|
||||
$this->_errorMsg = @ora_error($curs);
|
||||
// </G. Giunta 2004/03/03>
|
||||
@ora_close($curs);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
return @ora_logoff($this->_connectionID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_oracle extends ADORecordSet {
|
||||
|
||||
var $databaseType = "oracle";
|
||||
var $bind = false;
|
||||
|
||||
function ADORecordset_oracle($queryID,$mode=false)
|
||||
{
|
||||
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->fetchMode = $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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Returns: an object containing field information.
|
||||
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||
fetchField() is retrieved. */
|
||||
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
$fld = new ADOFieldObject;
|
||||
$fld->name = ora_columnname($this->_queryID, $fieldOffset);
|
||||
$fld->type = ora_columntype($this->_queryID, $fieldOffset);
|
||||
$fld->max_length = ora_columnsize($this->_queryID, $fieldOffset);
|
||||
return $fld;
|
||||
}
|
||||
|
||||
/* Use associative array to get fields array */
|
||||
function 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 _initrs()
|
||||
{
|
||||
$this->_numOfRows = -1;
|
||||
$this->_numOfFields = @ora_numcols($this->_queryID);
|
||||
}
|
||||
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch($ignore_fields=false) {
|
||||
// should remove call by reference, but ora_fetch_into requires it in 4.0.3pl1
|
||||
if ($this->fetchMode & ADODB_FETCH_ASSOC)
|
||||
return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS|ORA_FETCHINTO_ASSOC);
|
||||
else
|
||||
return @ora_fetch_into($this->_queryID,$this->fields,ORA_FETCHINTO_NULLS);
|
||||
}
|
||||
|
||||
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||
|
||||
function _close()
|
||||
{
|
||||
return @ora_close($this->_queryID);
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
|
||||
switch (strtoupper($t)) {
|
||||
case 'VARCHAR':
|
||||
case 'VARCHAR2':
|
||||
case 'CHAR':
|
||||
case 'VARBINARY':
|
||||
case 'BINARY':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
case 'LONG':
|
||||
case 'LONG VARCHAR':
|
||||
case 'CLOB':
|
||||
return 'X';
|
||||
case 'LONG RAW':
|
||||
case 'LONG VARBINARY':
|
||||
case 'BLOB':
|
||||
return 'B';
|
||||
|
||||
case 'DATE': return 'D';
|
||||
|
||||
//case 'T': return 'T';
|
||||
|
||||
case 'BIT': return 'L';
|
||||
case 'INT':
|
||||
case 'SMALLINT':
|
||||
case 'INTEGER': return 'I';
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,626 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Requires ODBC. Works on Windows and Unix.
|
||||
|
||||
Problems:
|
||||
Where is float/decimal type in pdo_param_type
|
||||
LOB handling for CLOB/BLOB differs significantly
|
||||
*/
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
|
||||
/*
|
||||
enum pdo_param_type {
|
||||
PDO::PARAM_NULL, 0
|
||||
|
||||
/* int as in long (the php native int type).
|
||||
* If you mark a column as an int, PDO expects get_col to return
|
||||
* a pointer to a long
|
||||
PDO::PARAM_INT, 1
|
||||
|
||||
/* get_col ptr should point to start of the string buffer
|
||||
PDO::PARAM_STR, 2
|
||||
|
||||
/* get_col: when len is 0 ptr should point to a php_stream *,
|
||||
* otherwise it should behave like a string. Indicate a NULL field
|
||||
* value by setting the ptr to NULL
|
||||
PDO::PARAM_LOB, 3
|
||||
|
||||
/* get_col: will expect the ptr to point to a new PDOStatement object handle,
|
||||
* but this isn't wired up yet
|
||||
PDO::PARAM_STMT, 4 /* hierarchical result set
|
||||
|
||||
/* get_col ptr should point to a zend_bool
|
||||
PDO::PARAM_BOOL, 5
|
||||
|
||||
|
||||
/* magic flag to denote a parameter as being input/output
|
||||
PDO::PARAM_INPUT_OUTPUT = 0x80000000
|
||||
};
|
||||
*/
|
||||
|
||||
function adodb_pdo_type($t)
|
||||
{
|
||||
switch($t) {
|
||||
case 2: return 'VARCHAR';
|
||||
case 3: return 'BLOB';
|
||||
default: return 'NUMERIC';
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class ADODB_pdo extends ADOConnection {
|
||||
var $databaseType = "pdo";
|
||||
var $dataProvider = "pdo";
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $hasAffectedRows = true;
|
||||
var $_bindInputArray = true;
|
||||
var $_genSeqSQL = "create table %s (id integer)";
|
||||
var $_autocommit = true;
|
||||
var $_haserrorfunctions = true;
|
||||
var $_lastAffectedRows = 0;
|
||||
|
||||
var $_errormsg = false;
|
||||
var $_errorno = false;
|
||||
|
||||
var $dsnType = '';
|
||||
var $stmt = false;
|
||||
|
||||
function ADODB_pdo()
|
||||
{
|
||||
}
|
||||
|
||||
function _UpdatePDO()
|
||||
{
|
||||
$d = $this->_driver;
|
||||
$this->fmtDate = $d->fmtDate;
|
||||
$this->fmtTimeStamp = $d->fmtTimeStamp;
|
||||
$this->replaceQuote = $d->replaceQuote;
|
||||
$this->sysDate = $d->sysDate;
|
||||
$this->sysTimeStamp = $d->sysTimeStamp;
|
||||
$this->random = $d->random;
|
||||
$this->concat_operator = $d->concat_operator;
|
||||
$this->nameQuote = $d->nameQuote;
|
||||
|
||||
$this->hasGenID = $d->hasGenID;
|
||||
$this->_genIDSQL = $d->_genIDSQL;
|
||||
$this->_genSeqSQL = $d->_genSeqSQL;
|
||||
$this->_dropSeqSQL = $d->_dropSeqSQL;
|
||||
|
||||
$d->_init($this);
|
||||
}
|
||||
|
||||
function Time()
|
||||
{
|
||||
if (!empty($this->_driver->_hasdual)) $sql = "select $this->sysTimeStamp from dual";
|
||||
else $sql = "select $this->sysTimeStamp";
|
||||
|
||||
$rs = $this->_Execute($sql);
|
||||
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false)
|
||||
{
|
||||
$at = strpos($argDSN,':');
|
||||
$this->dsnType = substr($argDSN,0,$at);
|
||||
|
||||
if ($argDatabasename) {
|
||||
$argDSN .= ';dbname='.$argDatabasename;
|
||||
}
|
||||
try {
|
||||
$this->_connectionID = new PDO($argDSN, $argUsername, $argPassword);
|
||||
} catch (Exception $e) {
|
||||
$this->_connectionID = false;
|
||||
$this->_errorno = -1;
|
||||
//var_dump($e);
|
||||
$this->_errormsg = 'Connection attempt failed: '.$e->getMessage();
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->_connectionID) {
|
||||
switch(ADODB_ASSOC_CASE){
|
||||
case 0: $m = PDO::CASE_LOWER; break;
|
||||
case 1: $m = PDO::CASE_UPPER; break;
|
||||
default:
|
||||
case 2: $m = PDO::CASE_NATURAL; break;
|
||||
}
|
||||
|
||||
//$this->_connectionID->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT );
|
||||
$this->_connectionID->setAttribute(PDO::ATTR_CASE,$m);
|
||||
|
||||
$class = 'ADODB_pdo_'.$this->dsnType;
|
||||
//$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||
switch($this->dsnType) {
|
||||
case 'oci':
|
||||
case 'mysql':
|
||||
case 'pgsql':
|
||||
case 'mssql':
|
||||
case 'sqlite':
|
||||
include_once(ADODB_DIR.'/drivers/adodb-pdo_'.$this->dsnType.'.inc.php');
|
||||
break;
|
||||
}
|
||||
if (class_exists($class))
|
||||
$this->_driver = new $class();
|
||||
else
|
||||
$this->_driver = new ADODB_pdo_base();
|
||||
|
||||
$this->_driver->_connectionID = $this->_connectionID;
|
||||
$this->_UpdatePDO();
|
||||
return true;
|
||||
}
|
||||
$this->_driver = new ADODB_pdo_base();
|
||||
return false;
|
||||
}
|
||||
|
||||
function Concat()
|
||||
{
|
||||
$args = func_get_args();
|
||||
if(method_exists($this->_driver, 'Concat'))
|
||||
return call_user_func_array(array($this->_driver, 'Concat'), $args);
|
||||
|
||||
return call_user_func_array(array($this,'parent::Concat'), $args);
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
return $this->_connect($argDSN, $argUsername, $argPassword, $argDatabasename, true);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$save = $this->_driver->fetchMode;
|
||||
$this->_driver->fetchMode = $this->fetchMode;
|
||||
$this->_driver->debug = $this->debug;
|
||||
$ret = $this->_driver->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
$this->_driver->fetchMode = $save;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
return $this->_driver->ServerInfo();
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
return $this->_driver->MetaTables($ttype,$showSchema,$mask);
|
||||
}
|
||||
|
||||
function MetaColumns($table,$normalize=true)
|
||||
{
|
||||
return $this->_driver->MetaColumns($table,$normalize);
|
||||
}
|
||||
|
||||
function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
|
||||
{
|
||||
$obj = $stmt[1];
|
||||
if ($type) $obj->bindParam($name,$var,$type,$maxLen);
|
||||
else $obj->bindParam($name, $var);
|
||||
}
|
||||
|
||||
function OffsetDate($dayFraction,$date=false)
|
||||
{
|
||||
return $this->_driver->OffsetDate($dayFraction,$date);
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_errormsg !== false) return $this->_errormsg;
|
||||
if (!empty($this->_stmt)) $arr = $this->_stmt->errorInfo();
|
||||
else if (!empty($this->_connectionID)) $arr = $this->_connectionID->errorInfo();
|
||||
else return 'No Connection Established';
|
||||
|
||||
|
||||
if ($arr) {
|
||||
if (sizeof($arr)<2) return '';
|
||||
if ((integer)$arr[1]) return $arr[2];
|
||||
else return '';
|
||||
} else return '-1';
|
||||
}
|
||||
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_errorno !== false) return $this->_errorno;
|
||||
if (!empty($this->_stmt)) $err = $this->_stmt->errorCode();
|
||||
else if (!empty($this->_connectionID)) {
|
||||
$arr = $this->_connectionID->errorInfo();
|
||||
if (isset($arr[0])) $err = $arr[0];
|
||||
else $err = -1;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
if ($err == '00000') return 0; // allows empty check
|
||||
return $err;
|
||||
}
|
||||
|
||||
function SetTransactionMode($transaction_mode)
|
||||
{
|
||||
if(method_exists($this->_driver, 'SetTransactionMode'))
|
||||
return $this->_driver->SetTransactionMode($transaction_mode);
|
||||
|
||||
return parent::SetTransactionMode($seqname);
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
if(method_exists($this->_driver, 'BeginTrans'))
|
||||
return $this->_driver->BeginTrans();
|
||||
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
$this->_autocommit = false;
|
||||
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,false);
|
||||
return $this->_connectionID->beginTransaction();
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if(method_exists($this->_driver, 'CommitTrans'))
|
||||
return $this->_driver->CommitTrans($ok);
|
||||
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
|
||||
$ret = $this->_connectionID->commit();
|
||||
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if(method_exists($this->_driver, 'RollbackTrans'))
|
||||
return $this->_driver->RollbackTrans();
|
||||
|
||||
if (!$this->hasTransactions) return false;
|
||||
if ($this->transOff) return true;
|
||||
if ($this->transCnt) $this->transCnt -= 1;
|
||||
$this->_autocommit = true;
|
||||
|
||||
$ret = $this->_connectionID->rollback();
|
||||
$this->_connectionID->setAttribute(PDO::ATTR_AUTOCOMMIT,true);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function Prepare($sql)
|
||||
{
|
||||
$this->_stmt = $this->_connectionID->prepare($sql);
|
||||
if ($this->_stmt) return array($sql,$this->_stmt);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function PrepareStmt($sql)
|
||||
{
|
||||
$stmt = $this->_connectionID->prepare($sql);
|
||||
if (!$stmt) return false;
|
||||
$obj = new ADOPDOStatement($stmt,$this);
|
||||
return $obj;
|
||||
}
|
||||
|
||||
function CreateSequence($seqname='adodbseq',$startID=1)
|
||||
{
|
||||
if(method_exists($this->_driver, 'CreateSequence'))
|
||||
return $this->_driver->CreateSequence($seqname, $startID);
|
||||
|
||||
return parent::CreateSequence($seqname, $startID);
|
||||
}
|
||||
|
||||
function DropSequence($seqname='adodbseq')
|
||||
{
|
||||
if(method_exists($this->_driver, 'DropSequence'))
|
||||
return $this->_driver->DropSequence($seqname);
|
||||
|
||||
return parent::DropSequence($seqname);
|
||||
}
|
||||
|
||||
function GenID($seqname='adodbseq',$startID=1)
|
||||
{
|
||||
if(method_exists($this->_driver, 'GenID'))
|
||||
return $this->_driver->GenID($seqname, $startID);
|
||||
|
||||
return parent::GenID($seqname, $startID);
|
||||
}
|
||||
|
||||
|
||||
/* returns queryID or false */
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
if (is_array($sql)) {
|
||||
$stmt = $sql[1];
|
||||
} else {
|
||||
$stmt = $this->_connectionID->prepare($sql);
|
||||
}
|
||||
#adodb_backtrace();
|
||||
#var_dump($this->_bindInputArray);
|
||||
if ($stmt) {
|
||||
$this->_driver->debug = $this->debug;
|
||||
if ($inputarr) $ok = $stmt->execute($inputarr);
|
||||
else $ok = $stmt->execute();
|
||||
}
|
||||
|
||||
|
||||
$this->_errormsg = false;
|
||||
$this->_errorno = false;
|
||||
|
||||
if ($ok) {
|
||||
$this->_stmt = $stmt;
|
||||
return $stmt;
|
||||
}
|
||||
|
||||
if ($stmt) {
|
||||
|
||||
$arr = $stmt->errorinfo();
|
||||
if ((integer)$arr[1]) {
|
||||
$this->_errormsg = $arr[2];
|
||||
$this->_errorno = $arr[1];
|
||||
}
|
||||
|
||||
} else {
|
||||
$this->_errormsg = false;
|
||||
$this->_errorno = false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
$this->_stmt = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function _affectedrows()
|
||||
{
|
||||
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
|
||||
}
|
||||
|
||||
function _insertid()
|
||||
{
|
||||
return ($this->_connectionID) ? $this->_connectionID->lastInsertId() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
class ADODB_pdo_base extends ADODB_pdo {
|
||||
|
||||
var $sysDate = "'?'";
|
||||
var $sysTimeStamp = "'?'";
|
||||
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
$parentDriver->_bindInputArray = true;
|
||||
#$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
return ADOConnection::ServerInfo();
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaTables()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function MetaColumns()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ADOPDOStatement {
|
||||
|
||||
var $databaseType = "pdo";
|
||||
var $dataProvider = "pdo";
|
||||
var $_stmt;
|
||||
var $_connectionID;
|
||||
|
||||
function ADOPDOStatement($stmt,$connection)
|
||||
{
|
||||
$this->_stmt = $stmt;
|
||||
$this->_connectionID = $connection;
|
||||
}
|
||||
|
||||
function Execute($inputArr=false)
|
||||
{
|
||||
$savestmt = $this->_connectionID->_stmt;
|
||||
$rs = $this->_connectionID->Execute(array(false,$this->_stmt),$inputArr);
|
||||
$this->_connectionID->_stmt = $savestmt;
|
||||
return $rs;
|
||||
}
|
||||
|
||||
function InParameter(&$var,$name,$maxLen=4000,$type=false)
|
||||
{
|
||||
|
||||
if ($type) $this->_stmt->bindParam($name,$var,$type,$maxLen);
|
||||
else $this->_stmt->bindParam($name, $var);
|
||||
}
|
||||
|
||||
function Affected_Rows()
|
||||
{
|
||||
return ($this->_stmt) ? $this->_stmt->rowCount() : 0;
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_stmt) $arr = $this->_stmt->errorInfo();
|
||||
else $arr = $this->_connectionID->errorInfo();
|
||||
|
||||
if (is_array($arr)) {
|
||||
if ((integer) $arr[0] && isset($arr[2])) return $arr[2];
|
||||
else return '';
|
||||
} else return '-1';
|
||||
}
|
||||
|
||||
function NumCols()
|
||||
{
|
||||
return ($this->_stmt) ? $this->_stmt->columnCount() : 0;
|
||||
}
|
||||
|
||||
function ErrorNo()
|
||||
{
|
||||
if ($this->_stmt) return $this->_stmt->errorCode();
|
||||
else return $this->_connectionID->errorInfo();
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_pdo extends ADORecordSet {
|
||||
|
||||
var $bind = false;
|
||||
var $databaseType = "pdo";
|
||||
var $dataProvider = "pdo";
|
||||
|
||||
function ADORecordSet_pdo($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
$this->adodbFetchMode = $mode;
|
||||
switch($mode) {
|
||||
case ADODB_FETCH_NUM: $mode = PDO::FETCH_NUM; break;
|
||||
case ADODB_FETCH_ASSOC: $mode = PDO::FETCH_ASSOC; break;
|
||||
|
||||
case ADODB_FETCH_BOTH:
|
||||
default: $mode = PDO::FETCH_BOTH; break;
|
||||
}
|
||||
$this->fetchMode = $mode;
|
||||
|
||||
$this->_queryID = $id;
|
||||
$this->ADORecordSet($id);
|
||||
}
|
||||
|
||||
|
||||
function Init()
|
||||
{
|
||||
if ($this->_inited) return;
|
||||
$this->_inited = true;
|
||||
if ($this->_queryID) @$this->_initrs();
|
||||
else {
|
||||
$this->_numOfRows = 0;
|
||||
$this->_numOfFields = 0;
|
||||
}
|
||||
if ($this->_numOfRows != 0 && $this->_currentRow == -1) {
|
||||
$this->_currentRow = 0;
|
||||
if ($this->EOF = ($this->_fetch() === false)) {
|
||||
$this->_numOfRows = 0; // _numOfRows could be -1
|
||||
}
|
||||
} else {
|
||||
$this->EOF = true;
|
||||
}
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS) ? @$this->_queryID->rowCount() : -1;
|
||||
if (!$this->_numOfRows) $this->_numOfRows = -1;
|
||||
$this->_numOfFields = $this->_queryID->columnCount();
|
||||
}
|
||||
|
||||
// returns the field object
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
$off=$fieldOffset+1; // offsets begin at 1
|
||||
|
||||
$o= new ADOFieldObject();
|
||||
$arr = @$this->_queryID->getColumnMeta($fieldOffset);
|
||||
if (!$arr) {
|
||||
$o->name = 'bad getColumnMeta()';
|
||||
$o->max_length = -1;
|
||||
$o->type = 'VARCHAR';
|
||||
$o->precision = 0;
|
||||
# $false = false;
|
||||
return $o;
|
||||
}
|
||||
//adodb_pr($arr);
|
||||
$o->name = $arr['name'];
|
||||
if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type'];
|
||||
else $o->type = adodb_pdo_type($arr['pdo_type']);
|
||||
$o->max_length = $arr['len'];
|
||||
$o->precision = $arr['precision'];
|
||||
|
||||
if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
|
||||
else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
|
||||
return $o;
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
if (!$this->_queryID) return false;
|
||||
|
||||
$this->fields = $this->_queryID->fetch($this->fetchMode);
|
||||
return !empty($this->fields);
|
||||
}
|
||||
|
||||
function _close()
|
||||
{
|
||||
$this->_queryID = false;
|
||||
}
|
||||
|
||||
function Fields($colname)
|
||||
{
|
||||
if ($this->adodbFetchMode != ADODB_FETCH_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)]];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,61 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
*/
|
||||
|
||||
class ADODB_pdo_mssql extends ADODB_pdo {
|
||||
|
||||
var $hasTop = 'top';
|
||||
var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';
|
||||
var $sysTimeStamp = 'GetDate()';
|
||||
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
|
||||
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO mssql driver
|
||||
$parentDriver->_bindInputArray = false;
|
||||
$parentDriver->hasInsertID = true;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
return ADOConnection::ServerInfo();
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET TRANSACTION ISOLATION LEVEL READ COMMITTED');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function MetaColumns($table,$normalize=true)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,182 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
*/
|
||||
|
||||
class ADODB_pdo_mysql extends ADODB_pdo {
|
||||
var $metaTablesSQL = "SHOW TABLES";
|
||||
var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
|
||||
var $sysDate = 'CURDATE()';
|
||||
var $sysTimeStamp = 'NOW()';
|
||||
var $hasGenID = true;
|
||||
var $_genIDSQL = "update %s set id=LAST_INSERT_ID(id+1);";
|
||||
var $_dropSeqSQL = "drop table %s";
|
||||
var $fmtTimeStamp = "'Y-m-d, H:i:s'";
|
||||
var $nameQuote = '`';
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
|
||||
$parentDriver->hasTransactions = false;
|
||||
#$parentDriver->_bindInputArray = false;
|
||||
$parentDriver->hasInsertID = true;
|
||||
$parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
|
||||
}
|
||||
|
||||
// dayFraction is a day in floating point
|
||||
function OffsetDate($dayFraction,$date=false)
|
||||
{
|
||||
if (!$date) $date = $this->sysDate;
|
||||
|
||||
$fraction = $dayFraction * 24 * 3600;
|
||||
return $date . ' + INTERVAL ' . $fraction.' SECOND';
|
||||
|
||||
// return "from_unixtime(unix_timestamp($date)+$fraction)";
|
||||
}
|
||||
|
||||
function Concat()
|
||||
{
|
||||
$s = "";
|
||||
$arr = func_get_args();
|
||||
|
||||
// suggestion by andrew005#mnogo.ru
|
||||
$s = implode(',',$arr);
|
||||
if (strlen($s) > 0) return "CONCAT($s)"; return '';
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
$save = $this->metaTablesSQL;
|
||||
if ($showSchema && is_string($showSchema)) {
|
||||
$this->metaTablesSQL .= " from $showSchema";
|
||||
}
|
||||
|
||||
if ($mask) {
|
||||
$mask = $this->qstr($mask);
|
||||
$this->metaTablesSQL .= " like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
$this->metaTablesSQL = $save;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function SetTransactionMode( $transaction_mode )
|
||||
{
|
||||
$this->_transmode = $transaction_mode;
|
||||
if (empty($transaction_mode)) {
|
||||
$this->Execute('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ');
|
||||
return;
|
||||
}
|
||||
if (!stristr($transaction_mode,'isolation')) $transaction_mode = 'ISOLATION LEVEL '.$transaction_mode;
|
||||
$this->Execute("SET SESSION TRANSACTION ".$transaction_mode);
|
||||
}
|
||||
|
||||
function MetaColumns($table,$normalize=true)
|
||||
{
|
||||
$this->_findschema($table,$schema);
|
||||
if ($schema) {
|
||||
$dbName = $this->database;
|
||||
$this->SelectDB($schema);
|
||||
}
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||
|
||||
if ($schema) {
|
||||
$this->SelectDB($dbName);
|
||||
}
|
||||
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
if (!is_object($rs)) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF){
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$type = $rs->fields[1];
|
||||
|
||||
// split type into type(length):
|
||||
$fld->scale = null;
|
||||
if (preg_match("/^(.+)\((\d+),(\d+)/", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||
$fld->scale = is_numeric($query_array[3]) ? $query_array[3] : -1;
|
||||
} elseif (preg_match("/^(.+)\((\d+)/", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$fld->max_length = is_numeric($query_array[2]) ? $query_array[2] : -1;
|
||||
} elseif (preg_match("/^(enum)\((.*)\)$/i", $type, $query_array)) {
|
||||
$fld->type = $query_array[1];
|
||||
$arr = explode(",",$query_array[2]);
|
||||
$fld->enums = $arr;
|
||||
$zlen = max(array_map("strlen",$arr)) - 2; // PHP >= 4.0.6
|
||||
$fld->max_length = ($zlen > 0) ? $zlen : 1;
|
||||
} else {
|
||||
$fld->type = $type;
|
||||
$fld->max_length = -1;
|
||||
}
|
||||
$fld->not_null = ($rs->fields[2] != 'YES');
|
||||
$fld->primary_key = ($rs->fields[3] == 'PRI');
|
||||
$fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
|
||||
$fld->binary = (strpos($type,'blob') !== false);
|
||||
$fld->unsigned = (strpos($type,'unsigned') !== false);
|
||||
|
||||
if (!$fld->binary) {
|
||||
$d = $rs->fields[4];
|
||||
if ($d != '' && $d != 'NULL') {
|
||||
$fld->has_default = true;
|
||||
$fld->default_value = $d;
|
||||
} else {
|
||||
$fld->has_default = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($save == ADODB_FETCH_NUM) {
|
||||
$retarr[] = $fld;
|
||||
} else {
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
|
||||
// parameters use PostgreSQL convention, not MySQL
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0)
|
||||
{
|
||||
$offsetStr =($offset>=0) ? "$offset," : '';
|
||||
// jason judge, see http://phplens.com/lens/lensforum/msgs.php?id=9220
|
||||
if ($nrows < 0) $nrows = '18446744073709551615';
|
||||
|
||||
if ($secs)
|
||||
$rs = $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||
else
|
||||
$rs = $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
|
||||
return $rs;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,93 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
*/
|
||||
|
||||
class ADODB_pdo_oci extends ADODB_pdo_base {
|
||||
|
||||
var $concat_operator='||';
|
||||
var $sysDate = "TRUNC(SYSDATE)";
|
||||
var $sysTimeStamp = 'SYSDATE';
|
||||
var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
|
||||
var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
|
||||
var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')";
|
||||
var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno";
|
||||
|
||||
var $_initdate = true;
|
||||
var $_hasdual = true;
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
$parentDriver->_bindInputArray = true;
|
||||
$parentDriver->_nestedSQL = true;
|
||||
if ($this->_initdate) {
|
||||
$parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
|
||||
}
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
if ($mask) {
|
||||
$save = $this->metaTablesSQL;
|
||||
$mask = $this->qstr(strtoupper($mask));
|
||||
$this->metaTablesSQL .= " AND table_name like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
if ($mask) {
|
||||
$this->metaTablesSQL = $save;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaColumns($table,$normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$false = false;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
|
||||
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
if (!$rs) {
|
||||
return $false;
|
||||
}
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) { //print_r($rs->fields);
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$fld->type = $rs->fields[1];
|
||||
$fld->max_length = $rs->fields[2];
|
||||
$fld->scale = $rs->fields[3];
|
||||
if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) {
|
||||
$fld->type ='INT';
|
||||
$fld->max_length = $rs->fields[4];
|
||||
}
|
||||
$fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
|
||||
$fld->binary = (strpos($fld->type,'BLOB') !== false);
|
||||
$fld->default_value = $rs->fields[6];
|
||||
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||
else $retarr[strtoupper($fld->name)] = $fld;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
if (empty($retarr))
|
||||
return $false;
|
||||
else
|
||||
return $retarr;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,230 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 8.
|
||||
|
||||
*/
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
class ADODB_pdo_pgsql extends ADODB_pdo {
|
||||
var $metaDatabasesSQL = "select datname from pg_database where datname not in ('template0','template1') order by 1";
|
||||
var $metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
|
||||
and tablename not in ('sql_features', 'sql_implementation_info', 'sql_languages',
|
||||
'sql_packages', 'sql_sizing', 'sql_sizing_profiles')
|
||||
union
|
||||
select viewname,'V' from pg_views where viewname not like 'pg\_%'";
|
||||
//"select tablename from pg_tables where tablename not like 'pg_%' order by 1";
|
||||
var $isoDates = true; // accepts dates in ISO format
|
||||
var $sysDate = "CURRENT_DATE";
|
||||
var $sysTimeStamp = "CURRENT_TIMESTAMP";
|
||||
var $blobEncodeType = 'C';
|
||||
var $metaColumnsSQL = "SELECT a.attname,t.typname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,a.attnum
|
||||
FROM pg_class c, pg_attribute a,pg_type t
|
||||
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s')) and a.attname not like '....%%'
|
||||
AND a.attnum > 0 AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
|
||||
|
||||
// used when schema defined
|
||||
var $metaColumnsSQL1 = "SELECT a.attname, t.typname, a.attlen, a.atttypmod, a.attnotnull, a.atthasdef, a.attnum
|
||||
FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
|
||||
WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
|
||||
and c.relnamespace=n.oid and n.nspname='%s'
|
||||
and a.attname not like '....%%' AND a.attnum > 0
|
||||
AND a.atttypid = t.oid AND a.attrelid = c.oid ORDER BY a.attnum";
|
||||
|
||||
// get primary key etc -- from Freek Dijkstra
|
||||
var $metaKeySQL = "SELECT ic.relname AS index_name, a.attname AS column_name,i.indisunique AS unique_key, i.indisprimary AS primary_key
|
||||
FROM pg_class bc, pg_class ic, pg_index i, pg_attribute a WHERE bc.oid = i.indrelid AND ic.oid = i.indexrelid AND (i.indkey[0] = a.attnum OR i.indkey[1] = a.attnum OR i.indkey[2] = a.attnum OR i.indkey[3] = a.attnum OR i.indkey[4] = a.attnum OR i.indkey[5] = a.attnum OR i.indkey[6] = a.attnum OR i.indkey[7] = a.attnum) AND a.attrelid = bc.oid AND bc.relname = '%s'";
|
||||
|
||||
var $hasAffectedRows = true;
|
||||
var $hasLimit = false; // set to true for pgsql 7 only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
|
||||
// below suggested by Freek Dijkstra
|
||||
var $true = 't'; // string that represents TRUE for a database
|
||||
var $false = 'f'; // string that represents FALSE for a database
|
||||
var $fmtDate = "'Y-m-d'"; // used by DBDate() as the default date format used by the database
|
||||
var $fmtTimeStamp = "'Y-m-d G:i:s'"; // used by DBTimeStamp as the default timestamp fmt.
|
||||
var $hasMoveFirst = true;
|
||||
var $hasGenID = true;
|
||||
var $_genIDSQL = "SELECT NEXTVAL('%s')";
|
||||
var $_genSeqSQL = "CREATE SEQUENCE %s START %s";
|
||||
var $_dropSeqSQL = "DROP SEQUENCE %s";
|
||||
var $metaDefaultsSQL = "SELECT d.adnum as num, d.adsrc as def from pg_attrdef d, pg_class c where d.adrelid=c.oid and c.relname='%s' order by d.adnum";
|
||||
var $random = 'random()'; /// random function
|
||||
var $concat_operator='||';
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
|
||||
$parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
|
||||
$parentDriver->hasInsertID = true;
|
||||
$parentDriver->_nestedSQL = true;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$arr['description'] = ADOConnection::GetOne("select version()");
|
||||
$arr['version'] = ADOConnection::_findvers($arr['description']);
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
|
||||
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : '';
|
||||
if ($secs2cache)
|
||||
$rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||
else
|
||||
$rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
$info = $this->ServerInfo();
|
||||
if ($info['version'] >= 7.3) {
|
||||
$this->metaTablesSQL = "select tablename,'T' from pg_tables where tablename not like 'pg\_%'
|
||||
and schemaname not in ( 'pg_catalog','information_schema')
|
||||
union
|
||||
select viewname,'V' from pg_views where viewname not like 'pg\_%' and schemaname not in ( 'pg_catalog','information_schema') ";
|
||||
}
|
||||
if ($mask) {
|
||||
$save = $this->metaTablesSQL;
|
||||
$mask = $this->qstr(strtolower($mask));
|
||||
if ($info['version']>=7.3)
|
||||
$this->metaTablesSQL = "
|
||||
select tablename,'T' from pg_tables where tablename like $mask and schemaname not in ( 'pg_catalog','information_schema')
|
||||
union
|
||||
select viewname,'V' from pg_views where viewname like $mask and schemaname not in ( 'pg_catalog','information_schema') ";
|
||||
else
|
||||
$this->metaTablesSQL = "
|
||||
select tablename,'T' from pg_tables where tablename like $mask
|
||||
union
|
||||
select viewname,'V' from pg_views where viewname like $mask";
|
||||
}
|
||||
$ret = ADOConnection::MetaTables($ttype,$showSchema);
|
||||
|
||||
if ($mask) {
|
||||
$this->metaTablesSQL = $save;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function MetaColumns($table,$normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$schema = false;
|
||||
$this->_findschema($table,$schema);
|
||||
|
||||
if ($normalize) $table = strtolower($table);
|
||||
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
|
||||
|
||||
if ($schema) $rs = $this->Execute(sprintf($this->metaColumnsSQL1,$table,$table,$schema));
|
||||
else $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table,$table));
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if ($rs === false) {
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
if (!empty($this->metaKeySQL)) {
|
||||
// If we want the primary keys, we have to issue a separate query
|
||||
// Of course, a modified version of the metaColumnsSQL query using a
|
||||
// LEFT JOIN would have been much more elegant, but postgres does
|
||||
// not support OUTER JOINS. So here is the clumsy way.
|
||||
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||
|
||||
$rskey = $this->Execute(sprintf($this->metaKeySQL,($table)));
|
||||
// fetch all result in once for performance.
|
||||
$keys = $rskey->GetArray();
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
$rskey->Close();
|
||||
unset($rskey);
|
||||
}
|
||||
|
||||
$rsdefa = array();
|
||||
if (!empty($this->metaDefaultsSQL)) {
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||
$sql = sprintf($this->metaDefaultsSQL, ($table));
|
||||
$rsdef = $this->Execute($sql);
|
||||
if (isset($savem)) $this->SetFetchMode($savem);
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if ($rsdef) {
|
||||
while (!$rsdef->EOF) {
|
||||
$num = $rsdef->fields['num'];
|
||||
$s = $rsdef->fields['def'];
|
||||
if (strpos($s,'::')===false && substr($s, 0, 1) == "'") { /* quoted strings hack... for now... fixme */
|
||||
$s = substr($s, 1);
|
||||
$s = substr($s, 0, strlen($s) - 1);
|
||||
}
|
||||
|
||||
$rsdefa[$num] = $s;
|
||||
$rsdef->MoveNext();
|
||||
}
|
||||
} else {
|
||||
ADOConnection::outp( "==> SQL => " . $sql);
|
||||
}
|
||||
unset($rsdef);
|
||||
}
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->fields[0];
|
||||
$fld->type = $rs->fields[1];
|
||||
$fld->max_length = $rs->fields[2];
|
||||
if ($fld->max_length <= 0) $fld->max_length = $rs->fields[3]-4;
|
||||
if ($fld->max_length <= 0) $fld->max_length = -1;
|
||||
if ($fld->type == 'numeric') {
|
||||
$fld->scale = $fld->max_length & 0xFFFF;
|
||||
$fld->max_length >>= 16;
|
||||
}
|
||||
// dannym
|
||||
// 5 hasdefault; 6 num-of-column
|
||||
$fld->has_default = ($rs->fields[5] == 't');
|
||||
if ($fld->has_default) {
|
||||
$fld->default_value = $rsdefa[$rs->fields[6]];
|
||||
}
|
||||
|
||||
//Freek
|
||||
if ($rs->fields[4] == $this->true) {
|
||||
$fld->not_null = true;
|
||||
}
|
||||
|
||||
// Freek
|
||||
if (is_array($keys)) {
|
||||
foreach($keys as $key) {
|
||||
if ($fld->name == $key['column_name'] AND $key['primary_key'] == $this->true)
|
||||
$fld->primary_key = true;
|
||||
if ($fld->name == $key['column_name'] AND $key['unique_key'] == $this->true)
|
||||
$fld->unique = true; // What name is more compatible?
|
||||
}
|
||||
}
|
||||
|
||||
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
|
||||
else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
|
||||
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
if (empty($retarr)) {
|
||||
$false = false;
|
||||
return $false;
|
||||
} else return $retarr;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -1,204 +0,0 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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. See License.txt.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Thanks Diogo Toscano (diogo#scriptcase.net) for the code.
|
||||
And also Sid Dunayer [sdunayer#interserv.com] for extensive fixes.
|
||||
*/
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
class ADODB_pdo_sqlite extends ADODB_pdo {
|
||||
var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table'";
|
||||
var $sysDate = 'current_date';
|
||||
var $sysTimeStamp = 'current_timestamp';
|
||||
var $nameQuote = '`';
|
||||
var $replaceQuote = "''";
|
||||
var $hasGenID = true;
|
||||
var $_genIDSQL = "UPDATE %s SET id=id+1 WHERE id=%s";
|
||||
var $_genSeqSQL = "CREATE TABLE %s (id integer)";
|
||||
var $_genSeqCountSQL = 'SELECT COUNT(*) FROM %s';
|
||||
var $_genSeq2SQL = 'INSERT INTO %s VALUES(%s)';
|
||||
var $_dropSeqSQL = 'DROP TABLE %s';
|
||||
var $concat_operator = '||';
|
||||
var $pdoDriver = false;
|
||||
var $random='abs(random())';
|
||||
|
||||
function _init($parentDriver)
|
||||
{
|
||||
$this->pdoDriver = $parentDriver;
|
||||
$parentDriver->_bindInputArray = true;
|
||||
$parentDriver->hasTransactions = false; // // should be set to false because of PDO SQLite driver not supporting changing autocommit mode
|
||||
$parentDriver->hasInsertID = true;
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
@($ver = array_pop($parent->GetCol("SELECT sqlite_version()")));
|
||||
@($enc = array_pop($parent->GetCol("PRAGMA encoding")));
|
||||
|
||||
$arr['version'] = $ver;
|
||||
$arr['description'] = 'SQLite ';
|
||||
$arr['encoding'] = $enc;
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
$offsetStr = ($offset >= 0) ? " OFFSET $offset" : '';
|
||||
$limitStr = ($nrows >= 0) ? " LIMIT $nrows" : ($offset >= 0 ? ' LIMIT 999999999' : '');
|
||||
if ($secs2cache)
|
||||
$rs = $parent->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||
else
|
||||
$rs = $parent->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
function GenID($seq='adodbseq',$start=1)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
// if you have to modify the parameter below, your database is overloaded,
|
||||
// or you need to implement generation of id's yourself!
|
||||
$MAXLOOPS = 100;
|
||||
while (--$MAXLOOPS>=0) {
|
||||
@($num = array_pop($parent->GetCol("SELECT id FROM {$seq}")));
|
||||
if ($num === false || !is_numeric($num)) {
|
||||
@$parent->Execute(sprintf($this->_genSeqSQL ,$seq));
|
||||
$start -= 1;
|
||||
$num = '0';
|
||||
$cnt = $parent->GetOne(sprintf($this->_genSeqCountSQL,$seq));
|
||||
if (!$cnt) {
|
||||
$ok = $parent->Execute(sprintf($this->_genSeq2SQL,$seq,$start));
|
||||
}
|
||||
if (!$ok) return false;
|
||||
}
|
||||
$parent->Execute(sprintf($this->_genIDSQL,$seq,$num));
|
||||
|
||||
if ($parent->affected_rows() > 0) {
|
||||
$num += 1;
|
||||
$parent->genID = intval($num);
|
||||
return intval($num);
|
||||
}
|
||||
}
|
||||
if ($fn = $parent->raiseErrorFn) {
|
||||
$fn($parent->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function CreateSequence($seqname='adodbseq',$start=1)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
$ok = $parent->Execute(sprintf($this->_genSeqSQL,$seqname));
|
||||
if (!$ok) return false;
|
||||
$start -= 1;
|
||||
return $parent->Execute("insert into $seqname values($start)");
|
||||
}
|
||||
|
||||
function SetTransactionMode($transaction_mode)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
$parent->_transmode = strtoupper($transaction_mode);
|
||||
}
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
if ($parent->transOff) return true;
|
||||
$parent->transCnt += 1;
|
||||
$parent->_autocommit = false;
|
||||
return $parent->Execute("BEGIN {$parent->_transmode}");
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
if ($parent->transOff) return true;
|
||||
if (!$ok) return $parent->RollbackTrans();
|
||||
if ($parent->transCnt) $parent->transCnt -= 1;
|
||||
$parent->_autocommit = true;
|
||||
|
||||
$ret = $parent->Execute('COMMIT');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
if ($parent->transOff) return true;
|
||||
if ($parent->transCnt) $parent->transCnt -= 1;
|
||||
$parent->_autocommit = true;
|
||||
|
||||
$ret = $parent->Execute('ROLLBACK');
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
// mark newnham
|
||||
function MetaColumns($tab,$normalize=true)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
|
||||
$parent = $this->pdoDriver;
|
||||
$false = false;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
|
||||
if ($parent->fetchMode !== false) $savem = $parent->SetFetchMode(false);
|
||||
$rs = $parent->Execute("PRAGMA table_info('$tab')");
|
||||
if (isset($savem)) $parent->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->primary_key = $r['pk'];
|
||||
$fld->default_value = $r['dflt_value'];
|
||||
$fld->scale = 0;
|
||||
if ($save == ADODB_FETCH_NUM) $arr[] = $fld;
|
||||
else $arr[strtoupper($fld->name)] = $fld;
|
||||
}
|
||||
$rs->Close();
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
$parent = $this->pdoDriver;
|
||||
|
||||
if ($mask) {
|
||||
$save = $this->metaTablesSQL;
|
||||
$mask = $this->qstr(strtoupper($mask));
|
||||
$this->metaTablesSQL .= " AND name LIKE $mask";
|
||||
}
|
||||
|
||||
$ret = $parent->GetCol($this->metaTablesSQL);
|
||||
|
||||
if ($mask) {
|
||||
$this->metaTablesSQL = $save;
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,14 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4.
|
||||
|
||||
NOTE: Since 3.31, this file is no longer used, and the "postgres" driver is
|
||||
remapped to "postgres7". Maintaining multiple postgres drivers is no easy
|
||||
job, so hopefully this will ensure greater consistency and fewer bugs.
|
||||
*/
|
||||
|
||||
?>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,313 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4.
|
||||
|
||||
Postgres7 support.
|
||||
28 Feb 2001: Currently indicate that we support LIMIT
|
||||
01 Dec 2001: dannym added support for default values
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR."/drivers/adodb-postgres64.inc.php");
|
||||
|
||||
class ADODB_postgres7 extends ADODB_postgres64 {
|
||||
var $databaseType = 'postgres7';
|
||||
var $hasLimit = true; // set to true for pgsql 6.5+ only. support pgsql/mysql SELECT * FROM TABLE LIMIT 10
|
||||
var $ansiOuter = true;
|
||||
var $charSet = true; //set to true for Postgres 7 and above - PG client supports encodings
|
||||
|
||||
function ADODB_postgres7()
|
||||
{
|
||||
$this->ADODB_postgres64();
|
||||
if (ADODB_ASSOC_CASE !== 2) {
|
||||
$this->rsPrefix .= 'assoc_';
|
||||
}
|
||||
$this->_bindInputArray = PHP_VERSION >= 5.1;
|
||||
}
|
||||
|
||||
|
||||
// the following should be compat with postgresql 7.2,
|
||||
// which makes obsolete the LIMIT limit,offset syntax
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$offsetStr = ($offset >= 0) ? " OFFSET ".((integer)$offset) : '';
|
||||
$limitStr = ($nrows >= 0) ? " LIMIT ".((integer)$nrows) : '';
|
||||
if ($secs2cache)
|
||||
$rs = $this->CacheExecute($secs2cache,$sql."$limitStr$offsetStr",$inputarr);
|
||||
else
|
||||
$rs = $this->Execute($sql."$limitStr$offsetStr",$inputarr);
|
||||
|
||||
return $rs;
|
||||
}
|
||||
/*
|
||||
function Prepare($sql)
|
||||
{
|
||||
$info = $this->ServerInfo();
|
||||
if ($info['version']>=7.3) {
|
||||
return array($sql,false);
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
I discovered that the MetaForeignKeys method no longer worked for Postgres 8.3.
|
||||
I went ahead and modified it to work for both 8.2 and 8.3.
|
||||
Please feel free to include this change in your next release of adodb.
|
||||
William Kolodny [William.Kolodny#gt-t.net]
|
||||
*/
|
||||
function MetaForeignKeys($table, $owner=false, $upper=false)
|
||||
{
|
||||
$sql="
|
||||
SELECT fum.ftblname AS lookup_table, split_part(fum.rf, ')'::text, 1) AS lookup_field,
|
||||
fum.ltable AS dep_table, split_part(fum.lf, ')'::text, 1) AS dep_field
|
||||
FROM (
|
||||
SELECT fee.ltable, fee.ftblname, fee.consrc, split_part(fee.consrc,'('::text, 2) AS lf,
|
||||
split_part(fee.consrc, '('::text, 3) AS rf
|
||||
FROM (
|
||||
SELECT foo.relname AS ltable, foo.ftblname,
|
||||
pg_get_constraintdef(foo.oid) AS consrc
|
||||
FROM (
|
||||
SELECT c.oid, c.conname AS name, t.relname, ft.relname AS ftblname
|
||||
FROM pg_constraint c
|
||||
JOIN pg_class t ON (t.oid = c.conrelid)
|
||||
JOIN pg_class ft ON (ft.oid = c.confrelid)
|
||||
JOIN pg_namespace nft ON (nft.oid = ft.relnamespace)
|
||||
LEFT JOIN pg_description ds ON (ds.objoid = c.oid)
|
||||
JOIN pg_namespace n ON (n.oid = t.relnamespace)
|
||||
WHERE c.contype = 'f'::\"char\"
|
||||
ORDER BY t.relname, n.nspname, c.conname, c.oid
|
||||
) foo
|
||||
) fee) fum
|
||||
WHERE fum.ltable='".strtolower($table)."'
|
||||
ORDER BY fum.ftblname, fum.ltable, split_part(fum.lf, ')'::text, 1)
|
||||
";
|
||||
$rs = $this->Execute($sql);
|
||||
|
||||
if (!$rs || $rs->EOF) return false;
|
||||
|
||||
$a = array();
|
||||
while (!$rs->EOF) {
|
||||
if ($upper) {
|
||||
$a[strtoupper($rs->Fields('lookup_table'))][] = strtoupper(str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')));
|
||||
} else {
|
||||
$a[$rs->Fields('lookup_table')][] = str_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'));
|
||||
}
|
||||
$rs->MoveNext();
|
||||
}
|
||||
|
||||
return $a;
|
||||
|
||||
}
|
||||
|
||||
// from Edward Jaramilla, improved version - works on pg 7.4
|
||||
function _old_MetaForeignKeys($table, $owner=false, $upper=false)
|
||||
{
|
||||
$sql = 'SELECT t.tgargs as args
|
||||
FROM
|
||||
pg_trigger t,pg_class c,pg_proc p
|
||||
WHERE
|
||||
t.tgenabled AND
|
||||
t.tgrelid = c.oid AND
|
||||
t.tgfoid = p.oid AND
|
||||
p.proname = \'RI_FKey_check_ins\' AND
|
||||
c.relname = \''.strtolower($table).'\'
|
||||
ORDER BY
|
||||
t.tgrelid';
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
|
||||
if (!$rs || $rs->EOF) return false;
|
||||
|
||||
$arr = $rs->GetArray();
|
||||
$a = array();
|
||||
foreach($arr as $v) {
|
||||
$data = explode(chr(0), $v['args']);
|
||||
$size = count($data)-1; //-1 because the last node is empty
|
||||
for($i = 4; $i < $size; $i++) {
|
||||
if ($upper)
|
||||
$a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]);
|
||||
else
|
||||
$a[$data[2]][] = $data[$i].'='.$data[++$i];
|
||||
}
|
||||
}
|
||||
return $a;
|
||||
}
|
||||
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
if (! $this->_bindInputArray) {
|
||||
// We don't have native support for parameterized queries, so let's emulate it at the parent
|
||||
return ADODB_postgres64::_query($sql, $inputarr);
|
||||
}
|
||||
$this->_errorMsg = false;
|
||||
// -- added Cristiano da Cunha Duarte
|
||||
if ($inputarr) {
|
||||
$sqlarr = explode('?',trim($sql));
|
||||
$sql = '';
|
||||
$i = 1;
|
||||
$last = sizeof($sqlarr)-1;
|
||||
foreach($sqlarr as $v) {
|
||||
if ($last < $i) $sql .= $v;
|
||||
else $sql .= $v.' $'.$i;
|
||||
$i++;
|
||||
}
|
||||
|
||||
$rez = pg_query_params($this->_connectionID,$sql, $inputarr);
|
||||
} else {
|
||||
$rez = pg_query($this->_connectionID,$sql);
|
||||
}
|
||||
// check if no data returned, then no need to create real recordset
|
||||
if ($rez && pg_numfields($rez) <= 0) {
|
||||
if (is_resource($this->_resultid) && get_resource_type($this->_resultid) === 'pgsql result') {
|
||||
pg_freeresult($this->_resultid);
|
||||
}
|
||||
$this->_resultid = $rez;
|
||||
return true;
|
||||
}
|
||||
return $rez;
|
||||
}
|
||||
|
||||
// this is a set of functions for managing client encoding - very important if the encodings
|
||||
// of your database and your output target (i.e. HTML) don't match
|
||||
//for instance, you may have UNICODE database and server it on-site as WIN1251 etc.
|
||||
// GetCharSet - get the name of the character set the client is using now
|
||||
// the functions should work with Postgres 7.0 and above, the set of charsets supported
|
||||
// depends on compile flags of postgres distribution - if no charsets were compiled into the server
|
||||
// it will return 'SQL_ANSI' always
|
||||
function GetCharSet()
|
||||
{
|
||||
//we will use ADO's builtin property charSet
|
||||
$this->charSet = @pg_client_encoding($this->_connectionID);
|
||||
if (!$this->charSet) {
|
||||
return false;
|
||||
} else {
|
||||
return $this->charSet;
|
||||
}
|
||||
}
|
||||
|
||||
// SetCharSet - switch the client encoding
|
||||
function SetCharSet($charset_name)
|
||||
{
|
||||
$this->GetCharSet();
|
||||
if ($this->charSet !== $charset_name) {
|
||||
$if = pg_set_client_encoding($this->_connectionID, $charset_name);
|
||||
if ($if == "0" & $this->GetCharSet() == $charset_name) {
|
||||
return true;
|
||||
} else return false;
|
||||
} else return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordSet_postgres7 extends ADORecordSet_postgres64{
|
||||
|
||||
var $databaseType = "postgres7";
|
||||
|
||||
|
||||
function ADORecordSet_postgres7($queryID,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_postgres64($queryID,$mode);
|
||||
}
|
||||
|
||||
// 10% speedup to move MoveNext to child class
|
||||
function MoveNext()
|
||||
{
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow++;
|
||||
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
|
||||
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||
|
||||
if (is_array($this->fields)) {
|
||||
if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$this->fields = false;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class ADORecordSet_assoc_postgres7 extends ADORecordSet_postgres64{
|
||||
|
||||
var $databaseType = "postgres7";
|
||||
|
||||
|
||||
function ADORecordSet_assoc_postgres7($queryID,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_postgres64($queryID,$mode);
|
||||
}
|
||||
|
||||
function _fetch()
|
||||
{
|
||||
if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
|
||||
return false;
|
||||
|
||||
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||
|
||||
if ($this->fields) {
|
||||
if (isset($this->_blobArr)) $this->_fixblobs();
|
||||
$this->_updatefields();
|
||||
}
|
||||
|
||||
return (is_array($this->fields));
|
||||
}
|
||||
|
||||
// Create associative array
|
||||
function _updatefields()
|
||||
{
|
||||
if (ADODB_ASSOC_CASE == 2) return; // native
|
||||
|
||||
$arr = array();
|
||||
$lowercase = (ADODB_ASSOC_CASE == 0);
|
||||
|
||||
foreach($this->fields as $k => $v) {
|
||||
if (is_integer($k)) $arr[$k] = $v;
|
||||
else {
|
||||
if ($lowercase)
|
||||
$arr[strtolower($k)] = $v;
|
||||
else
|
||||
$arr[strtoupper($k)] = $v;
|
||||
}
|
||||
}
|
||||
$this->fields = $arr;
|
||||
}
|
||||
|
||||
function MoveNext()
|
||||
{
|
||||
if (!$this->EOF) {
|
||||
$this->_currentRow++;
|
||||
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
|
||||
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
|
||||
|
||||
if (is_array($this->fields)) {
|
||||
if ($this->fields) {
|
||||
if (isset($this->_blobArr)) $this->_fixblobs();
|
||||
|
||||
$this->_updatefields();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->fields = false;
|
||||
$this->EOF = true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4.
|
||||
|
||||
NOTE: The "postgres8" driver is remapped to "postgres7".
|
||||
*/
|
||||
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4.
|
||||
|
||||
Synonym for csv driver.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (! defined("_ADODB_PROXY_LAYER")) {
|
||||
define("_ADODB_PROXY_LAYER", 1 );
|
||||
include(ADODB_DIR."/drivers/adodb-csv.inc.php");
|
||||
|
||||
class ADODB_proxy extends ADODB_csv {
|
||||
var $databaseType = 'proxy';
|
||||
var $databaseProvider = 'csv';
|
||||
}
|
||||
class ADORecordset_proxy extends ADORecordset_csv {
|
||||
var $databaseType = "proxy";
|
||||
|
||||
function ADORecordset_proxy($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordset($id,$mode);
|
||||
}
|
||||
};
|
||||
} // define
|
||||
|
||||
?>
|
||||
@@ -1,184 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
SAPDB data driver. Requires ODBC.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
if (!defined('ADODB_SAPDB')){
|
||||
define('ADODB_SAPDB',1);
|
||||
|
||||
class ADODB_SAPDB extends ADODB_odbc {
|
||||
var $databaseType = "sapdb";
|
||||
var $concat_operator = '||';
|
||||
var $sysDate = 'DATE';
|
||||
var $sysTimeStamp = 'TIMESTAMP';
|
||||
var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'"; /// used by DBTimeStamp as the default timestamp fmt.
|
||||
var $hasInsertId = true;
|
||||
var $_bindInputArray = true;
|
||||
|
||||
function ADODB_SAPDB()
|
||||
{
|
||||
//if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function ServerInfo()
|
||||
{
|
||||
$info = ADODB_odbc::ServerInfo();
|
||||
if (!$info['version'] && preg_match('/([0-9.]+)/',$info['description'],$matches)) {
|
||||
$info['version'] = $matches[1];
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
function MetaPrimaryKeys($table)
|
||||
{
|
||||
$table = $this->Quote(strtoupper($table));
|
||||
|
||||
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos");
|
||||
}
|
||||
|
||||
function MetaIndexes ($table, $primary = FALSE)
|
||||
{
|
||||
$table = $this->Quote(strtoupper($table));
|
||||
|
||||
$sql = "SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS ".
|
||||
" WHERE TABLENAME=$table".
|
||||
" ORDER BY INDEXNAME,COLUMNNO";
|
||||
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
|
||||
$rs = $this->Execute($sql);
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
if (!is_object($rs)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$indexes = array();
|
||||
while ($row = $rs->FetchRow()) {
|
||||
$indexes[$row[0]]['unique'] = $row[1] == 'UNIQUE';
|
||||
$indexes[$row[0]]['columns'][] = $row[2];
|
||||
}
|
||||
if ($primary) {
|
||||
$indexes['SYSPRIMARYKEYINDEX'] = array(
|
||||
'unique' => True, // by definition
|
||||
'columns' => $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table AND mode='KEY' ORDER BY pos"),
|
||||
);
|
||||
}
|
||||
return $indexes;
|
||||
}
|
||||
|
||||
function MetaColumns ($table)
|
||||
{
|
||||
global $ADODB_FETCH_MODE;
|
||||
$save = $ADODB_FETCH_MODE;
|
||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
||||
if ($this->fetchMode !== FALSE) {
|
||||
$savem = $this->SetFetchMode(FALSE);
|
||||
}
|
||||
$table = $this->Quote(strtoupper($table));
|
||||
|
||||
$retarr = array();
|
||||
foreach($this->GetAll("SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE,\"DEFAULT\",CASE WHEN \"DEFAULT\" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename=$table ORDER BY pos") as $column)
|
||||
{
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $column[0];
|
||||
$fld->type = $column[1];
|
||||
$fld->max_length = $fld->type == 'LONG' ? 2147483647 : $column[2];
|
||||
$fld->scale = $column[3];
|
||||
$fld->not_null = $column[4] == 'NO';
|
||||
$fld->primary_key = $column[5] == 'KEY';
|
||||
if ($fld->has_default = $column[7]) {
|
||||
if ($fld->primary_key && $column[6] == 'DEFAULT SERIAL (1)') {
|
||||
$fld->auto_increment = true;
|
||||
$fld->has_default = false;
|
||||
} else {
|
||||
$fld->default_value = $column[6];
|
||||
switch($fld->type) {
|
||||
case 'VARCHAR':
|
||||
case 'CHARACTER':
|
||||
case 'LONG':
|
||||
$fld->default_value = $column[6];
|
||||
break;
|
||||
default:
|
||||
$fld->default_value = trim($column[6]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
$retarr[$fld->name] = $fld;
|
||||
}
|
||||
if (isset($savem)) {
|
||||
$this->SetFetchMode($savem);
|
||||
}
|
||||
$ADODB_FETCH_MODE = $save;
|
||||
|
||||
return $retarr;
|
||||
}
|
||||
|
||||
function MetaColumnNames($table)
|
||||
{
|
||||
$table = $this->Quote(strtoupper($table));
|
||||
|
||||
return $this->GetCol("SELECT columnname FROM COLUMNS WHERE tablename=$table ORDER BY pos");
|
||||
}
|
||||
|
||||
// unlike it seems, this depends on the db-session and works in a multiuser environment
|
||||
function _insertid($table,$column)
|
||||
{
|
||||
return empty($table) ? False : $this->GetOne("SELECT $table.CURRVAL FROM DUAL");
|
||||
}
|
||||
|
||||
/*
|
||||
SelectLimit implementation problems:
|
||||
|
||||
The following will return random 10 rows as order by performed after "WHERE rowno<10"
|
||||
which is not ideal...
|
||||
|
||||
select * from table where rowno < 10 order by 1
|
||||
|
||||
This means that we have to use the adoconnection base class SelectLimit when
|
||||
there is an "order by".
|
||||
|
||||
See http://listserv.sap.com/pipermail/sapdb.general/2002-January/010405.html
|
||||
*/
|
||||
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_sapdb extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = "sapdb";
|
||||
|
||||
function ADORecordSet_sapdb($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
}
|
||||
|
||||
} //define
|
||||
?>
|
||||
@@ -1,169 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
version V5.06 16 Oct 2008 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights
|
||||
reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
21.02.2002 - Wade Johnson wade@wadejohnson.de
|
||||
Extended ODBC class for Sybase SQLAnywhere.
|
||||
1) Added support to retrieve the last row insert ID on tables with
|
||||
primary key column using autoincrement function.
|
||||
|
||||
2) Added blob support. Usage:
|
||||
a) create blob variable on db server:
|
||||
|
||||
$dbconn->create_blobvar($blobVarName);
|
||||
|
||||
b) load blob var from file. $filename must be complete path
|
||||
|
||||
$dbcon->load_blobvar_from_file($blobVarName, $filename);
|
||||
|
||||
c) Use the $blobVarName in SQL insert or update statement in the values
|
||||
clause:
|
||||
|
||||
$recordSet = $dbconn->Execute('INSERT INTO tabname (idcol, blobcol) '
|
||||
.
|
||||
'VALUES (\'test\', ' . $blobVarName . ')');
|
||||
|
||||
instead of loading blob from a file, you can also load from
|
||||
an unformatted (raw) blob variable:
|
||||
$dbcon->load_blobvar_from_var($blobVarName, $varName);
|
||||
|
||||
d) drop blob variable on db server to free up resources:
|
||||
$dbconn->drop_blobvar($blobVarName);
|
||||
|
||||
Sybase_SQLAnywhere data driver. Requires ODBC.
|
||||
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
|
||||
if (!defined('ADODB_SYBASE_SQLANYWHERE')){
|
||||
|
||||
define('ADODB_SYBASE_SQLANYWHERE',1);
|
||||
|
||||
class ADODB_sqlanywhere extends ADODB_odbc {
|
||||
var $databaseType = "sqlanywhere";
|
||||
var $hasInsertID = true;
|
||||
|
||||
function ADODB_sqlanywhere()
|
||||
{
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function _insertid() {
|
||||
return $this->GetOne('select @@identity');
|
||||
}
|
||||
|
||||
function create_blobvar($blobVarName) {
|
||||
$this->Execute("create variable $blobVarName long binary");
|
||||
return;
|
||||
}
|
||||
|
||||
function drop_blobvar($blobVarName) {
|
||||
$this->Execute("drop variable $blobVarName");
|
||||
return;
|
||||
}
|
||||
|
||||
function load_blobvar_from_file($blobVarName, $filename) {
|
||||
$chunk_size = 1000;
|
||||
|
||||
$fd = fopen ($filename, "rb");
|
||||
|
||||
$integer_chunks = (integer)filesize($filename) / $chunk_size;
|
||||
$modulus = filesize($filename) % $chunk_size;
|
||||
if ($modulus != 0){
|
||||
$integer_chunks += 1;
|
||||
}
|
||||
|
||||
for($loop=1;$loop<=$integer_chunks;$loop++){
|
||||
$contents = fread ($fd, $chunk_size);
|
||||
$contents = bin2hex($contents);
|
||||
|
||||
$hexstring = '';
|
||||
|
||||
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
|
||||
$hexstring .= '\x' . substr($contents,$loop2,2);
|
||||
}
|
||||
|
||||
$hexstring = $this->qstr($hexstring);
|
||||
|
||||
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
|
||||
}
|
||||
|
||||
fclose ($fd);
|
||||
return;
|
||||
}
|
||||
|
||||
function load_blobvar_from_var($blobVarName, &$varName) {
|
||||
$chunk_size = 1000;
|
||||
|
||||
$integer_chunks = (integer)strlen($varName) / $chunk_size;
|
||||
$modulus = strlen($varName) % $chunk_size;
|
||||
if ($modulus != 0){
|
||||
$integer_chunks += 1;
|
||||
}
|
||||
|
||||
for($loop=1;$loop<=$integer_chunks;$loop++){
|
||||
$contents = substr ($varName, (($loop - 1) * $chunk_size), $chunk_size);
|
||||
$contents = bin2hex($contents);
|
||||
|
||||
$hexstring = '';
|
||||
|
||||
for($loop2=0;$loop2<strlen($contents);$loop2+=2){
|
||||
$hexstring .= '\x' . substr($contents,$loop2,2);
|
||||
}
|
||||
|
||||
$hexstring = $this->qstr($hexstring);
|
||||
|
||||
$this->Execute("set $blobVarName = $blobVarName || " . $hexstring);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert a null into the blob field of the table first.
|
||||
Then use UpdateBlob to store the blob.
|
||||
|
||||
Usage:
|
||||
|
||||
$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
|
||||
$conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
|
||||
*/
|
||||
function UpdateBlob($table,$column,&$val,$where,$blobtype='BLOB')
|
||||
{
|
||||
$blobVarName = 'hold_blob';
|
||||
$this->create_blobvar($blobVarName);
|
||||
$this->load_blobvar_from_var($blobVarName, $val);
|
||||
$this->Execute("UPDATE $table SET $column=$blobVarName WHERE $where");
|
||||
$this->drop_blobvar($blobVarName);
|
||||
return true;
|
||||
}
|
||||
}; //class
|
||||
|
||||
class ADORecordSet_sqlanywhere extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = "sqlanywhere";
|
||||
|
||||
function ADORecordSet_sqlanywhere($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
|
||||
|
||||
}; //class
|
||||
|
||||
|
||||
} //define
|
||||
?>
|
||||
@@ -1,398 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.sourceforge.net
|
||||
|
||||
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 ADODB_sqlite()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
function __get($name)
|
||||
{
|
||||
switch($name) {
|
||||
case 'sysDate': return "'".date($this->fmtDate)."'";
|
||||
case 'sysTimeStamp' : return "'".date($this->sysTimeStamp)."'";
|
||||
}
|
||||
}*/
|
||||
|
||||
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 ($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);
|
||||
}
|
||||
|
||||
return $rez;
|
||||
}
|
||||
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$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)
|
||||
{
|
||||
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 ADORecordset_sqlite($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()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,62 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Portable version of sqlite driver, to make it more similar to other database drivers.
|
||||
The main differences are
|
||||
|
||||
1. When selecting (joining) multiple tables, in assoc mode the table
|
||||
names are included in the assoc keys in the "sqlite" driver.
|
||||
|
||||
In "sqlitepo" driver, the table names are stripped from the returned column names.
|
||||
When this results in a conflict, the first field get preference.
|
||||
|
||||
Contributed by Herman Kuiper herman#ozuzo.net
|
||||
*/
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
include_once(ADODB_DIR.'/drivers/adodb-sqlite.inc.php');
|
||||
|
||||
class ADODB_sqlitepo extends ADODB_sqlite {
|
||||
var $databaseType = 'sqlitepo';
|
||||
|
||||
function ADODB_sqlitepo()
|
||||
{
|
||||
$this->ADODB_sqlite();
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
|
||||
class ADORecordset_sqlitepo extends ADORecordset_sqlite {
|
||||
|
||||
var $databaseType = 'sqlitepo';
|
||||
|
||||
function ADORecordset_sqlitepo($queryID,$mode=false)
|
||||
{
|
||||
$this->ADORecordset_sqlite($queryID,$mode);
|
||||
}
|
||||
|
||||
// Modified to strip table names from returned fields
|
||||
function _fetch($ignore_fields=false)
|
||||
{
|
||||
$this->fields = array();
|
||||
$fields = @sqlite_fetch_array($this->_queryID,$this->fetchMode);
|
||||
if(is_array($fields))
|
||||
foreach($fields as $n => $v)
|
||||
{
|
||||
if(($p = strpos($n, ".")) !== false)
|
||||
$n = substr($n, $p+1);
|
||||
$this->fields[$n] = $v;
|
||||
}
|
||||
|
||||
return !empty($this->fields);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,428 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim. All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
|
||||
|
||||
- MSSQL date patch applied.
|
||||
|
||||
Date patch by Toni 15 Feb 2002
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
class ADODB_sybase extends ADOConnection {
|
||||
var $databaseType = "sybase";
|
||||
var $dataProvider = 'sybase';
|
||||
var $replaceQuote = "''"; // string to use to replace quotes
|
||||
var $fmtDate = "'Y-m-d'";
|
||||
var $fmtTimeStamp = "'Y-m-d H:i:s'";
|
||||
var $hasInsertID = true;
|
||||
var $hasAffectedRows = true;
|
||||
var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
|
||||
// see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
|
||||
var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'";
|
||||
/*
|
||||
"select c.name,t.name,c.length from
|
||||
syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id
|
||||
where o.name='%s'";
|
||||
*/
|
||||
var $concat_operator = '+';
|
||||
var $arrayClass = 'ADORecordSet_array_sybase';
|
||||
var $sysDate = 'GetDate()';
|
||||
var $leftOuter = '*=';
|
||||
var $rightOuter = '=*';
|
||||
|
||||
function ADODB_sybase()
|
||||
{
|
||||
}
|
||||
|
||||
// might require begintrans -- committrans
|
||||
function _insertid()
|
||||
{
|
||||
return $this->GetOne('select @@identity');
|
||||
}
|
||||
// might require begintrans -- committrans
|
||||
function _affectedrows()
|
||||
{
|
||||
return $this->GetOne('select @@rowcount');
|
||||
}
|
||||
|
||||
|
||||
function BeginTrans()
|
||||
{
|
||||
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt += 1;
|
||||
|
||||
$this->Execute('BEGIN TRAN');
|
||||
return true;
|
||||
}
|
||||
|
||||
function CommitTrans($ok=true)
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
|
||||
if (!$ok) return $this->RollbackTrans();
|
||||
|
||||
$this->transCnt -= 1;
|
||||
$this->Execute('COMMIT TRAN');
|
||||
return true;
|
||||
}
|
||||
|
||||
function RollbackTrans()
|
||||
{
|
||||
if ($this->transOff) return true;
|
||||
$this->transCnt -= 1;
|
||||
$this->Execute('ROLLBACK TRAN');
|
||||
return true;
|
||||
}
|
||||
|
||||
// http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
|
||||
function RowLock($tables,$where,$col='top 1 null as ignore')
|
||||
{
|
||||
if (!$this->_hastrans) $this->BeginTrans();
|
||||
$tables = str_replace(',',' HOLDLOCK,',$tables);
|
||||
return $this->GetOne("select $col from $tables HOLDLOCK where $where");
|
||||
|
||||
}
|
||||
|
||||
function SelectDB($dbName)
|
||||
{
|
||||
$this->database = $dbName;
|
||||
$this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
|
||||
if ($this->_connectionID) {
|
||||
return @sybase_select_db($dbName);
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
|
||||
/* Returns: the last error message from previous database operation
|
||||
Note: This function is NOT available for Microsoft SQL Server. */
|
||||
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if ($this->_logsql) return $this->_errorMsg;
|
||||
if (function_exists('sybase_get_last_message'))
|
||||
$this->_errorMsg = sybase_get_last_message();
|
||||
else
|
||||
$this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
|
||||
return $this->_errorMsg;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!function_exists('sybase_connect')) return null;
|
||||
|
||||
if ($this->charSet) {
|
||||
$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword, $this->charSet);
|
||||
} else {
|
||||
$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
|
||||
}
|
||||
|
||||
$this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
// returns true or false
|
||||
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
|
||||
{
|
||||
if (!function_exists('sybase_connect')) return null;
|
||||
|
||||
if ($this->charSet) {
|
||||
$this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword, $this->charSet);
|
||||
} else {
|
||||
$this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
|
||||
}
|
||||
if ($this->_connectionID === false) return false;
|
||||
if ($argDatabasename) return $this->SelectDB($argDatabasename);
|
||||
return true;
|
||||
}
|
||||
|
||||
// returns query ID if successful, otherwise false
|
||||
function _query($sql,$inputarr=false)
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
|
||||
if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
|
||||
return sybase_unbuffered_query($sql,$this->_connectionID);
|
||||
else
|
||||
return sybase_query($sql,$this->_connectionID);
|
||||
}
|
||||
|
||||
// See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
|
||||
{
|
||||
if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
|
||||
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
return $rs;
|
||||
}
|
||||
|
||||
$nrows = (integer) $nrows;
|
||||
$offset = (integer) $offset;
|
||||
|
||||
$cnt = ($nrows >= 0) ? $nrows : 999999999;
|
||||
if ($offset > 0 && $cnt) $cnt += $offset;
|
||||
|
||||
$this->Execute("set rowcount $cnt");
|
||||
$rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
|
||||
$this->Execute("set rowcount 0");
|
||||
|
||||
return $rs;
|
||||
}
|
||||
|
||||
// returns true or false
|
||||
function _close()
|
||||
{
|
||||
return @sybase_close($this->_connectionID);
|
||||
}
|
||||
|
||||
static function UnixDate($v)
|
||||
{
|
||||
return ADORecordSet_array_sybase::UnixDate($v);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
return ADORecordSet_array_sybase::UnixTimeStamp($v);
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Added 2003-10-05 by Chris Phillipson
|
||||
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25
|
||||
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
|
||||
// Format date column in sql string given an input format that understands Y M D
|
||||
function SQLDate($fmt, $col=false)
|
||||
{
|
||||
if (!$col) $col = $this->sysTimeStamp;
|
||||
$s = '';
|
||||
|
||||
$len = strlen($fmt);
|
||||
for ($i=0; $i < $len; $i++) {
|
||||
if ($s) $s .= '+';
|
||||
$ch = $fmt[$i];
|
||||
switch($ch) {
|
||||
case 'Y':
|
||||
case 'y':
|
||||
$s .= "datename(yy,$col)";
|
||||
break;
|
||||
case 'M':
|
||||
$s .= "convert(char(3),$col,0)";
|
||||
break;
|
||||
case 'm':
|
||||
$s .= "str_replace(str(month($col),2),' ','0')";
|
||||
break;
|
||||
case 'Q':
|
||||
case 'q':
|
||||
$s .= "datename(qq,$col)";
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
$s .= "str_replace(str(datepart(dd,$col),2),' ','0')";
|
||||
break;
|
||||
case 'h':
|
||||
$s .= "substring(convert(char(14),$col,0),13,2)";
|
||||
break;
|
||||
|
||||
case 'H':
|
||||
$s .= "str_replace(str(datepart(hh,$col),2),' ','0')";
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
$s .= "str_replace(str(datepart(mi,$col),2),' ','0')";
|
||||
break;
|
||||
case 's':
|
||||
$s .= "str_replace(str(datepart(ss,$col),2),' ','0')";
|
||||
break;
|
||||
case 'a':
|
||||
case 'A':
|
||||
$s .= "substring(convert(char(19),$col,0),18,2)";
|
||||
break;
|
||||
|
||||
default:
|
||||
if ($ch == '\\') {
|
||||
$i++;
|
||||
$ch = substr($fmt,$i,1);
|
||||
}
|
||||
$s .= $this->qstr($ch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $s;
|
||||
}
|
||||
|
||||
# Added 2003-10-07 by Chris Phillipson
|
||||
# Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
|
||||
# to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
|
||||
function MetaPrimaryKeys($table)
|
||||
{
|
||||
$sql = "SELECT c.column_name " .
|
||||
"FROM syscolumn c, systable t " .
|
||||
"WHERE t.table_name='$table' AND c.table_id=t.table_id " .
|
||||
"AND t.table_type='BASE' " .
|
||||
"AND c.pkey = 'Y' " .
|
||||
"ORDER BY c.column_id";
|
||||
|
||||
$a = $this->GetCol($sql);
|
||||
if ($a && sizeof($a)>0) return $a;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------
|
||||
Class Name: Recordset
|
||||
--------------------------------------------------------------------------------------*/
|
||||
global $ADODB_sybase_mths;
|
||||
$ADODB_sybase_mths = array(
|
||||
'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
|
||||
'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||
|
||||
class ADORecordset_sybase extends ADORecordSet {
|
||||
|
||||
var $databaseType = "sybase";
|
||||
var $canSeek = true;
|
||||
// _mths works only in non-localised system
|
||||
var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
|
||||
|
||||
function ADORecordset_sybase($id,$mode=false)
|
||||
{
|
||||
if ($mode === false) {
|
||||
global $ADODB_FETCH_MODE;
|
||||
$mode = $ADODB_FETCH_MODE;
|
||||
}
|
||||
if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
|
||||
else $this->fetchMode = $mode;
|
||||
$this->ADORecordSet($id,$mode);
|
||||
}
|
||||
|
||||
/* Returns: an object containing field information.
|
||||
Get column information in the Recordset object. fetchField() can be used in order to obtain information about
|
||||
fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
|
||||
fetchField() is retrieved. */
|
||||
function FetchField($fieldOffset = -1)
|
||||
{
|
||||
if ($fieldOffset != -1) {
|
||||
$o = @sybase_fetch_field($this->_queryID, $fieldOffset);
|
||||
}
|
||||
else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
|
||||
$o = @sybase_fetch_field($this->_queryID);
|
||||
}
|
||||
// older versions of PHP did not support type, only numeric
|
||||
if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
|
||||
return $o;
|
||||
}
|
||||
|
||||
function _initrs()
|
||||
{
|
||||
global $ADODB_COUNTRECS;
|
||||
$this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
|
||||
$this->_numOfFields = @sybase_num_fields($this->_queryID);
|
||||
}
|
||||
|
||||
function _seek($row)
|
||||
{
|
||||
return @sybase_data_seek($this->_queryID, $row);
|
||||
}
|
||||
|
||||
function _fetch($ignore_fields=false)
|
||||
{
|
||||
if ($this->fetchMode == ADODB_FETCH_NUM) {
|
||||
$this->fields = @sybase_fetch_row($this->_queryID);
|
||||
} else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
|
||||
$this->fields = @sybase_fetch_row($this->_queryID);
|
||||
if (is_array($this->fields)) {
|
||||
$this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
$this->fields = @sybase_fetch_array($this->_queryID);
|
||||
}
|
||||
if ( is_array($this->fields)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* close() only needs to be called if you are worried about using too much memory while your script
|
||||
is running. All associated result memory for the specified result identifier will automatically be freed. */
|
||||
function _close() {
|
||||
return @sybase_free_result($this->_queryID);
|
||||
}
|
||||
|
||||
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
|
||||
static function UnixDate($v)
|
||||
{
|
||||
return ADORecordSet_array_sybase::UnixDate($v);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
return ADORecordSet_array_sybase::UnixTimeStamp($v);
|
||||
}
|
||||
}
|
||||
|
||||
class ADORecordSet_array_sybase extends ADORecordSet_array {
|
||||
function ADORecordSet_array_sybase($id=-1)
|
||||
{
|
||||
$this->ADORecordSet_array($id);
|
||||
}
|
||||
|
||||
// sybase/mssql uses a default date like Dec 30 2000 12:00AM
|
||||
static function UnixDate($v)
|
||||
{
|
||||
global $ADODB_sybase_mths;
|
||||
|
||||
//Dec 30 2000 12:00AM
|
||||
if (!preg_match( "/([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})/"
|
||||
,$v, $rr)) return parent::UnixDate($v);
|
||||
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$themth = substr(strtoupper($rr[1]),0,3);
|
||||
$themth = $ADODB_sybase_mths[$themth];
|
||||
if ($themth <= 0) return false;
|
||||
// h-m-s-MM-DD-YY
|
||||
return mktime(0,0,0,$themth,$rr[2],$rr[3]);
|
||||
}
|
||||
|
||||
static function UnixTimeStamp($v)
|
||||
{
|
||||
global $ADODB_sybase_mths;
|
||||
//11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
|
||||
//Changed [0-9] to [0-9 ] in day conversion
|
||||
if (!preg_match( "/([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})/"
|
||||
,$v, $rr)) return parent::UnixTimeStamp($v);
|
||||
if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
|
||||
|
||||
$themth = substr(strtoupper($rr[1]),0,3);
|
||||
$themth = $ADODB_sybase_mths[$themth];
|
||||
if ($themth <= 0) return false;
|
||||
|
||||
switch (strtoupper($rr[6])) {
|
||||
case 'P':
|
||||
if ($rr[4]<12) $rr[4] += 12;
|
||||
break;
|
||||
case 'A':
|
||||
if ($rr[4]==12) $rr[4] = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// h-m-s-MM-DD-YY
|
||||
return mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -1,120 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
|
||||
Set tabs to 4.
|
||||
|
||||
Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com
|
||||
*/
|
||||
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
require_once ADODB_DIR."/drivers/adodb-sybase.inc.php";
|
||||
|
||||
class ADODB_sybase_ase extends ADODB_sybase {
|
||||
var $databaseType = "sybase_ase";
|
||||
|
||||
var $metaTablesSQL="SELECT sysobjects.name FROM sysobjects, sysusers WHERE sysobjects.type='U' AND sysobjects.uid = sysusers.uid";
|
||||
var $metaColumnsSQL = "SELECT syscolumns.name AS field_name, systypes.name AS type, systypes.length AS width FROM sysobjects, syscolumns, systypes WHERE sysobjects.name='%s' AND syscolumns.id = sysobjects.id AND systypes.type=syscolumns.type";
|
||||
var $metaDatabasesSQL ="SELECT a.name FROM master.dbo.sysdatabases a, master.dbo.syslogins b WHERE a.suid = b.suid and a.name like '%' and a.name != 'tempdb' and a.status3 != 256 order by 1";
|
||||
|
||||
function ADODB_sybase_ase()
|
||||
{
|
||||
}
|
||||
|
||||
// split the Views, Tables and procedures.
|
||||
function MetaTables($ttype=false,$showSchema=false,$mask=false)
|
||||
{
|
||||
$false = false;
|
||||
if ($this->metaTablesSQL) {
|
||||
// complicated state saving by the need for backward compat
|
||||
|
||||
if ($ttype == 'VIEWS'){
|
||||
$sql = str_replace('U', 'V', $this->metaTablesSQL);
|
||||
}elseif (false === $ttype){
|
||||
$sql = str_replace('U',"U' OR type='V", $this->metaTablesSQL);
|
||||
}else{ // TABLES OR ANY OTHER
|
||||
$sql = $this->metaTablesSQL;
|
||||
}
|
||||
$rs = $this->Execute($sql);
|
||||
|
||||
if ($rs === false || !method_exists($rs, 'GetArray')){
|
||||
return $false;
|
||||
}
|
||||
$arr = $rs->GetArray();
|
||||
|
||||
$arr2 = array();
|
||||
foreach($arr as $key=>$value){
|
||||
$arr2[] = trim($value['name']);
|
||||
}
|
||||
return $arr2;
|
||||
}
|
||||
return $false;
|
||||
}
|
||||
|
||||
function MetaDatabases()
|
||||
{
|
||||
$arr = array();
|
||||
if ($this->metaDatabasesSQL!='') {
|
||||
$rs = $this->Execute($this->metaDatabasesSQL);
|
||||
if ($rs && !$rs->EOF){
|
||||
while (!$rs->EOF){
|
||||
$arr[] = $rs->Fields('name');
|
||||
$rs->MoveNext();
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// fix a bug which prevent the metaColumns query to be executed for Sybase ASE
|
||||
function MetaColumns($table,$upper=false)
|
||||
{
|
||||
$false = false;
|
||||
if (!empty($this->metaColumnsSQL)) {
|
||||
|
||||
$rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
|
||||
if ($rs === false) return $false;
|
||||
|
||||
$retarr = array();
|
||||
while (!$rs->EOF) {
|
||||
$fld = new ADOFieldObject();
|
||||
$fld->name = $rs->Fields('field_name');
|
||||
$fld->type = $rs->Fields('type');
|
||||
$fld->max_length = $rs->Fields('width');
|
||||
$retarr[strtoupper($fld->name)] = $fld;
|
||||
$rs->MoveNext();
|
||||
}
|
||||
$rs->Close();
|
||||
return $retarr;
|
||||
}
|
||||
return $false;
|
||||
}
|
||||
|
||||
function getProcedureList($schema)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
function ErrorMsg()
|
||||
{
|
||||
if (!function_exists('sybase_connect')){
|
||||
return 'Your PHP doesn\'t contain the Sybase connection module!';
|
||||
}
|
||||
return parent::ErrorMsg();
|
||||
}
|
||||
}
|
||||
|
||||
class adorecordset_sybase_ase extends ADORecordset_sybase {
|
||||
var $databaseType = "sybase_ase";
|
||||
function ADORecordset_sybase_ase($id,$mode=false)
|
||||
{
|
||||
$this->ADORecordSet_sybase($id,$mode);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
@@ -1,107 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
V5.10 10 Nov 2009 (c) 2000-2009 John Lim (jlim#natsoft.com). All rights reserved.
|
||||
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.
|
||||
Set tabs to 4 for best viewing.
|
||||
|
||||
Latest version is available at http://adodb.sourceforge.net
|
||||
|
||||
Microsoft Visual FoxPro data driver. Requires ODBC. Works only on MS Windows.
|
||||
*/
|
||||
|
||||
// security - hide paths
|
||||
if (!defined('ADODB_DIR')) die();
|
||||
|
||||
if (!defined('_ADODB_ODBC_LAYER')) {
|
||||
include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
|
||||
}
|
||||
if (!defined('ADODB_VFP')){
|
||||
define('ADODB_VFP',1);
|
||||
class ADODB_vfp extends ADODB_odbc {
|
||||
var $databaseType = "vfp";
|
||||
var $fmtDate = "{^Y-m-d}";
|
||||
var $fmtTimeStamp = "{^Y-m-d, h:i:sA}";
|
||||
var $replaceQuote = "'+chr(39)+'" ;
|
||||
var $true = '.T.';
|
||||
var $false = '.F.';
|
||||
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
|
||||
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
|
||||
var $sysTimeStamp = 'datetime()';
|
||||
var $sysDate = 'date()';
|
||||
var $ansiOuter = true;
|
||||
var $hasTransactions = false;
|
||||
var $curmode = false ; // See sqlext.h, SQL_CUR_DEFAULT == SQL_CUR_USE_DRIVER == 2L
|
||||
|
||||
function ADODB_vfp()
|
||||
{
|
||||
$this->ADODB_odbc();
|
||||
}
|
||||
|
||||
function Time()
|
||||
{
|
||||
return time();
|
||||
}
|
||||
|
||||
function BeginTrans() { return false;}
|
||||
|
||||
// quote string to be sent back to database
|
||||
function qstr($s,$nofixquotes=false)
|
||||
{
|
||||
if (!$nofixquotes) return "'".str_replace("\r\n","'+chr(13)+'",str_replace("'",$this->replaceQuote,$s))."'";
|
||||
return "'".$s."'";
|
||||
}
|
||||
|
||||
|
||||
// TOP requires ORDER BY for VFP
|
||||
function SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
|
||||
{
|
||||
$this->hasTop = preg_match('/ORDER[ \t\r\n]+BY/is',$sql) ? 'top' : false;
|
||||
$ret = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
class ADORecordSet_vfp extends ADORecordSet_odbc {
|
||||
|
||||
var $databaseType = "vfp";
|
||||
|
||||
|
||||
function ADORecordSet_vfp($id,$mode=false)
|
||||
{
|
||||
return $this->ADORecordSet_odbc($id,$mode);
|
||||
}
|
||||
|
||||
function MetaType($t,$len=-1)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
$fieldobj = $t;
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
switch (strtoupper($t)) {
|
||||
case 'C':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
case 'M':
|
||||
return 'X';
|
||||
|
||||
case 'D': return 'D';
|
||||
|
||||
case 'T': return 'T';
|
||||
|
||||
case 'L': return 'L';
|
||||
|
||||
case 'I': return 'I';
|
||||
|
||||
default: return 'N';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} //define
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
// by "El-Shamaa, Khaled" <k.el-shamaa#cgiar.org>
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'ar',
|
||||
DB_ERROR => '<27><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_ALREADY_EXISTS => '<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_CREATE => '<27><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_DELETE => '<27><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>',
|
||||
DB_ERROR_CANNOT_DROP => '<27><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>',
|
||||
DB_ERROR_CONSTRAINT => '<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_DIVZERO => '<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>',
|
||||
DB_ERROR_INVALID => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID_DATE => '<27><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID_NUMBER => '<27><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_MISMATCH => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NODBSELECTED => '<27><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>',
|
||||
DB_ERROR_NOSUCHFIELD => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHTABLE => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_CAPABLE => '<27><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_FOUND => '<27><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_LOCKED => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_SYNTAX => '<27><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_UNSUPPORTED => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID_DSN => 'DSN <20><><EFBFBD> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CONNECT_FAILED => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
0 => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>', // DB_O
|
||||
DB_ERROR_NEED_MORE_DATA => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> '<27><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHDB => '<27><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_ACCESS_VIOLATION => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>'
|
||||
);
|
||||
?>
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
Bulgarian language, v1.0, 25.03.2004, encoding by Windows-1251 charset
|
||||
contributed by Valentin Sheiretsky <valio#valio.eu.org>
|
||||
*/
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'bg',
|
||||
DB_ERROR => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_ALREADY_EXISTS => '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_CREATE => '<27><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_DELETE => '<27><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_DROP => '<27><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CONSTRAINT => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_DIVZERO => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID_DATE => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>',
|
||||
DB_ERROR_INVALID_NUMBER => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_MISMATCH => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NODBSELECTED => '<27><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHFIELD => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHTABLE => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||
DB_ERROR_NOT_FOUND => '<27><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_LOCKED => '<27><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_SYNTAX => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_UNSUPPORTED => '<27><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_INVALID_DSN => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DSN',
|
||||
DB_ERROR_CONNECT_FAILED => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
0 => '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHDB => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_ACCESS_VIOLATION => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>'
|
||||
);
|
||||
?>
|
||||
@@ -1,37 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
Bulgarian language, v1.0, 25.03.2004, encoding by UTF-8 charset
|
||||
contributed by Valentin Sheiretsky <valio#valio.eu.org>
|
||||
*/
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'bgutf8',
|
||||
DB_ERROR => 'неизвестна грешка',
|
||||
DB_ERROR_ALREADY_EXISTS => 'вече съществува',
|
||||
DB_ERROR_CANNOT_CREATE => 'не може да бъде създадена',
|
||||
DB_ERROR_CANNOT_DELETE => 'не може да бъде изтрита',
|
||||
DB_ERROR_CANNOT_DROP => 'не може да бъде унищожена',
|
||||
DB_ERROR_CONSTRAINT => 'нарушено условие',
|
||||
DB_ERROR_DIVZERO => 'деление на нула',
|
||||
DB_ERROR_INVALID => 'неправилно',
|
||||
DB_ERROR_INVALID_DATE => 'некоректна дата или час',
|
||||
DB_ERROR_INVALID_NUMBER => 'невалиден номер',
|
||||
DB_ERROR_MISMATCH => 'погрешна употреба',
|
||||
DB_ERROR_NODBSELECTED => 'не е избрана база данни',
|
||||
DB_ERROR_NOSUCHFIELD => 'несъществуващо поле',
|
||||
DB_ERROR_NOSUCHTABLE => 'несъществуваща таблица',
|
||||
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||
DB_ERROR_NOT_FOUND => 'не е намерена',
|
||||
DB_ERROR_NOT_LOCKED => 'не е заключена',
|
||||
DB_ERROR_SYNTAX => 'грешен синтаксис',
|
||||
DB_ERROR_UNSUPPORTED => 'не се поддържа',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'некоректен брой колони в реда',
|
||||
DB_ERROR_INVALID_DSN => 'невалиден DSN',
|
||||
DB_ERROR_CONNECT_FAILED => 'връзката не може да бъде осъществена',
|
||||
0 => 'няма грешки', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'предоставените данни са недостатъчни',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'разширението не е намерено',
|
||||
DB_ERROR_NOSUCHDB => 'несъществуваща база данни',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'нямате достатъчно права'
|
||||
);
|
||||
?>
|
||||
@@ -1,34 +0,0 @@
|
||||
<?php
|
||||
// Catalan language
|
||||
// contributed by "Josep Lladonosa" jlladono#pie.xtec.es
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'ca',
|
||||
DB_ERROR => 'error desconegut',
|
||||
DB_ERROR_ALREADY_EXISTS => 'ja existeix',
|
||||
DB_ERROR_CANNOT_CREATE => 'no es pot crear',
|
||||
DB_ERROR_CANNOT_DELETE => 'no es pot esborrar',
|
||||
DB_ERROR_CANNOT_DROP => 'no es pot eliminar',
|
||||
DB_ERROR_CONSTRAINT => 'violaci<63> de constraint',
|
||||
DB_ERROR_DIVZERO => 'divisi<73> per zero',
|
||||
DB_ERROR_INVALID => 'no <20>s v<>lid',
|
||||
DB_ERROR_INVALID_DATE => 'la data o l\'hora no s<>n v<>lides',
|
||||
DB_ERROR_INVALID_NUMBER => 'el nombre no <20>s v<>lid',
|
||||
DB_ERROR_MISMATCH => 'no hi ha coincid<69>ncia',
|
||||
DB_ERROR_NODBSELECTED => 'cap base de dades seleccionada',
|
||||
DB_ERROR_NOSUCHFIELD => 'camp inexistent',
|
||||
DB_ERROR_NOSUCHTABLE => 'taula inexistent',
|
||||
DB_ERROR_NOT_CAPABLE => 'l\'execuci<63> secund<6E>ria de DB no pot',
|
||||
DB_ERROR_NOT_FOUND => 'no trobat',
|
||||
DB_ERROR_NOT_LOCKED => 'no blocat',
|
||||
DB_ERROR_SYNTAX => 'error de sintaxi',
|
||||
DB_ERROR_UNSUPPORTED => 'no suportat',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'el nombre de columnes no coincideix amb el nombre de valors en la fila',
|
||||
DB_ERROR_INVALID_DSN => 'el DSN no <20>s v<>lid',
|
||||
DB_ERROR_CONNECT_FAILED => 'connexi<78> fallida',
|
||||
0 => 'cap error', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'les dades subministrades s<>n insuficients',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensi<73> no trobada',
|
||||
DB_ERROR_NOSUCHDB => 'base de dades inexistent',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficients'
|
||||
);
|
||||
?>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
// Chinese language file contributed by "Cuiyan (cysoft)" cysoft#php.net.
|
||||
// Encode by GB2312
|
||||
// Simplified Chinese
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'cn',
|
||||
DB_ERROR => 'δ֪<CEB4><D6AA><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_ALREADY_EXISTS => '<27>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_CANNOT_CREATE => '<27><><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>',
|
||||
DB_ERROR_CANNOT_DELETE => '<27><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>',
|
||||
DB_ERROR_CANNOT_DROP => '<27><><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD>',
|
||||
DB_ERROR_CONSTRAINT => 'Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_DIVZERO => '<27><>0<EFBFBD><30>',
|
||||
DB_ERROR_INVALID => '<27><>Ч',
|
||||
DB_ERROR_INVALID_DATE => '<27><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD>ʱ<EFBFBD><CAB1>',
|
||||
DB_ERROR_INVALID_NUMBER => '<27><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_MISMATCH => '<27><>ƥ<EFBFBD><C6A5>',
|
||||
DB_ERROR_NODBSELECTED => 'û<><C3BB><EFBFBD><EFBFBD>ݿⱻѡ<E2B1BB><D1A1>',
|
||||
DB_ERROR_NOSUCHFIELD => 'û<><C3BB><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ֶ<EFBFBD>',
|
||||
DB_ERROR_NOSUCHTABLE => 'û<><C3BB><EFBFBD><EFBFBD>Ӧ<EFBFBD>ı<EFBFBD>',
|
||||
DB_ERROR_NOT_CAPABLE => '<27><>ݿ<EFBFBD><DDBF>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOT_FOUND => 'û<>з<EFBFBD><D0B7><EFBFBD>',
|
||||
DB_ERROR_NOT_LOCKED => 'û<>б<EFBFBD><D0B1><EFBFBD>',
|
||||
DB_ERROR_SYNTAX => '<27><EFBFBD><EFB7A8><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_UNSUPPORTED => '<27><>֧<EFBFBD><D6A7>',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => '<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>ֵ',
|
||||
DB_ERROR_INVALID_DSN => '<27><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>Դ (DSN)',
|
||||
DB_ERROR_CONNECT_FAILED => '<27><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>',
|
||||
0 => 'û<>д<EFBFBD><D0B4><EFBFBD>', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => '<27>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ܷ<EFBFBD><DCB7>Ҫ<EFBFBD><D2AA>',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> '<27><>չû<D5B9>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>',
|
||||
DB_ERROR_NOSUCHDB => 'û<><C3BB><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ݿ<EFBFBD>',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'û<>к<EFBFBD><D0BA>ʵ<EFBFBD>Ȩ<EFBFBD><C8A8>'
|
||||
);
|
||||
?>
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
|
||||
# Czech language, encoding by ISO 8859-2 charset (Iso Latin-2)
|
||||
# For convert to MS Windows use shell command:
|
||||
# iconv -f ISO_8859-2 -t CP1250 < adodb-cz.inc.php
|
||||
# For convert to ASCII use shell command:
|
||||
# unaccent ISO_8859-2 < adodb-cz.inc.php
|
||||
# v1.0, 19.06.2003 Kamil Jakubovic <jake@host.sk>
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'cz',
|
||||
DB_ERROR => 'nezn<7A>m<EFBFBD> chyba',
|
||||
DB_ERROR_ALREADY_EXISTS => 'ji? existuje',
|
||||
DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it',
|
||||
DB_ERROR_CANNOT_DELETE => 'nelze smazat',
|
||||
DB_ERROR_CANNOT_DROP => 'nelze odstranit',
|
||||
DB_ERROR_CONSTRAINT => 'poru?en<65> omezuj<75>c<EFBFBD> podm<64>nky',
|
||||
DB_ERROR_DIVZERO => 'd?len<65> nulou',
|
||||
DB_ERROR_INVALID => 'neplatn<74>',
|
||||
DB_ERROR_INVALID_DATE => 'neplatn<74> datum nebo ?as',
|
||||
DB_ERROR_INVALID_NUMBER => 'neplatn<74> ?<3F>slo',
|
||||
DB_ERROR_MISMATCH => 'nesouhlas<61>',
|
||||
DB_ERROR_NODBSELECTED => '?<3F>dn<64> datab<61>ze nen<65> vybr<62>na',
|
||||
DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
|
||||
DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
|
||||
DB_ERROR_NOT_CAPABLE => 'nepodporov<6F>no',
|
||||
DB_ERROR_NOT_FOUND => 'nenalezeno',
|
||||
DB_ERROR_NOT_LOCKED => 'nezam?eno',
|
||||
DB_ERROR_SYNTAX => 'syntaktick<63> chyba',
|
||||
DB_ERROR_UNSUPPORTED => 'nepodporov<6F>no',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => '',
|
||||
DB_ERROR_INVALID_DSN => 'neplatn<74> DSN',
|
||||
DB_ERROR_CONNECT_FAILED => 'p?ipojen<65> selhalo',
|
||||
0 => 'bez chyb', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'm<>lo zdrojov<6F>ch dat',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?<3F>?en<65> nenalezeno',
|
||||
DB_ERROR_NOSUCHDB => 'datab<61>ze neexistuje',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'nedostate?n<> pr<70>va'
|
||||
);
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
// Arne Eckmann bananstat#users.sourceforge.net
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'da',
|
||||
DB_ERROR => 'ukendt fejl',
|
||||
DB_ERROR_ALREADY_EXISTS => 'eksisterer allerede',
|
||||
DB_ERROR_CANNOT_CREATE => 'kan ikke oprette',
|
||||
DB_ERROR_CANNOT_DELETE => 'kan ikke slette',
|
||||
DB_ERROR_CANNOT_DROP => 'kan ikke droppe',
|
||||
DB_ERROR_CONSTRAINT => 'begrænsning krænket',
|
||||
DB_ERROR_DIVZERO => 'division med nul',
|
||||
DB_ERROR_INVALID => 'ugyldig',
|
||||
DB_ERROR_INVALID_DATE => 'ugyldig dato eller klokkeslet',
|
||||
DB_ERROR_INVALID_NUMBER => 'ugyldigt tal',
|
||||
DB_ERROR_MISMATCH => 'mismatch',
|
||||
DB_ERROR_NODBSELECTED => 'ingen database valgt',
|
||||
DB_ERROR_NOSUCHFIELD => 'felt findes ikke',
|
||||
DB_ERROR_NOSUCHTABLE => 'tabel findes ikke',
|
||||
DB_ERROR_NOT_CAPABLE => 'DB backend opgav',
|
||||
DB_ERROR_NOT_FOUND => 'ikke fundet',
|
||||
DB_ERROR_NOT_LOCKED => 'ikke låst',
|
||||
DB_ERROR_SYNTAX => 'syntaksfejl',
|
||||
DB_ERROR_UNSUPPORTED => 'ikke understøttet',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til forespørgslens antal felter',
|
||||
DB_ERROR_INVALID_DSN => 'ugyldig DSN',
|
||||
DB_ERROR_CONNECT_FAILED => 'tilslutning mislykkedes',
|
||||
0 => 'ingen fejl', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'utilstrækkelige data angivet',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet',
|
||||
DB_ERROR_NOSUCHDB => 'database ikke fundet',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'utilstrækkelige rettigheder'
|
||||
);
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
// contributed by "Heinz Hombergs" <opn@hhombergs.de>
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'de',
|
||||
DB_ERROR => 'Unbekannter Fehler',
|
||||
DB_ERROR_ALREADY_EXISTS => 'existiert bereits',
|
||||
DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen',
|
||||
DB_ERROR_CANNOT_DELETE => 'kann nicht löschen',
|
||||
DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden',
|
||||
DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
|
||||
DB_ERROR_DIVZERO => 'Division durch Null',
|
||||
DB_ERROR_INVALID => 'ung¨ltig',
|
||||
DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit',
|
||||
DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl',
|
||||
DB_ERROR_MISMATCH => 'Unverträglichkeit',
|
||||
DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt',
|
||||
DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden',
|
||||
DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden',
|
||||
DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert',
|
||||
DB_ERROR_NOT_FOUND => 'nicht gefunden',
|
||||
DB_ERROR_NOT_LOCKED => 'nicht gesperrt',
|
||||
DB_ERROR_SYNTAX => 'Syntaxfehler',
|
||||
DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
|
||||
DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN',
|
||||
DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
|
||||
0 => 'kein Fehler', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
|
||||
DB_ERROR_NOSUCHDB => 'keine Datenbank',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte'
|
||||
);
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'en',
|
||||
DB_ERROR => 'unknown error',
|
||||
DB_ERROR_ALREADY_EXISTS => 'already exists',
|
||||
DB_ERROR_CANNOT_CREATE => 'can not create',
|
||||
DB_ERROR_CANNOT_DELETE => 'can not delete',
|
||||
DB_ERROR_CANNOT_DROP => 'can not drop',
|
||||
DB_ERROR_CONSTRAINT => 'constraint violation',
|
||||
DB_ERROR_DIVZERO => 'division by zero',
|
||||
DB_ERROR_INVALID => 'invalid',
|
||||
DB_ERROR_INVALID_DATE => 'invalid date or time',
|
||||
DB_ERROR_INVALID_NUMBER => 'invalid number',
|
||||
DB_ERROR_MISMATCH => 'mismatch',
|
||||
DB_ERROR_NODBSELECTED => 'no database selected',
|
||||
DB_ERROR_NOSUCHFIELD => 'no such field',
|
||||
DB_ERROR_NOSUCHTABLE => 'no such table',
|
||||
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||
DB_ERROR_NOT_FOUND => 'not found',
|
||||
DB_ERROR_NOT_LOCKED => 'not locked',
|
||||
DB_ERROR_SYNTAX => 'syntax error',
|
||||
DB_ERROR_UNSUPPORTED => 'not supported',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
|
||||
DB_ERROR_INVALID_DSN => 'invalid DSN',
|
||||
DB_ERROR_CONNECT_FAILED => 'connect failed',
|
||||
0 => 'no error', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
|
||||
DB_ERROR_NOSUCHDB => 'no such database',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions'
|
||||
);
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
// contributed by "Horacio Degiorgi" <horaciod@codigophp.com>
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'es',
|
||||
DB_ERROR => 'error desconocido',
|
||||
DB_ERROR_ALREADY_EXISTS => 'ya existe',
|
||||
DB_ERROR_CANNOT_CREATE => 'imposible crear',
|
||||
DB_ERROR_CANNOT_DELETE => 'imposible borrar',
|
||||
DB_ERROR_CANNOT_DROP => 'imposible hacer drop',
|
||||
DB_ERROR_CONSTRAINT => 'violacion de constraint',
|
||||
DB_ERROR_DIVZERO => 'division por cero',
|
||||
DB_ERROR_INVALID => 'invalido',
|
||||
DB_ERROR_INVALID_DATE => 'fecha u hora invalida',
|
||||
DB_ERROR_INVALID_NUMBER => 'numero invalido',
|
||||
DB_ERROR_MISMATCH => 'error',
|
||||
DB_ERROR_NODBSELECTED => 'no hay base de datos seleccionada',
|
||||
DB_ERROR_NOSUCHFIELD => 'campo invalido',
|
||||
DB_ERROR_NOSUCHTABLE => 'tabla no existe',
|
||||
DB_ERROR_NOT_CAPABLE => 'capacidad invalida para esta DB',
|
||||
DB_ERROR_NOT_FOUND => 'no encontrado',
|
||||
DB_ERROR_NOT_LOCKED => 'no bloqueado',
|
||||
DB_ERROR_SYNTAX => 'error de sintaxis',
|
||||
DB_ERROR_UNSUPPORTED => 'no soportado',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'la cantidad de columnas no corresponden a la cantidad de valores',
|
||||
DB_ERROR_INVALID_DSN => 'DSN invalido',
|
||||
DB_ERROR_CONNECT_FAILED => 'fallo la conexion',
|
||||
0 => 'sin error', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'insuficientes datos',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension no encontrada',
|
||||
DB_ERROR_NOSUCHDB => 'base de datos no encontrada',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'permisos insuficientes'
|
||||
);
|
||||
?>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
// Vivu Esperanto cxiam!
|
||||
// Traduko fare de Antono Vasiljev (anders[#]brainactive.org)
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'eo',
|
||||
DB_ERROR => 'nekonata eraro',
|
||||
DB_ERROR_ALREADY_EXISTS => 'jam ekzistas',
|
||||
DB_ERROR_CANNOT_CREATE => 'maleblas krei',
|
||||
DB_ERROR_CANNOT_DELETE => 'maleblas elimini',
|
||||
DB_ERROR_CANNOT_DROP => 'maleblas elimini (drop)',
|
||||
DB_ERROR_CONSTRAINT => 'rompo de kondicxoj de provo',
|
||||
DB_ERROR_DIVZERO => 'divido per 0 (nul)',
|
||||
DB_ERROR_INVALID => 'malregule',
|
||||
DB_ERROR_INVALID_DATE => 'malregula dato kaj tempo',
|
||||
DB_ERROR_INVALID_NUMBER => 'malregula nombro',
|
||||
DB_ERROR_MISMATCH => 'eraro',
|
||||
DB_ERROR_NODBSELECTED => 'datumbazo ne elektita',
|
||||
DB_ERROR_NOSUCHFIELD => 'ne ekzistas kampo',
|
||||
DB_ERROR_NOSUCHTABLE => 'ne ekzistas tabelo',
|
||||
DB_ERROR_NOT_CAPABLE => 'DBMS ne povas',
|
||||
DB_ERROR_NOT_FOUND => 'ne trovita',
|
||||
DB_ERROR_NOT_LOCKED => 'ne blokita',
|
||||
DB_ERROR_SYNTAX => 'sintaksa eraro',
|
||||
DB_ERROR_UNSUPPORTED => 'ne apogata',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'nombrilo de valoroj en linio',
|
||||
DB_ERROR_INVALID_DSN => 'malregula DSN-o',
|
||||
DB_ERROR_CONNECT_FAILED => 'konekto malsukcesa',
|
||||
0 => 'cxio bone', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'ne suficxe da datumo',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'etendo ne trovita',
|
||||
DB_ERROR_NOSUCHDB => 'datumbazo ne ekzistas',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'ne suficxe da rajto por atingo'
|
||||
);
|
||||
?>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
/* Farsi - by "Peyman Hooshmandi Raad" <phooshmand#gmail.com> */
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'fa',
|
||||
DB_ERROR => 'خطای ناشناخته',
|
||||
DB_ERROR_ALREADY_EXISTS => 'وجود دارد',
|
||||
DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد',
|
||||
DB_ERROR_CANNOT_DELETE => 'امکان حذف وجود ندارد',
|
||||
DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد',
|
||||
DB_ERROR_CONSTRAINT => 'نقض شرط',
|
||||
DB_ERROR_DIVZERO => 'تقسیم بر صفر',
|
||||
DB_ERROR_INVALID => 'نامعتبر',
|
||||
DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر',
|
||||
DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر',
|
||||
DB_ERROR_MISMATCH => 'عدم مطابقت',
|
||||
DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است',
|
||||
DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد',
|
||||
DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد',
|
||||
DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست',
|
||||
DB_ERROR_NOT_FOUND => 'پیدا نشد',
|
||||
DB_ERROR_NOT_LOCKED => 'قفل نشده',
|
||||
DB_ERROR_SYNTAX => 'خطای دستوری',
|
||||
DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیف',
|
||||
DB_ERROR_INVALID_DSN => 'DSN نامعتبر',
|
||||
DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد',
|
||||
0 => 'بدون خطا', // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'داده ناکافی است',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد',
|
||||
DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکافی'
|
||||
);
|
||||
?>
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
$ADODB_LANG_ARRAY = array (
|
||||
'LANG' => 'fr',
|
||||
DB_ERROR => 'erreur inconnue',
|
||||
DB_ERROR_ALREADY_EXISTS => 'existe déjà',
|
||||
DB_ERROR_CANNOT_CREATE => 'crétion impossible',
|
||||
DB_ERROR_CANNOT_DELETE => 'effacement impossible',
|
||||
DB_ERROR_CANNOT_DROP => 'suppression impossible',
|
||||
DB_ERROR_CONSTRAINT => 'violation de contrainte',
|
||||
DB_ERROR_DIVZERO => 'division par zéro',
|
||||
DB_ERROR_INVALID => 'invalide',
|
||||
DB_ERROR_INVALID_DATE => 'date ou heure invalide',
|
||||
DB_ERROR_INVALID_NUMBER => 'nombre invalide',
|
||||
DB_ERROR_MISMATCH => 'erreur de concordance',
|
||||
DB_ERROR_NODBSELECTED => 'pas de base de donnéessélectionnée',
|
||||
DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide',
|
||||
DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante',
|
||||
DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non installée',
|
||||
DB_ERROR_NOT_FOUND => 'pas trouvé',
|
||||
DB_ERROR_NOT_LOCKED => 'non verrouillé',
|
||||
DB_ERROR_SYNTAX => 'erreur de syntaxe',
|
||||
DB_ERROR_UNSUPPORTED => 'non supporté',
|
||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur insérée trop grande pour colonne',
|
||||
DB_ERROR_INVALID_DSN => 'DSN invalide',
|
||||
DB_ERROR_CONNECT_FAILED => 'échec à la connexion',
|
||||
0 => "pas d'erreur", // DB_OK
|
||||
DB_ERROR_NEED_MORE_DATA => 'données fournies insuffisantes',
|
||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouvée',
|
||||
DB_ERROR_NOSUCHDB => 'base de données inconnue',
|
||||
DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants'
|
||||
);
|
||||
?>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user