Removed final Agilebill items
This commit is contained in:
parent
89bb9004ed
commit
bb73fbbd17
@ -1,317 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// security - hide paths
|
|
||||||
if (!defined('ADODB_DIR')) die();
|
|
||||||
|
|
||||||
global $ADODB_INCLUDED_CSV;
|
|
||||||
$ADODB_INCLUDED_CSV = 1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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->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-2008 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.06 16 Oct 2008 (c) 2000-2008 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-2008 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.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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,290 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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-2008 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.06 16 Oct 2008 (c) 2000-2008 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,95 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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)
|
|
||||||
{
|
|
||||||
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,143 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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)
|
|
||||||
{
|
|
||||||
$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,151 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
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 '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,125 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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,67 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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,80 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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)
|
|
||||||
{
|
|
||||||
if ($fautoinc) {
|
|
||||||
$ftype = 'SERIAL';
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
$suffix = '';
|
|
||||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
|
||||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
|
||||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
|
||||||
return $suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,282 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 'DATETIME';
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
$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.06 16 Oct 2008 (c) 2000-2008 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 'DATETIME';
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
$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,181 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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,291 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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 '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,447 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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)
|
|
||||||
{
|
|
||||||
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,441 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.02 24 Sept 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). 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 '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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
|
||||||
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,121 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.50 6 July 2004 (c) 2000-2008 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 '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,228 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 '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)
|
|
||||||
{
|
|
||||||
$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.06 16 Oct 2008 (c) 2000-2008 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,644 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
$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;
|
|
||||||
|
|
||||||
foreach($inputarr as $val) {
|
|
||||||
// name, type, direction 1 = input, len,
|
|
||||||
$this->adoParameterType = 130;
|
|
||||||
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
|
|
||||||
//print $p->Type.' '.$p->value;
|
|
||||||
$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,678 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 $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) {
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
$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;
|
|
||||||
|
|
||||||
foreach($inputarr as $val) {
|
|
||||||
// name, type, direction 1 = input, len,
|
|
||||||
$this->adoParameterType = 130;
|
|
||||||
$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
|
|
||||||
//print $p->Type.' '.$p->value;
|
|
||||||
$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;
|
|
||||||
$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,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 $hasTransactions = false;
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
$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,92 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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,828 +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.");
|
|
||||||
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) {
|
|
||||||
$this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
|
|
||||||
} 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);
|
|
||||||
|
|
||||||
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) {
|
|
||||||
$this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
|
|
||||||
} 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);
|
|
||||||
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
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];
|
|
||||||
$schemaval = ($schema) ? $arr[$i][1].'.' : '';
|
|
||||||
if ($ttype) {
|
|
||||||
if ($isview) {
|
|
||||||
if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
|
|
||||||
} else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
|
|
||||||
} else if (strncmp($type,'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)
|
|
||||||
{
|
|
||||||
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,266 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
@version V5.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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-2008 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.06 16 Oct 2008 (c) 2000-2008 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,$flds='1 as ignore')
|
|
||||||
{
|
|
||||||
if ($this->_autocommit) $this->BeginTrans();
|
|
||||||
return $this->GetOne("select $flds 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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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 = split(';',$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,419 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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;
|
|
||||||
|
|
||||||
$conn_info = array( $host,$this->port);
|
|
||||||
|
|
||||||
if ( strstr( $host, ':' ) ) {
|
|
||||||
$conn_info = split( ':', $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)
|
|
||||||
{
|
|
||||||
$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-2008 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)
|
|
||||||
{
|
|
||||||
$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,902 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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();
|
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
|
||||||
// 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,$flds='top 1 null as ignore')
|
|
||||||
{
|
|
||||||
if (!$this->transCnt) $this->BeginTrans();
|
|
||||||
return $this->GetOne("select $flds 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)
|
|
||||||
{
|
|
||||||
$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
|
|
||||||
function UnixDate($v)
|
|
||||||
{
|
|
||||||
return ADORecordSet_array_mssql::UnixDate($v);
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
if ($this->connection->debug) error_log("<hr>fetchfield: $fieldOffset, fetch array: <pre>".print_r($this->fields,true)."</pre> backtrace: ".adodb_backtrace(false));
|
|
||||||
if ($fieldOffset != -1) $this->fieldOffset = $fieldOffset;
|
|
||||||
$arrKeys = array_keys($this->fields);
|
|
||||||
if(array_key_exists($this->fieldOffset,$arrKeys) && !array_key_exists($arrKeys[$this->fieldOffset],$this->fields)) {
|
|
||||||
$f = false;
|
|
||||||
} else {
|
|
||||||
$f = $this->fields[ $arrKeys[$this->fieldOffset] ];
|
|
||||||
if($fieldOffset == -1) $this->fieldOffset++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($f)) {
|
|
||||||
$f = false;//PHP Notice: Only variable references should be returned by reference
|
|
||||||
}
|
|
||||||
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\TH:i:s\Z");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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
|
|
||||||
function UnixDate($v)
|
|
||||||
{
|
|
||||||
return ADORecordSet_array_mssqlnative::UnixDate($v);
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
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]);
|
|
||||||
}
|
|
||||||
|
|
||||||
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-2008 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)
|
|
||||||
{
|
|
||||||
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,791 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 false;
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
//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);
|
|
||||||
}
|
|
||||||
|
|
||||||
$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.06 16 Oct 2008 (c) 2000-2008 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='',$flds='1 as adodb_ignore')
|
|
||||||
{
|
|
||||||
if ($this->transCnt==0) $this->BeginTrans();
|
|
||||||
if ($where) $where = ' where '.$where;
|
|
||||||
$rs = $this->Execute("select $flds 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.06 16 Oct 2008 (c) 2000-2008 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;
|
|
||||||
$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='',$flds='1 as adodb_ignore')
|
|
||||||
{
|
|
||||||
if ($this->transCnt==0) $this->BeginTrans();
|
|
||||||
if ($where) $where = ' where '.$where;
|
|
||||||
$rs = $this->Execute("select $flds 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.06 16 Oct 2008 (c) 2000-2008 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-2008 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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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,$flds='1 as ignore')
|
|
||||||
{
|
|
||||||
if ($this->_autocommit) $this->BeginTrans();
|
|
||||||
return $this->GetOne("select $flds 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,306 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 SCOPE_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 = $ADODB_FETCH_MODE;
|
|
||||||
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
|
|
||||||
$row = $this->GetRow("execute sp_server_info 2");
|
|
||||||
$ADODB_FETCH_MODE = $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) {$this->debug=1;
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
$arr = ADOConnection::MetaColumns($table);
|
|
||||||
return $arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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 _query($sql,$inputarr)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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,793 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 (empty($this->_connectionID)) return @odbtp_last_error();
|
|
||||||
return @odbtp_last_error($this->_connectionID);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ErrorNo()
|
|
||||||
{
|
|
||||||
if (empty($this->_connectionID)) return @odbtp_last_error_state();
|
|
||||||
return @odbtp_last_error_state($this->_connectionID);
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
$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
|
|
||||||
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
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] );
|
|
||||||
}
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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,338 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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);
|
|
||||||
return 'TO_DATE('.adodb_date($this->fmtDate,$d).",'YYYY-MM-DD')";
|
|
||||||
}
|
|
||||||
|
|
||||||
// format and return date string in database timestamp format
|
|
||||||
function DBTimeStamp($ts)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
|
|
||||||
return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'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,580 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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':
|
|
||||||
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 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 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 (!$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 (!$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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function MetaColumns()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
?>
|
|
@ -1,182 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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 $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)
|
|
||||||
{
|
|
||||||
$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
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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_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,268 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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 $hasTransactions = true;
|
|
||||||
var $_bndInputArray = false;
|
|
||||||
var $hasInsertID = true;
|
|
||||||
var $hasGenID = true;
|
|
||||||
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 $_stmt = false;
|
|
||||||
|
|
||||||
function _init($parentDriver)
|
|
||||||
{
|
|
||||||
$parentDriver->_bindInputArray = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _query($sql,$inputarr=false) {
|
|
||||||
if(strtolower(substr($sql,0,5)) != 'alter') {
|
|
||||||
return parent::_query($sql,$inputarr);
|
|
||||||
} else {
|
|
||||||
if(!$this->sqliteDropColumn($sql))
|
|
||||||
return parent::_query($sql,$inputarr);
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _connect($argDSN, $argUsername, $argPassword, $argDatabasename, $persist=false) {
|
|
||||||
return parent::_connect($argDatabasename,'','','',$persist);
|
|
||||||
}
|
|
||||||
|
|
||||||
function sqliteDropColumn($sql) {
|
|
||||||
$queryparts = preg_split("/[\s]+/",$sql,10,PREG_SPLIT_NO_EMPTY);
|
|
||||||
if(count($queryparts) == 6) {
|
|
||||||
$table = $queryparts[2];
|
|
||||||
$temp_table = $table.'_Temp';
|
|
||||||
$removeColumn = $queryparts[5];
|
|
||||||
$removeColumn = str_replace(';','',$removeColumn);
|
|
||||||
if(strtolower($queryparts[1]) != 'table' ||
|
|
||||||
strtolower($queryparts[3]) != 'drop' ||
|
|
||||||
strtolower($queryparts[4]) != 'column') {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// RENAME TABLE to TABLE_Temp
|
|
||||||
// CREATE new table without dropped column
|
|
||||||
// INSERT RECORDS from old table to new
|
|
||||||
// DROP Temp table
|
|
||||||
$meta = $this->MetaColumns($table);
|
|
||||||
$fields = Array();
|
|
||||||
$fieldNames = Array();
|
|
||||||
foreach($meta as $col) {
|
|
||||||
if($col->name != $removeColumn) {
|
|
||||||
$colText = $col->name;
|
|
||||||
if(!empty($col->type))
|
|
||||||
$colText .= ' '.$col->type;
|
|
||||||
if($col->not_null)
|
|
||||||
$colText .= ' NOT NULL';
|
|
||||||
if(!empty($col->default_value))
|
|
||||||
$colText .= ' DEFAULT '.$col->default_value.'';
|
|
||||||
|
|
||||||
$fieldNames[] = $col->name;
|
|
||||||
$fields[] = $colText;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$fieldList = implode(',',$fields);
|
|
||||||
$fieldNameList = implode(',',$fieldNames);
|
|
||||||
|
|
||||||
$this->BeginTrans();
|
|
||||||
$sql = "SELECT sql FROM sqlite_master WHERE type = 'index' AND tbl_name = '$table'";
|
|
||||||
$result = $this->Execute($sql);
|
|
||||||
while(list($index) = $result->FetchRow()) {
|
|
||||||
$indexes[] = $index;
|
|
||||||
}
|
|
||||||
|
|
||||||
$renameTempSql = 'ALTER TABLE '.$table.' RENAME TO '.$temp_table.';';
|
|
||||||
$createTableSql = 'CREATE TABLE '.$table.'('.$fieldList.');';
|
|
||||||
$copyTableContentsSql = 'INSERT INTO '.$table.' SELECT '.$fieldNameList.' FROM '.$temp_table.';';
|
|
||||||
$removeTableSql = 'DROP TABLE '.$temp_table.';';
|
|
||||||
$vacuumSql = 'VACUUM '.$table.';';
|
|
||||||
|
|
||||||
// Do the steps to drop the column by renaming and creating new table
|
|
||||||
$ok = $this->Execute($renameTempSql);
|
|
||||||
if($ok) $ok = $this->Execute($createTableSql);
|
|
||||||
if($ok) $ok = $this->Execute($copyTableContentsSql);
|
|
||||||
|
|
||||||
$this->CommitTrans($ok);
|
|
||||||
|
|
||||||
if($ok) $ok = $this->Execute($removeTableSql);
|
|
||||||
if($ok) $ok = $this->Execute($vacuumSql);
|
|
||||||
|
|
||||||
// Recreate the indexes on the new table from the old
|
|
||||||
foreach($indexes as $indexSQL) {
|
|
||||||
$listStart = strpos($indexSQL,'(')+1;
|
|
||||||
$listEnd = strpos($indexSQL,')');
|
|
||||||
$indexList = substr($indexSQL,$listStart,$listEnd-$listStart);
|
|
||||||
$indexList = explode(',',$indexList);
|
|
||||||
$newIndexList = Array();
|
|
||||||
foreach($indexList as $listItem) {
|
|
||||||
$listItem = trim($listItem);
|
|
||||||
if($listItem != $removeColumn) {
|
|
||||||
$newIndexList[] = $listItem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$indexSQL = substr($indexSQL,0,$listStart-1);
|
|
||||||
$indexSQL .= '('.implode(',',$newIndexList).');';
|
|
||||||
$this->Execute($indexSQL);
|
|
||||||
}
|
|
||||||
return $ok;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs=0) {
|
|
||||||
$offsetStr =($offset>=0) ? "$offset," : '';
|
|
||||||
if ($secs)
|
|
||||||
$rs =& $this->CacheExecute($secs,$sql." LIMIT $offsetStr$nrows",$inputarr);
|
|
||||||
else
|
|
||||||
$rs =& $this->Execute($sql." LIMIT $offsetStr$nrows",$inputarr);
|
|
||||||
return $rs;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 = array_pop($this->GetCol("select id from $seq")));
|
|
||||||
if ($num === false || !is_numeric($num)) {
|
|
||||||
@$this->Execute(sprintf($this->_genSeqSQL ,$seq));
|
|
||||||
$start -= 1;
|
|
||||||
$num = '0';
|
|
||||||
$cnt = $this->GetOne(sprintf($this->_genSeqCountSQL,$seq));
|
|
||||||
if (!$cnt) {
|
|
||||||
$ok = $this->Execute(sprintf($this->_genSeq2SQL,$seq,$start));
|
|
||||||
}
|
|
||||||
if (!$ok) return false;
|
|
||||||
}
|
|
||||||
$this->Execute("update $seq set id=id+1");
|
|
||||||
|
|
||||||
if ($this->affected_rows() > 0) {
|
|
||||||
$num += 1;
|
|
||||||
$this->genID = intval($num);
|
|
||||||
return intval($num);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($fn = $this->raiseErrorFn) {
|
|
||||||
$fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function BeginTrans()
|
|
||||||
{
|
|
||||||
if (!$this->hasTransactions) return false;
|
|
||||||
if ($this->transOff) return true;
|
|
||||||
if($this->transCnt < 1) {
|
|
||||||
$this->transCnt += 1;
|
|
||||||
$this->_autocommit = false;
|
|
||||||
return $this->_connectionID->beginTransaction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function CommitTrans($ok=true)
|
|
||||||
{
|
|
||||||
if (!$this->hasTransactions) return false;
|
|
||||||
if ($this->transOff) return true;
|
|
||||||
if (!$ok) return $this->RollbackTrans();
|
|
||||||
if ($this->transCnt) $this->transCnt -= 1;
|
|
||||||
$this->_autocommit = true;
|
|
||||||
|
|
||||||
if($this->transCnt == 0)
|
|
||||||
$ret = $this->_connectionID->commit();
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function RollbackTrans()
|
|
||||||
{
|
|
||||||
if (!$this->hasTransactions) return false;
|
|
||||||
if ($this->transOff) return true;
|
|
||||||
if ($this->transCnt) $this->transCnt -= 1;
|
|
||||||
$this->_autocommit = true;
|
|
||||||
|
|
||||||
$ret = $this->_connectionID->rollback();
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)");
|
|
||||||
}
|
|
||||||
|
|
||||||
function DropSequence($seqname) {
|
|
||||||
if (empty($this->_dropSeqSQL)) return false;
|
|
||||||
return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
|
|
||||||
}
|
|
||||||
|
|
||||||
// mark newnham
|
|
||||||
function &MetaColumns($tab)
|
|
||||||
{
|
|
||||||
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('$tab')");
|
|
||||||
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->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) {
|
|
||||||
return $this->GetCol($this->metaTablesSQL);
|
|
||||||
}
|
|
||||||
|
|
||||||
function __sleep() {
|
|
||||||
unset($this->_connectionID);
|
|
||||||
return( array_keys( get_object_vars( $this ) ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
|
@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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(ereg_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field')));
|
|
||||||
} else {
|
|
||||||
$a[$rs->Fields('lookup_table')][] = ereg_replace('"','',$rs->Fields('dep_field').'='.$rs->Fields('lookup_field'));
|
|
||||||
}
|
|
||||||
adodb_movenext($rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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.06 16 Oct 2008 (c) 2000-2008 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-2008 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.06 16 Oct 2008 (c) 2000-2008 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($tab)
|
|
||||||
{
|
|
||||||
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('$tab')");
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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,418 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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,$flds='top 1 null as ignore')
|
|
||||||
{
|
|
||||||
if (!$this->_hastrans) $this->BeginTrans();
|
|
||||||
$tables = str_replace(',',' HOLDLOCK,',$tables);
|
|
||||||
return $this->GetOne("select $flds 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;
|
|
||||||
|
|
||||||
$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;
|
|
||||||
|
|
||||||
$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)
|
|
||||||
{
|
|
||||||
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 (!ereg( "([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 (!ereg( "([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,119 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
V5.06 16 Oct 2008 (c) 2000-2008 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
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.06 16 Oct 2008 (c) 2000-2008 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 => 'خطأ غير محدد',
|
|
||||||
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_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,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 => 'неизвестна грешка',
|
|
||||||
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,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ó de constraint',
|
|
||||||
DB_ERROR_DIVZERO => 'divisió per zero',
|
|
||||||
DB_ERROR_INVALID => 'no és vàlid',
|
|
||||||
DB_ERROR_INVALID_DATE => 'la data o l\'hora no són vàlides',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'el nombre no és vàlid',
|
|
||||||
DB_ERROR_MISMATCH => 'no hi ha coincidè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ó secundà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 és vàlid',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'connexió fallida',
|
|
||||||
0 => 'cap error', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'les dades subministrades són insuficients',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensió 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 => '未知错误',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => '已经存在',
|
|
||||||
DB_ERROR_CANNOT_CREATE => '不能创建',
|
|
||||||
DB_ERROR_CANNOT_DELETE => '不能删除',
|
|
||||||
DB_ERROR_CANNOT_DROP => '不能丢弃',
|
|
||||||
DB_ERROR_CONSTRAINT => '约束限制',
|
|
||||||
DB_ERROR_DIVZERO => '被0除',
|
|
||||||
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_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,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ámá 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í omezující podmínky',
|
|
||||||
DB_ERROR_DIVZERO => 'd?lení nulou',
|
|
||||||
DB_ERROR_INVALID => 'neplatné',
|
|
||||||
DB_ERROR_INVALID_DATE => 'neplatné datum nebo ?as',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'neplatné ?íslo',
|
|
||||||
DB_ERROR_MISMATCH => 'nesouhlasí',
|
|
||||||
DB_ERROR_NODBSELECTED => '?ádná databáze není vybrána',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'nepodporováno',
|
|
||||||
DB_ERROR_NOT_FOUND => 'nenalezeno',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'nezam?eno',
|
|
||||||
DB_ERROR_SYNTAX => 'syntaktická chyba',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'nepodporováno',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => '',
|
|
||||||
DB_ERROR_INVALID_DSN => 'neplatné DSN',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'p?ipojení selhalo',
|
|
||||||
0 => 'bez chyb', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'málo zdrojových dat',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'roz?í?ení nenalezeno',
|
|
||||||
DB_ERROR_NOSUCHDB => 'databáze neexistuje',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'nedostate?ná prá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'
|
|
||||||
);
|
|
||||||
?>
|
|
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
# Hungarian language, encoding by ISO 8859-2 charset (Iso Latin-2)
|
|
||||||
# Halászvári Gábor <g.halaszvari#portmax.hu>
|
|
||||||
$ADODB_LANG_ARRAY = array (
|
|
||||||
'LANG' => 'hu',
|
|
||||||
DB_ERROR => 'ismeretlen hiba',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'már létezik',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'nem sikerült létrehozni',
|
|
||||||
DB_ERROR_CANNOT_DELETE => 'nem sikerült törölni',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'nem sikerült eldobni',
|
|
||||||
DB_ERROR_CONSTRAINT => 'szabályok megszegése',
|
|
||||||
DB_ERROR_DIVZERO => 'osztás nullával',
|
|
||||||
DB_ERROR_INVALID => 'érvénytelen',
|
|
||||||
DB_ERROR_INVALID_DATE => 'érvénytelen dátum vagy idõ',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'érvénytelen szám',
|
|
||||||
DB_ERROR_MISMATCH => 'nem megfelelõ',
|
|
||||||
DB_ERROR_NODBSELECTED => 'nincs kiválasztott adatbázis',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'nincs ilyen mezõ',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'nincs ilyen tábla',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'DB backend nem támogatja',
|
|
||||||
DB_ERROR_NOT_FOUND => 'nem található',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'nincs lezárva',
|
|
||||||
DB_ERROR_SYNTAX => 'szintaktikai hiba',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'nem támogatott',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'soron végzett érték számlálás',
|
|
||||||
DB_ERROR_INVALID_DSN => 'hibás DSN',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'sikertelen csatlakozás',
|
|
||||||
0 => 'nincs hiba', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'túl kevés az adat',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'bõvítmény nem található',
|
|
||||||
DB_ERROR_NOSUCHDB => 'nincs ilyen adatbázis',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'nincs jogosultság'
|
|
||||||
);
|
|
||||||
?>
|
|
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Italian language file contributed by Tiraboschi Massimiliano aka TiMax
|
|
||||||
// www.maxdev.com timax@maxdev.com
|
|
||||||
$ADODB_LANG_ARRAY = array (
|
|
||||||
'LANG' => 'it',
|
|
||||||
DB_ERROR => 'errore sconosciuto',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'esiste già',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'non posso creare',
|
|
||||||
DB_ERROR_CANNOT_DELETE => 'non posso cancellare',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'non posso eliminare',
|
|
||||||
DB_ERROR_CONSTRAINT => 'violazione constraint',
|
|
||||||
DB_ERROR_DIVZERO => 'divisione per zero',
|
|
||||||
DB_ERROR_INVALID => 'non valido',
|
|
||||||
DB_ERROR_INVALID_DATE => 'data od ora non valida',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'numero non valido',
|
|
||||||
DB_ERROR_MISMATCH => 'diversi',
|
|
||||||
DB_ERROR_NODBSELECTED => 'nessun database selezionato',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'nessun campo trovato',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato',
|
|
||||||
DB_ERROR_NOT_FOUND => 'non trovato',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'non bloccato',
|
|
||||||
DB_ERROR_SYNTAX => 'errore di sintassi',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'non supportato',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna',
|
|
||||||
DB_ERROR_INVALID_DSN => 'DSN non valido',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'connessione fallita',
|
|
||||||
0 => 'nessun errore', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata',
|
|
||||||
DB_ERROR_NOSUCHDB => 'database non trovato',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti'
|
|
||||||
);
|
|
||||||
?>
|
|
@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
// Translated by Pim Koeman (pim#wittenborg-university.com)
|
|
||||||
$ADODB_LANG_ARRAY = array (
|
|
||||||
'LANG' => 'nl',
|
|
||||||
DB_ERROR => 'onbekende fout',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'bestaat al',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'kan niet aanmaken',
|
|
||||||
DB_ERROR_CANNOT_DELETE => 'kan niet wissen',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'kan niet verwijderen',
|
|
||||||
DB_ERROR_CONSTRAINT => 'constraint overtreding',
|
|
||||||
DB_ERROR_DIVZERO => 'poging tot delen door nul',
|
|
||||||
DB_ERROR_INVALID => 'ongeldig',
|
|
||||||
DB_ERROR_INVALID_DATE => 'ongeldige datum of tijd',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'ongeldig nummer',
|
|
||||||
DB_ERROR_MISMATCH => 'is incorrect',
|
|
||||||
DB_ERROR_NODBSELECTED => 'geen database geselecteerd',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'onbekend veld',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'onbekende tabel',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'database systeem is niet tot uitvoer in staat',
|
|
||||||
DB_ERROR_NOT_FOUND => 'niet gevonden',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'niet vergrendeld',
|
|
||||||
DB_ERROR_SYNTAX => 'syntaxis fout',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'niet ondersteund',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'waarde telling op rij',
|
|
||||||
DB_ERROR_INVALID_DSN => 'ongeldige DSN',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'connectie mislukt',
|
|
||||||
0 => 'geen fout', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'onvoldoende data gegeven',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie niet gevonden',
|
|
||||||
DB_ERROR_NOSUCHDB => 'onbekende database',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'onvoldoende rechten'
|
|
||||||
);
|
|
||||||
?>
|
|
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// Contributed by Grzegorz Pacan <gp#dione.cc>
|
|
||||||
|
|
||||||
$ADODB_LANG_ARRAY = array (
|
|
||||||
'LANG' => 'pl',
|
|
||||||
DB_ERROR => 'niezidentyfikowany błąd',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'już istnieją',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'nie można stworzyć',
|
|
||||||
DB_ERROR_CANNOT_DELETE => 'nie można usunąć',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'nie można porzucić',
|
|
||||||
DB_ERROR_CONSTRAINT => 'pogwałcenie uprawnień',
|
|
||||||
DB_ERROR_DIVZERO => 'dzielenie przez zero',
|
|
||||||
DB_ERROR_INVALID => 'błędny',
|
|
||||||
DB_ERROR_INVALID_DATE => 'błędna godzina lub data',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'błędny numer',
|
|
||||||
DB_ERROR_MISMATCH => 'niedopasowanie',
|
|
||||||
DB_ERROR_NODBSELECTED => 'baza danych nie została wybrana',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'nie znaleziono pola',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'nie znaleziono tabeli',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'nie zdolny',
|
|
||||||
DB_ERROR_NOT_FOUND => 'nie znaleziono',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'nie zakmnięty',
|
|
||||||
DB_ERROR_SYNTAX => 'błąd składni',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'nie obsługuje',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'wartość liczona w szeregu',
|
|
||||||
DB_ERROR_INVALID_DSN => 'błędny DSN',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'połączenie nie zostało zrealizowane',
|
|
||||||
0 => 'brak błędów', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'niedostateczna ilość informacji',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'nie znaleziono rozszerzenia',
|
|
||||||
DB_ERROR_NOSUCHDB => 'nie znaleziono bazy',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'niedostateczne uprawnienia'
|
|
||||||
);
|
|
||||||
?>
|
|
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
// contributed by "Levi Fukumori" levi _AT_ fukumori _DOT_ com _DOT_ br
|
|
||||||
// portugese (brazilian)
|
|
||||||
$ADODB_LANG_ARRAY = array (
|
|
||||||
'LANG' => 'pt-br',
|
|
||||||
DB_ERROR => 'erro desconhecido',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'já existe',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'impossível criar',
|
|
||||||
DB_ERROR_CANNOT_DELETE => 'impossível excluír',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'impossível remover',
|
|
||||||
DB_ERROR_CONSTRAINT => 'violação do confinamente',
|
|
||||||
DB_ERROR_DIVZERO => 'divisão por zero',
|
|
||||||
DB_ERROR_INVALID => 'inválido',
|
|
||||||
DB_ERROR_INVALID_DATE => 'data ou hora inválida',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'número inválido',
|
|
||||||
DB_ERROR_MISMATCH => 'erro',
|
|
||||||
DB_ERROR_NODBSELECTED => 'nenhum banco de dados selecionado',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'campo inválido',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'tabela inexistente',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'capacidade inválida para este BD',
|
|
||||||
DB_ERROR_NOT_FOUND => 'não encontrado',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'não bloqueado',
|
|
||||||
DB_ERROR_SYNTAX => 'erro de sintaxe',
|
|
||||||
DB_ERROR_UNSUPPORTED =>
|
|
||||||
'não suportado',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'a quantidade de colunas não corresponde ao de valores',
|
|
||||||
DB_ERROR_INVALID_DSN => 'DSN inválido',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'falha na conexão',
|
|
||||||
0 => 'sem erro', // DB_OK
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'dados insuficientes',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extensão não encontrada',
|
|
||||||
DB_ERROR_NOSUCHDB => 'banco de dados não encontrado',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'permissão insuficiente'
|
|
||||||
);
|
|
||||||
?>
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user