summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Kinkade <nath@nkinka.de>2015-07-01 02:31:59 +0000
committerNathan Kinkade <nath@nkinka.de>2015-07-01 02:31:59 +0000
commit640e9246d3e1706e7f5ce77ccb586792b19398e0 (patch)
treeac6fe921eed6a891ea562d4604929aec3e1708b9
parentbbeffce07a41998d21c4805df2af0d88ef0cba04 (diff)
parentfe1bf80dfd9d270cfefc71284eb9d96b00283734 (diff)
Merge remote-tracking branch 'origin/dev'
-rw-r--r--.htaccess7
-rw-r--r--config.php-dist1
-rwxr-xr-xdb_update_scripts/config.php2
-rw-r--r--food_quantity.php4
-rw-r--r--food_search.php9
-rw-r--r--lib/adodb/adodb-active-record.inc.php622
-rw-r--r--lib/adodb/adodb-csvlib.inc.php312
-rw-r--r--lib/adodb/adodb-datadict.inc.php889
-rw-r--r--lib/adodb/adodb-error.inc.php258
-rw-r--r--lib/adodb/adodb-errorhandler.inc.php79
-rw-r--r--lib/adodb/adodb-errorpear.inc.php88
-rw-r--r--lib/adodb/adodb-exceptions.inc.php82
-rw-r--r--lib/adodb/adodb-iterator.inc.php85
-rw-r--r--lib/adodb/adodb-lib.inc.php1137
-rw-r--r--lib/adodb/adodb-memcache.lib.inc.php118
-rw-r--r--lib/adodb/adodb-pager.inc.php290
-rw-r--r--lib/adodb/adodb-pear.inc.php374
-rw-r--r--lib/adodb/adodb-perf.inc.php1068
-rw-r--r--lib/adodb/adodb-php4.inc.php16
-rw-r--r--lib/adodb/adodb-time.inc.php1337
-rw-r--r--lib/adodb/adodb-xmlschema.inc.php2221
-rw-r--r--lib/adodb/adodb-xmlschema03.inc.php2403
-rw-r--r--lib/adodb/adodb.inc.php4231
-rw-r--r--lib/adodb/contrib/toxmlrpc.inc.php183
-rw-r--r--lib/adodb/datadict/datadict-access.inc.php95
-rw-r--r--lib/adodb/datadict/datadict-db2.inc.php143
-rw-r--r--lib/adodb/datadict/datadict-firebird.inc.php151
-rw-r--r--lib/adodb/datadict/datadict-generic.inc.php125
-rw-r--r--lib/adodb/datadict/datadict-ibase.inc.php67
-rw-r--r--lib/adodb/datadict/datadict-informix.inc.php80
-rw-r--r--lib/adodb/datadict/datadict-mssql.inc.php282
-rw-r--r--lib/adodb/datadict/datadict-mysql.inc.php181
-rw-r--r--lib/adodb/datadict/datadict-oci8.inc.php290
-rw-r--r--lib/adodb/datadict/datadict-postgres.inc.php371
-rw-r--r--lib/adodb/datadict/datadict-sapdb.inc.php121
-rw-r--r--lib/adodb/datadict/datadict-sybase.inc.php228
-rw-r--r--lib/adodb/drivers/adodb-access.inc.php87
-rw-r--r--lib/adodb/drivers/adodb-ado.inc.php634
-rw-r--r--lib/adodb/drivers/adodb-ado5.inc.php668
-rw-r--r--lib/adodb/drivers/adodb-ado_access.inc.php55
-rw-r--r--lib/adodb/drivers/adodb-ado_mssql.inc.php154
-rw-r--r--lib/adodb/drivers/adodb-borland_ibase.inc.php92
-rw-r--r--lib/adodb/drivers/adodb-csv.inc.php207
-rw-r--r--lib/adodb/drivers/adodb-db2.inc.php828
-rw-r--r--lib/adodb/drivers/adodb-fbsql.inc.php266
-rw-r--r--lib/adodb/drivers/adodb-firebird.inc.php77
-rw-r--r--lib/adodb/drivers/adodb-ibase.inc.php887
-rw-r--r--lib/adodb/drivers/adodb-informix.inc.php40
-rw-r--r--lib/adodb/drivers/adodb-informix72.inc.php475
-rw-r--r--lib/adodb/drivers/adodb-ldap.inc.php406
-rw-r--r--lib/adodb/drivers/adodb-mssql.inc.php1037
-rw-r--r--lib/adodb/drivers/adodb-mssql_n.inc.php166
-rw-r--r--lib/adodb/drivers/adodb-mssqlpo.inc.php62
-rw-r--r--lib/adodb/drivers/adodb-mysql.inc.php782
-rw-r--r--lib/adodb/drivers/adodb-mysqli.inc.php1020
-rw-r--r--lib/adodb/drivers/adodb-mysqlt.inc.php155
-rw-r--r--lib/adodb/drivers/adodb-netezza.inc.php170
-rw-r--r--lib/adodb/drivers/adodb-oci8.inc.php1512
-rw-r--r--lib/adodb/drivers/adodb-oci805.inc.php59
-rw-r--r--lib/adodb/drivers/adodb-oci8po.inc.php217
-rw-r--r--lib/adodb/drivers/adodb-odbc.inc.php738
-rw-r--r--lib/adodb/drivers/adodb-odbc_db2.inc.php368
-rw-r--r--lib/adodb/drivers/adodb-odbc_mssql.inc.php306
-rw-r--r--lib/adodb/drivers/adodb-odbc_oracle.inc.php115
-rw-r--r--lib/adodb/drivers/adodb-odbtp.inc.php743
-rw-r--r--lib/adodb/drivers/adodb-odbtp_unicode.inc.php39
-rw-r--r--lib/adodb/drivers/adodb-oracle.inc.php338
-rw-r--r--lib/adodb/drivers/adodb-pdo.inc.php569
-rw-r--r--lib/adodb/drivers/adodb-pdo_mssql.inc.php61
-rw-r--r--lib/adodb/drivers/adodb-pdo_mysql.inc.php168
-rw-r--r--lib/adodb/drivers/adodb-pdo_oci.inc.php93
-rw-r--r--lib/adodb/drivers/adodb-pdo_pgsql.inc.php230
-rw-r--r--lib/adodb/drivers/adodb-postgres.inc.php14
-rw-r--r--lib/adodb/drivers/adodb-postgres64.inc.php1064
-rw-r--r--lib/adodb/drivers/adodb-postgres7.inc.php264
-rw-r--r--lib/adodb/drivers/adodb-postgres8.inc.php12
-rw-r--r--lib/adodb/drivers/adodb-proxy.inc.php33
-rw-r--r--lib/adodb/drivers/adodb-sapdb.inc.php184
-rw-r--r--lib/adodb/drivers/adodb-sqlanywhere.inc.php169
-rw-r--r--lib/adodb/drivers/adodb-sqlite.inc.php398
-rw-r--r--lib/adodb/drivers/adodb-sqlitepo.inc.php62
-rw-r--r--lib/adodb/drivers/adodb-sybase.inc.php418
-rw-r--r--lib/adodb/drivers/adodb-sybase_ase.inc.php119
-rw-r--r--lib/adodb/drivers/adodb-vfp.inc.php107
-rw-r--r--lib/adodb/icons/adodb.gifbin1091 -> 0 bytes
-rw-r--r--lib/adodb/icons/adodb2.gifbin1458 -> 0 bytes
-rw-r--r--lib/adodb/lang/adodb-ar.inc.php34
-rw-r--r--lib/adodb/lang/adodb-bg.inc.php38
-rw-r--r--lib/adodb/lang/adodb-bgutf8.inc.php38
-rw-r--r--lib/adodb/lang/adodb-ca.inc.php35
-rw-r--r--lib/adodb/lang/adodb-cn.inc.php35
-rw-r--r--lib/adodb/lang/adodb-cz.inc.php40
-rw-r--r--lib/adodb/lang/adodb-da.inc.php33
-rw-r--r--lib/adodb/lang/adodb-de.inc.php33
-rw-r--r--lib/adodb/lang/adodb-en.inc.php34
-rw-r--r--lib/adodb/lang/adodb-es.inc.php33
-rw-r--r--lib/adodb/lang/adodb-esperanto.inc.php35
-rw-r--r--lib/adodb/lang/adodb-fr.inc.php33
-rw-r--r--lib/adodb/lang/adodb-hu.inc.php34
-rw-r--r--lib/adodb/lang/adodb-it.inc.php34
-rw-r--r--lib/adodb/lang/adodb-nl.inc.php33
-rw-r--r--lib/adodb/lang/adodb-pl.inc.php36
-rw-r--r--lib/adodb/lang/adodb-pt-br.inc.php35
-rw-r--r--lib/adodb/lang/adodb-ro.inc.php36
-rw-r--r--lib/adodb/lang/adodb-ru1251.inc.php35
-rw-r--r--lib/adodb/lang/adodb-sv.inc.php33
-rw-r--r--lib/adodb/lang/adodb-uk1251.inc.php35
-rw-r--r--lib/adodb/perf/perf-db2.inc.php102
-rw-r--r--lib/adodb/perf/perf-informix.inc.php70
-rw-r--r--lib/adodb/perf/perf-mssql.inc.php164
-rw-r--r--lib/adodb/perf/perf-mysql.inc.php315
-rw-r--r--lib/adodb/perf/perf-oci8.inc.php509
-rw-r--r--lib/adodb/perf/perf-postgres.inc.php124
-rw-r--r--lib/adodb/pivottable.inc.php187
-rw-r--r--lib/adodb/rsfilter.inc.php61
-rw-r--r--lib/adodb/server.php100
-rw-r--r--lib/adodb/session/adodb-compress-bzip2.php118
-rw-r--r--lib/adodb/session/adodb-compress-gzip.php93
-rw-r--r--lib/adodb/session/adodb-cryptsession.php27
-rw-r--r--lib/adodb/session/adodb-cryptsession2.php27
-rw-r--r--lib/adodb/session/adodb-encrypt-mcrypt.php109
-rw-r--r--lib/adodb/session/adodb-encrypt-md5.php39
-rw-r--r--lib/adodb/session/adodb-encrypt-secret.php48
-rw-r--r--lib/adodb/session/adodb-encrypt-sha1.php32
-rw-r--r--lib/adodb/session/adodb-session-clob.php24
-rw-r--r--lib/adodb/session/adodb-session-clob2.php24
-rw-r--r--lib/adodb/session/adodb-session.php934
-rw-r--r--lib/adodb/session/adodb-session2.php941
-rw-r--r--lib/adodb/session/crypt.inc.php161
-rw-r--r--lib/adodb/session/old/adodb-cryptsession.php324
-rw-r--r--lib/adodb/session/old/adodb-session-clob.php448
-rw-r--r--lib/adodb/session/old/adodb-session.php439
-rw-r--r--lib/adodb/session/old/crypt.inc.php64
-rw-r--r--lib/adodb/session/session_schema.xml26
-rw-r--r--lib/adodb/session/session_schema2.xml38
-rw-r--r--lib/adodb/toexport.inc.php133
-rw-r--r--lib/adodb/tohtml.inc.php195
-rw-r--r--lib/adodb/xmlschema.dtd39
-rw-r--r--lib/adodb/xmlschema03.dtd43
-rw-r--r--lib/adodb/xsl/convert-0.1-0.2.xsl205
-rw-r--r--lib/adodb/xsl/convert-0.1-0.3.xsl221
-rw-r--r--lib/adodb/xsl/convert-0.2-0.1.xsl207
-rw-r--r--lib/adodb/xsl/convert-0.2-0.3.xsl281
-rw-r--r--lib/adodb/xsl/remove-0.2.xsl54
-rw-r--r--lib/adodb/xsl/remove-0.3.xsl54
-rw-r--r--lib/config.class.php1
-rw-r--r--lib/database.class.php83
-rw-r--r--nutrient_search.php4
-rw-r--r--view_food.php16
149 files changed, 49 insertions, 42385 deletions
diff --git a/.htaccess b/.htaccess
deleted file mode 100644
index e0b2d91..0000000
--- a/.htaccess
+++ /dev/null
@@ -1,7 +0,0 @@
-RewriteEngine On
-
-# Get rid of ugly .php extensions
-RewriteCond %{REQUEST_URI} !^/$
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^([^#?]*)(.*)$ $1.php$2 [L,NE]
-
diff --git a/config.php-dist b/config.php-dist
index b2aca4b..325cd70 100644
--- a/config.php-dist
+++ b/config.php-dist
@@ -22,7 +22,6 @@ define("DBNAME", "nutridb_sr19"); # database name
define("DBUSER", "nutridb"); # database user
define("DBPASS", ""); # database password
-define("ADODBDIR", "lib/adodb"); # adodb db abastractions libs - adodb.sourceforge.net
define("SMARTYDIR", "lib/smarty"); # Smarty templates dir - smarty.php.net
define("XAJAXDIR", "lib/xajax"); # XAJAX libs - xajaxproject.org
diff --git a/db_update_scripts/config.php b/db_update_scripts/config.php
index da259ce..732879d 100755
--- a/db_update_scripts/config.php
+++ b/db_update_scripts/config.php
@@ -27,8 +27,6 @@ define("DBNAME", "nutridb_sr20"); # database name
define("DBUSER", "root"); # database user
define("DBPASS", ""); # database password
-define("ADODBDIR", "../lib/adodb"); # adodb db abastractions libs - adodb.sourceforge.net
-
require("../lib/database.class.php"); # database class
# instantiate the database object
diff --git a/food_quantity.php b/food_quantity.php
index b938745..e93c17e 100644
--- a/food_quantity.php
+++ b/food_quantity.php
@@ -25,13 +25,13 @@ if ( isset($_REQUEST['food']) ) {
# get the selected food and quantities from the database
$sql = sprintf ("
- SELECT foodDescs.sciname, %s AS foodDesc, weights.*
+ SELECT foodDescs.sciname, CONCAT(foodDescs.long_desc, foodDescs.comname)
+ AS foodDesc, weights.*
FROM foodDescs LEFT JOIN weights
ON foodDescs.ndb_no = weights.ndb_no
WHERE foodDescs.ndb_no = '%s'
AND weights.usda_status = 'active'
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$food
);
$db->Select($sql);
diff --git a/food_search.php b/food_search.php
index 3466a00..4e92c74 100644
--- a/food_search.php
+++ b/food_search.php
@@ -115,13 +115,13 @@ if ( $_GET['sortType'] == "Food Description" ) {
# build the main query
$sql = sprintf ("
- SELECT foodDescs.ndb_no, foodDescs.popularity AS popularity, %s AS foodDesc,
+ SELECT foodDescs.ndb_no, foodDescs.popularity AS popularity,
+ CONCAT(foodDescs.long_desc, foodDescs.comname) AS foodDesc,
foodCats.fdgrp_cd, foodCats.fdgrp_desc
FROM foodDescs LEFT JOIN foodCats
ON foodDescs.fdgrp_cd = foodCats.fdgrp_cd
%s
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$where
);
@@ -137,7 +137,9 @@ $sql = sprintf ("
# having to parse it
$sql .= sprintf ("
UNION
- SELECT %s AS ndb_no, userFoods.popularity AS popularity, description AS foodDesc,
+ SELECT CONCAT('food=',userFoods.food,'&weight=',userFoods.weight,'&quantity=',
+ userFoods.quantity,'&userFoodsId=',userFoods.id) AS ndb_no,
+ userFoods.popularity AS popularity, description AS foodDesc,
'userFood' AS fdgrp_cd, 'User saved foods' AS fdgrp_desc
FROM userFoods
%s
@@ -147,7 +149,6 @@ $sql .= sprintf ("
FROM userMeals
%s
",
- $db->_dbConn->Concat("'food='", "userFoods.food", "'&weight='", "userFoods.weight", "'&quantity='", "userFoods.quantity", "'&userFoodsId='", "userFoods.id"),
$userWhere,
$userWhere
);
diff --git a/lib/adodb/adodb-active-record.inc.php b/lib/adodb/adodb-active-record.inc.php
deleted file mode 100644
index 35bf968..0000000
--- a/lib/adodb/adodb-active-record.inc.php
+++ /dev/null
@@ -1,622 +0,0 @@
-<?php
-/*
-
-@version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Latest version is available at http://adodb.sourceforge.net
-
- Released under both BSD license and Lesser GPL library license.
- Whenever there is any discrepancy between the two licenses,
- the BSD license will take precedence.
-
- Active Record implementation. Superset of Zend Framework's.
-
- Version 0.07
-
- See http://www-128.ibm.com/developerworks/java/library/j-cb03076/?ca=dgr-lnxw01ActiveRecord
- for info on Ruby on Rails Active Record implementation
-*/
-
-global $_ADODB_ACTIVE_DBS;
-global $ADODB_ACTIVE_CACHESECS; // set to true to enable caching of metadata such as field info
-
-// array of ADODB_Active_DB's, indexed by ADODB_Active_Record->_dbat
-$_ADODB_ACTIVE_DBS = array();
-
-
-class ADODB_Active_DB {
- var $db; // ADOConnection
- var $tables; // assoc array of ADODB_Active_Table objects, indexed by tablename
-}
-
-class ADODB_Active_Table {
- var $name; // table name
- var $flds; // assoc array of adofieldobjs, indexed by fieldname
- var $keys; // assoc array of primary keys, indexed by fieldname
- var $_created; // only used when stored as a cached file
-}
-
-// returns index into $_ADODB_ACTIVE_DBS
-function ADODB_SetDatabaseAdapter(&$db)
-{
- global $_ADODB_ACTIVE_DBS;
-
- foreach($_ADODB_ACTIVE_DBS as $k => $d) {
- if (PHP_VERSION >= 5) {
- if ($d->db === $db) return $k;
- } else {
- if ($d->db->_connectionID === $db->_connectionID && $db->database == $d->db->database)
- return $k;
- }
- }
-
- $obj = new ADODB_Active_DB();
- $obj->db =& $db;
- $obj->tables = array();
-
- $_ADODB_ACTIVE_DBS[] = $obj;
-
- return sizeof($_ADODB_ACTIVE_DBS)-1;
-}
-
-
-class ADODB_Active_Record {
- var $_dbat; // associative index pointing to ADODB_Active_DB eg. $ADODB_Active_DBS[_dbat]
- var $_table; // tablename, if set in class definition then use it as table name
- var $_tableat; // associative index pointing to ADODB_Active_Table, eg $ADODB_Active_DBS[_dbat]->tables[$this->_tableat]
- var $_where; // where clause set in Load()
- var $_saved = false; // indicates whether data is already inserted.
- var $_lasterr = false; // last error message
- var $_original = false; // the original values loaded or inserted, refreshed on update
-
- // should be static
- function SetDatabaseAdapter(&$db)
- {
- return ADODB_SetDatabaseAdapter($db);
- }
-
- // php4 constructor
- function ADODB_Active_Record($table = false, $pkeyarr=false, $db=false)
- {
- ADODB_Active_Record::__construct($table,$pkeyarr,$db);
- }
-
- // php5 constructor
- function __construct($table = false, $pkeyarr=false, $db=false)
- {
- global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS;
-
- if ($db == false && is_object($pkeyarr)) {
- $db = $pkeyarr;
- $pkeyarr = false;
- }
-
- if (!$table) {
- if (!empty($this->_table)) $table = $this->_table;
- else $table = $this->_pluralize(get_class($this));
- }
- if ($db) {
- $this->_dbat = ADODB_Active_Record::SetDatabaseAdapter($db);
- } else
- $this->_dbat = sizeof($_ADODB_ACTIVE_DBS)-1;
-
-
- if ($this->_dbat < 0) $this->Error("No database connection set; use ADOdb_Active_Record::SetDatabaseAdapter(\$db)",'ADODB_Active_Record::__constructor');
-
- $this->_table = $table;
- $this->_tableat = $table; # reserved for setting the assoc value to a non-table name, eg. the sql string in future
- $this->UpdateActiveTable($pkeyarr);
- }
-
- function __wakeup()
- {
- $class = get_class($this);
- new $class;
- }
-
- function _pluralize($table)
- {
- $ut = strtoupper($table);
- $len = strlen($table);
- $lastc = $ut[$len-1];
- $lastc2 = substr($ut,$len-2);
- switch ($lastc) {
- case 'S':
- return $table.'es';
- case 'Y':
- return substr($table,0,$len-1).'ies';
- case 'X':
- return $table.'es';
- case 'H':
- if ($lastc2 == 'CH' || $lastc2 == 'SH')
- return $table.'es';
- default:
- return $table.'s';
- }
- }
-
- //////////////////////////////////
-
- // update metadata
- function UpdateActiveTable($pkeys=false,$forceUpdate=false)
- {
- global $ADODB_ASSOC_CASE,$_ADODB_ACTIVE_DBS , $ADODB_CACHE_DIR, $ADODB_ACTIVE_CACHESECS;
-
- $activedb =& $_ADODB_ACTIVE_DBS[$this->_dbat];
-
- $table = $this->_table;
- $tables = $activedb->tables;
- $tableat = $this->_tableat;
- if (!$forceUpdate && !empty($tables[$tableat])) {
- $tobj =& $tables[$tableat];
- foreach($tobj->flds as $name => $fld)
- $this->$name = null;
- return;
- }
-
- $db =& $activedb->db;
- $fname = $ADODB_CACHE_DIR . '/adodb_' . $db->databaseType . '_active_'. $table . '.cache';
- if (!$forceUpdate && $ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR && file_exists($fname)) {
- $fp = fopen($fname,'r');
- @flock($fp, LOCK_SH);
- $acttab = unserialize(fread($fp,100000));
- fclose($fp);
- if ($acttab->_created + $ADODB_ACTIVE_CACHESECS - (abs(rand()) % 16) > time()) {
- // abs(rand()) randomizes deletion, reducing contention to delete/refresh file
- // ideally, you should cache at least 32 secs
- $activedb->tables[$table] = $acttab;
-
- //if ($db->debug) ADOConnection::outp("Reading cached active record file: $fname");
- return;
- } else if ($db->debug) {
- ADOConnection::outp("Refreshing cached active record file: $fname");
- }
- }
- $activetab = new ADODB_Active_Table();
- $activetab->name = $table;
-
-
- $cols = $db->MetaColumns($table);
- if (!$cols) {
- $this->Error("Invalid table name: $table",'UpdateActiveTable');
- return false;
- }
- $fld = reset($cols);
- if (!$pkeys) {
- if (isset($fld->primary_key)) {
- $pkeys = array();
- foreach($cols as $name => $fld) {
- if (!empty($fld->primary_key)) $pkeys[] = $name;
- }
- } else
- $pkeys = $this->GetPrimaryKeys($db, $table);
- }
- if (empty($pkeys)) {
- $this->Error("No primary key found for table $table",'UpdateActiveTable');
- return false;
- }
-
- $attr = array();
- $keys = array();
-
- switch($ADODB_ASSOC_CASE) {
- case 0:
- foreach($cols as $name => $fldobj) {
- $name = strtolower($name);
- $this->$name = null;
- $attr[$name] = $fldobj;
- }
- foreach($pkeys as $k => $name) {
- $keys[strtolower($name)] = strtolower($name);
- }
- break;
-
- case 1:
- foreach($cols as $name => $fldobj) {
- $name = strtoupper($name);
- $this->$name = null;
- $attr[$name] = $fldobj;
- }
-
- foreach($pkeys as $k => $name) {
- $keys[strtoupper($name)] = strtoupper($name);
- }
- break;
- default:
- foreach($cols as $name => $fldobj) {
- $name = ($fldobj->name);
- $this->$name = null;
- $attr[$name] = $fldobj;
- }
- foreach($pkeys as $k => $name) {
- $keys[$name] = $cols[$name]->name;
- }
- break;
- }
-
- $activetab->keys = $keys;
- $activetab->flds = $attr;
-
- if ($ADODB_ACTIVE_CACHESECS && $ADODB_CACHE_DIR) {
- $activetab->_created = time();
- $s = serialize($activetab);
- if (!function_exists('adodb_write_file')) include(ADODB_DIR.'/adodb-csvlib.inc.php');
- adodb_write_file($fname,$s);
- }
- $activedb->tables[$table] = $activetab;
- }
-
- function GetPrimaryKeys(&$db, $table)
- {
- return $db->MetaPrimaryKeys($table);
- }
-
- // error handler for both PHP4+5.
- function Error($err,$fn)
- {
- global $_ADODB_ACTIVE_DBS;
-
- $fn = get_class($this).'::'.$fn;
- $this->_lasterr = $fn.': '.$err;
-
- if ($this->_dbat < 0) $db = false;
- else {
- $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
- $db =& $activedb->db;
- }
-
- if (function_exists('adodb_throw')) {
- if (!$db) adodb_throw('ADOdb_Active_Record', $fn, -1, $err, 0, 0, false);
- else adodb_throw($db->databaseType, $fn, -1, $err, 0, 0, $db);
- } else
- if (!$db || $db->debug) ADOConnection::outp($this->_lasterr);
-
- }
-
- // return last error message
- function ErrorMsg()
- {
- if (!function_exists('adodb_throw')) {
- if ($this->_dbat < 0) $db = false;
- else $db = $this->DB();
-
- // last error could be database error too
- if ($db && $db->ErrorMsg()) return $db->ErrorMsg();
- }
- return $this->_lasterr;
- }
-
- function ErrorNo()
- {
- if ($this->_dbat < 0) return -9999; // no database connection...
- $db = $this->DB();
-
- return (int) $db->ErrorNo();
- }
-
-
- // retrieve ADOConnection from _ADODB_Active_DBs
- function &DB()
- {
- global $_ADODB_ACTIVE_DBS;
-
- if ($this->_dbat < 0) {
- $false = false;
- $this->Error("No database connection set: use ADOdb_Active_Record::SetDatabaseAdaptor(\$db)", "DB");
- return $false;
- }
- $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
- $db =& $activedb->db;
- return $db;
- }
-
- // retrieve ADODB_Active_Table
- function &TableInfo()
- {
- global $_ADODB_ACTIVE_DBS;
-
- $activedb = $_ADODB_ACTIVE_DBS[$this->_dbat];
- $table =& $activedb->tables[$this->_tableat];
- return $table;
- }
-
- // set a numeric array (using natural table field ordering) as object properties
- function Set(&$row)
- {
- $db =& $this->DB();
-
- if (!$row) {
- $this->_saved = false;
- return false;
- }
-
- $this->_saved = true;
-
- $table =& $this->TableInfo();
- if (sizeof($table->flds) != sizeof($row)) {
- $this->Error("Table structure of $this->_table has changed","Load");
- return false;
- }
-
- $cnt = 0;
- foreach($table->flds as $name=>$fld) {
- $this->$name = $row[$cnt];
- $cnt += 1;
- }
- $this->_original = $row;
- return true;
- }
-
- // get last inserted id for INSERT
- function LastInsertID(&$db,$fieldname)
- {
- if ($db->hasInsertID)
- $val = $db->Insert_ID($this->_table,$fieldname);
- else
- $val = false;
-
- if (is_null($val) || $val === false) {
- // this might not work reliably in multi-user environment
- return $db->GetOne("select max(".$fieldname.") from ".$this->_table);
- }
- return $val;
- }
-
- // quote data in where clause
- function doquote(&$db, $val,$t)
- {
- switch($t) {
- case 'D':
- case 'T':
- if (empty($val)) return 'null';
-
- case 'C':
- case 'X':
- if (is_null($val)) return 'null';
-
- if (strncmp($val,"'",1) != 0 && substr($val,strlen($val)-1,1) != "'") {
- return $db->qstr($val);
- break;
- }
- default:
- return $val;
- break;
- }
- }
-
- // generate where clause for an UPDATE/SELECT
- function GenWhere(&$db, &$table)
- {
- $keys = $table->keys;
- $parr = array();
-
- foreach($keys as $k) {
- $f = $table->flds[$k];
- if ($f) {
- $parr[] = $k.' = '.$this->doquote($db,$this->$k,$db->MetaType($f->type));
- }
- }
- return implode(' and ', $parr);
- }
-
-
- //------------------------------------------------------------ Public functions below
-
- function Load($where,$bindarr=false)
- {
- $db =& $this->DB(); if (!$db) return false;
- $this->_where = $where;
-
- $save = $db->SetFetchMode(ADODB_FETCH_NUM);
- $row = $db->GetRow("select * from ".$this->_table.' WHERE '.$where,$bindarr);
- $db->SetFetchMode($save);
-
- return $this->Set($row);
- }
-
- // false on error
- function Save()
- {
- if ($this->_saved) $ok = $this->Update();
- else $ok = $this->Insert();
-
- return $ok;
- }
-
- // false on error
- function Insert()
- {
- $db =& $this->DB(); if (!$db) return false;
- $cnt = 0;
- $table =& $this->TableInfo();
-
- $valarr = array();
- $names = array();
- $valstr = array();
-
- foreach($table->flds as $name=>$fld) {
- $val = $this->$name;
- if(!is_null($val) || !array_key_exists($name, $table->keys)) {
- $valarr[] = $val;
- $names[] = $name;
- $valstr[] = $db->Param($cnt);
- $cnt += 1;
- }
- }
-
- if (empty($names)){
- foreach($table->flds as $name=>$fld) {
- $valarr[] = null;
- $names[] = $name;
- $valstr[] = $db->Param($cnt);
- $cnt += 1;
- }
- }
- $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')';
- $ok = $db->Execute($sql,$valarr);
-
- if ($ok) {
- $this->_saved = true;
- $autoinc = false;
- foreach($table->keys as $k) {
- if (is_null($this->$k)) {
- $autoinc = true;
- break;
- }
- }
- if ($autoinc && sizeof($table->keys) == 1) {
- $k = reset($table->keys);
- $this->$k = $this->LastInsertID($db,$k);
- }
- }
-
- $this->_original = $valarr;
- return !empty($ok);
- }
-
- function Delete()
- {
- $db =& $this->DB(); if (!$db) return false;
- $table =& $this->TableInfo();
-
- $where = $this->GenWhere($db,$table);
- $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where;
- $ok = $db->Execute($sql);
-
- return $ok ? true : false;
- }
-
- // returns an array of active record objects
- function &Find($whereOrderBy,$bindarr=false,$pkeysArr=false)
- {
- $db =& $this->DB(); if (!$db || empty($this->_table)) return false;
- $arr =& $db->GetActiveRecordsClass(get_class($this),$this->_table, $whereOrderBy,$bindarr,$pkeysArr);
- return $arr;
- }
-
- // returns 0 on error, 1 on update, 2 on insert
- function Replace()
- {
- global $ADODB_ASSOC_CASE;
-
- $db =& $this->DB(); if (!$db) return false;
- $table =& $this->TableInfo();
-
- $pkey = $table->keys;
-
- foreach($table->flds as $name=>$fld) {
- $val = $this->$name;
- /*
- if (is_null($val)) {
- if (isset($fld->not_null) && $fld->not_null) {
- if (isset($fld->default_value) && strlen($fld->default_value)) continue;
- else {
- $this->Error("Cannot update null into $name","Replace");
- return false;
- }
- }
- }*/
- if (is_null($val) && !empty($fld->auto_increment)) {
- continue;
- }
- $t = $db->MetaType($fld->type);
- $arr[$name] = $this->doquote($db,$val,$t);
- $valarr[] = $val;
- }
-
- if (!is_array($pkey)) $pkey = array($pkey);
-
-
- if ($ADODB_ASSOC_CASE == 0)
- foreach($pkey as $k => $v)
- $pkey[$k] = strtolower($v);
- elseif ($ADODB_ASSOC_CASE == 0)
- foreach($pkey as $k => $v)
- $pkey[$k] = strtoupper($v);
-
- $ok = $db->Replace($this->_table,$arr,$pkey);
- if ($ok) {
- $this->_saved = true; // 1= update 2=insert
- if ($ok == 2) {
- $autoinc = false;
- foreach($table->keys as $k) {
- if (is_null($this->$k)) {
- $autoinc = true;
- break;
- }
- }
- if ($autoinc && sizeof($table->keys) == 1) {
- $k = reset($table->keys);
- $this->$k = $this->LastInsertID($db,$k);
- }
- }
-
- $this->_original =& $valarr;
- }
- return $ok;
- }
-
- // returns 0 on error, 1 on update, -1 if no change in data (no update)
- function Update()
- {
- $db =& $this->DB(); if (!$db) return false;
- $table =& $this->TableInfo();
-
- $where = $this->GenWhere($db, $table);
-
- if (!$where) {
- $this->error("Where missing for table $table", "Update");
- return false;
- }
- $valarr = array();
- $neworig = array();
- $pairs = array();
- $i = -1;
- $cnt = 0;
- foreach($table->flds as $name=>$fld) {
- $i += 1;
- $val = $this->$name;
- $neworig[] = $val;
-
- if (isset($table->keys[$name])) {
- continue;
- }
-
- if (is_null($val)) {
- if (isset($fld->not_null) && $fld->not_null) {
- if (isset($fld->default_value) && strlen($fld->default_value)) continue;
- else {
- $this->Error("Cannot set field $name to NULL","Update");
- return false;
- }
- }
- }
-
- if (isset($this->_original[$i]) && $val == $this->_original[$i]) {
- continue;
- }
- $valarr[] = $val;
- $pairs[] = $name.'='.$db->Param($cnt);
- $cnt += 1;
- }
-
-
- if (!$cnt) return -1;
- $sql = 'UPDATE '.$this->_table." SET ".implode(",",$pairs)." WHERE ".$where;
- $ok = $db->Execute($sql,$valarr);
- if ($ok) {
- $this->_original =& $neworig;
- return 1;
- }
- return 0;
- }
-
- function GetAttributeNames()
- {
- $table =& $this->TableInfo();
- if (!$table) return false;
- return array_keys($table->flds);
- }
-
-};
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-csvlib.inc.php b/lib/adodb/adodb-csvlib.inc.php
deleted file mode 100644
index 1e34d39..0000000
--- a/lib/adodb/adodb-csvlib.inc.php
+++ /dev/null
@@ -1,312 +0,0 @@
-<?php
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-global $ADODB_INCLUDED_CSV;
-$ADODB_INCLUDED_CSV = 1;
-
-/*
-
- V4.94 23 Jan 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. 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
- */
- 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,'a'))) return false;
- $ok = ftruncate($fd,0);
- if (!fwrite($fd,$contents)) $ok = false;
- fclose($fd);
- chmod($tmpname,0644);
- // the tricky moment
- @unlink($filename);
- if (!@rename($tmpname,$filename)) {
- unlink($tmpname);
- $ok = false;
- }
- 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)) {
- $ok = fwrite( $fd, $contents );
- fclose($fd);
- chmod($filename,0644);
- }else {
- fclose($fd);
- if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
- $ok = false;
- }
-
- return $ok;
- }
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-datadict.inc.php b/lib/adodb/adodb-datadict.inc.php
deleted file mode 100644
index c31edd8..0000000
--- a/lib/adodb/adodb-datadict.inc.php
+++ /dev/null
@@ -1,889 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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.
-
- DOCUMENTATION:
-
- See adodb/tests/test-datadict.php for docs and examples.
-*/
-
-/*
- Test script for parser
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-function Lens_ParseTest()
-{
-$str = "`zcol ACOL` NUMBER(32,2) DEFAULT 'The \"cow\" (and Jim''s dog) jumps over the moon' PRIMARY, INTI INT AUTO DEFAULT 0, zcol2\"afs ds";
-print "<p>$str</p>";
-$a= Lens_ParseArgs($str);
-print "<pre>";
-print_r($a);
-print "</pre>";
-}
-
-
-if (!function_exists('ctype_alnum')) {
- function ctype_alnum($text) {
- return preg_match('/^[a-z0-9]*$/i', $text);
- }
-}
-
-//Lens_ParseTest();
-
-/**
- Parse arguments, treat "text" (text) and 'text' as quotation marks.
- To escape, use "" or '' or ))
-
- Will read in "abc def" sans quotes, as: abc def
- Same with 'abc def'.
- However if `abc def`, then will read in as `abc def`
-
- @param endstmtchar Character that indicates end of statement
- @param tokenchars Include the following characters in tokens apart from A-Z and 0-9
- @returns 2 dimensional array containing parsed tokens.
-*/
-function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
-{
- $pos = 0;
- $intoken = false;
- $stmtno = 0;
- $endquote = false;
- $tokens = array();
- $tokens[$stmtno] = array();
- $max = strlen($args);
- $quoted = false;
- $tokarr = array();
-
- while ($pos < $max) {
- $ch = substr($args,$pos,1);
- switch($ch) {
- case ' ':
- case "\t":
- case "\n":
- case "\r":
- if (!$quoted) {
- if ($intoken) {
- $intoken = false;
- $tokens[$stmtno][] = implode('',$tokarr);
- }
- break;
- }
-
- $tokarr[] = $ch;
- break;
-
- case '`':
- if ($intoken) $tokarr[] = $ch;
- case '(':
- case ')':
- case '"':
- case "'":
-
- if ($intoken) {
- if (empty($endquote)) {
- $tokens[$stmtno][] = implode('',$tokarr);
- if ($ch == '(') $endquote = ')';
- else $endquote = $ch;
- $quoted = true;
- $intoken = true;
- $tokarr = array();
- } else if ($endquote == $ch) {
- $ch2 = substr($args,$pos+1,1);
- if ($ch2 == $endquote) {
- $pos += 1;
- $tokarr[] = $ch2;
- } else {
- $quoted = false;
- $intoken = false;
- $tokens[$stmtno][] = implode('',$tokarr);
- $endquote = '';
- }
- } else
- $tokarr[] = $ch;
-
- }else {
-
- if ($ch == '(') $endquote = ')';
- else $endquote = $ch;
- $quoted = true;
- $intoken = true;
- $tokarr = array();
- if ($ch == '`') $tokarr[] = '`';
- }
- break;
-
- default:
-
- if (!$intoken) {
- if ($ch == $endstmtchar) {
- $stmtno += 1;
- $tokens[$stmtno] = array();
- break;
- }
-
- $intoken = true;
- $quoted = false;
- $endquote = false;
- $tokarr = array();
-
- }
-
- if ($quoted) $tokarr[] = $ch;
- else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch;
- else {
- if ($ch == $endstmtchar) {
- $tokens[$stmtno][] = implode('',$tokarr);
- $stmtno += 1;
- $tokens[$stmtno] = array();
- $intoken = false;
- $tokarr = array();
- break;
- }
- $tokens[$stmtno][] = implode('',$tokarr);
- $tokens[$stmtno][] = $ch;
- $intoken = false;
- }
- }
- $pos += 1;
- }
- if ($intoken) $tokens[$stmtno][] = implode('',$tokarr);
-
- return $tokens;
-}
-
-
-class ADODB_DataDict {
- var $connection;
- var $debug = false;
- var $dropTable = 'DROP TABLE %s';
- var $renameTable = 'RENAME TABLE %s TO %s';
- var $dropIndex = 'DROP INDEX %s';
- var $addCol = ' ADD';
- var $alterCol = ' ALTER COLUMN';
- var $dropCol = ' DROP COLUMN';
- var $renameColumn = 'ALTER TABLE %s RENAME COLUMN %s TO %s'; // table, old-column, new-column, column-definitions (not used by default)
- var $nameRegex = '\w';
- var $nameRegexBrackets = 'a-zA-Z0-9_\(\)';
- var $schema = false;
- var $serverInfo = array();
- var $autoIncrement = false;
- var $dataProvider;
- var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql
- var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
- /// in other words, we use a text area for editting.
-
- function GetCommentSQL($table,$col)
- {
- return false;
- }
-
- function SetCommentSQL($table,$col,$cmt)
- {
- return false;
- }
-
- function MetaTables()
- {
- if (!$this->connection->IsConnected()) return array();
- return $this->connection->MetaTables();
- }
-
- function MetaColumns($tab, $upper=true, $schema=false)
- {
- if (!$this->connection->IsConnected()) return array();
- return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema);
- }
-
- function MetaPrimaryKeys($tab,$owner=false,$intkey=false)
- {
- if (!$this->connection->IsConnected()) return array();
- return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey);
- }
-
- function MetaIndexes($table, $primary = false, $owner = false)
- {
- if (!$this->connection->IsConnected()) return array();
- return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner);
- }
-
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- return ADORecordSet::MetaType($t,$len,$fieldobj);
- }
-
- function NameQuote($name = NULL,$allowBrackets=false)
- {
- 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
- $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex;
-
- if ( !preg_match('/^[' . $regex . ']+$/', $name) ) {
- return $quote . $name . $quote;
- }
-
- return $name;
- }
-
- function TableName($name)
- {
- if ( $this->schema ) {
- return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name);
- }
- return $this->NameQuote($name);
- }
-
- // Executes the sql array returned by GetTableSQL and GetIndexSQL
- function ExecuteSQLArray($sql, $continueOnError = true)
- {
- $rez = 2;
- $conn = &$this->connection;
- $saved = $conn->debug;
- foreach($sql as $line) {
-
- if ($this->debug) $conn->debug = true;
- $ok = $conn->Execute($line);
- $conn->debug = $saved;
- if (!$ok) {
- if ($this->debug) ADOConnection::outp($conn->ErrorMsg());
- if (!$continueOnError) return 0;
- $rez = 1;
- }
- }
- return $rez;
- }
-
- /**
- Returns the actual type given a character code.
-
- C: varchar
- X: CLOB (character large object) or largest varchar size if CLOB is not supported
- C2: Multibyte varchar
- X2: Multibyte CLOB
-
- B: BLOB (binary large object)
-
- D: Date
- T: Date-time
- L: Integer field suitable for storing booleans (0 or 1)
- I: Integer
- F: Floating point number
- N: Numeric or decimal number
- */
-
- function ActualType($meta)
- {
- return $meta;
- }
-
- function CreateDatabase($dbname,$options=false)
- {
- $options = $this->_Options($options);
- $sql = array();
-
- $s = 'CREATE DATABASE ' . $this->NameQuote($dbname);
- if (isset($options[$this->upperName]))
- $s .= ' '.$options[$this->upperName];
-
- $sql[] = $s;
- return $sql;
- }
-
- /*
- Generates the SQL to create index. Returns an array of sql strings.
- */
- function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false)
- {
- if (!is_array($flds)) {
- $flds = explode(',',$flds);
- }
-
- foreach($flds as $key => $fld) {
- # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32)
- $flds[$key] = $this->NameQuote($fld,$allowBrackets=true);
- }
-
- return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions));
- }
-
- function DropIndexSQL ($idxname, $tabname = NULL)
- {
- return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname)));
- }
-
- function SetSchema($schema)
- {
- $this->schema = $schema;
- }
-
- function AddColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey,$idxs) = $this->_GenFields($flds);
- // genfields can return FALSE at times
- if ($lines == null) $lines = array();
- $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
- foreach($lines as $v) {
- $sql[] = $alter . $v;
- }
- if (is_array($idxs)) {
- foreach($idxs as $idx => $idxdef) {
- $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']);
- $sql = array_merge($sql, $sql_idxs);
- }
- }
- return $sql;
- }
-
- /**
- * Change the definition of one column
- *
- * As some DBM's can't do that on there 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/string $tableoptions='' options for the new table see CreateTableSQL, default ''
- * @return array with SQL strings
- */
- function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey,$idxs) = $this->_GenFields($flds);
- // genfields can return FALSE at times
- if ($lines == null) $lines = array();
- $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
- foreach($lines as $v) {
- $sql[] = $alter . $v;
- }
- if (is_array($idxs)) {
- foreach($idxs as $idx => $idxdef) {
- $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']);
- $sql = array_merge($sql, $sql_idxs);
- }
-
- }
- return $sql;
- }
-
- /**
- * Rename one column
- *
- * Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql)
- * @param string $tabname table-name
- * @param string $oldcolumn column-name to be renamed
- * @param string $newcolumn new column-name
- * @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default=''
- * @return array with SQL strings
- */
- function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='')
- {
- $tabname = $this->TableName ($tabname);
- if ($flds) {
- list($lines,$pkey,$idxs) = $this->_GenFields($flds);
- // genfields can return FALSE at times
- if ($lines == null) $lines = array();
- list(,$first) = each($lines);
- list(,$column_def) = split("[\t ]+",$first,2);
- }
- return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def));
- }
-
- /**
- * Drop one column
- *
- * Some DBM's can't do that on there 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/string $tableoptions='' options for the new table see CreateTableSQL, default ''
- * @return array with SQL strings
- */
- function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
- {
- $tabname = $this->TableName ($tabname);
- if (!is_array($flds)) $flds = explode(',',$flds);
- $sql = array();
- $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' ';
- foreach($flds as $v) {
- $sql[] = $alter . $this->NameQuote($v);
- }
- return $sql;
- }
-
- function DropTableSQL($tabname)
- {
- return array (sprintf($this->dropTable, $this->TableName($tabname)));
- }
-
- function RenameTableSQL($tabname,$newname)
- {
- return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
- }
-
- /**
- Generate the SQL to create table. Returns an array of sql strings.
- */
- function CreateTableSQL($tabname, $flds, $tableoptions=array())
- {
- list($lines,$pkey,$idxs) = $this->_GenFields($flds, true);
- // genfields can return FALSE at times
- if ($lines == null) $lines = array();
-
- $taboptions = $this->_Options($tableoptions);
- $tabname = $this->TableName ($tabname);
- $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions);
-
- // ggiunta - 2006/10/12 - KLUDGE:
- // if we are on autoincrement, and table options includes REPLACE, the
- // autoincrement sequence has already been dropped on table creation sql, so
- // we avoid passing REPLACE to trigger creation code. This prevents
- // creating sql that double-drops the sequence
- if ($this->autoIncrement && isset($taboptions['REPLACE']))
- unset($taboptions['REPLACE']);
- $tsql = $this->_Triggers($tabname,$taboptions);
- foreach($tsql as $s) $sql[] = $s;
-
- if (is_array($idxs)) {
- foreach($idxs as $idx => $idxdef) {
- $sql_idxs = $this->CreateIndexSql($idx, $tabname, $idxdef['cols'], $idxdef['opts']);
- $sql = array_merge($sql, $sql_idxs);
- }
- }
-
- return $sql;
- }
-
- function _GenFields($flds,$widespacing=false)
- {
- if (is_string($flds)) {
- $padding = ' ';
- $txt = $flds.$padding;
- $flds = array();
- $flds0 = Lens_ParseArgs($txt,',');
- $hasparam = false;
- foreach($flds0 as $f0) {
- $f1 = array();
- foreach($f0 as $token) {
- switch (strtoupper($token)) {
- case 'INDEX':
- $f1['INDEX'] = '';
- // fall through intentionally
- case 'CONSTRAINT':
- case 'DEFAULT':
- $hasparam = $token;
- break;
- default:
- if ($hasparam) $f1[$hasparam] = $token;
- else $f1[] = $token;
- $hasparam = false;
- break;
- }
- }
- // 'index' token without a name means single column index: name it after column
- if (array_key_exists('INDEX', $f1) && $f1['INDEX'] == '') {
- $f1['INDEX'] = isset($f0['NAME']) ? $f0['NAME'] : $f0[0];
- // check if column name used to create an index name was quoted
- if (($f1['INDEX'][0] == '"' || $f1['INDEX'][0] == "'" || $f1['INDEX'][0] == "`") &&
- ($f1['INDEX'][0] == substr($f1['INDEX'], -1))) {
- $f1['INDEX'] = $f1['INDEX'][0].'idx_'.substr($f1['INDEX'], 1, -1).$f1['INDEX'][0];
- }
- else
- $f1['INDEX'] = 'idx_'.$f1['INDEX'];
- }
- // reset it, so we don't get next field 1st token as INDEX...
- $hasparam = false;
-
- $flds[] = $f1;
-
- }
- }
- $this->autoIncrement = false;
- $lines = array();
- $pkey = array();
- $idxs = array();
- foreach($flds as $fld) {
- $fld = _array_change_key_case($fld);
-
- $fname = false;
- $fdefault = false;
- $fautoinc = false;
- $ftype = false;
- $fsize = false;
- $fprec = false;
- $fprimary = false;
- $fnoquote = false;
- $fdefts = false;
- $fdefdate = false;
- $fconstraint = false;
- $fnotnull = false;
- $funsigned = false;
- $findex = '';
- $funiqueindex = false;
-
- //-----------------
- // Parse attributes
- foreach($fld as $attr => $v) {
- if ($attr == 2 && is_numeric($v)) $attr = 'SIZE';
- else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v);
-
- switch($attr) {
- case '0':
- case 'NAME': $fname = $v; break;
- case '1':
- case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break;
-
- case 'SIZE':
- $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,',');
- if ($dotat === false) $fsize = $v;
- else {
- $fsize = substr($v,0,$dotat);
- $fprec = substr($v,$dotat+1);
- }
- break;
- case 'UNSIGNED': $funsigned = true; break;
- case 'AUTOINCREMENT':
- case 'AUTO': $fautoinc = true; $fnotnull = true; break;
- case 'KEY':
- // a primary key col can be non unique in itself (if key spans many cols...)
- case 'PRIMARY': $fprimary = $v; $fnotnull = true; /*$funiqueindex = true;*/ break;
- case 'DEF':
- case 'DEFAULT': $fdefault = $v; break;
- case 'NOTNULL': $fnotnull = $v; break;
- case 'NOQUOTE': $fnoquote = $v; break;
- case 'DEFDATE': $fdefdate = $v; break;
- case 'DEFTIMESTAMP': $fdefts = $v; break;
- case 'CONSTRAINT': $fconstraint = $v; break;
- // let INDEX keyword create a 'very standard' index on column
- case 'INDEX': $findex = $v; break;
- case 'UNIQUE': $funiqueindex = true; break;
- } //switch
- } // foreach $fld
-
- //--------------------
- // VALIDATE FIELD INFO
- if (!strlen($fname)) {
- if ($this->debug) ADOConnection::outp("Undefined NAME");
- return false;
- }
-
- $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname));
- $fname = $this->NameQuote($fname);
-
- if (!strlen($ftype)) {
- if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'");
- return false;
- } else {
- $ftype = strtoupper($ftype);
- }
-
- $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec);
-
- if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls
-
- if ($fprimary) $pkey[] = $fname;
-
- // some databases do not allow blobs to have defaults
- if ($ty == 'X') $fdefault = false;
-
- // build list of indexes
- if ($findex != '') {
- if (array_key_exists($findex, $idxs)) {
- $idxs[$findex]['cols'][] = ($fname);
- if (in_array('UNIQUE', $idxs[$findex]['opts']) != $funiqueindex) {
- if ($this->debug) ADOConnection::outp("Index $findex defined once UNIQUE and once not");
- }
- if ($funiqueindex && !in_array('UNIQUE', $idxs[$findex]['opts']))
- $idxs[$findex]['opts'][] = 'UNIQUE';
- }
- else
- {
- $idxs[$findex] = array();
- $idxs[$findex]['cols'] = array($fname);
- if ($funiqueindex)
- $idxs[$findex]['opts'] = array('UNIQUE');
- else
- $idxs[$findex]['opts'] = array();
- }
- }
-
- //--------------------
- // CONSTRUCT FIELD SQL
- if ($fdefts) {
- if (substr($this->connection->databaseType,0,5) == 'mysql') {
- $ftype = 'TIMESTAMP';
- } else {
- $fdefault = $this->connection->sysTimeStamp;
- }
- } else if ($fdefdate) {
- if (substr($this->connection->databaseType,0,5) == 'mysql') {
- $ftype = 'TIMESTAMP';
- } else {
- $fdefault = $this->connection->sysDate;
- }
- } else if ($fdefault !== false && !$fnoquote) {
- if ($ty == 'C' or $ty == 'X' or
- ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) {
-
- if (($ty == 'D' || $ty == 'T') && strtolower($fdefault) != 'null') {
- // convert default date into database-aware code
- if ($ty == 'T')
- {
- $fdefault = $this->connection->DBTimeStamp($fdefault);
- }
- else
- {
- $fdefault = $this->connection->DBDate($fdefault);
- }
- }
- else
- if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ')
- $fdefault = trim($fdefault);
- else if (strtolower($fdefault) != 'null')
- $fdefault = $this->connection->qstr($fdefault);
- }
- }
- $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned);
-
- // add index creation
- if ($widespacing) $fname = str_pad($fname,24);
-
- // check for field names appearing twice
- if (array_key_exists($fid, $lines)) {
- ADOConnection::outp("Field '$fname' defined twice");
- }
-
- $lines[$fid] = $fname.' '.$ftype.$suffix;
-
- if ($fautoinc) $this->autoIncrement = true;
- } // foreach $flds
-
- return array($lines,$pkey,$idxs);
- }
-
- /**
- GENERATE THE SIZE PART OF THE DATATYPE
- $ftype is the actual type
- $ty is the type defined originally in the DDL
- */
- function _GetSize($ftype, $ty, $fsize, $fprec)
- {
- if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) {
- $ftype .= "(".$fsize;
- if (strlen($fprec)) $ftype .= ",".$fprec;
- $ftype .= ')';
- }
- return $ftype;
- }
-
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fnotnull) $suffix .= ' NOT NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname);
- 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[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s .= '(' . $flds . ')';
- $sql[] = $s;
-
- return $sql;
- }
-
- function _DropAutoIncrement($tabname)
- {
- return false;
- }
-
- function _TableSQL($tabname,$lines,$pkey,$tableoptions)
- {
- $sql = array();
-
- if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) {
- $sql[] = sprintf($this->dropTable,$tabname);
- if ($this->autoIncrement) {
- $sInc = $this->_DropAutoIncrement($tabname);
- if ($sInc) $sql[] = $sInc;
- }
- if ( isset ($tableoptions['DROP']) ) {
- return $sql;
- }
- }
- $s = "CREATE TABLE $tabname (\n";
- $s .= implode(",\n", $lines);
- if (sizeof($pkey)>0) {
- $s .= ",\n PRIMARY KEY (";
- $s .= implode(", ",$pkey).")";
- }
- if (isset($tableoptions['CONSTRAINTS']))
- $s .= "\n".$tableoptions['CONSTRAINTS'];
-
- if (isset($tableoptions[$this->upperName.'_CONSTRAINTS']))
- $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS'];
-
- $s .= "\n)";
- if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName];
- $sql[] = $s;
-
- return $sql;
- }
-
- /**
- GENERATE TRIGGERS IF NEEDED
- used when table has auto-incrementing field that is emulated using triggers
- */
- function _Triggers($tabname,$taboptions)
- {
- return array();
- }
-
- /**
- Sanitize options, so that array elements with no keys are promoted to keys
- */
- function _Options($opts)
- {
- if (!is_array($opts)) return array();
- $newopts = array();
- foreach($opts as $k => $v) {
- if (is_numeric($k)) $newopts[strtoupper($v)] = $v;
- else $newopts[strtoupper($k)] = $v;
- }
- return $newopts;
- }
-
- /**
- "Florian Buzin [ easywe ]" <florian.buzin#easywe.de>
-
- This function changes/adds new fields to your table. You don't
- have to know if the col is new or not. It will check on its own.
- */
- function ChangeTableSQL($tablename, $flds, $tableoptions = false)
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
- if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false);
-
- // check table exists
- $save_handler = $this->connection->raiseErrorFn;
- $this->connection->raiseErrorFn = '';
- $cols = $this->MetaColumns($tablename);
- $this->connection->raiseErrorFn = $save_handler;
-
- if (isset($savem)) $this->connection->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if ( empty($cols)) {
- return $this->CreateTableSQL($tablename, $flds, $tableoptions);
- }
-
- if (is_array($flds)) {
- // Cycle through the update fields, comparing
- // existing fields to fields to update.
- // if the Metatype and size is exactly the
- // same, ignore - by Mark Newham
- $holdflds = array();
- foreach($flds as $k=>$v) {
- if ( isset($cols[$k]) && is_object($cols[$k]) ) {
- // If already not allowing nulls, then don't change
- $obj = $cols[$k];
- if (isset($obj->not_null) && $obj->not_null)
- $v = str_replace('NOT NULL','',$v);
-
- $c = $cols[$k];
- $ml = $c->max_length;
- $mt = $this->MetaType($c->type,$ml);
- if ($ml == -1) $ml = '';
- if ($mt == 'X') $ml = $v['SIZE'];
- if (($mt != $v['TYPE']) || $ml != $v['SIZE']) {
- $holdflds[$k] = $v;
- }
- } else {
- $holdflds[$k] = $v;
- }
- }
- $flds = $holdflds;
- }
-
-
- // already exists, alter table instead
- list($lines,$pkey,$idxs) = $this->_GenFields($flds);
- // genfields can return FALSE at times
- if ($lines == null) $lines = array();
- $alter = 'ALTER TABLE ' . $this->TableName($tablename);
- $sql = array();
-
- foreach ( $lines as $id => $v ) {
- if ( isset($cols[$id]) && is_object($cols[$id]) ) {
-
- $flds = Lens_ParseArgs($v,',');
-
- // We are trying to change the size of the field, if not allowed, simply ignore the request.
- if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) {
- echo "<h3>$this->alterCol cannot be changed to $flds currently</h3>";
- continue;
- }
- $sql[] = $alter . $this->alterCol . ' ' . $v;
- } else {
- $sql[] = $alter . $this->addCol . ' ' . $v;
- }
- }
-
- return $sql;
- }
-} // class
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-error.inc.php b/lib/adodb/adodb-error.inc.php
deleted file mode 100644
index e60976b..0000000
--- a/lib/adodb/adodb-error.inc.php
+++ /dev/null
@@ -1,258 +0,0 @@
-<?php
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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)$/' => DB_ERROR_NOSUCHTABLE,
- '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/' => DB_ERROR_ALREADY_EXISTS,
- '/divide by zero$/' => DB_ERROR_DIVZERO,
- '/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER,
- '/ttribute [\"\'].*[\"\'] not found|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD,
- '/parser: parse error at or near \"/' => DB_ERROR_SYNTAX,
- '/referential integrity violation/' => DB_ERROR_CONSTRAINT,
- '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*|duplicate key violates unique constraint/'
- => 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;
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-errorhandler.inc.php b/lib/adodb/adodb-errorhandler.inc.php
deleted file mode 100644
index 87a9267..0000000
--- a/lib/adodb/adodb-errorhandler.inc.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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);
-}
-?>
diff --git a/lib/adodb/adodb-errorpear.inc.php b/lib/adodb/adodb-errorpear.inc.php
deleted file mode 100644
index 31cbe61..0000000
--- a/lib/adodb/adodb-errorpear.inc.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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;
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-exceptions.inc.php b/lib/adodb/adodb-exceptions.inc.php
deleted file mode 100644
index 3eebc4e..0000000
--- a/lib/adodb/adodb-exceptions.inc.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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);
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-iterator.inc.php b/lib/adodb/adodb-iterator.inc.php
deleted file mode 100644
index d291e78..0000000
--- a/lib/adodb/adodb-iterator.inc.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/*
- V4.94 23 Jan 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.
-
- 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
- */
-
-
- class ADODB_Iterator implements Iterator {
-
- private $rs;
-
- function __construct($rs)
- {
- $this->rs = $rs;
- }
- function rewind()
- {
- $this->rs->MoveFirst();
- }
-
- function valid()
- {
- return !$this->rs->EOF;
- }
-
- function key()
- {
- return $this->rs->_currentRow;
- }
-
- function current()
- {
- return $this->rs->fields;
- }
-
- function next()
- {
- $this->rs->MoveNext();
- }
-
- function __call($func, $params)
- {
- return call_user_func_array(array($this->rs, $func), $params);
- }
-
-
- function hasMore()
- {
- return !$this->rs->EOF;
- }
-
-}
-
-
-class ADODB_BASE_RS implements IteratorAggregate {
- function getIterator() {
- return new ADODB_Iterator($this);
- }
-
- /* this is experimental - i don't really know what to return... */
- function __toString()
- {
- include_once(ADODB_DIR.'/toexport.inc.php');
- return _adodb_export($this,',',',',false,true);
- }
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-lib.inc.php b/lib/adodb/adodb-lib.inc.php
deleted file mode 100644
index 2a67f28..0000000
--- a/lib/adodb/adodb-lib.inc.php
+++ /dev/null
@@ -1,1137 +0,0 @@
-<?php
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-global $ADODB_INCLUDED_LIB;
-$ADODB_INCLUDED_LIB = 1;
-
-/*
- @version V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Less commonly used functions are placed here to reduce size of adodb.inc.php.
-*/
-
-function adodb_probetypes(&$array,&$types,$probe=8)
-{
-// probe and guess the type
- $types = array();
- if ($probe > sizeof($array)) $max = sizeof($array);
- else $max = $probe;
-
-
- for ($j=0;$j < $max; $j++) {
- $row =& $array[$j];
- if (!$row) break;
- $i = -1;
- foreach($row as $v) {
- $i += 1;
-
- if (isset($types[$i]) && $types[$i]=='C') continue;
-
- //print " ($i ".$types[$i]. "$v) ";
- $v = trim($v);
-
- if (!preg_match('/^[+-]{0,1}[0-9\.]+$/',$v)) {
- $types[$i] = 'C'; // once C, always C
-
- continue;
- }
- if ($j == 0) {
- // If empty string, we presume is character
- // test for integer for 1st row only
- // after that it is up to testing other rows to prove
- // that it is not an integer
- if (strlen($v) == 0) $types[$i] = 'C';
- if (strpos($v,'.') !== false) $types[$i] = 'N';
- else $types[$i] = 'I';
- continue;
- }
-
- if (strpos($v,'.') !== false) $types[$i] = 'N';
-
- }
- }
-
-}
-
-function adodb_transpose(&$arr, &$newarr, &$hdr, &$fobjs)
-{
- $oldX = sizeof(reset($arr));
- $oldY = sizeof($arr);
-
- if ($hdr) {
- $startx = 1;
- $hdr = array('Fields');
- for ($y = 0; $y < $oldY; $y++) {
- $hdr[] = $arr[$y][0];
- }
- } else
- $startx = 0;
-
- for ($x = $startx; $x < $oldX; $x++) {
- if ($fobjs) {
- $o = $fobjs[$x];
- $newarr[] = array($o->name);
- } else
- $newarr[] = array();
-
- for ($y = 0; $y < $oldY; $y++) {
- $newarr[$x-$startx][] = $arr[$y][$x];
- }
- }
-}
-
-// Force key to upper.
-// See also http://www.php.net/manual/en/function.array-change-key-case.php
-function _array_change_key_case($an_array)
-{
- if (is_array($an_array)) {
- $new_array = array();
- foreach($an_array as $key=>$value)
- $new_array[strtoupper($key)] = $value;
-
- return $new_array;
- }
-
- return $an_array;
-}
-
-function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc)
-{
- if (count($fieldArray) == 0) return 0;
- $first = true;
- $uSet = '';
-
- if (!is_array($keyCol)) {
- $keyCol = array($keyCol);
- }
- foreach($fieldArray as $k => $v) {
- if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,$zthis->null2null)!=0) {
- $v = $zthis->qstr($v);
- $fieldArray[$k] = $v;
- }
- if (in_array($k,$keyCol)) continue; // skip UPDATE if is key
-
- if ($first) {
- $first = false;
- $uSet = "$k=$v";
- } else
- $uSet .= ",$k=$v";
- }
-
- $where = false;
- foreach ($keyCol as $v) {
- if (isset($fieldArray[$v])) {
- if ($where) $where .= ' and '.$v.'='.$fieldArray[$v];
- else $where = $v.'='.$fieldArray[$v];
- }
- }
-
- if ($uSet && $where) {
- $update = "UPDATE $table SET $uSet WHERE $where";
-
- $rs = $zthis->Execute($update);
-
-
- if ($rs) {
- if ($zthis->poorAffectedRows) {
- /*
- The Select count(*) wipes out any errors that the update would have returned.
- http://phplens.com/lens/lensforum/msgs.php?id=5696
- */
- if ($zthis->ErrorNo()<>0) return 0;
-
- # affected_rows == 0 if update field values identical to old values
- # for mysql - which is silly.
-
- $cnt = $zthis->GetOne("select count(*) from $table where $where");
- if ($cnt > 0) return 1; // record already exists
- } else {
- if (($zthis->Affected_Rows()>0)) return 1;
- }
- } else
- return 0;
- }
-
- // print "<p>Error=".$this->ErrorNo().'<p>';
- $first = true;
- foreach($fieldArray as $k => $v) {
- if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
-
- if ($first) {
- $first = false;
- $iCols = "$k";
- $iVals = "$v";
- } else {
- $iCols .= ",$k";
- $iVals .= ",$v";
- }
- }
- $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
- $rs = $zthis->Execute($insert);
- return ($rs) ? 2 : 0;
-}
-
-// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
-function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
- $size=0, $selectAttr='',$compareFields0=true)
-{
- $hasvalue = false;
-
- if ($multiple or is_array($defstr)) {
- if ($size==0) $size=5;
- $attr = ' multiple size="'.$size.'"';
- if (!strpos($name,'[]')) $name .= '[]';
- } else if ($size) $attr = ' size="'.$size.'"';
- else $attr ='';
-
- $s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>';
- if ($blank1stItem)
- if (is_string($blank1stItem)) {
- $barr = explode(':',$blank1stItem);
- if (sizeof($barr) == 1) $barr[] = '';
- $s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>";
- } else $s .= "\n<option></option>";
-
- if ($zthis->FieldCount() > 1) $hasvalue=true;
- else $compareFields0 = true;
-
- $value = '';
- $optgroup = null;
- $firstgroup = true;
- $fieldsize = $zthis->FieldCount();
- while(!$zthis->EOF) {
- $zval = rtrim(reset($zthis->fields));
-
- if ($blank1stItem && $zval=="") {
- $zthis->MoveNext();
- continue;
- }
-
- if ($fieldsize > 1) {
- if (isset($zthis->fields[1]))
- $zval2 = rtrim($zthis->fields[1]);
- else
- $zval2 = rtrim(next($zthis->fields));
- }
- $selected = ($compareFields0) ? $zval : $zval2;
-
- $group = '';
- if ($fieldsize > 2) {
- $group = rtrim($zthis->fields[2]);
- }
-/*
- if ($optgroup != $group) {
- $optgroup = $group;
- if ($firstgroup) {
- $firstgroup = false;
- $s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
- } else {
- $s .="\n</optgroup>";
- $s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
- }
- }
-*/
- if ($hasvalue)
- $value = " value='".htmlspecialchars($zval2)."'";
-
- if (is_array($defstr)) {
-
- if (in_array($selected,$defstr))
- $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
- else
- $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
- }
- else {
- if (strcasecmp($selected,$defstr)==0)
- $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
- else
- $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
- }
- $zthis->MoveNext();
- } // while
-
- // closing last optgroup
- if($optgroup != null) {
- $s .= "\n</optgroup>";
- }
- return $s ."\n</select>\n";
-}
-
-// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
-function _adodb_getmenu_gp(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
- $size=0, $selectAttr='',$compareFields0=true)
-{
- $hasvalue = false;
-
- if ($multiple or is_array($defstr)) {
- if ($size==0) $size=5;
- $attr = ' multiple size="'.$size.'"';
- if (!strpos($name,'[]')) $name .= '[]';
- } else if ($size) $attr = ' size="'.$size.'"';
- else $attr ='';
-
- $s = '<select name="'.$name.'"'.$attr.' '.$selectAttr.'>';
- if ($blank1stItem)
- if (is_string($blank1stItem)) {
- $barr = explode(':',$blank1stItem);
- if (sizeof($barr) == 1) $barr[] = '';
- $s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>";
- } else $s .= "\n<option></option>";
-
- if ($zthis->FieldCount() > 1) $hasvalue=true;
- else $compareFields0 = true;
-
- $value = '';
- $optgroup = null;
- $firstgroup = true;
- $fieldsize = sizeof($zthis->fields);
- while(!$zthis->EOF) {
- $zval = rtrim(reset($zthis->fields));
-
- if ($blank1stItem && $zval=="") {
- $zthis->MoveNext();
- continue;
- }
-
- if ($fieldsize > 1) {
- if (isset($zthis->fields[1]))
- $zval2 = rtrim($zthis->fields[1]);
- else
- $zval2 = rtrim(next($zthis->fields));
- }
- $selected = ($compareFields0) ? $zval : $zval2;
-
- $group = '';
- if (isset($zthis->fields[2])) {
- $group = rtrim($zthis->fields[2]);
- }
-
- if ($optgroup != $group) {
- $optgroup = $group;
- if ($firstgroup) {
- $firstgroup = false;
- $s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
- } else {
- $s .="\n</optgroup>";
- $s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
- }
- }
-
- if ($hasvalue)
- $value = " value='".htmlspecialchars($zval2)."'";
-
- if (is_array($defstr)) {
-
- if (in_array($selected,$defstr))
- $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
- else
- $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
- }
- else {
- if (strcasecmp($selected,$defstr)==0)
- $s .= "\n<option selected='selected'$value>".htmlspecialchars($zval).'</option>';
- else
- $s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';
- }
- $zthis->MoveNext();
- } // while
-
- // closing last optgroup
- if($optgroup != null) {
- $s .= "\n</optgroup>";
- }
- return $s ."\n</select>\n";
-}
-
-
-/*
- Count the number of records this sql statement will return by using
- query rewriting heuristics...
-
- Does not work with UNIONs, except with postgresql and oracle.
-
- Usage:
-
- $conn->Connect(...);
- $cnt = _adodb_getcount($conn, $sql);
-
-*/
-function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
-{
- $qryRecs = 0;
-
- if (!empty($zthis->_nestedSQL) || preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) ||
- preg_match('/\s+GROUP\s+BY\s+/is',$sql) ||
- preg_match('/\s+UNION\s+/is',$sql)) {
- // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias
- // but this is only supported by oracle and postgresql...
- if ($zthis->dataProvider == 'oci8') {
-
- $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql);
-
- // Allow Oracle hints to be used for query optimization, Chris Wrye
- if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) {
- $rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")";
- } else
- $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")";
-
- } else if (strncmp($zthis->databaseType,'postgres',8) == 0) {
- $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql);
- $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";
- }
- } else {
- // now replace SELECT ... FROM with SELECT COUNT(*) FROM
- $rewritesql = preg_replace(
- '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql);
-
-
-
- // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails
- // with mssql, access and postgresql. Also a good speedup optimization - skips sorting!
- // also see http://phplens.com/lens/lensforum/msgs.php?id=12752
- if (preg_match('/\sORDER\s+BY\s*\(/i',$rewritesql))
- $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql);
- else
- $rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$rewritesql);
- }
-
-
-
- if (isset($rewritesql) && $rewritesql != $sql) {
- if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[1];
-
- if ($secs2cache) {
- // we only use half the time of secs2cache because the count can quickly
- // become inaccurate if new records are added
- $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);
-
- } else {
- $qryRecs = $zthis->GetOne($rewritesql,$inputarr);
- }
- if ($qryRecs !== false) return $qryRecs;
- }
- //--------------------------------------------
- // query rewrite failed - so try slower way...
-
-
- // strip off unneeded ORDER BY if no UNION
- if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql;
- else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
-
- if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];
-
- $rstest = &$zthis->Execute($rewritesql,$inputarr);
- if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr);
-
- if ($rstest) {
- $qryRecs = $rstest->RecordCount();
- if ($qryRecs == -1) {
- global $ADODB_EXTENSION;
- // some databases will return -1 on MoveLast() - change to MoveNext()
- if ($ADODB_EXTENSION) {
- while(!$rstest->EOF) {
- adodb_movenext($rstest);
- }
- } else {
- while(!$rstest->EOF) {
- $rstest->MoveNext();
- }
- }
- $qryRecs = $rstest->_currentRow;
- }
- $rstest->Close();
- if ($qryRecs == -1) return 0;
- }
- return $qryRecs;
-}
-
-/*
- Code originally from "Cornel G" <conyg@fx.ro>
-
- This code might not work with SQL that has UNION in it
-
- Also if you are using CachePageExecute(), there is a strong possibility that
- data will get out of synch. use CachePageExecute() only with tables that
- rarely change.
-*/
-function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,
- $inputarr=false, $secs2cache=0)
-{
- $atfirstpage = false;
- $atlastpage = false;
- $lastpageno=1;
-
- // If an invalid nrows is supplied,
- // we assume a default value of 10 rows per page
- if (!isset($nrows) || $nrows <= 0) $nrows = 10;
-
- $qryRecs = false; //count records for no offset
-
- $qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache);
- $lastpageno = (int) ceil($qryRecs / $nrows);
- $zthis->_maxRecordCount = $qryRecs;
-
-
-
- // ***** Here we check whether $page is the last page or
- // whether we are trying to retrieve
- // a page number greater than the last page number.
- if ($page >= $lastpageno) {
- $page = $lastpageno;
- $atlastpage = true;
- }
-
- // If page number <= 1, then we are at the first page
- if (empty($page) || $page <= 1) {
- $page = 1;
- $atfirstpage = true;
- }
-
- // We get the data we want
- $offset = $nrows * ($page-1);
- if ($secs2cache > 0)
- $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
- else
- $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
-
-
- // Before returning the RecordSet, we set the pagination properties we need
- if ($rsreturn) {
- $rsreturn->_maxRecordCount = $qryRecs;
- $rsreturn->rowsPerPage = $nrows;
- $rsreturn->AbsolutePage($page);
- $rsreturn->AtFirstPage($atfirstpage);
- $rsreturn->AtLastPage($atlastpage);
- $rsreturn->LastPageNo($lastpageno);
- }
- return $rsreturn;
-}
-
-// Iván Oliva version
-function &_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0)
-{
-
- $atfirstpage = false;
- $atlastpage = false;
-
- if (!isset($page) || $page <= 1) { // If page number <= 1, then we are at the first page
- $page = 1;
- $atfirstpage = true;
- }
- if ($nrows <= 0) $nrows = 10; // If an invalid nrows is supplied, we assume a default value of 10 rows per page
-
- // ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than
- // the last page number.
- $pagecounter = $page + 1;
- $pagecounteroffset = ($pagecounter * $nrows) - $nrows;
- if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
- else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
- if ($rstest) {
- while ($rstest && $rstest->EOF && $pagecounter>0) {
- $atlastpage = true;
- $pagecounter--;
- $pagecounteroffset = $nrows * ($pagecounter - 1);
- $rstest->Close();
- if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
- else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
- }
- if ($rstest) $rstest->Close();
- }
- if ($atlastpage) { // If we are at the last page or beyond it, we are going to retrieve it
- $page = $pagecounter;
- if ($page == 1) $atfirstpage = true; // We have to do this again in case the last page is the same as the first
- //... page, that is, the recordset has only 1 page.
- }
-
- // We get the data we want
- $offset = $nrows * ($page-1);
- if ($secs2cache > 0) $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
- else $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
-
- // Before returning the RecordSet, we set the pagination properties we need
- if ($rsreturn) {
- $rsreturn->rowsPerPage = $nrows;
- $rsreturn->AbsolutePage($page);
- $rsreturn->AtFirstPage($atfirstpage);
- $rsreturn->AtLastPage($atlastpage);
- }
- return $rsreturn;
-}
-
-function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2)
-{
- global $ADODB_QUOTE_FIELDNAMES;
-
- if (!$rs) {
- printf(ADODB_BAD_RS,'GetUpdateSQL');
- return false;
- }
-
- $fieldUpdatedCount = 0;
- $arrFields = _array_change_key_case($arrFields);
-
- $hasnumeric = isset($rs->fields[0]);
- $setFields = '';
-
- // Loop through all of the fields in the recordset
- for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
- // Get the field from the recordset
- $field = $rs->FetchField($i);
-
- // If the recordset field is one
- // of the fields passed in then process.
- $upperfname = strtoupper($field->name);
- if (adodb_key_exists($upperfname,$arrFields,$force)) {
-
- // If the existing field value in the recordset
- // is different from the value passed in then
- // go ahead and append the field name and new value to
- // the update query.
-
- if ($hasnumeric) $val = $rs->fields[$i];
- else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname];
- else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name];
- else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)];
- else $val = '';
-
-
- if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) {
- // Set the counter for the number of fields that will be updated.
- $fieldUpdatedCount++;
-
- // Based on the datatype of the field
- // Format the value properly for the database
- $type = $rs->MetaType($field->type);
-
-
- if ($type == 'null') {
- $type = 'C';
- }
-
- if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES))
- $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
- else
- $fnameq = $upperfname;
-
-
- // is_null requires php 4.0.4
- //********************************************************//
- if (is_null($arrFields[$upperfname])
- || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
- || $arrFields[$upperfname] === $zthis->null2null
- )
- {
- switch ($force) {
-
- //case 0:
- // //Ignore empty values. This is allready handled in "adodb_key_exists" function.
- //break;
-
- case 1:
- //Set null
- $setFields .= $field->name . " = null, ";
- break;
-
- case 2:
- //Set empty
- $arrFields[$upperfname] = "";
- $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
- break;
- default:
- case 3:
- //Set the value that was given in array, so you can give both null and empty values
- if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {
- $setFields .= $field->name . " = null, ";
- } else {
- $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
- }
- break;
- }
- //********************************************************//
- } else {
- //we do this so each driver can customize the sql for
- //DB specific column types.
- //Oracle needs BLOB types to be handled with a returning clause
- //postgres has special needs as well
- $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,
- $arrFields, $magicq);
- }
- }
- }
- }
-
- // If there were any modified fields then build the rest of the update query.
- if ($fieldUpdatedCount > 0 || $forceUpdate) {
- // Get the table name from the existing query.
- if (!empty($rs->tableName)) $tableName = $rs->tableName;
- else {
- preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName);
- $tableName = $tableName[1];
- }
- // Get the full where clause excluding the word "WHERE" from
- // the existing query.
- preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause);
-
- $discard = false;
- // not a good hack, improvements?
- if ($whereClause) {
- #var_dump($whereClause);
- if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));
- else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard));
- else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard));
- else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976
- } else
- $whereClause = array(false,false);
-
- if ($discard)
- $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));
-
- $sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2);
- if (strlen($whereClause[1]) > 0)
- $sql .= ' WHERE '.$whereClause[1];
-
- return $sql;
-
- } else {
- return false;
- }
-}
-
-function adodb_key_exists($key, &$arr,$force=2)
-{
- if ($force<=0) {
- // the following is the old behaviour where null or empty fields are ignored
- return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0);
- }
-
- if (isset($arr[$key])) return true;
- ## null check below
- if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr);
- return false;
-}
-
-/**
- * There is a special case of this function for the oci8 driver.
- * The proper way to handle an insert w/ a blob in oracle requires
- * a returning clause with bind variables and a descriptor blob.
- *
- *
- */
-function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2)
-{
-static $cacheRS = false;
-static $cacheSig = 0;
-static $cacheCols;
- global $ADODB_QUOTE_FIELDNAMES;
-
- $tableName = '';
- $values = '';
- $fields = '';
- $recordSet = null;
- $arrFields = _array_change_key_case($arrFields);
- $fieldInsertedCount = 0;
-
- if (is_string($rs)) {
- //ok we have a table name
- //try and get the column info ourself.
- $tableName = $rs;
-
- //we need an object for the recordSet
- //because we have to call MetaType.
- //php can't do a $rsclass::MetaType()
- $rsclass = $zthis->rsPrefix.$zthis->databaseType;
- $recordSet = new $rsclass(-1,$zthis->fetchMode);
- $recordSet->connection = &$zthis;
-
- if (is_string($cacheRS) && $cacheRS == $rs) {
- $columns =& $cacheCols;
- } else {
- $columns = $zthis->MetaColumns( $tableName );
- $cacheRS = $tableName;
- $cacheCols = $columns;
- }
- } else if (is_subclass_of($rs, 'adorecordset')) {
- if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) {
- $columns =& $cacheCols;
- } else {
- for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++)
- $columns[] = $rs->FetchField($i);
- $cacheRS = $cacheSig;
- $cacheCols = $columns;
- $rs->insertSig = $cacheSig++;
- }
- $recordSet =& $rs;
-
- } else {
- printf(ADODB_BAD_RS,'GetInsertSQL');
- return false;
- }
-
- // Loop through all of the fields in the recordset
- foreach( $columns as $field ) {
- $upperfname = strtoupper($field->name);
- if (adodb_key_exists($upperfname,$arrFields,$force)) {
- $bad = false;
- if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES))
- $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
- else
- $fnameq = $upperfname;
-
- $type = $recordSet->MetaType($field->type);
-
- /********************************************************/
- if (is_null($arrFields[$upperfname])
- || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
- || $arrFields[$upperfname] === $zthis->null2null
- )
- {
- switch ($force) {
-
- case 0: // we must always set null if missing
- $bad = true;
- break;
-
- case 1:
- $values .= "null, ";
- break;
-
- case 2:
- //Set empty
- $arrFields[$upperfname] = "";
- $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,$arrFields, $magicq);
- break;
-
- default:
- case 3:
- //Set the value that was given in array, so you can give both null and empty values
- if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {
- $values .= "null, ";
- } else {
- $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq);
- }
- break;
- } // switch
-
- /*********************************************************/
- } else {
- //we do this so each driver can customize the sql for
- //DB specific column types.
- //Oracle needs BLOB types to be handled with a returning clause
- //postgres has special needs as well
- $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,
- $arrFields, $magicq);
- }
-
- if ($bad) continue;
- // Set the counter for the number of fields that will be inserted.
- $fieldInsertedCount++;
-
-
- // Get the name of the fields to insert
- $fields .= $fnameq . ", ";
- }
- }
-
-
- // If there were any inserted fields then build the rest of the insert query.
- if ($fieldInsertedCount <= 0) return false;
-
- // Get the table name from the existing query.
- if (!$tableName) {
- if (!empty($rs->tableName)) $tableName = $rs->tableName;
- else if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName))
- $tableName = $tableName[1];
- else
- return false;
- }
-
- // Strip off the comma and space on the end of both the fields
- // and their values.
- $fields = substr($fields, 0, -2);
- $values = substr($values, 0, -2);
-
- // Append the fields and their values to the insert query.
- return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )';
-}
-
-
-/**
- * This private method is used to help construct
- * the update/sql which is generated by GetInsertSQL and GetUpdateSQL.
- * It handles the string construction of 1 column -> sql string based on
- * the column type. We want to do 'safe' handling of BLOBs
- *
- * @param string the type of sql we are trying to create
- * 'I' or 'U'.
- * @param string column data type from the db::MetaType() method
- * @param string the column name
- * @param array the column value
- *
- * @return string
- *
- */
-function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq)
-{
- $sql = '';
-
- // Based on the datatype of the field
- // Format the value properly for the database
- switch($type) {
- case 'B':
- //in order to handle Blobs correctly, we need
- //to do some magic for Oracle
-
- //we need to create a new descriptor to handle
- //this properly
- if (!empty($zthis->hasReturningInto)) {
- if ($action == 'I') {
- $sql = 'empty_blob(), ';
- } else {
- $sql = $fnameq. '=empty_blob(), ';
- }
- //add the variable to the returning clause array
- //so the user can build this later in
- //case they want to add more to it
- $zthis->_returningArray[$fname] = ':xx'.$fname.'xx';
- } else if (empty($arrFields[$fname])){
- if ($action == 'I') {
- $sql = 'empty_blob(), ';
- } else {
- $sql = $fnameq. '=empty_blob(), ';
- }
- } else {
- //this is to maintain compatibility
- //with older adodb versions.
- $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
- }
- break;
-
- case "X":
- //we need to do some more magic here for long variables
- //to handle these correctly in oracle.
-
- //create a safe bind var name
- //to avoid conflicts w/ dupes.
- if (!empty($zthis->hasReturningInto)) {
- if ($action == 'I') {
- $sql = ':xx'.$fname.'xx, ';
- } else {
- $sql = $fnameq.'=:xx'.$fname.'xx, ';
- }
- //add the variable to the returning clause array
- //so the user can build this later in
- //case they want to add more to it
- $zthis->_returningArray[$fname] = ':xx'.$fname.'xx';
- } else {
- //this is to maintain compatibility
- //with older adodb versions.
- $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
- }
- break;
-
- default:
- $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);
- break;
- }
-
- return $sql;
-}
-
-function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true)
-{
-
- if ($recurse) {
- switch($zthis->dataProvider) {
- case 'postgres':
- if ($type == 'L') $type = 'C';
- break;
- case 'oci8':
- return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq);
-
- }
- }
-
- switch($type) {
- case "C":
- case "X":
- case 'B':
- $val = $zthis->qstr($arrFields[$fname],$magicq);
- break;
-
- case "D":
- $val = $zthis->DBDate($arrFields[$fname]);
- break;
-
- case "T":
- $val = $zthis->DBTimeStamp($arrFields[$fname]);
- break;
-
- default:
- $val = $arrFields[$fname];
- if (empty($val)) $val = '0';
- break;
- }
-
- if ($action == 'I') return $val . ", ";
-
-
- return $fnameq . "=" . $val . ", ";
-
-}
-
-
-
-function _adodb_debug_execute(&$zthis, $sql, $inputarr)
-{
- $ss = '';
- if ($inputarr) {
- foreach($inputarr as $kk=>$vv) {
- if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...';
- $ss .= "($kk=>'$vv') ";
- }
- $ss = "[ $ss ]";
- }
- $sqlTxt = is_array($sql) ? $sql[0] : $sql;
- /*str_replace(', ','##1#__^LF',is_array($sql) ? $sql[0] : $sql);
- $sqlTxt = str_replace(',',', ',$sqlTxt);
- $sqlTxt = str_replace('##1#__^LF', ', ' ,$sqlTxt);
- */
- // check if running from browser or command-line
- $inBrowser = isset($_SERVER['HTTP_USER_AGENT']);
-
- $dbt = $zthis->databaseType;
- if (isset($zthis->dsnType)) $dbt .= '-'.$zthis->dsnType;
- if ($inBrowser) {
- if ($ss) {
- $ss = '<code>'.htmlspecialchars($ss).'</code>';
- }
- if ($zthis->debug === -1)
- ADOConnection::outp( "<br />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<br />\n",false);
- else
- ADOConnection::outp( "<hr />\n($dbt): ".htmlspecialchars($sqlTxt)." &nbsp; $ss\n<hr />\n",false);
- } else {
- ADOConnection::outp("-----\n($dbt): ".$sqlTxt."\n-----\n",false);
- }
-
- $qID = $zthis->_query($sql,$inputarr);
-
- /*
- Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql
- because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion
- */
- if ($zthis->databaseType == 'mssql') {
- // ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6
- if($emsg = $zthis->ErrorMsg()) {
- if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg);
- }
- } else if (!$qID) {
- ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg());
- }
-
- if ($zthis->debug === 99) _adodb_backtrace(true,9999,2);
- return $qID;
-}
-
-# pretty print the debug_backtrace function
-function _adodb_backtrace($printOrArr=true,$levels=9999,$skippy=0)
-{
- if (!function_exists('debug_backtrace')) return '';
-
- $html = (isset($_SERVER['HTTP_USER_AGENT']));
- $fmt = ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s";
-
- $MAXSTRLEN = 128;
-
- $s = ($html) ? '<pre align=left>' : '';
-
- if (is_array($printOrArr)) $traceArr = $printOrArr;
- else $traceArr = debug_backtrace();
- array_shift($traceArr);
- array_shift($traceArr);
- $tabs = sizeof($traceArr)-2;
-
- foreach ($traceArr as $arr) {
- if ($skippy) {$skippy -= 1; continue;}
- $levels -= 1;
- if ($levels < 0) break;
-
- $args = array();
- for ($i=0; $i < $tabs; $i++) $s .= ($html) ? ' &nbsp; ' : "\t";
- $tabs -= 1;
- if ($html) $s .= '<font face="Courier New,Courier">';
- if (isset($arr['class'])) $s .= $arr['class'].'.';
- if (isset($arr['args']))
- foreach($arr['args'] as $v) {
- if (is_null($v)) $args[] = 'null';
- else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';
- else if (is_object($v)) $args[] = 'Object:'.get_class($v);
- else if (is_bool($v)) $args[] = $v ? 'true' : 'false';
- else {
- $v = (string) @$v;
- $str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
- if (strlen($v) > $MAXSTRLEN) $str .= '...';
- $args[] = $str;
- }
- }
- $s .= $arr['function'].'('.implode(', ',$args).')';
-
-
- $s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
-
- $s .= "\n";
- }
- if ($html) $s .= '</pre>';
- if ($printOrArr) print $s;
-
- return $s;
-}
-/*
-function _adodb_find_from($sql)
-{
-
- $sql = str_replace(array("\n","\r"), ' ', $sql);
- $charCount = strlen($sql);
-
- $inString = false;
- $quote = '';
- $parentheseCount = 0;
- $prevChars = '';
- $nextChars = '';
-
-
- for($i = 0; $i < $charCount; $i++) {
-
- $char = substr($sql,$i,1);
- $prevChars = substr($sql,0,$i);
- $nextChars = substr($sql,$i+1);
-
- if((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === false) {
- $quote = $char;
- $inString = true;
- }
-
- elseif((($char == "'" || $char == '"' || $char == '`') && substr($prevChars,-1,1) != '\\') && $inString === true && $quote == $char) {
- $quote = "";
- $inString = false;
- }
-
- elseif($char == "(" && $inString === false)
- $parentheseCount++;
-
- elseif($char == ")" && $inString === false && $parentheseCount > 0)
- $parentheseCount--;
-
- elseif($parentheseCount <= 0 && $inString === false && $char == " " && strtoupper(substr($prevChars,-5,5)) == " FROM")
- return $i;
-
- }
-}
-*/
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-memcache.lib.inc.php b/lib/adodb/adodb-memcache.lib.inc.php
deleted file mode 100644
index bc6b420..0000000
--- a/lib/adodb/adodb-memcache.lib.inc.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-global $ADODB_INCLUDED_MEMCACHE;
-$ADODB_INCLUDED_MEMCACHE = 1;
-
-/*
-
- V4.90 8 June 2006 (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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
-*/
-
- function &getmemcache($key,&$err, $timeout=0, $host, $port)
- {
- $false = false;
- $err = false;
-
- if (!function_exists('memcache_pconnect')) {
- $err = 'Memcache module PECL extension not found!';
- return $false;
- }
-
- $memcache = new Memcache;
- if (!@$memcache->pconnect($host, $port)) {
- $err = 'Can\'t connect to memcache server on: '.$host.':'.$port;
- return $false;
- }
-
- $rs = $memcache->get($key);
- if (!$rs) {
- $err = 'Item with such key doesn\'t exists on the memcached server.';
- return $false;
- }
-
- $tdiff = intval($rs->timeCreated+$timeout - time());
- if ($tdiff <= 2) {
- switch($tdiff) {
- case 2:
- if ((rand() & 15) == 0) {
- $err = "Timeout 2";
- return $false;
- }
- break;
- case 1:
- if ((rand() & 3) == 0) {
- $err = "Timeout 1";
- return $false;
- }
- break;
- default:
- $err = "Timeout 0";
- return $false;
- }
- }
- return $rs;
- }
-
- function putmemcache($key, $rs, $host, $port, $compress, $debug=false)
- {
- $false = false;
- $true = true;
-
- if (!function_exists('memcache_pconnect')) {
- if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n");
- return $false;
- }
-
- $memcache = new Memcache;
- if (!@$memcache->pconnect($host, $port)) {
- if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n");
- return $false;
- }
-
- $rs->timeCreated = time();
- if (!$memcache->set($key, $rs, $compress, 0)) {
- if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n");
- return $false;
- }
- return $true;
- }
-
- function flushmemcache($key=false, $host, $port, $debug=false)
- {
- if (!function_exists('memcache_pconnect')) {
- if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n");
- return;
- }
-
- $memcache = new Memcache;
- if (!@$memcache->pconnect($host, $port)) {
- if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n");
- return;
- }
-
- if ($key) {
- if (!$memcache->delete($key)) {
- if ($debug) ADOConnection::outp("CacheFlush: $key entery doesn't exist on memcached server!<br>\n");
- } else {
- if ($debug) ADOConnection::outp("CacheFlush: $key entery flushed from memcached server!<br>\n");
- }
- } else {
- if (!$memcache->flush()) {
- if ($debug) ADOConnection::outp("CacheFlush: Failure flushing all enteries from memcached server!<br>\n");
- } else {
- if ($debug) ADOConnection::outp("CacheFlush: All enteries flushed from memcached server!<br>\n");
- }
- }
- return;
- }
-?>
diff --git a/lib/adodb/adodb-pager.inc.php b/lib/adodb/adodb-pager.inc.php
deleted file mode 100644
index 22321b2..0000000
--- a/lib/adodb/adodb-pager.inc.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-/*
- V4.94 23 Jan 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.
-
- 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>|&lt;</code>';
- var $prev = '<code>&lt;&lt;</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> &nbsp;
- <?php
- } else {
- print "$this->first &nbsp; ";
- }
- }
-
- //--------------------------
- // 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> &nbsp;
- <?php
- } else {
- print "$this->next &nbsp; ";
- }
- }
-
- //------------------
- // 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> &nbsp;
- <?php
- } else {
- print "$this->last &nbsp; ";
- }
- }
-
- //---------------------------------------------------
- // 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 . ' &nbsp; ';
- }
- // 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> &nbsp;
- <?php
- } else {
- print "$this->prev &nbsp; ";
- }
- }
-
- //--------------------------------------------------------
- // 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 = "&nbsp;";
-
- $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>";
- }
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-pear.inc.php b/lib/adodb/adodb-pear.inc.php
deleted file mode 100644
index ecaf753..0000000
--- a/lib/adodb/adodb-pear.inc.php
+++ /dev/null
@@ -1,374 +0,0 @@
-<?php
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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 = 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;
- }
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-perf.inc.php b/lib/adodb/adodb-perf.inc.php
deleted file mode 100644
index e00359f..0000000
--- a/lib/adodb/adodb-perf.inc.php
+++ /dev/null
@@ -1,1068 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning.
-
- My apologies if you see code mixed with presentation. The presentation suits
- my needs. If you want to separate code from presentation, be my guest. Patches
- are welcome.
-
-*/
-
-if (!defined('ADODB_DIR')) include_once(dirname(__FILE__).'/adodb.inc.php');
-include_once(ADODB_DIR.'/tohtml.inc.php');
-
-define( 'ADODB_OPT_HIGH', 2);
-define( 'ADODB_OPT_LOW', 1);
-
-// returns in K the memory of current process, or 0 if not known
-function adodb_getmem()
-{
- if (function_exists('memory_get_usage'))
- return (integer) ((memory_get_usage()+512)/1024);
-
- $pid = getmypid();
-
- if ( strncmp(strtoupper(PHP_OS),'WIN',3)==0) {
- $output = array();
-
- exec('tasklist /FI "PID eq ' . $pid. '" /FO LIST', $output);
- return substr($output[5], strpos($output[5], ':') + 1);
- }
-
- /* Hopefully UNIX */
- exec("ps --pid $pid --no-headers -o%mem,size", $output);
- if (sizeof($output) == 0) return 0;
-
- $memarr = explode(' ',$output[0]);
- if (sizeof($memarr)>=2) return (integer) $memarr[1];
-
- return 0;
-}
-
-// avoids localization problems where , is used instead of .
-function adodb_round($n,$prec)
-{
- return number_format($n, $prec, '.', '');
-}
-
-/* return microtime value as a float */
-function adodb_microtime()
-{
- $t = microtime();
- $t = explode(' ',$t);
- return (float)$t[1]+ (float)$t[0];
-}
-
-/* sql code timing */
-function& adodb_log_sql(&$connx,$sql,$inputarr)
-{
- $perf_table = adodb_perf::table();
- $connx->fnExecute = false;
- $t0 = microtime();
- $rs =& $connx->Execute($sql,$inputarr);
- $t1 = microtime();
-
- if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) {
- global $ADODB_LOG_CONN;
-
- if (!empty($ADODB_LOG_CONN)) {
- $conn = &$ADODB_LOG_CONN;
- if ($conn->databaseType != $connx->databaseType)
- $prefix = '/*dbx='.$connx->databaseType .'*/ ';
- else
- $prefix = '';
- } else {
- $conn =& $connx;
- $prefix = '';
- }
-
- $conn->_logsql = false; // disable logsql error simulation
- $dbT = $conn->databaseType;
-
- $a0 = split(' ',$t0);
- $a0 = (float)$a0[1]+(float)$a0[0];
-
- $a1 = split(' ',$t1);
- $a1 = (float)$a1[1]+(float)$a1[0];
-
- $time = $a1 - $a0;
-
- if (!$rs) {
- $errM = $connx->ErrorMsg();
- $errN = $connx->ErrorNo();
- $conn->lastInsID = 0;
- $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250);
- } else {
- $tracer = '';
- $errM = '';
- $errN = 0;
- $dbg = $conn->debug;
- $conn->debug = false;
- if (!is_object($rs) || $rs->dataProvider == 'empty')
- $conn->_affected = $conn->affected_rows(true);
- $conn->lastInsID = @$conn->Insert_ID();
- $conn->debug = $dbg;
- }
- if (isset($_SERVER['HTTP_HOST'])) {
- $tracer .= '<br>'.$_SERVER['HTTP_HOST'];
- if (isset($_SERVER['PHP_SELF'])) $tracer .= $_SERVER['PHP_SELF'];
- } else
- if (isset($_SERVER['PHP_SELF'])) $tracer .= '<br>'.$_SERVER['PHP_SELF'];
- //$tracer .= (string) adodb_backtrace(false);
-
- $tracer = (string) substr($tracer,0,500);
-
- if (is_array($inputarr)) {
- if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr);
- else {
- // Quote string parameters so we can see them in the
- // performance stats. This helps spot disabled indexes.
- $xar_params = $inputarr;
- foreach ($xar_params as $xar_param_key => $xar_param) {
- if (gettype($xar_param) == 'string')
- $xar_params[$xar_param_key] = '"' . $xar_param . '"';
- }
- $params = implode(', ', $xar_params);
- if (strlen($params) >= 3000) $params = substr($params, 0, 3000);
- }
- } else {
- $params = '';
- }
-
- if (is_array($sql)) $sql = $sql[0];
- if ($prefix) $sql = $prefix.$sql;
- $arr = array('b'=>strlen($sql).'.'.crc32($sql),
- 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6));
- //var_dump($arr);
- $saved = $conn->debug;
- $conn->debug = 0;
-
- $d = $conn->sysTimeStamp;
- if (empty($d)) $d = date("'Y-m-d H:i:s'");
- if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') {
- $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)";
- } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || strncmp($dbT,'odbtp',4)==0) {
- $timer = $arr['f'];
- if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
-
- $sql1 = $conn->qstr($arr['b']);
- $sql2 = $conn->qstr($arr['c']);
- $params = $conn->qstr($arr['d']);
- $tracer = $conn->qstr($arr['e']);
-
- $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($d,$sql1,$sql2,$params,$tracer,$timer)";
- if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
- $arr = false;
- } else {
- if ($dbT == 'db2') $arr['f'] = (float) $arr['f'];
- $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)";
- }
- $ok = $conn->Execute($isql,$arr);
- $conn->debug = $saved;
-
- if ($ok) {
- $conn->_logsql = true;
- } else {
- $err2 = $conn->ErrorMsg();
- $conn->_logsql = true; // enable logsql error simulation
- $perf =& NewPerfMonitor($conn);
- if ($perf) {
- if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr);
- } else {
- $ok = $conn->Execute("create table $perf_table (
- created varchar(50),
- sql0 varchar(250),
- sql1 varchar(4000),
- params varchar(3000),
- tracer varchar(500),
- timer decimal(16,6))");
- }
- if (!$ok) {
- ADOConnection::outp( "<p><b>LOGSQL Insert Failed</b>: $isql<br>$err2</p>");
- $conn->_logsql = false;
- }
- }
- $connx->_errorMsg = $errM;
- $connx->_errorCode = $errN;
- }
- $connx->fnExecute = 'adodb_log_sql';
- return $rs;
-}
-
-
-/*
-The settings data structure is an associative array that database parameter per element.
-
-Each database parameter element in the array is itself an array consisting of:
-
-0: category code, used to group related db parameters
-1: either
- a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'",
- b. array holding sql string and field to look for, e.g. array('show variables','table_cache'),
- c. a string prefixed by =, then a PHP method of the class is invoked,
- e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue',
-2: description of the database parameter
-*/
-
-class adodb_perf {
- var $conn;
- var $color = '#F0F0F0';
- var $table = '<table border=1 bgcolor=white>';
- var $titles = '<tr><td><b>Parameter</b></td><td><b>Value</b></td><td><b>Description</b></td></tr>';
- var $warnRatio = 90;
- var $tablesSQL = false;
- var $cliFormat = "%32s => %s \r\n";
- var $sql1 = 'sql1'; // used for casting sql1 to text for mssql
- var $explain = true;
- var $helpurl = "<a href=http://phplens.com/adodb/reference.functions.fnexecute.and.fncacheexecute.properties.html#logsql>LogSQL help</a>";
- var $createTableSQL = false;
- var $maxLength = 2000;
-
- // Sets the tablename to be used
- function table($newtable = false)
- {
- static $_table;
-
- if (!empty($newtable)) $_table = $newtable;
- if (empty($_table)) $_table = 'adodb_logsql';
- return $_table;
- }
-
- // returns array with info to calculate CPU Load
- function _CPULoad()
- {
-/*
-
-cpu 524152 2662 2515228 336057010
-cpu0 264339 1408 1257951 168025827
-cpu1 259813 1254 1257277 168031181
-page 622307 25475680
-swap 24 1891
-intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320)
-ctxt 66155838
-btime 1062315585
-processes 69293
-
-*/
- // Algorithm is taken from
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
- if (strncmp(PHP_OS,'WIN',3)==0) {
- if (PHP_VERSION == '5.0.0') return false;
- if (PHP_VERSION == '5.0.1') return false;
- if (PHP_VERSION == '5.0.2') return false;
- if (PHP_VERSION == '5.0.3') return false;
- if (PHP_VERSION == '4.3.10') return false; # see http://bugs.php.net/bug.php?id=31737
-
- @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'");
- if (!$c) return false;
-
- $info[0] = $c->PercentProcessorTime;
- $info[1] = 0;
- $info[2] = 0;
- $info[3] = $c->TimeStamp_Sys100NS;
- //print_r($info);
- return $info;
- }
-
- // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com)
- $statfile = '/proc/stat';
- if (!file_exists($statfile)) return false;
-
- $fd = fopen($statfile,"r");
- if (!$fd) return false;
-
- $statinfo = explode("\n",fgets($fd, 1024));
- fclose($fd);
- foreach($statinfo as $line) {
- $info = explode(" ",$line);
- if($info[0]=="cpu") {
- array_shift($info); // pop off "cpu"
- if(!$info[0]) array_shift($info); // pop off blank space (if any)
- return $info;
- }
- }
-
- return false;
-
- }
-
- /* NOT IMPLEMENTED */
- function MemInfo()
- {
- /*
-
- total: used: free: shared: buffers: cached:
-Mem: 1055289344 917299200 137990144 0 165437440 599773184
-Swap: 2146775040 11055104 2135719936
-MemTotal: 1030556 kB
-MemFree: 134756 kB
-MemShared: 0 kB
-Buffers: 161560 kB
-Cached: 581384 kB
-SwapCached: 4332 kB
-Active: 494468 kB
-Inact_dirty: 322856 kB
-Inact_clean: 24256 kB
-Inact_target: 168316 kB
-HighTotal: 131064 kB
-HighFree: 1024 kB
-LowTotal: 899492 kB
-LowFree: 133732 kB
-SwapTotal: 2096460 kB
-SwapFree: 2085664 kB
-Committed_AS: 348732 kB
- */
- }
-
-
- /*
- Remember that this is client load, not db server load!
- */
- var $_lastLoad;
- function CPULoad()
- {
- $info = $this->_CPULoad();
- if (!$info) return false;
-
- if (empty($this->_lastLoad)) {
- sleep(1);
- $this->_lastLoad = $info;
- $info = $this->_CPULoad();
- }
-
- $last = $this->_lastLoad;
- $this->_lastLoad = $info;
-
- $d_user = $info[0] - $last[0];
- $d_nice = $info[1] - $last[1];
- $d_system = $info[2] - $last[2];
- $d_idle = $info[3] - $last[3];
-
- //printf("Delta - User: %f Nice: %f System: %f Idle: %f<br>",$d_user,$d_nice,$d_system,$d_idle);
-
- if (strncmp(PHP_OS,'WIN',3)==0) {
- if ($d_idle < 1) $d_idle = 1;
- return 100*(1-$d_user/$d_idle);
- }else {
- $total=$d_user+$d_nice+$d_system+$d_idle;
- if ($total<1) $total=1;
- return 100*($d_user+$d_nice+$d_system)/$total;
- }
- }
-
- function Tracer($sql)
- {
- $perf_table = adodb_perf::table();
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
-
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $sqlq = $this->conn->qstr($sql);
- $arr = $this->conn->GetArray(
-"select count(*),tracer
- from $perf_table where sql1=$sqlq
- group by tracer
- order by 1 desc");
- $s = '';
- if ($arr) {
- $s .= '<h3>Scripts Affected</h3>';
- foreach($arr as $k) {
- $s .= sprintf("%4d",$k[0]).' &nbsp; '.strip_tags($k[1]).'<br>';
- }
- }
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_CACHE_MODE = $save;
- $this->conn->fnExecute = $saveE;
- return $s;
- }
-
- /*
- Explain Plan for $sql.
- If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the
- actual sql.
- */
- function Explain($sql,$partial=false)
- {
- return false;
- }
-
- function InvalidSQL($numsql = 10)
- {
-
- if (isset($_GET['sql'])) return;
- $s = '<h3>Invalid SQL</h3>';
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
- $perf_table = adodb_perf::table();
- $rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql);
- $this->conn->fnExecute = $saveE;
- if ($rs) {
- $s .= rs2html($rs,false,false,false,false);
- } else
- return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
-
- return $s;
- }
-
-
- /*
- This script identifies the longest running SQL
- */
- function _SuspiciousSQL($numsql = 10)
- {
- global $ADODB_FETCH_MODE;
-
- $perf_table = adodb_perf::table();
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
-
- if (isset($_GET['exps']) && isset($_GET['sql'])) {
- $partial = !empty($_GET['part']);
- echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
- }
-
- if (isset($_GET['sql'])) return;
- $sql1 = $this->sql1;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
- //$this->conn->debug=1;
- $rs =& $this->conn->SelectLimit(
- "select avg(timer) as avg_timer,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
- from $perf_table
- where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
- and (tracer is null or tracer not like 'ERROR:%')
- group by sql1
- order by 1 desc",$numsql);
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- $this->conn->fnExecute = $saveE;
-
- if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
- $s = "<h3>Suspicious SQL</h3>
-<font size=1>The following SQL have high average execution times</font><br>
-<table border=1 bgcolor=white><tr><td><b>Avg Time</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
- $max = $this->maxLength;
- while (!$rs->EOF) {
- $sql = $rs->fields[1];
- $raw = urlencode($sql);
- if (strlen($raw)>$max-100) {
- $sql2 = substr($sql,0,$max-500);
- $raw = urlencode($sql2).'&part='.crc32($sql);
- }
- $prefix = "<a target=sql".rand()." href=\"?hidem=1&exps=1&sql=".$raw."&x#explain\">";
- $suffix = "</a>";
- if ($this->explain == false || strlen($prefix)>$max) {
- $suffix = ' ... <i>String too long for GET parameter: '.strlen($prefix).'</i>';
- $prefix = '';
- }
- $s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
- "<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>";
- $rs->MoveNext();
- }
- return $s."</table>";
-
- }
-
- function CheckMemory()
- {
- return '';
- }
-
-
- function SuspiciousSQL($numsql=10)
- {
- return adodb_perf::_SuspiciousSQL($numsql);
- }
-
- function ExpensiveSQL($numsql=10)
- {
- return adodb_perf::_ExpensiveSQL($numsql);
- }
-
-
- /*
- This reports the percentage of load on the instance due to the most
- expensive few SQL statements. Tuning these statements can often
- make huge improvements in overall system performance.
- */
- function _ExpensiveSQL($numsql = 10)
- {
- global $ADODB_FETCH_MODE;
-
- $perf_table = adodb_perf::table();
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
-
- if (isset($_GET['expe']) && isset($_GET['sql'])) {
- $partial = !empty($_GET['part']);
- echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
- }
-
- if (isset($_GET['sql'])) return;
-
- $sql1 = $this->sql1;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs =& $this->conn->SelectLimit(
- "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
- from $perf_table
- where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
- and (tracer is null or tracer not like 'ERROR:%')
- group by sql1
- having count(*)>1
- order by 1 desc",$numsql);
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $this->conn->fnExecute = $saveE;
- $ADODB_FETCH_MODE = $save;
- if (!$rs) return "<p>$this->helpurl. ".$this->conn->ErrorMsg()."</p>";
- $s = "<h3>Expensive SQL</h3>
-<font size=1>Tuning the following SQL could reduce the server load substantially</font><br>
-<table border=1 bgcolor=white><tr><td><b>Load</b><td><b>Count</b><td><b>SQL</b><td><b>Max</b><td><b>Min</b></tr>\n";
- $max = $this->maxLength;
- while (!$rs->EOF) {
- $sql = $rs->fields[1];
- $raw = urlencode($sql);
- if (strlen($raw)>$max-100) {
- $sql2 = substr($sql,0,$max-500);
- $raw = urlencode($sql2).'&part='.crc32($sql);
- }
- $prefix = "<a target=sqle".rand()." href=\"?hidem=1&expe=1&sql=".$raw."&x#explain\">";
- $suffix = "</a>";
- if($this->explain == false || strlen($prefix>$max)) {
- $prefix = '';
- $suffix = '';
- }
- $s .= "<tr><td>".adodb_round($rs->fields[0],6)."<td align=right>".$rs->fields[2]."<td><font size=-1>".$prefix.htmlspecialchars($sql).$suffix."</font>".
- "<td>".$rs->fields[3]."<td>".$rs->fields[4]."</tr>";
- $rs->MoveNext();
- }
- return $s."</table>";
- }
-
- /*
- Raw function to return parameter value from $settings.
- */
- function DBParameter($param)
- {
- if (empty($this->settings[$param])) return false;
- $sql = $this->settings[$param][1];
- return $this->_DBParameter($sql);
- }
-
- /*
- Raw function returning array of poll paramters
- */
- function &PollParameters()
- {
- $arr[0] = (float)$this->DBParameter('data cache hit ratio');
- $arr[1] = (float)$this->DBParameter('data reads');
- $arr[2] = (float)$this->DBParameter('data writes');
- $arr[3] = (integer) $this->DBParameter('current connections');
- return $arr;
- }
-
- /*
- Low-level Get Database Parameter
- */
- function _DBParameter($sql)
- {
- $savelog = $this->conn->LogSQL(false);
- if (is_array($sql)) {
- global $ADODB_FETCH_MODE;
-
- $sql1 = $sql[0];
- $key = $sql[1];
- if (sizeof($sql)>2) $pos = $sql[2];
- else $pos = 1;
- if (sizeof($sql)>3) $coef = $sql[3];
- else $coef = false;
- $ret = false;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs = $this->conn->Execute($sql1);
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- if ($rs) {
- while (!$rs->EOF) {
- $keyf = reset($rs->fields);
- if (trim($keyf) == $key) {
- $ret = $rs->fields[$pos];
- if ($coef) $ret *= $coef;
- break;
- }
- $rs->MoveNext();
- }
- $rs->Close();
- }
- $this->conn->LogSQL($savelog);
- return $ret;
- } else {
- if (strncmp($sql,'=',1) == 0) {
- $fn = substr($sql,1);
- return $this->$fn();
- }
- $sql = str_replace('$DATABASE',$this->conn->database,$sql);
- $ret = $this->conn->GetOne($sql);
- $this->conn->LogSQL($savelog);
-
- return $ret;
- }
- }
-
- /*
- Warn if cache ratio falls below threshold. Displayed in "Description" column.
- */
- function WarnCacheRatio($val)
- {
- if ($val < $this->warnRatio)
- return '<font color=red><b>Cache ratio should be at least '.$this->warnRatio.'%</b></font>';
- else return '';
- }
-
- /***********************************************************************************************/
- // HIGH LEVEL UI FUNCTIONS
- /***********************************************************************************************/
-
-
- function UI($pollsecs=5)
- {
-
- $perf_table = adodb_perf::table();
- $conn = $this->conn;
-
- $app = $conn->host;
- if ($conn->host && $conn->database) $app .= ', db=';
- $app .= $conn->database;
-
- if ($app) $app .= ', ';
- $savelog = $this->conn->LogSQL(false);
- $info = $conn->ServerInfo();
- if (isset($_GET['clearsql'])) {
- $this->conn->Execute("delete from $perf_table");
- }
- $this->conn->LogSQL($savelog);
-
- // magic quotes
-
- if (isset($_GET['sql']) && get_magic_quotes_gpc()) {
- $_GET['sql'] = $_GET['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$_GET['sql']);
- }
-
- if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10;
- else $nsql = $_SESSION['ADODB_PERF_SQL'];
-
- $app .= $info['description'];
-
-
- if (isset($_GET['do'])) $do = $_GET['do'];
- else if (isset($_POST['do'])) $do = $_POST['do'];
- else if (isset($_GET['sql'])) $do = 'viewsql';
- else $do = 'stats';
-
- if (isset($_GET['nsql'])) {
- if ($_GET['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $_GET['nsql'];
- }
- echo "<title>ADOdb Performance Monitor on $app</title><body bgcolor=white>";
- if ($do == 'viewsql') $form = "<td><form># SQL:<input type=hidden value=viewsql name=do> <input type=text size=4 name=nsql value=$nsql><input type=submit value=Go></td></form>";
- else $form = "<td>&nbsp;</td>";
-
- $allowsql = !defined('ADODB_PERF_NO_RUN_SQL');
-
- if (empty($_GET['hidem']))
- echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2>
- <b><a href=http://adodb.sourceforge.net/?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td>
- <a href=?do=stats><b>Performance Stats</b></a> &nbsp; <a href=?do=viewsql><b>View SQL</b></a>
- &nbsp; <a href=?do=tables><b>View Tables</b></a> &nbsp; <a href=?do=poll><b>Poll Stats</b></a>",
- $allowsql ? ' &nbsp; <a href=?do=dosql><b>Run SQL</b></a>' : '',
- "$form",
- "</tr></table>";
-
-
- switch ($do) {
- default:
- case 'stats':
- echo $this->HealthCheck();
- //$this->conn->debug=1;
- echo $this->CheckMemory();
- break;
- case 'poll':
- echo "<iframe width=720 height=80%
- src=\"{$_SERVER['PHP_SELF']}?do=poll2&hidem=1\"></iframe>";
- break;
- case 'poll2':
- echo "<pre>";
- $this->Poll($pollsecs);
- break;
-
- case 'dosql':
- if (!$allowsql) break;
-
- $this->DoSQLForm();
- break;
- case 'viewsql':
- if (empty($_GET['hidem']))
- echo "&nbsp; <a href=\"?do=viewsql&clearsql=1\">Clear SQL Log</a><br>";
- echo($this->SuspiciousSQL($nsql));
- echo($this->ExpensiveSQL($nsql));
- echo($this->InvalidSQL($nsql));
- break;
- case 'tables':
- echo $this->Tables(); break;
- }
- global $ADODB_vers;
- echo "<p><div align=center><font size=1>$ADODB_vers Sponsored by <a href=http://phplens.com/>phpLens</a></font></div>";
- }
-
- /*
- Runs in infinite loop, returning real-time statistics
- */
- function Poll($secs=5)
- {
- $this->conn->fnExecute = false;
- //$this->conn->debug=1;
- if ($secs <= 1) $secs = 1;
- echo "Accumulating statistics, every $secs seconds...\n";flush();
- $arro =& $this->PollParameters();
- $cnt = 0;
- set_time_limit(0);
- sleep($secs);
- while (1) {
-
- $arr =& $this->PollParameters();
-
- $hits = sprintf('%2.2f',$arr[0]);
- $reads = sprintf('%12.4f',($arr[1]-$arro[1])/$secs);
- $writes = sprintf('%12.4f',($arr[2]-$arro[2])/$secs);
- $sess = sprintf('%5d',$arr[3]);
-
- $load = $this->CPULoad();
- if ($load !== false) {
- $oslabel = 'WS-CPU%';
- $osval = sprintf(" %2.1f ",(float) $load);
- }else {
- $oslabel = '';
- $osval = '';
- }
- if ($cnt % 10 == 0) echo " Time ".$oslabel." Hit% Sess Reads/s Writes/s\n";
- $cnt += 1;
- echo date('H:i:s').' '.$osval."$hits $sess $reads $writes\n";
- flush();
-
- if (connection_aborted()) return;
-
- sleep($secs);
- $arro = $arr;
- }
- }
-
- /*
- Returns basic health check in a command line interface
- */
- function HealthCheckCLI()
- {
- return $this->HealthCheck(true);
- }
-
-
- /*
- Returns basic health check as HTML
- */
- function HealthCheck($cli=false)
- {
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
- if ($cli) $html = '';
- else $html = $this->table.'<tr><td colspan=3><h3>'.$this->conn->databaseType.'</h3></td></tr>'.$this->titles;
-
- $oldc = false;
- $bgc = '';
- foreach($this->settings as $name => $arr) {
- if ($arr === false) break;
-
- if (!is_string($name)) {
- if ($cli) $html .= " -- $arr -- \n";
- else $html .= "<tr bgcolor=$this->color><td colspan=3><i>$arr</i> &nbsp;</td></tr>";
- continue;
- }
-
- if (!is_array($arr)) break;
- $category = $arr[0];
- $how = $arr[1];
- if (sizeof($arr)>2) $desc = $arr[2];
- else $desc = ' &nbsp; ';
-
-
- if ($category == 'HIDE') continue;
-
- $val = $this->_DBParameter($how);
-
- if ($desc && strncmp($desc,"=",1) === 0) {
- $fn = substr($desc,1);
- $desc = $this->$fn($val);
- }
-
- if ($val === false) {
- $m = $this->conn->ErrorMsg();
- $val = "Error: $m";
- } else {
- if (is_numeric($val) && $val >= 256*1024) {
- if ($val % (1024*1024) == 0) {
- $val /= (1024*1024);
- $val .= 'M';
- } else if ($val % 1024 == 0) {
- $val /= 1024;
- $val .= 'K';
- }
- //$val = htmlspecialchars($val);
- }
- }
- if ($category != $oldc) {
- $oldc = $category;
- //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color;
- }
- if (strlen($desc)==0) $desc = '&nbsp;';
- if (strlen($val)==0) $val = '&nbsp;';
- if ($cli) {
- $html .= str_replace('&nbsp;','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc)));
-
- }else {
- $html .= "<tr$bgc><td>".$name.'</td><td>'.$val.'</td><td>'.$desc."</td></tr>\n";
- }
- }
-
- if (!$cli) $html .= "</table>\n";
- $this->conn->fnExecute = $saveE;
-
- return $html;
- }
-
- function Tables($orderby='1')
- {
- if (!$this->tablesSQL) return false;
-
- $savelog = $this->conn->LogSQL(false);
- $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby);
- $this->conn->LogSQL($savelog);
- $html = rs2html($rs,false,false,false,false);
- return $html;
- }
-
-
- function CreateLogTable()
- {
- if (!$this->createTableSQL) return false;
-
- $table = $this->table();
- $sql = str_replace('adodb_logsql',$table,$this->createTableSQL);
- $savelog = $this->conn->LogSQL(false);
- $ok = $this->conn->Execute($sql);
- $this->conn->LogSQL($savelog);
- return ($ok) ? true : false;
- }
-
- function DoSQLForm()
- {
-
-
- $PHP_SELF = $_SERVER['PHP_SELF'];
- $sql = isset($_REQUEST['sql']) ? $_REQUEST['sql'] : '';
-
- if (isset($_SESSION['phplens_sqlrows'])) $rows = $_SESSION['phplens_sqlrows'];
- else $rows = 3;
-
- if (isset($_REQUEST['SMALLER'])) {
- $rows /= 2;
- if ($rows < 3) $rows = 3;
- $_SESSION['phplens_sqlrows'] = $rows;
- }
- if (isset($_REQUEST['BIGGER'])) {
- $rows *= 2;
- $_SESSION['phplens_sqlrows'] = $rows;
- }
-
-?>
-
-<form method="POST" action="<?php echo $PHP_SELF ?>">
-<table><tr>
-<td> Form size: <input type="submit" value=" &lt; " name="SMALLER"><input type="submit" value=" &gt; &gt; " name="BIGGER">
-</td>
-<td align=right>
-<input type="submit" value=" Run SQL Below " name="RUN"><input type=hidden name=do value=dosql>
-</td></tr>
- <tr>
- <td colspan=2><textarea rows=<?php print $rows; ?> name="sql" cols="80"><?php print htmlspecialchars($sql) ?></textarea>
- </td>
- </tr>
- </table>
-</form>
-
-<?php
- if (!isset($_REQUEST['sql'])) return;
-
- $sql = $this->undomq(trim($sql));
- if (substr($sql,strlen($sql)-1) === ';') {
- $print = true;
- $sqla = $this->SplitSQL($sql);
- } else {
- $print = false;
- $sqla = array($sql);
- }
- foreach($sqla as $sqls) {
-
- if (!$sqls) continue;
-
- if ($print) {
- print "<p>".htmlspecialchars($sqls)."</p>";
- flush();
- }
- $savelog = $this->conn->LogSQL(false);
- $rs = $this->conn->Execute($sqls);
- $this->conn->LogSQL($savelog);
- if ($rs && is_object($rs) && !$rs->EOF) {
- rs2html($rs);
- while ($rs->NextRecordSet()) {
- print "<table width=98% bgcolor=#C0C0FF><tr><td>&nbsp;</td></tr></table>";
- rs2html($rs);
- }
- } else {
- $e1 = (integer) $this->conn->ErrorNo();
- $e2 = $this->conn->ErrorMsg();
- if (($e1) || ($e2)) {
- if (empty($e1)) $e1 = '-1'; // postgresql fix
- print ' &nbsp; '.$e1.': '.$e2;
- } else {
- print "<p>No Recordset returned<br></p>";
- }
- }
- } // foreach
- }
-
- function SplitSQL($sql)
- {
- $arr = explode(';',$sql);
- return $arr;
- }
-
- function undomq($m)
- {
- if (get_magic_quotes_gpc()) {
- // undo the damage
- $m = str_replace('\\\\','\\',$m);
- $m = str_replace('\"','"',$m);
- $m = str_replace('\\\'','\'',$m);
- }
- return $m;
-}
-
-
- /************************************************************************/
-
- /**
- * Reorganise multiple table-indices/statistics/..
- * OptimizeMode could be given by last Parameter
- *
- * @example
- * <pre>
- * optimizeTables( 'tableA');
- * </pre>
- * <pre>
- * optimizeTables( 'tableA', 'tableB', 'tableC');
- * </pre>
- * <pre>
- * optimizeTables( 'tableA', 'tableB', ADODB_OPT_LOW);
- * </pre>
- *
- * @param string table name of the table to optimize
- * @param int mode optimization-mode
- * <code>ADODB_OPT_HIGH</code> for full optimization
- * <code>ADODB_OPT_LOW</code> for CPU-less optimization
- * Default is LOW <code>ADODB_OPT_LOW</code>
- * @author Markus Staab
- * @return Returns <code>true</code> on success and <code>false</code> on error
- */
- function OptimizeTables()
- {
- $args = func_get_args();
- $numArgs = func_num_args();
-
- if ( $numArgs == 0) return false;
-
- $mode = ADODB_OPT_LOW;
- $lastArg = $args[ $numArgs - 1];
- if ( !is_string($lastArg)) {
- $mode = $lastArg;
- unset( $args[ $numArgs - 1]);
- }
-
- foreach( $args as $table) {
- $this->optimizeTable( $table, $mode);
- }
- }
-
- /**
- * Reorganise the table-indices/statistics/.. depending on the given mode.
- * Default Implementation throws an error.
- *
- * @param string table name of the table to optimize
- * @param int mode optimization-mode
- * <code>ADODB_OPT_HIGH</code> for full optimization
- * <code>ADODB_OPT_LOW</code> for CPU-less optimization
- * Default is LOW <code>ADODB_OPT_LOW</code>
- * @author Markus Staab
- * @return Returns <code>true</code> on success and <code>false</code> on error
- */
- function OptimizeTable( $table, $mode = ADODB_OPT_LOW)
- {
- ADOConnection::outp( sprintf( "<p>%s: '%s' not implemented for driver '%s'</p>", __CLASS__, __FUNCTION__, $this->conn->databaseType));
- return false;
- }
-
- /**
- * Reorganise current database.
- * Default implementation loops over all <code>MetaTables()</code> and
- * optimize each using <code>optmizeTable()</code>
- *
- * @author Markus Staab
- * @return Returns <code>true</code> on success and <code>false</code> on error
- */
- function optimizeDatabase()
- {
- $conn = $this->conn;
- if ( !$conn) return false;
-
- $tables = $conn->MetaTables( 'TABLES');
- if ( !$tables ) return false;
-
- foreach( $tables as $table) {
- if ( !$this->optimizeTable( $table)) {
- return false;
- }
- }
-
- return true;
- }
- // end hack
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-php4.inc.php b/lib/adodb/adodb-php4.inc.php
deleted file mode 100644
index 99fda17..0000000
--- a/lib/adodb/adodb-php4.inc.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-/*
- V4.94 23 Jan 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.
-*/
-
-
-class ADODB_BASE_RS {
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-time.inc.php b/lib/adodb/adodb-time.inc.php
deleted file mode 100644
index 51f69f7..0000000
--- a/lib/adodb/adodb-time.inc.php
+++ /dev/null
@@ -1,1337 +0,0 @@
-<?php
-/**
-ADOdb Date Library, part of the ADOdb abstraction library
-Download: http://phplens.com/phpeverywhere/
-
-PHP native date functions use integer timestamps for computations.
-Because of this, dates are restricted to the years 1901-2038 on Unix
-and 1970-2038 on Windows due to integer overflow for dates beyond
-those years. This library overcomes these limitations by replacing the
-native function's signed integers (normally 32-bits) with PHP floating
-point numbers (normally 64-bits).
-
-Dates from 100 A.D. to 3000 A.D. and later
-have been tested. The minimum is 100 A.D. as <100 will invoke the
-2 => 4 digit year conversion. The maximum is billions of years in the
-future, but this is a theoretical limit as the computation of that year
-would take too long with the current implementation of adodb_mktime().
-
-This library replaces native functions as follows:
-
-<pre>
- getdate() with adodb_getdate()
- date() with adodb_date()
- gmdate() with adodb_gmdate()
- mktime() with adodb_mktime()
- gmmktime() with adodb_gmmktime()
- strftime() with adodb_strftime()
- strftime() with adodb_gmstrftime()
-</pre>
-
-The parameters are identical, except that adodb_date() accepts a subset
-of date()'s field formats. Mktime() will convert from local time to GMT,
-and date() will convert from GMT to local time, but daylight savings is
-not handled currently.
-
-This library is independant of the rest of ADOdb, and can be used
-as standalone code.
-
-PERFORMANCE
-
-For high speed, this library uses the native date functions where
-possible, and only switches to PHP code when the dates fall outside
-the 32-bit signed integer range.
-
-GREGORIAN CORRECTION
-
-Pope Gregory shortened October of A.D. 1582 by ten days. Thursday,
-October 4, 1582 (Julian) was followed immediately by Friday, October 15,
-1582 (Gregorian).
-
-Since 0.06, we handle this correctly, so:
-
-adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582)
- == 24 * 3600 (1 day)
-
-=============================================================================
-
-COPYRIGHT
-
-(c) 2003-2005 John Lim and released under BSD-style license except for code by
-jackbbs, which includes adodb_mktime, adodb_get_gmt_diff, adodb_is_leap_year
-and originally found at http://www.php.net/manual/en/function.mktime.php
-
-=============================================================================
-
-BUG REPORTS
-
-These should be posted to the ADOdb forums at
-
- http://phplens.com/lens/lensforum/topics.php?id=4
-
-=============================================================================
-
-FUNCTION DESCRIPTIONS
-
-
-** FUNCTION adodb_getdate($date=false)
-
-Returns an array containing date information, as getdate(), but supports
-dates greater than 1901 to 2038. The local date/time format is derived from a
-heuristic the first time adodb_getdate is called.
-
-
-** FUNCTION adodb_date($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted local date. If $timestamp is not defined, the
-current timestamp is used. Unlike the function date(), it supports dates
-outside the 1901 to 2038 range.
-
-The format fields that adodb_date supports:
-
-<pre>
- a - "am" or "pm"
- A - "AM" or "PM"
- d - day of the month, 2 digits with leading zeros; i.e. "01" to "31"
- D - day of the week, textual, 3 letters; e.g. "Fri"
- F - month, textual, long; e.g. "January"
- g - hour, 12-hour format without leading zeros; i.e. "1" to "12"
- G - hour, 24-hour format without leading zeros; i.e. "0" to "23"
- h - hour, 12-hour format; i.e. "01" to "12"
- H - hour, 24-hour format; i.e. "00" to "23"
- i - minutes; i.e. "00" to "59"
- j - day of the month without leading zeros; i.e. "1" to "31"
- l (lowercase 'L') - day of the week, textual, long; e.g. "Friday"
- L - boolean for whether it is a leap year; i.e. "0" or "1"
- m - month; i.e. "01" to "12"
- M - month, textual, 3 letters; e.g. "Jan"
- n - month without leading zeros; i.e. "1" to "12"
- O - Difference to Greenwich time in hours; e.g. "+0200"
- Q - Quarter, as in 1, 2, 3, 4
- r - RFC 2822 formatted date; e.g. "Thu, 21 Dec 2000 16:01:07 +0200"
- s - seconds; i.e. "00" to "59"
- S - English ordinal suffix for the day of the month, 2 characters;
- i.e. "st", "nd", "rd" or "th"
- t - number of days in the given month; i.e. "28" to "31"
- T - Timezone setting of this machine; e.g. "EST" or "MDT"
- U - seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
- w - day of the week, numeric, i.e. "0" (Sunday) to "6" (Saturday)
- Y - year, 4 digits; e.g. "1999"
- y - year, 2 digits; e.g. "99"
- z - day of the year; i.e. "0" to "365"
- Z - timezone offset in seconds (i.e. "-43200" to "43200").
- The offset for timezones west of UTC is always negative,
- and for those east of UTC is always positive.
-</pre>
-
-Unsupported:
-<pre>
- B - Swatch Internet time
- I (capital i) - "1" if Daylight Savings Time, "0" otherwise.
- W - ISO-8601 week number of year, weeks starting on Monday
-
-</pre>
-
-
-** FUNCTION adodb_date2($fmt, $isoDateString = false)
-Same as adodb_date, but 2nd parameter accepts iso date, eg.
-
- adodb_date2('d-M-Y H:i','2003-12-25 13:01:34');
-
-
-** FUNCTION adodb_gmdate($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted GMT date. If $timestamp is not defined, the
-current timestamp is used. Unlike the function date(), it supports dates
-outside the 1901 to 2038 range.
-
-
-** FUNCTION adodb_mktime($hr, $min, $sec[, $month, $day, $year])
-
-Converts a local date to a unix timestamp. Unlike the function mktime(), it supports
-dates outside the 1901 to 2038 range. All parameters are optional.
-
-
-** FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year])
-
-Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports
-dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters
-are currently compulsory.
-
-** FUNCTION adodb_gmstrftime($fmt, $timestamp = false)
-Convert a timestamp to a formatted GMT date.
-
-** FUNCTION adodb_strftime($fmt, $timestamp = false)
-
-Convert a timestamp to a formatted local date. Internally converts $fmt into
-adodb_date format, then echo result.
-
-For best results, you can define the local date format yourself. Define a global
-variable $ADODB_DATE_LOCALE which is an array, 1st element is date format using
-adodb_date syntax, and 2nd element is the time format, also in adodb_date syntax.
-
- eg. $ADODB_DATE_LOCALE = array('d/m/Y','H:i:s');
-
- Supported format codes:
-
-<pre>
- %a - abbreviated weekday name according to the current locale
- %A - full weekday name according to the current locale
- %b - abbreviated month name according to the current locale
- %B - full month name according to the current locale
- %c - preferred date and time representation for the current locale
- %d - day of the month as a decimal number (range 01 to 31)
- %D - same as %m/%d/%y
- %e - day of the month as a decimal number, a single digit is preceded by a space (range ' 1' to '31')
- %h - same as %b
- %H - hour as a decimal number using a 24-hour clock (range 00 to 23)
- %I - hour as a decimal number using a 12-hour clock (range 01 to 12)
- %m - month as a decimal number (range 01 to 12)
- %M - minute as a decimal number
- %n - newline character
- %p - either `am' or `pm' according to the given time value, or the corresponding strings for the current locale
- %r - time in a.m. and p.m. notation
- %R - time in 24 hour notation
- %S - second as a decimal number
- %t - tab character
- %T - current time, equal to %H:%M:%S
- %x - preferred date representation for the current locale without the time
- %X - preferred time representation for the current locale without the date
- %y - year as a decimal number without a century (range 00 to 99)
- %Y - year as a decimal number including the century
- %Z - time zone or name or abbreviation
- %% - a literal `%' character
-</pre>
-
- Unsupported codes:
-<pre>
- %C - century number (the year divided by 100 and truncated to an integer, range 00 to 99)
- %g - like %G, but without the century.
- %G - The 4-digit year corresponding to the ISO week number (see %V).
- This has the same format and value as %Y, except that if the ISO week number belongs
- to the previous or next year, that year is used instead.
- %j - day of the year as a decimal number (range 001 to 366)
- %u - weekday as a decimal number [1,7], with 1 representing Monday
- %U - week number of the current year as a decimal number, starting
- with the first Sunday as the first day of the first week
- %V - The ISO 8601:1988 week number of the current year as a decimal number,
- range 01 to 53, where week 1 is the first week that has at least 4 days in the
- current year, and with Monday as the first day of the week. (Use %G or %g for
- the year component that corresponds to the week number for the specified timestamp.)
- %w - day of the week as a decimal, Sunday being 0
- %W - week number of the current year as a decimal number, starting with the
- first Monday as the first day of the first week
-</pre>
-
-=============================================================================
-
-NOTES
-
-Useful url for generating test timestamps:
- http://www.4webhelp.net/us/timestamp.php
-
-Possible future optimizations include
-
-a. Using an algorithm similar to Plauger's in "The Standard C Library"
-(page 428, xttotm.c _Ttotm() function). Plauger's algorithm will not
-work outside 32-bit signed range, so i decided not to implement it.
-
-b. Implement daylight savings, which looks awfully complicated, see
- http://webexhibits.org/daylightsaving/
-
-
-CHANGELOG
-- 19 March 2006 0.24
-Changed strftime() locale detection, because some locales prepend the day of week to the date when %c is used.
-
-- 10 Feb 2006 0.23
-PHP5 compat: when we detect PHP5, the RFC2822 format for gmt 0000hrs is changed from -0000 to +0000.
- In PHP4, we will still use -0000 for 100% compat with PHP4.
-
-- 08 Sept 2005 0.22
-In adodb_date2(), $is_gmt not supported properly. Fixed.
-
-- 18 July 2005 0.21
-In PHP 4.3.11, the 'r' format has changed. Leading 0 in day is added. Changed for compat.
-Added support for negative months in adodb_mktime().
-
-- 24 Feb 2005 0.20
-Added limited strftime/gmstrftime support. x10 improvement in performance of adodb_date().
-
-- 21 Dec 2004 0.17
-In adodb_getdate(), the timestamp was accidentally converted to gmt when $is_gmt is false.
-Also adodb_mktime(0,0,0) did not work properly. Both fixed thx Mauro.
-
-- 17 Nov 2004 0.16
-Removed intval typecast in adodb_mktime() for secs, allowing:
- adodb_mktime(0,0,0 + 2236672153,1,1,1934);
-Suggested by Ryan.
-
-- 18 July 2004 0.15
-All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory.
-This brings it more in line with mktime (still not identical).
-
-- 23 June 2004 0.14
-
-Allow you to define your own daylights savings function, adodb_daylight_sv.
-If the function is defined (somewhere in an include), then you can correct for daylights savings.
-
-In this example, we apply daylights savings in June or July, adding one hour. This is extremely
-unrealistic as it does not take into account time-zone, geographic location, current year.
-
-function adodb_daylight_sv(&$arr, $is_gmt)
-{
- if ($is_gmt) return;
- $m = $arr['mon'];
- if ($m == 6 || $m == 7) $arr['hours'] += 1;
-}
-
-This is only called by adodb_date() and not by adodb_mktime().
-
-The format of $arr is
-Array (
- [seconds] => 0
- [minutes] => 0
- [hours] => 0
- [mday] => 1 # day of month, eg 1st day of the month
- [mon] => 2 # month (eg. Feb)
- [year] => 2102
- [yday] => 31 # days in current year
- [leap] => # true if leap year
- [ndays] => 28 # no of days in current month
- )
-
-
-- 28 Apr 2004 0.13
-Fixed adodb_date to properly support $is_gmt. Thx to Dimitar Angelov.
-
-- 20 Mar 2004 0.12
-Fixed month calculation error in adodb_date. 2102-June-01 appeared as 2102-May-32.
-
-- 26 Oct 2003 0.11
-Because of daylight savings problems (some systems apply daylight savings to
-January!!!), changed adodb_get_gmt_diff() to ignore daylight savings.
-
-- 9 Aug 2003 0.10
-Fixed bug with dates after 2038.
-See http://phplens.com/lens/lensforum/msgs.php?id=6980
-
-- 1 July 2003 0.09
-Added support for Q (Quarter).
-Added adodb_date2(), which accepts ISO date in 2nd param
-
-- 3 March 2003 0.08
-Added support for 'S' adodb_date() format char. Added constant ADODB_ALLOW_NEGATIVE_TS
-if you want PHP to handle negative timestamps between 1901 to 1969.
-
-- 27 Feb 2003 0.07
-All negative numbers handled by adodb now because of RH 7.3+ problems.
-See http://bugs.php.net/bug.php?id=20048&edit=2
-
-- 4 Feb 2003 0.06
-Fixed a typo, 1852 changed to 1582! This means that pre-1852 dates
-are now correctly handled.
-
-- 29 Jan 2003 0.05
-
-Leap year checking differs under Julian calendar (pre 1582). Also
-leap year code optimized by checking for most common case first.
-
-We also handle month overflow correctly in mktime (eg month set to 13).
-
-Day overflow for less than one month's days is supported.
-
-- 28 Jan 2003 0.04
-
-Gregorian correction handled. In PHP5, we might throw an error if
-mktime uses invalid dates around 5-14 Oct 1582. Released with ADOdb 3.10.
-Added limbo 5-14 Oct 1582 check, when we set to 15 Oct 1582.
-
-- 27 Jan 2003 0.03
-
-Fixed some more month problems due to gmt issues. Added constant ADODB_DATE_VERSION.
-Fixed calculation of days since start of year for <1970.
-
-- 27 Jan 2003 0.02
-
-Changed _adodb_getdate() to inline leap year checking for better performance.
-Fixed problem with time-zones west of GMT +0000.
-
-- 24 Jan 2003 0.01
-
-First implementation.
-*/
-
-
-/* Initialization */
-
-/*
- Version Number
-*/
-define('ADODB_DATE_VERSION',0.24);
-
-/*
- This code was originally for windows. But apparently this problem happens
- also with Linux, RH 7.3 and later!
-
- glibc-2.2.5-34 and greater has been changed to return -1 for dates <
- 1970. This used to work. The problem exists with RedHat 7.3 and 8.0
- echo (mktime(0, 0, 0, 1, 1, 1960)); // prints -1
-
- References:
- http://bugs.php.net/bug.php?id=20048&edit=2
- http://lists.debian.org/debian-glibc/2002/debian-glibc-200205/msg00010.html
-*/
-
-if (!defined('ADODB_ALLOW_NEGATIVE_TS')) define('ADODB_NO_NEGATIVE_TS',1);
-
-function adodb_date_test_date($y1,$m,$d=13)
-{
- $t = adodb_mktime(0,0,0,$m,$d,$y1);
- $rez = adodb_date('Y-n-j H:i:s',$t);
- if ("$y1-$m-$d 00:00:00" != $rez) {
- print "<b>$y1 error, expected=$y1-$m-$d 00:00:00, adodb=$rez</b><br>";
- return false;
- }
- return true;
-}
-
-function adodb_date_test_strftime($fmt)
-{
- $s1 = strftime($fmt);
- $s2 = adodb_strftime($fmt);
-
- if ($s1 == $s2) return true;
-
- echo "error for $fmt, strftime=$s1, $adodb=$s2<br>";
- return false;
-}
-
-/**
- Test Suite
-*/
-function adodb_date_test()
-{
-
- error_reporting(E_ALL);
- print "<h4>Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION.' PHP='.PHP_VERSION."</h4>";
- @set_time_limit(0);
- $fail = false;
-
- // This flag disables calling of PHP native functions, so we can properly test the code
- if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1);
-
- adodb_date_test_strftime('%Y %m %x %X');
- adodb_date_test_strftime("%A %d %B %Y");
- adodb_date_test_strftime("%H %M S");
-
- $t = adodb_mktime(0,0,0);
- if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'<br>';
-
- $t = adodb_mktime(0,0,0,6,1,2102);
- if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
-
- $t = adodb_mktime(0,0,0,2,1,2102);
- if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
-
-
- print "<p>Testing gregorian <=> julian conversion<p>";
- $t = adodb_mktime(0,0,0,10,11,1492);
- //http://www.holidayorigins.com/html/columbus_day.html - Friday check
- if (!(adodb_date('D Y-m-d',$t) == 'Fri 1492-10-11')) print 'Error in Columbus landing<br>';
-
- $t = adodb_mktime(0,0,0,2,29,1500);
- if (!(adodb_date('Y-m-d',$t) == '1500-02-29')) print 'Error in julian leap years<br>';
-
- $t = adodb_mktime(0,0,0,2,29,1700);
- if (!(adodb_date('Y-m-d',$t) == '1700-03-01')) print 'Error in gregorian leap years<br>';
-
- print adodb_mktime(0,0,0,10,4,1582).' ';
- print adodb_mktime(0,0,0,10,15,1582);
- $diff = (adodb_mktime(0,0,0,10,15,1582) - adodb_mktime(0,0,0,10,4,1582));
- if ($diff != 3600*24) print " <b>Error in gregorian correction = ".($diff/3600/24)." days </b><br>";
-
- print " 15 Oct 1582, Fri=".(adodb_dow(1582,10,15) == 5 ? 'Fri' : '<b>Error</b>')."<br>";
- print " 4 Oct 1582, Thu=".(adodb_dow(1582,10,4) == 4 ? 'Thu' : '<b>Error</b>')."<br>";
-
- print "<p>Testing overflow<p>";
-
- $t = adodb_mktime(0,0,0,3,33,1965);
- if (!(adodb_date('Y-m-d',$t) == '1965-04-02')) print 'Error in day overflow 1 <br>';
- $t = adodb_mktime(0,0,0,4,33,1971);
- if (!(adodb_date('Y-m-d',$t) == '1971-05-03')) print 'Error in day overflow 2 <br>';
- $t = adodb_mktime(0,0,0,1,60,1965);
- if (!(adodb_date('Y-m-d',$t) == '1965-03-01')) print 'Error in day overflow 3 '.adodb_date('Y-m-d',$t).' <br>';
- $t = adodb_mktime(0,0,0,12,32,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-01-01')) print 'Error in day overflow 4 '.adodb_date('Y-m-d',$t).' <br>';
- $t = adodb_mktime(0,0,0,12,63,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-02-01')) print 'Error in day overflow 5 '.adodb_date('Y-m-d',$t).' <br>';
- $t = adodb_mktime(0,0,0,13,3,1965);
- if (!(adodb_date('Y-m-d',$t) == '1966-01-03')) print 'Error in mth overflow 1 <br>';
-
- print "Testing 2-digit => 4-digit year conversion<p>";
- if (adodb_year_digit_check(00) != 2000) print "Err 2-digit 2000<br>";
- if (adodb_year_digit_check(10) != 2010) print "Err 2-digit 2010<br>";
- if (adodb_year_digit_check(20) != 2020) print "Err 2-digit 2020<br>";
- if (adodb_year_digit_check(30) != 2030) print "Err 2-digit 2030<br>";
- if (adodb_year_digit_check(40) != 1940) print "Err 2-digit 1940<br>";
- if (adodb_year_digit_check(50) != 1950) print "Err 2-digit 1950<br>";
- if (adodb_year_digit_check(90) != 1990) print "Err 2-digit 1990<br>";
-
- // Test string formating
- print "<p>Testing date formating</p>";
- $fmt = '\d\a\t\e T Y-m-d H:i:s a A d D F g G h H i j l L m M n O \R\F\C2822 r s t U w y Y z Z 2003';
- $s1 = date($fmt,0);
- $s2 = adodb_date($fmt,0);
- if ($s1 != $s2) {
- print " date() 0 failed<br>$s1<br>$s2<br>";
- }
- flush();
- for ($i=100; --$i > 0; ) {
-
- $ts = 3600.0*((rand()%60000)+(rand()%60000))+(rand()%60000);
- $s1 = date($fmt,$ts);
- $s2 = adodb_date($fmt,$ts);
- //print "$s1 <br>$s2 <p>";
- $pos = strcmp($s1,$s2);
-
- if (($s1) != ($s2)) {
- for ($j=0,$k=strlen($s1); $j < $k; $j++) {
- if ($s1[$j] != $s2[$j]) {
- print substr($s1,$j).' ';
- break;
- }
- }
- print "<b>Error date(): $ts<br><pre>
-&nbsp; \"$s1\" (date len=".strlen($s1).")
-&nbsp; \"$s2\" (adodb_date len=".strlen($s2).")</b></pre><br>";
- $fail = true;
- }
-
- $a1 = getdate($ts);
- $a2 = adodb_getdate($ts);
- $rez = array_diff($a1,$a2);
- if (sizeof($rez)>0) {
- print "<b>Error getdate() $ts</b><br>";
- print_r($a1);
- print "<br>";
- print_r($a2);
- print "<p>";
- $fail = true;
- }
- }
-
- // Test generation of dates outside 1901-2038
- print "<p>Testing random dates between 100 and 4000</p>";
- adodb_date_test_date(100,1);
- for ($i=100; --$i >= 0;) {
- $y1 = 100+rand(0,1970-100);
- $m = rand(1,12);
- adodb_date_test_date($y1,$m);
-
- $y1 = 3000-rand(0,3000-1970);
- adodb_date_test_date($y1,$m);
- }
- print '<p>';
- $start = 1960+rand(0,10);
- $yrs = 12;
- $i = 365.25*86400*($start-1970);
- $offset = 36000+rand(10000,60000);
- $max = 365*$yrs*86400;
- $lastyear = 0;
-
- // we generate a timestamp, convert it to a date, and convert it back to a timestamp
- // and check if the roundtrip broke the original timestamp value.
- print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
- $cnt = 0;
- for ($max += $i; $i < $max; $i += $offset) {
- $ret = adodb_date('m,d,Y,H,i,s',$i);
- $arr = explode(',',$ret);
- if ($lastyear != $arr[2]) {
- $lastyear = $arr[2];
- print " $lastyear ";
- flush();
- }
- $newi = adodb_mktime($arr[3],$arr[4],$arr[5],$arr[0],$arr[1],$arr[2]);
- if ($i != $newi) {
- print "Error at $i, adodb_mktime returned $newi ($ret)";
- $fail = true;
- break;
- }
- $cnt += 1;
- }
- echo "Tested $cnt dates<br>";
- if (!$fail) print "<p>Passed !</p>";
- else print "<p><b>Failed</b> :-(</p>";
-}
-
-/**
- Returns day of week, 0 = Sunday,... 6=Saturday.
- Algorithm from PEAR::Date_Calc
-*/
-function adodb_dow($year, $month, $day)
-{
-/*
-Pope Gregory removed 10 days - October 5 to October 14 - from the year 1582 and
-proclaimed that from that time onwards 3 days would be dropped from the calendar
-every 400 years.
-
-Thursday, October 4, 1582 (Julian) was followed immediately by Friday, October 15, 1582 (Gregorian).
-*/
- if ($year <= 1582) {
- if ($year < 1582 ||
- ($year == 1582 && ($month < 10 || ($month == 10 && $day < 15)))) $greg_correction = 3;
- else
- $greg_correction = 0;
- } else
- $greg_correction = 0;
-
- if($month > 2)
- $month -= 2;
- else {
- $month += 10;
- $year--;
- }
-
- $day = floor((13 * $month - 1) / 5) +
- $day + ($year % 100) +
- floor(($year % 100) / 4) +
- floor(($year / 100) / 4) - 2 *
- floor($year / 100) + 77 + $greg_correction;
-
- return $day - 7 * floor($day / 7);
-}
-
-
-/**
- Checks for leap year, returns true if it is. No 2-digit year check. Also
- handles julian calendar correctly.
-*/
-function _adodb_is_leap_year($year)
-{
- if ($year % 4 != 0) return false;
-
- if ($year % 400 == 0) {
- return true;
- // if gregorian calendar (>1582), century not-divisible by 400 is not leap
- } else if ($year > 1582 && $year % 100 == 0 ) {
- return false;
- }
-
- return true;
-}
-
-
-/**
- checks for leap year, returns true if it is. Has 2-digit year check
-*/
-function adodb_is_leap_year($year)
-{
- return _adodb_is_leap_year(adodb_year_digit_check($year));
-}
-
-/**
- Fix 2-digit years. Works for any century.
- Assumes that if 2-digit is more than 30 years in future, then previous century.
-*/
-function adodb_year_digit_check($y)
-{
- if ($y < 100) {
-
- $yr = (integer) date("Y");
- $century = (integer) ($yr /100);
-
- if ($yr%100 > 50) {
- $c1 = $century + 1;
- $c0 = $century;
- } else {
- $c1 = $century;
- $c0 = $century - 1;
- }
- $c1 *= 100;
- // if 2-digit year is less than 30 years in future, set it to this century
- // otherwise if more than 30 years in future, then we set 2-digit year to the prev century.
- if (($y + $c1) < $yr+30) $y = $y + $c1;
- else $y = $y + $c0*100;
- }
- return $y;
-}
-
-/**
- get local time zone offset from GMT
-*/
-function adodb_get_gmt_diff()
-{
-static $TZ;
- if (isset($TZ)) return $TZ;
-
- $TZ = mktime(0,0,0,1,2,1970,0) - gmmktime(0,0,0,1,2,1970,0);
- return $TZ;
-}
-
-/**
- Returns an array with date info.
-*/
-function adodb_getdate($d=false,$fast=false)
-{
- if ($d === false) return getdate();
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
- if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
- return @getdate($d);
- }
- }
- return _adodb_getdate($d);
-}
-
-/*
-// generate $YRS table for _adodb_getdate()
-function adodb_date_gentable($out=true)
-{
-
- for ($i=1970; $i >= 1600; $i-=10) {
- $s = adodb_gmmktime(0,0,0,1,1,$i);
- echo "$i => $s,<br>";
- }
-}
-adodb_date_gentable();
-
-for ($i=1970; $i > 1500; $i--) {
-
-echo "<hr />$i ";
- adodb_date_test_date($i,1,1);
-}
-
-*/
-
-
-$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
-$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
-function adodb_validdate($y,$m,$d)
-{
-global $_month_table_normal,$_month_table_leaf;
-
- if (_adodb_is_leap_year($y)) $marr =& $_month_table_leaf;
- else $marr =& $_month_table_normal;
-
- if ($m > 12 || $m < 1) return false;
-
- if ($d > 31 || $d < 1) return false;
-
- if ($marr[$m] < $d) return false;
-
- if ($y < 1000 && $y > 3000) return false;
-
- return true;
-}
-
-/**
- Low-level function that returns the getdate() array. We have a special
- $fast flag, which if set to true, will return fewer array values,
- and is much faster as it does not calculate dow, etc.
-*/
-function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
-{
-static $YRS;
-global $_month_table_normal,$_month_table_leaf;
-
- $d = $origd - ($is_gmt ? 0 : adodb_get_gmt_diff());
-
- $_day_power = 86400;
- $_hour_power = 3600;
- $_min_power = 60;
-
- if ($d < -12219321600) $d -= 86400*10; // if 15 Oct 1582 or earlier, gregorian correction
-
- $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
- $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
- $d366 = $_day_power * 366;
- $d365 = $_day_power * 365;
-
- if ($d < 0) {
-
- if (empty($YRS)) $YRS = array(
- 1970 => 0,
- 1960 => -315619200,
- 1950 => -631152000,
- 1940 => -946771200,
- 1930 => -1262304000,
- 1920 => -1577923200,
- 1910 => -1893456000,
- 1900 => -2208988800,
- 1890 => -2524521600,
- 1880 => -2840140800,
- 1870 => -3155673600,
- 1860 => -3471292800,
- 1850 => -3786825600,
- 1840 => -4102444800,
- 1830 => -4417977600,
- 1820 => -4733596800,
- 1810 => -5049129600,
- 1800 => -5364662400,
- 1790 => -5680195200,
- 1780 => -5995814400,
- 1770 => -6311347200,
- 1760 => -6626966400,
- 1750 => -6942499200,
- 1740 => -7258118400,
- 1730 => -7573651200,
- 1720 => -7889270400,
- 1710 => -8204803200,
- 1700 => -8520336000,
- 1690 => -8835868800,
- 1680 => -9151488000,
- 1670 => -9467020800,
- 1660 => -9782640000,
- 1650 => -10098172800,
- 1640 => -10413792000,
- 1630 => -10729324800,
- 1620 => -11044944000,
- 1610 => -11360476800,
- 1600 => -11676096000);
-
- if ($is_gmt) $origd = $d;
- // The valid range of a 32bit signed timestamp is typically from
- // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT
- //
-
- # old algorithm iterates through all years. new algorithm does it in
- # 10 year blocks
-
- /*
- # old algo
- for ($a = 1970 ; --$a >= 0;) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
- else $d += $d365;
-
- if ($d >= 0) {
- $year = $a;
- break;
- }
- }
- */
-
- $lastsecs = 0;
- $lastyear = 1970;
- foreach($YRS as $year => $secs) {
- if ($d >= $secs) {
- $a = $lastyear;
- break;
- }
- $lastsecs = $secs;
- $lastyear = $year;
- }
-
- $d -= $lastsecs;
- if (!isset($a)) $a = $lastyear;
-
- //echo ' yr=',$a,' ', $d,'.';
-
- for (; --$a >= 0;) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
- else $d += $d365;
-
- if ($d >= 0) {
- $year = $a;
- break;
- }
- }
- /**/
-
- $secsInYear = 86400 * ($leaf ? 366 : 365) + $lastd;
-
- $d = $lastd;
- $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
- for ($a = 13 ; --$a > 0;) {
- $lastd = $d;
- $d += $mtab[$a] * $_day_power;
- if ($d >= 0) {
- $month = $a;
- $ndays = $mtab[$a];
- break;
- }
- }
-
- $d = $lastd;
- $day = $ndays + ceil(($d+1) / ($_day_power));
-
- $d += ($ndays - $day+1)* $_day_power;
- $hour = floor($d/$_hour_power);
-
- } else {
- for ($a = 1970 ;; $a++) {
- $lastd = $d;
-
- if ($leaf = _adodb_is_leap_year($a)) $d -= $d366;
- else $d -= $d365;
- if ($d < 0) {
- $year = $a;
- break;
- }
- }
- $secsInYear = $lastd;
- $d = $lastd;
- $mtab = ($leaf) ? $_month_table_leaf : $_month_table_normal;
- for ($a = 1 ; $a <= 12; $a++) {
- $lastd = $d;
- $d -= $mtab[$a] * $_day_power;
- if ($d < 0) {
- $month = $a;
- $ndays = $mtab[$a];
- break;
- }
- }
- $d = $lastd;
- $day = ceil(($d+1) / $_day_power);
- $d = $d - ($day-1) * $_day_power;
- $hour = floor($d /$_hour_power);
- }
-
- $d -= $hour * $_hour_power;
- $min = floor($d/$_min_power);
- $secs = $d - $min * $_min_power;
- if ($fast) {
- return array(
- 'seconds' => $secs,
- 'minutes' => $min,
- 'hours' => $hour,
- 'mday' => $day,
- 'mon' => $month,
- 'year' => $year,
- 'yday' => floor($secsInYear/$_day_power),
- 'leap' => $leaf,
- 'ndays' => $ndays
- );
- }
-
-
- $dow = adodb_dow($year,$month,$day);
-
- return array(
- 'seconds' => $secs,
- 'minutes' => $min,
- 'hours' => $hour,
- 'mday' => $day,
- 'wday' => $dow,
- 'mon' => $month,
- 'year' => $year,
- 'yday' => floor($secsInYear/$_day_power),
- 'weekday' => gmdate('l',$_day_power*(3+$dow)),
- 'month' => gmdate('F',mktime(0,0,0,$month,2,1971)),
- 0 => $origd
- );
-}
-
-function adodb_gmdate($fmt,$d=false)
-{
- return adodb_date($fmt,$d,true);
-}
-
-// accepts unix timestamp and iso date format in $d
-function adodb_date2($fmt, $d=false, $is_gmt=false)
-{
- if ($d !== false) {
- if (!preg_match(
- "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ -]?(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
- ($d), $rr)) return adodb_date($fmt,false,$is_gmt);
-
- if ($rr[1] <= 100 && $rr[2]<= 1) return adodb_date($fmt,false,$is_gmt);
-
- // h-m-s-MM-DD-YY
- if (!isset($rr[5])) $d = adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1],false,$is_gmt);
- else $d = @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1],false,$is_gmt);
- }
-
- return adodb_date($fmt,$d,$is_gmt);
-}
-
-
-/**
- Return formatted date based on timestamp $d
-*/
-function adodb_date($fmt,$d=false,$is_gmt=false)
-{
-static $daylight;
-
- if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
- if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
- return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
-
- }
- }
- $_day_power = 86400;
-
- $arr = _adodb_getdate($d,true,$is_gmt);
-
- if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv');
- if ($daylight) adodb_daylight_sv($arr, $is_gmt);
-
- $year = $arr['year'];
- $month = $arr['mon'];
- $day = $arr['mday'];
- $hour = $arr['hours'];
- $min = $arr['minutes'];
- $secs = $arr['seconds'];
-
- $max = strlen($fmt);
- $dates = '';
-
- $isphp5 = PHP_VERSION >= 5;
-
- /*
- at this point, we have the following integer vars to manipulate:
- $year, $month, $day, $hour, $min, $secs
- */
- for ($i=0; $i < $max; $i++) {
- switch($fmt[$i]) {
- case 'T': $dates .= date('T');break;
- // YEAR
- case 'L': $dates .= $arr['leap'] ? '1' : '0'; break;
- case 'r': // Thu, 21 Dec 2000 16:01:07 +0200
-
- // 4.3.11 uses '04 Jun 2004'
- // 4.3.8 uses ' 4 Jun 2004'
- $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))).', '
- . ($day<10?'0'.$day:$day) . ' '.date('M',mktime(0,0,0,$month,2,1971)).' '.$year.' ';
-
- if ($hour < 10) $dates .= '0'.$hour; else $dates .= $hour;
-
- if ($min < 10) $dates .= ':0'.$min; else $dates .= ':'.$min;
-
- if ($secs < 10) $dates .= ':0'.$secs; else $dates .= ':'.$secs;
-
- $gmt = adodb_get_gmt_diff();
- if ($isphp5)
- $dates .= sprintf(' %s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
- else
- $dates .= sprintf(' %s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
- break;
-
- case 'Y': $dates .= $year; break;
- case 'y': $dates .= substr($year,strlen($year)-2,2); break;
- // MONTH
- case 'm': if ($month<10) $dates .= '0'.$month; else $dates .= $month; break;
- case 'Q': $dates .= ($month+3)>>2; break;
- case 'n': $dates .= $month; break;
- case 'M': $dates .= date('M',mktime(0,0,0,$month,2,1971)); break;
- case 'F': $dates .= date('F',mktime(0,0,0,$month,2,1971)); break;
- // DAY
- case 't': $dates .= $arr['ndays']; break;
- case 'z': $dates .= $arr['yday']; break;
- case 'w': $dates .= adodb_dow($year,$month,$day); break;
- case 'l': $dates .= gmdate('l',$_day_power*(3+adodb_dow($year,$month,$day))); break;
- case 'D': $dates .= gmdate('D',$_day_power*(3+adodb_dow($year,$month,$day))); break;
- case 'j': $dates .= $day; break;
- case 'd': if ($day<10) $dates .= '0'.$day; else $dates .= $day; break;
- case 'S':
- $d10 = $day % 10;
- if ($d10 == 1) $dates .= 'st';
- else if ($d10 == 2 && $day != 12) $dates .= 'nd';
- else if ($d10 == 3) $dates .= 'rd';
- else $dates .= 'th';
- break;
-
- // HOUR
- case 'Z':
- $dates .= ($is_gmt) ? 0 : -adodb_get_gmt_diff(); break;
- case 'O':
- $gmt = ($is_gmt) ? 0 : adodb_get_gmt_diff();
-
- if ($isphp5)
- $dates .= sprintf('%s%04d',($gmt<=0)?'+':'-',abs($gmt)/36);
- else
- $dates .= sprintf('%s%04d',($gmt<0)?'+':'-',abs($gmt)/36);
- break;
-
- case 'H':
- if ($hour < 10) $dates .= '0'.$hour;
- else $dates .= $hour;
- break;
- case 'h':
- if ($hour > 12) $hh = $hour - 12;
- else {
- if ($hour == 0) $hh = '12';
- else $hh = $hour;
- }
-
- if ($hh < 10) $dates .= '0'.$hh;
- else $dates .= $hh;
- break;
-
- case 'G':
- $dates .= $hour;
- break;
-
- case 'g':
- if ($hour > 12) $hh = $hour - 12;
- else {
- if ($hour == 0) $hh = '12';
- else $hh = $hour;
- }
- $dates .= $hh;
- break;
- // MINUTES
- case 'i': if ($min < 10) $dates .= '0'.$min; else $dates .= $min; break;
- // SECONDS
- case 'U': $dates .= $d; break;
- case 's': if ($secs < 10) $dates .= '0'.$secs; else $dates .= $secs; break;
- // AM/PM
- // Note 00:00 to 11:59 is AM, while 12:00 to 23:59 is PM
- case 'a':
- if ($hour>=12) $dates .= 'pm';
- else $dates .= 'am';
- break;
- case 'A':
- if ($hour>=12) $dates .= 'PM';
- else $dates .= 'AM';
- break;
- default:
- $dates .= $fmt[$i]; break;
- // ESCAPE
- case "\\":
- $i++;
- if ($i < $max) $dates .= $fmt[$i];
- break;
- }
- }
- return $dates;
-}
-
-/**
- Returns a timestamp given a GMT/UTC time.
- Note that $is_dst is not implemented and is ignored.
-*/
-function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false)
-{
- return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);
-}
-
-/**
- Return a timestamp given a local time. Originally by jackbbs.
- Note that $is_dst is not implemented and is ignored.
-
- Not a very fast algorithm - O(n) operation. Could be optimized to O(1).
-*/
-function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false)
-{
- if (!defined('ADODB_TEST_DATES')) {
-
- if ($mon === false) {
- return $is_gmt? @gmmktime($hr,$min,$sec): @mktime($hr,$min,$sec);
- }
-
- // for windows, we don't check 1970 because with timezone differences,
- // 1 Jan 1970 could generate negative timestamp, which is illegal
- if (1971 < $year && $year < 2038
- || !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
- ) {
- return $is_gmt ?
- @gmmktime($hr,$min,$sec,$mon,$day,$year):
- @mktime($hr,$min,$sec,$mon,$day,$year);
- }
- }
-
- $gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff();
-
- /*
- # disabled because some people place large values in $sec.
- # however we need it for $mon because we use an array...
- $hr = intval($hr);
- $min = intval($min);
- $sec = intval($sec);
- */
- $mon = intval($mon);
- $day = intval($day);
- $year = intval($year);
-
-
- $year = adodb_year_digit_check($year);
-
- if ($mon > 12) {
- $y = floor($mon / 12);
- $year += $y;
- $mon -= $y*12;
- } else if ($mon < 1) {
- $y = ceil((1-$mon) / 12);
- $year -= $y;
- $mon += $y*12;
- }
-
- $_day_power = 86400;
- $_hour_power = 3600;
- $_min_power = 60;
-
- $_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
- $_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
-
- $_total_date = 0;
- if ($year >= 1970) {
- for ($a = 1970 ; $a <= $year; $a++) {
- $leaf = _adodb_is_leap_year($a);
- if ($leaf == true) {
- $loop_table = $_month_table_leaf;
- $_add_date = 366;
- } else {
- $loop_table = $_month_table_normal;
- $_add_date = 365;
- }
- if ($a < $year) {
- $_total_date += $_add_date;
- } else {
- for($b=1;$b<$mon;$b++) {
- $_total_date += $loop_table[$b];
- }
- }
- }
- $_total_date +=$day-1;
- $ret = $_total_date * $_day_power + $hr * $_hour_power + $min * $_min_power + $sec + $gmt_different;
-
- } else {
- for ($a = 1969 ; $a >= $year; $a--) {
- $leaf = _adodb_is_leap_year($a);
- if ($leaf == true) {
- $loop_table = $_month_table_leaf;
- $_add_date = 366;
- } else {
- $loop_table = $_month_table_normal;
- $_add_date = 365;
- }
- if ($a > $year) { $_total_date += $_add_date;
- } else {
- for($b=12;$b>$mon;$b--) {
- $_total_date += $loop_table[$b];
- }
- }
- }
- $_total_date += $loop_table[$mon] - $day;
-
- $_day_time = $hr * $_hour_power + $min * $_min_power + $sec;
- $_day_time = $_day_power - $_day_time;
- $ret = -( $_total_date * $_day_power + $_day_time - $gmt_different);
- if ($ret < -12220185600) $ret += 10*86400; // if earlier than 5 Oct 1582 - gregorian correction
- else if ($ret < -12219321600) $ret = -12219321600; // if in limbo, reset to 15 Oct 1582.
- }
- //print " dmy=$day/$mon/$year $hr:$min:$sec => " .$ret;
- return $ret;
-}
-
-function adodb_gmstrftime($fmt, $ts=false)
-{
- return adodb_strftime($fmt,$ts,true);
-}
-
-// hack - convert to adodb_date
-function adodb_strftime($fmt, $ts=false,$is_gmt=false)
-{
-global $ADODB_DATE_LOCALE;
-
- if (!defined('ADODB_TEST_DATES')) {
- if ((abs($ts) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
- if (!defined('ADODB_NO_NEGATIVE_TS') || $ts >= 0) // if windows, must be +ve integer
- return ($is_gmt)? @gmstrftime($fmt,$ts): @strftime($fmt,$ts);
-
- }
- }
-
- if (empty($ADODB_DATE_LOCALE)) {
- /*
- $tstr = strtoupper(gmstrftime('%c',31366800)); // 30 Dec 1970, 1 am
- $sep = substr($tstr,2,1);
- $hasAM = strrpos($tstr,'M') !== false;
- */
- # see http://phplens.com/lens/lensforum/msgs.php?id=14865 for reasoning, and changelog for version 0.24
- $dstr = gmstrftime('%x',31366800); // 30 Dec 1970, 1 am
- $sep = substr($dstr,2,1);
- $tstr = strtoupper(gmstrftime('%X',31366800)); // 30 Dec 1970, 1 am
- $hasAM = strrpos($tstr,'M') !== false;
-
- $ADODB_DATE_LOCALE = array();
- $ADODB_DATE_LOCALE[] = strncmp($tstr,'30',2) == 0 ? 'd'.$sep.'m'.$sep.'y' : 'm'.$sep.'d'.$sep.'y';
- $ADODB_DATE_LOCALE[] = ($hasAM) ? 'h:i:s a' : 'H:i:s';
-
- }
- $inpct = false;
- $fmtdate = '';
- for ($i=0,$max = strlen($fmt); $i < $max; $i++) {
- $ch = $fmt[$i];
- if ($ch == '%') {
- if ($inpct) {
- $fmtdate .= '%';
- $inpct = false;
- } else
- $inpct = true;
- } else if ($inpct) {
-
- $inpct = false;
- switch($ch) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case 'E':
- case 'O':
- /* ignore format modifiers */
- $inpct = true;
- break;
-
- case 'a': $fmtdate .= 'D'; break;
- case 'A': $fmtdate .= 'l'; break;
- case 'h':
- case 'b': $fmtdate .= 'M'; break;
- case 'B': $fmtdate .= 'F'; break;
- case 'c': $fmtdate .= $ADODB_DATE_LOCALE[0].$ADODB_DATE_LOCALE[1]; break;
- case 'C': $fmtdate .= '\C?'; break; // century
- case 'd': $fmtdate .= 'd'; break;
- case 'D': $fmtdate .= 'm/d/y'; break;
- case 'e': $fmtdate .= 'j'; break;
- case 'g': $fmtdate .= '\g?'; break; //?
- case 'G': $fmtdate .= '\G?'; break; //?
- case 'H': $fmtdate .= 'H'; break;
- case 'I': $fmtdate .= 'h'; break;
- case 'j': $fmtdate .= '?z'; $parsej = true; break; // wrong as j=1-based, z=0-basd
- case 'm': $fmtdate .= 'm'; break;
- case 'M': $fmtdate .= 'i'; break;
- case 'n': $fmtdate .= "\n"; break;
- case 'p': $fmtdate .= 'a'; break;
- case 'r': $fmtdate .= 'h:i:s a'; break;
- case 'R': $fmtdate .= 'H:i:s'; break;
- case 'S': $fmtdate .= 's'; break;
- case 't': $fmtdate .= "\t"; break;
- case 'T': $fmtdate .= 'H:i:s'; break;
- case 'u': $fmtdate .= '?u'; $parseu = true; break; // wrong strftime=1-based, date=0-based
- case 'U': $fmtdate .= '?U'; $parseU = true; break;// wrong strftime=1-based, date=0-based
- case 'x': $fmtdate .= $ADODB_DATE_LOCALE[0]; break;
- case 'X': $fmtdate .= $ADODB_DATE_LOCALE[1]; break;
- case 'w': $fmtdate .= '?w'; $parseu = true; break; // wrong strftime=1-based, date=0-based
- case 'W': $fmtdate .= '?W'; $parseU = true; break;// wrong strftime=1-based, date=0-based
- case 'y': $fmtdate .= 'y'; break;
- case 'Y': $fmtdate .= 'Y'; break;
- case 'Z': $fmtdate .= 'T'; break;
- }
- } else if (('A' <= ($ch) && ($ch) <= 'Z' ) || ('a' <= ($ch) && ($ch) <= 'z' ))
- $fmtdate .= "\\".$ch;
- else
- $fmtdate .= $ch;
- }
- //echo "fmt=",$fmtdate,"<br>";
- if ($ts === false) $ts = time();
- $ret = adodb_date($fmtdate, $ts, $is_gmt);
- return $ret;
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-xmlschema.inc.php b/lib/adodb/adodb-xmlschema.inc.php
deleted file mode 100644
index 388e3d8..0000000
--- a/lib/adodb/adodb-xmlschema.inc.php
+++ /dev/null
@@ -1,2221 +0,0 @@
-<?php
-// Copyright (c) 2004 ars Cognita Inc., 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.
-*******************************************************************************/
-/**
- * xmlschema is a class that allows the user to quickly and easily
- * build a database on any ADOdb-supported platform using a simple
- * XML schema.
- *
- * Last Editor: $Author: jlim $
- * @author Richard Tango-Lowy & Dan Cech
- * @version $Revision: 1.12 $
- *
- * @package axmls
- * @tutorial getting_started.pkg
- */
-
-function _file_get_contents($file)
-{
- if (function_exists('file_get_contents')) return file_get_contents($file);
-
- $f = fopen($file,'r');
- if (!$f) return '';
- $t = '';
-
- while ($s = fread($f,100000)) $t .= $s;
- fclose($f);
- return $t;
-}
-
-
-/**
-* Debug on or off
-*/
-if( !defined( 'XMLS_DEBUG' ) ) {
- define( 'XMLS_DEBUG', FALSE );
-}
-
-/**
-* Default prefix key
-*/
-if( !defined( 'XMLS_PREFIX' ) ) {
- define( 'XMLS_PREFIX', '%%P' );
-}
-
-/**
-* Maximum length allowed for object prefix
-*/
-if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) {
- define( 'XMLS_PREFIX_MAXLEN', 10 );
-}
-
-/**
-* Execute SQL inline as it is generated
-*/
-if( !defined( 'XMLS_EXECUTE_INLINE' ) ) {
- define( 'XMLS_EXECUTE_INLINE', FALSE );
-}
-
-/**
-* Continue SQL Execution if an error occurs?
-*/
-if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) {
- define( 'XMLS_CONTINUE_ON_ERROR', FALSE );
-}
-
-/**
-* Current Schema Version
-*/
-if( !defined( 'XMLS_SCHEMA_VERSION' ) ) {
- define( 'XMLS_SCHEMA_VERSION', '0.2' );
-}
-
-/**
-* Default Schema Version. Used for Schemas without an explicit version set.
-*/
-if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) {
- define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' );
-}
-
-/**
-* Default Schema Version. Used for Schemas without an explicit version set.
-*/
-if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) {
- define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' );
-}
-
-/**
-* Include the main ADODB library
-*/
-if( !defined( '_ADODB_LAYER' ) ) {
- require( 'adodb.inc.php' );
- require( 'adodb-datadict.inc.php' );
-}
-
-/**
-* Abstract DB Object. This class provides basic methods for database objects, such
-* as tables and indexes.
-*
-* @package axmls
-* @access private
-*/
-class dbObject {
-
- /**
- * var object Parent
- */
- var $parent;
-
- /**
- * var string current element
- */
- var $currentElement;
-
- /**
- * NOP
- */
- function dbObject( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- }
-
- /**
- * XML Callback to process start elements
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
-
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
-
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
-
- }
-
- function create() {
- return array();
- }
-
- /**
- * Destroys the object
- */
- function destroy() {
- unset( $this );
- }
-
- /**
- * Checks whether the specified RDBMS is supported by the current
- * database object or its ranking ancestor.
- *
- * @param string $platform RDBMS platform name (from ADODB platform list).
- * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE.
- */
- function supportedPlatform( $platform = NULL ) {
- return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE;
- }
-
- /**
- * Returns the prefix set by the ranking ancestor of the database object.
- *
- * @param string $name Prefix string.
- * @return string Prefix.
- */
- function prefix( $name = '' ) {
- return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name;
- }
-
- /**
- * Extracts a field ID from the specified field.
- *
- * @param string $field Field.
- * @return string Field ID.
- */
- function FieldID( $field ) {
- return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) );
- }
-}
-
-/**
-* Creates a table object in ADOdb's datadict format
-*
-* This class stores information about a database table. As charactaristics
-* of the table are loaded from the external source, methods and properties
-* of this class are used to build up the table description in ADOdb's
-* datadict format.
-*
-* @package axmls
-* @access private
-*/
-class dbTable extends dbObject {
-
- /**
- * @var string Table name
- */
- var $name;
-
- /**
- * @var array Field specifier: Meta-information about each field
- */
- var $fields = array();
-
- /**
- * @var array List of table indexes.
- */
- var $indexes = array();
-
- /**
- * @var array Table options: Table-level options
- */
- var $opts = array();
-
- /**
- * @var string Field index: Keeps track of which field is currently being processed
- */
- var $current_field;
-
- /**
- * @var boolean Mark table for destruction
- * @access private
- */
- var $drop_table;
-
- /**
- * @var boolean Mark field for destruction (not yet implemented)
- * @access private
- */
- var $drop_field = array();
-
- /**
- * Iniitializes a new table object.
- *
- * @param string $prefix DB Object prefix
- * @param array $attributes Array of table attributes.
- */
- function dbTable( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- $this->name = $this->prefix($attributes['NAME']);
- }
-
- /**
- * XML Callback to process start elements. Elements currently
- * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'INDEX':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- xml_set_object( $parser, $this->addIndex( $attributes ) );
- }
- break;
- case 'DATA':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- xml_set_object( $parser, $this->addData( $attributes ) );
- }
- break;
- case 'DROP':
- $this->drop();
- break;
- case 'FIELD':
- // Add a field
- $fieldName = $attributes['NAME'];
- $fieldType = $attributes['TYPE'];
- $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL;
- $fieldOpts = isset( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL;
-
- $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts );
- break;
- case 'KEY':
- case 'NOTNULL':
- case 'AUTOINCREMENT':
- // Add a field option
- $this->addFieldOpt( $this->current_field, $this->currentElement );
- break;
- case 'DEFAULT':
- // Add a field option to the table object
-
- // Work around ADOdb datadict issue that misinterprets empty strings.
- if( $attributes['VALUE'] == '' ) {
- $attributes['VALUE'] = " '' ";
- }
-
- $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] );
- break;
- case 'DEFDATE':
- case 'DEFTIMESTAMP':
- // Add a field option to the table object
- $this->addFieldOpt( $this->current_field, $this->currentElement );
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Table constraint
- case 'CONSTRAINT':
- if( isset( $this->current_field ) ) {
- $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata );
- } else {
- $this->addTableOpt( $cdata );
- }
- break;
- // Table option
- case 'OPT':
- $this->addTableOpt( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'TABLE':
- $this->parent->addSQL( $this->create( $this->parent ) );
- xml_set_object( $parser, $this->parent );
- $this->destroy();
- break;
- case 'FIELD':
- unset($this->current_field);
- break;
-
- }
- }
-
- /**
- * Adds an index to a table object
- *
- * @param array $attributes Index attributes
- * @return object dbIndex object
- */
- function &addIndex( $attributes ) {
- $name = strtoupper( $attributes['NAME'] );
- $this->indexes[$name] =& new dbIndex( $this, $attributes );
- return $this->indexes[$name];
- }
-
- /**
- * Adds data to a table object
- *
- * @param array $attributes Data attributes
- * @return object dbData object
- */
- function &addData( $attributes ) {
- if( !isset( $this->data ) ) {
- $this->data =& new dbData( $this, $attributes );
- }
- return $this->data;
- }
-
- /**
- * Adds a field to a table object
- *
- * $name is the name of the table to which the field should be added.
- * $type is an ADODB datadict field type. The following field types
- * are supported as of ADODB 3.40:
- * - C: varchar
- * - X: CLOB (character large object) or largest varchar size
- * if CLOB is not supported
- * - C2: Multibyte varchar
- * - X2: Multibyte CLOB
- * - B: BLOB (binary large object)
- * - D: Date (some databases do not support this, and we return a datetime type)
- * - T: Datetime or Timestamp
- * - L: Integer field suitable for storing booleans (0 or 1)
- * - I: Integer (mapped to I4)
- * - I1: 1-byte integer
- * - I2: 2-byte integer
- * - I4: 4-byte integer
- * - I8: 8-byte integer
- * - F: Floating point number
- * - N: Numeric or decimal number
- *
- * @param string $name Name of the table to which the field will be added.
- * @param string $type ADODB datadict field type.
- * @param string $size Field size
- * @param array $opts Field options array
- * @return array Field specifier array
- */
- function addField( $name, $type, $size = NULL, $opts = NULL ) {
- $field_id = $this->FieldID( $name );
-
- // Set the field index so we know where we are
- $this->current_field = $field_id;
-
- // Set the field name (required)
- $this->fields[$field_id]['NAME'] = $name;
-
- // Set the field type (required)
- $this->fields[$field_id]['TYPE'] = $type;
-
- // Set the field size (optional)
- if( isset( $size ) ) {
- $this->fields[$field_id]['SIZE'] = $size;
- }
-
- // Set the field options
- if( isset( $opts ) ) {
- $this->fields[$field_id]['OPTS'][] = $opts;
- }
- }
-
- /**
- * Adds a field option to the current field specifier
- *
- * This method adds a field option allowed by the ADOdb datadict
- * and appends it to the given field.
- *
- * @param string $field Field name
- * @param string $opt ADOdb field option
- * @param mixed $value Field option value
- * @return array Field specifier array
- */
- function addFieldOpt( $field, $opt, $value = NULL ) {
- if( !isset( $value ) ) {
- $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt;
- // Add the option and value
- } else {
- $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value );
- }
- }
-
- /**
- * Adds an option to the table
- *
- * This method takes a comma-separated list of table-level options
- * and appends them to the table object.
- *
- * @param string $opt Table option
- * @return array Options
- */
- function addTableOpt( $opt ) {
- $this->opts[] = $opt;
-
- return $this->opts;
- }
-
- /**
- * Generates the SQL that will create the table in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing table creation SQL
- */
- function create( &$xmls ) {
- $sql = array();
-
- // drop any existing indexes
- if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) {
- foreach( $legacy_indexes as $index => $index_details ) {
- $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name );
- }
- }
-
- // remove fields to be dropped from table object
- foreach( $this->drop_field as $field ) {
- unset( $this->fields[$field] );
- }
-
- // if table exists
- if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) {
- // drop table
- if( $this->drop_table ) {
- $sql[] = $xmls->dict->DropTableSQL( $this->name );
-
- return $sql;
- }
-
- // drop any existing fields not in schema
- foreach( $legacy_fields as $field_id => $field ) {
- if( !isset( $this->fields[$field_id] ) ) {
- $sql[] = $xmls->dict->DropColumnSQL( $this->name, '`'.$field->name.'`' );
- }
- }
- // if table doesn't exist
- } else {
- if( $this->drop_table ) {
- return $sql;
- }
-
- $legacy_fields = array();
- }
-
- // Loop through the field specifier array, building the associative array for the field options
- $fldarray = array();
-
- foreach( $this->fields as $field_id => $finfo ) {
- // Set an empty size if it isn't supplied
- if( !isset( $finfo['SIZE'] ) ) {
- $finfo['SIZE'] = '';
- }
-
- // Initialize the field array with the type and size
- $fldarray[$field_id] = array(
- 'NAME' => $finfo['NAME'],
- 'TYPE' => $finfo['TYPE'],
- 'SIZE' => $finfo['SIZE']
- );
-
- // Loop through the options array and add the field options.
- if( isset( $finfo['OPTS'] ) ) {
- foreach( $finfo['OPTS'] as $opt ) {
- // Option has an argument.
- if( is_array( $opt ) ) {
- $key = key( $opt );
- $value = $opt[key( $opt )];
- @$fldarray[$field_id][$key] .= $value;
- // Option doesn't have arguments
- } else {
- $fldarray[$field_id][$opt] = $opt;
- }
- }
- }
- }
-
- if( empty( $legacy_fields ) ) {
- // Create the new table
- $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
- logMsg( end( $sql ), 'Generated CreateTableSQL' );
- } else {
- // Upgrade an existing table
- logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" );
- switch( $xmls->upgrade ) {
- // Use ChangeTableSQL
- case 'ALTER':
- logMsg( 'Generated ChangeTableSQL (ALTERing table)' );
- $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts );
- break;
- case 'REPLACE':
- logMsg( 'Doing upgrade REPLACE (testing)' );
- $sql[] = $xmls->dict->DropTableSQL( $this->name );
- $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
- break;
- // ignore table
- default:
- return array();
- }
- }
-
- foreach( $this->indexes as $index ) {
- $sql[] = $index->create( $xmls );
- }
-
- if( isset( $this->data ) ) {
- $sql[] = $this->data->create( $xmls );
- }
-
- return $sql;
- }
-
- /**
- * Marks a field or table for destruction
- */
- function drop() {
- if( isset( $this->current_field ) ) {
- // Drop the current field
- logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" );
- // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field );
- $this->drop_field[$this->current_field] = $this->current_field;
- } else {
- // Drop the current table
- logMsg( "Dropping table '{$this->name}'" );
- // $this->drop_table = $xmls->dict->DropTableSQL( $this->name );
- $this->drop_table = TRUE;
- }
- }
-}
-
-/**
-* Creates an index object in ADOdb's datadict format
-*
-* This class stores information about a database index. As charactaristics
-* of the index are loaded from the external source, methods and properties
-* of this class are used to build up the index description in ADOdb's
-* datadict format.
-*
-* @package axmls
-* @access private
-*/
-class dbIndex extends dbObject {
-
- /**
- * @var string Index name
- */
- var $name;
-
- /**
- * @var array Index options: Index-level options
- */
- var $opts = array();
-
- /**
- * @var array Indexed fields: Table columns included in this index
- */
- var $columns = array();
-
- /**
- * @var boolean Mark index for destruction
- * @access private
- */
- var $drop = FALSE;
-
- /**
- * Initializes the new dbIndex object.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- *
- * @internal
- */
- function dbIndex( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
-
- $this->name = $this->prefix ($attributes['NAME']);
- }
-
- /**
- * XML Callback to process start elements
- *
- * Processes XML opening tags.
- * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'DROP':
- $this->drop();
- break;
- case 'CLUSTERED':
- case 'BITMAP':
- case 'UNIQUE':
- case 'FULLTEXT':
- case 'HASH':
- // Add index Option
- $this->addIndexOpt( $this->currentElement );
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * Processes XML cdata.
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Index field name
- case 'COL':
- $this->addField( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'INDEX':
- xml_set_object( $parser, $this->parent );
- break;
- }
- }
-
- /**
- * Adds a field to the index
- *
- * @param string $name Field name
- * @return string Field list
- */
- function addField( $name ) {
- $this->columns[$this->FieldID( $name )] = $name;
-
- // Return the field list
- return $this->columns;
- }
-
- /**
- * Adds options to the index
- *
- * @param string $opt Comma-separated list of index options.
- * @return string Option list
- */
- function addIndexOpt( $opt ) {
- $this->opts[] = $opt;
-
- // Return the options list
- return $this->opts;
- }
-
- /**
- * Generates the SQL that will create the index in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing index creation SQL
- */
- function create( &$xmls ) {
- if( $this->drop ) {
- return NULL;
- }
-
- // eliminate any columns that aren't in the table
- foreach( $this->columns as $id => $col ) {
- if( !isset( $this->parent->fields[$id] ) ) {
- unset( $this->columns[$id] );
- }
- }
-
- return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts );
- }
-
- /**
- * Marks an index for destruction
- */
- function drop() {
- $this->drop = TRUE;
- }
-}
-
-/**
-* Creates a data object in ADOdb's datadict format
-*
-* This class stores information about table data.
-*
-* @package axmls
-* @access private
-*/
-class dbData extends dbObject {
-
- var $data = array();
-
- var $row;
-
- /**
- * Initializes the new dbIndex object.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- *
- * @internal
- */
- function dbData( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- }
-
- /**
- * XML Callback to process start elements
- *
- * Processes XML opening tags.
- * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'ROW':
- $this->row = count( $this->data );
- $this->data[$this->row] = array();
- break;
- case 'F':
- $this->addField($attributes);
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * Processes XML cdata.
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Index field name
- case 'F':
- $this->addData( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'DATA':
- xml_set_object( $parser, $this->parent );
- break;
- }
- }
-
- /**
- * Adds a field to the index
- *
- * @param string $name Field name
- * @return string Field list
- */
- function addField( $attributes ) {
- if( isset( $attributes['NAME'] ) ) {
- $name = $attributes['NAME'];
- } else {
- $name = count($this->data[$this->row]);
- }
-
- // Set the field index so we know where we are
- $this->current_field = $this->FieldID( $name );
- }
-
- /**
- * Adds options to the index
- *
- * @param string $opt Comma-separated list of index options.
- * @return string Option list
- */
- function addData( $cdata ) {
- if( !isset( $this->data[$this->row] ) ) {
- $this->data[$this->row] = array();
- }
-
- if( !isset( $this->data[$this->row][$this->current_field] ) ) {
- $this->data[$this->row][$this->current_field] = '';
- }
-
- $this->data[$this->row][$this->current_field] .= $cdata;
- }
-
- /**
- * Generates the SQL that will create the index in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing index creation SQL
- */
- function create( &$xmls ) {
- $table = $xmls->dict->TableName($this->parent->name);
- $table_field_count = count($this->parent->fields);
- $sql = array();
-
- // eliminate any columns that aren't in the table
- foreach( $this->data as $row ) {
- $table_fields = $this->parent->fields;
- $fields = array();
-
- foreach( $row as $field_id => $field_data ) {
- if( !array_key_exists( $field_id, $table_fields ) ) {
- if( is_numeric( $field_id ) ) {
- $field_id = reset( array_keys( $table_fields ) );
- } else {
- continue;
- }
- }
-
- $name = $table_fields[$field_id]['NAME'];
-
- switch( $table_fields[$field_id]['TYPE'] ) {
- case 'C':
- case 'C2':
- case 'X':
- case 'X2':
- $fields[$name] = $xmls->db->qstr( $field_data );
- break;
- case 'I':
- case 'I1':
- case 'I2':
- case 'I4':
- case 'I8':
- $fields[$name] = intval($field_data);
- break;
- default:
- $fields[$name] = $field_data;
- }
-
- unset($table_fields[$field_id]);
- }
-
- // check that at least 1 column is specified
- if( empty( $fields ) ) {
- continue;
- }
-
- // check that no required columns are missing
- if( count( $fields ) < $table_field_count ) {
- foreach( $table_fields as $field ) {
- if (isset( $field['OPTS'] ))
- if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) {
- continue(2);
- }
- }
- }
-
- $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
- }
-
- return $sql;
- }
-}
-
-/**
-* Creates the SQL to execute a list of provided SQL queries
-*
-* @package axmls
-* @access private
-*/
-class dbQuerySet extends dbObject {
-
- /**
- * @var array List of SQL queries
- */
- var $queries = array();
-
- /**
- * @var string String used to build of a query line by line
- */
- var $query;
-
- /**
- * @var string Query prefix key
- */
- var $prefixKey = '';
-
- /**
- * @var boolean Auto prefix enable (TRUE)
- */
- var $prefixMethod = 'AUTO';
-
- /**
- * Initializes the query set.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- */
- function dbQuerySet( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
-
- // Overrides the manual prefix key
- if( isset( $attributes['KEY'] ) ) {
- $this->prefixKey = $attributes['KEY'];
- }
-
- $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : '';
-
- // Enables or disables automatic prefix prepending
- switch( $prefixMethod ) {
- case 'AUTO':
- $this->prefixMethod = 'AUTO';
- break;
- case 'MANUAL':
- $this->prefixMethod = 'MANUAL';
- break;
- case 'NONE':
- $this->prefixMethod = 'NONE';
- break;
- }
- }
-
- /**
- * XML Callback to process start elements. Elements currently
- * processed are: QUERY.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'QUERY':
- // Create a new query in a SQL queryset.
- // Ignore this query set if a platform is specified and it's different than the
- // current connection platform.
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- $this->newQuery();
- } else {
- $this->discardQuery();
- }
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Line of queryset SQL data
- case 'QUERY':
- $this->buildQuery( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'QUERY':
- // Add the finished query to the open query set.
- $this->addQuery();
- break;
- case 'SQL':
- $this->parent->addSQL( $this->create( $this->parent ) );
- xml_set_object( $parser, $this->parent );
- $this->destroy();
- break;
- default:
-
- }
- }
-
- /**
- * Re-initializes the query.
- *
- * @return boolean TRUE
- */
- function newQuery() {
- $this->query = '';
-
- return TRUE;
- }
-
- /**
- * Discards the existing query.
- *
- * @return boolean TRUE
- */
- function discardQuery() {
- unset( $this->query );
-
- return TRUE;
- }
-
- /**
- * Appends a line to a query that is being built line by line
- *
- * @param string $data Line of SQL data or NULL to initialize a new query
- * @return string SQL query string.
- */
- function buildQuery( $sql = NULL ) {
- if( !isset( $this->query ) OR empty( $sql ) ) {
- return FALSE;
- }
-
- $this->query .= $sql;
-
- return $this->query;
- }
-
- /**
- * Adds a completed query to the query list
- *
- * @return string SQL of added query
- */
- function addQuery() {
- if( !isset( $this->query ) ) {
- return FALSE;
- }
-
- $this->queries[] = $return = trim($this->query);
-
- unset( $this->query );
-
- return $return;
- }
-
- /**
- * Creates and returns the current query set
- *
- * @param object $xmls adoSchema object
- * @return array Query set
- */
- function create( &$xmls ) {
- foreach( $this->queries as $id => $query ) {
- switch( $this->prefixMethod ) {
- case 'AUTO':
- // Enable auto prefix replacement
-
- // Process object prefix.
- // Evaluate SQL statements to prepend prefix to objects
- $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
- $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
- $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
-
- // SELECT statements aren't working yet
- #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data );
-
- case 'MANUAL':
- // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX.
- // If prefixKey is not set, we use the default constant XMLS_PREFIX
- if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) {
- // Enable prefix override
- $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query );
- } else {
- // Use default replacement
- $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query );
- }
- }
-
- $this->queries[$id] = trim( $query );
- }
-
- // Return the query set array
- return $this->queries;
- }
-
- /**
- * Rebuilds the query with the prefix attached to any objects
- *
- * @param string $regex Regex used to add prefix
- * @param string $query SQL query string
- * @param string $prefix Prefix to be appended to tables, indices, etc.
- * @return string Prefixed SQL query string.
- */
- function prefixQuery( $regex, $query, $prefix = NULL ) {
- if( !isset( $prefix ) ) {
- return $query;
- }
-
- if( preg_match( $regex, $query, $match ) ) {
- $preamble = $match[1];
- $postamble = $match[5];
- $objectList = explode( ',', $match[3] );
- // $prefix = $prefix . '_';
-
- $prefixedList = '';
-
- foreach( $objectList as $object ) {
- if( $prefixedList !== '' ) {
- $prefixedList .= ', ';
- }
-
- $prefixedList .= $prefix . trim( $object );
- }
-
- $query = $preamble . ' ' . $prefixedList . ' ' . $postamble;
- }
-
- return $query;
- }
-}
-
-/**
-* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements
-*
-* This class is used to load and parse the XML file, to create an array of SQL statements
-* that can be used to build a database, and to build the database using the SQL array.
-*
-* @tutorial getting_started.pkg
-*
-* @author Richard Tango-Lowy & Dan Cech
-* @version $Revision: 1.12 $
-*
-* @package axmls
-*/
-class adoSchema {
-
- /**
- * @var array Array containing SQL queries to generate all objects
- * @access private
- */
- var $sqlArray;
-
- /**
- * @var object ADOdb connection object
- * @access private
- */
- var $db;
-
- /**
- * @var object ADOdb Data Dictionary
- * @access private
- */
- var $dict;
-
- /**
- * @var string Current XML element
- * @access private
- */
- var $currentElement = '';
-
- /**
- * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
- * @access private
- */
- var $upgrade = '';
-
- /**
- * @var string Optional object prefix
- * @access private
- */
- var $objectPrefix = '';
-
- /**
- * @var long Original Magic Quotes Runtime value
- * @access private
- */
- var $mgq;
-
- /**
- * @var long System debug
- * @access private
- */
- var $debug;
-
- /**
- * @var string Regular expression to find schema version
- * @access private
- */
- var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/';
-
- /**
- * @var string Current schema version
- * @access private
- */
- var $schemaVersion;
-
- /**
- * @var int Success of last Schema execution
- */
- var $success;
-
- /**
- * @var bool Execute SQL inline as it is generated
- */
- var $executeInline;
-
- /**
- * @var bool Continue SQL execution if errors occur
- */
- var $continueOnError;
-
- /**
- * Creates an adoSchema object
- *
- * Creating an adoSchema object is the first step in processing an XML schema.
- * The only parameter is an ADOdb database connection object, which must already
- * have been created.
- *
- * @param object $db ADOdb database connection object.
- */
- function adoSchema( &$db ) {
- // Initialize the environment
- $this->mgq = get_magic_quotes_runtime();
- set_magic_quotes_runtime(0);
-
- $this->db =& $db;
- $this->debug = $this->db->debug;
- $this->dict = NewDataDictionary( $this->db );
- $this->sqlArray = array();
- $this->schemaVersion = XMLS_SCHEMA_VERSION;
- $this->executeInline( XMLS_EXECUTE_INLINE );
- $this->continueOnError( XMLS_CONTINUE_ON_ERROR );
- $this->setUpgradeMethod();
- }
-
- /**
- * Sets the method to be used for upgrading an existing database
- *
- * Use this method to specify how existing database objects should be upgraded.
- * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to
- * alter each database object directly, REPLACE attempts to rebuild each object
- * from scratch, BEST attempts to determine the best upgrade method for each
- * object, and NONE disables upgrading.
- *
- * This method is not yet used by AXMLS, but exists for backward compatibility.
- * The ALTER method is automatically assumed when the adoSchema object is
- * instantiated; other upgrade methods are not currently supported.
- *
- * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE)
- * @returns string Upgrade method used
- */
- function SetUpgradeMethod( $method = '' ) {
- if( !is_string( $method ) ) {
- return FALSE;
- }
-
- $method = strtoupper( $method );
-
- // Handle the upgrade methods
- switch( $method ) {
- case 'ALTER':
- $this->upgrade = $method;
- break;
- case 'REPLACE':
- $this->upgrade = $method;
- break;
- case 'BEST':
- $this->upgrade = 'ALTER';
- break;
- case 'NONE':
- $this->upgrade = 'NONE';
- break;
- default:
- // Use default if no legitimate method is passed.
- $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD;
- }
-
- return $this->upgrade;
- }
-
- /**
- * Enables/disables inline SQL execution.
- *
- * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution),
- * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode
- * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema()
- * to apply the schema to the database.
- *
- * @param bool $mode execute
- * @return bool current execution mode
- *
- * @see ParseSchema(), ExecuteSchema()
- */
- function ExecuteInline( $mode = NULL ) {
- if( is_bool( $mode ) ) {
- $this->executeInline = $mode;
- }
-
- return $this->executeInline;
- }
-
- /**
- * Enables/disables SQL continue on error.
- *
- * Call this method to enable or disable continuation of SQL execution if an error occurs.
- * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs.
- * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing
- * of the schema will continue.
- *
- * @param bool $mode execute
- * @return bool current continueOnError mode
- *
- * @see addSQL(), ExecuteSchema()
- */
- function ContinueOnError( $mode = NULL ) {
- if( is_bool( $mode ) ) {
- $this->continueOnError = $mode;
- }
-
- return $this->continueOnError;
- }
-
- /**
- * Loads an XML schema from a file and converts it to SQL.
- *
- * Call this method to load the specified schema (see the DTD for the proper format) from
- * the filesystem and generate the SQL necessary to create the database described.
- * @see ParseSchemaString()
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute
- */
- function ParseSchema( $filename, $returnSchema = FALSE ) {
- return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
- }
-
- /**
- * Loads an XML schema from a file and converts it to SQL.
- *
- * Call this method to load the specified schema from a file (see the DTD for the proper format)
- * and generate the SQL necessary to create the database described by the schema.
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- *
- * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString()
- * @see ParseSchema(), ParseSchemaString()
- */
- function ParseSchemaFile( $filename, $returnSchema = FALSE ) {
- // Open the file
- if( !($fp = fopen( $filename, 'r' )) ) {
- // die( 'Unable to open file' );
- return FALSE;
- }
-
- // do version detection here
- if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) {
- return FALSE;
- }
-
- if ( $returnSchema )
- {
- $xmlstring = '';
- while( $data = fread( $fp, 100000 ) ) {
- $xmlstring .= $data;
- }
- return $xmlstring;
- }
-
- $this->success = 2;
-
- $xmlParser = $this->create_parser();
-
- // Process the file
- while( $data = fread( $fp, 4096 ) ) {
- if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) {
- die( sprintf(
- "XML error: %s at line %d",
- xml_error_string( xml_get_error_code( $xmlParser) ),
- xml_get_current_line_number( $xmlParser)
- ) );
- }
- }
-
- xml_parser_free( $xmlParser );
-
- return $this->sqlArray;
- }
-
- /**
- * Converts an XML schema string to SQL.
- *
- * Call this method to parse a string containing an XML schema (see the DTD for the proper format)
- * and generate the SQL necessary to create the database described by the schema.
- * @see ParseSchema()
- *
- * @param string $xmlstring XML schema string.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- */
- function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) {
- if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
- return FALSE;
- }
-
- // do version detection here
- if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) {
- return FALSE;
- }
-
- if ( $returnSchema )
- {
- return $xmlstring;
- }
-
- $this->success = 2;
-
- $xmlParser = $this->create_parser();
-
- if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) {
- die( sprintf(
- "XML error: %s at line %d",
- xml_error_string( xml_get_error_code( $xmlParser) ),
- xml_get_current_line_number( $xmlParser)
- ) );
- }
-
- xml_parser_free( $xmlParser );
-
- return $this->sqlArray;
- }
-
- /**
- * Loads an XML schema from a file and converts it to uninstallation SQL.
- *
- * Call this method to load the specified schema (see the DTD for the proper format) from
- * the filesystem and generate the SQL necessary to remove the database described.
- * @see RemoveSchemaString()
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute
- */
- function RemoveSchema( $filename, $returnSchema = FALSE ) {
- return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
- }
-
- /**
- * Converts an XML schema string to uninstallation SQL.
- *
- * Call this method to parse a string containing an XML schema (see the DTD for the proper format)
- * and generate the SQL necessary to uninstall the database described by the schema.
- * @see RemoveSchema()
- *
- * @param string $schema XML schema string.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- */
- function RemoveSchemaString( $schema, $returnSchema = FALSE ) {
-
- // grab current version
- if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
- return FALSE;
- }
-
- return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema );
- }
-
- /**
- * Applies the current XML schema to the database (post execution).
- *
- * Call this method to apply the current schema (generally created by calling
- * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes,
- * and executing other SQL specified in the schema) after parsing.
- * @see ParseSchema(), ParseSchemaString(), ExecuteInline()
- *
- * @param array $sqlArray Array of SQL statements that will be applied rather than
- * the current schema.
- * @param boolean $continueOnErr Continue to apply the schema even if an error occurs.
- * @returns integer 0 if failure, 1 if errors, 2 if successful.
- */
- function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) {
- if( !is_bool( $continueOnErr ) ) {
- $continueOnErr = $this->ContinueOnError();
- }
-
- if( !isset( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
-
- if( !is_array( $sqlArray ) ) {
- $this->success = 0;
- } else {
- $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr );
- }
-
- return $this->success;
- }
-
- /**
- * Returns the current SQL array.
- *
- * Call this method to fetch the array of SQL queries resulting from
- * ParseSchema() or ParseSchemaString().
- *
- * @param string $format Format: HTML, TEXT, or NONE (PHP array)
- * @return array Array of SQL statements or FALSE if an error occurs
- */
- function PrintSQL( $format = 'NONE' ) {
- $sqlArray = null;
- return $this->getSQL( $format, $sqlArray );
- }
-
- /**
- * Saves the current SQL array to the local filesystem as a list of SQL queries.
- *
- * Call this method to save the array of SQL queries (generally resulting from a
- * parsed XML schema) to the filesystem.
- *
- * @param string $filename Path and name where the file should be saved.
- * @return boolean TRUE if save is successful, else FALSE.
- */
- function SaveSQL( $filename = './schema.sql' ) {
-
- if( !isset( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
- if( !isset( $sqlArray ) ) {
- return FALSE;
- }
-
- $fp = fopen( $filename, "w" );
-
- foreach( $sqlArray as $key => $query ) {
- fwrite( $fp, $query . ";\n" );
- }
- fclose( $fp );
- }
-
- /**
- * Create an xml parser
- *
- * @return object PHP XML parser object
- *
- * @access private
- */
- function &create_parser() {
- // Create the parser
- $xmlParser = xml_parser_create();
- xml_set_object( $xmlParser, $this );
-
- // Initialize the XML callback functions
- xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' );
- xml_set_character_data_handler( $xmlParser, '_tag_cdata' );
-
- return $xmlParser;
- }
-
- /**
- * XML Callback to process start elements
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- switch( strtoupper( $tag ) ) {
- case 'TABLE':
- $this->obj = new dbTable( $this, $attributes );
- xml_set_object( $parser, $this->obj );
- break;
- case 'SQL':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- $this->obj = new dbQuerySet( $this, $attributes );
- xml_set_object( $parser, $this->obj );
- }
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
-
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- * @internal
- */
- function _tag_close( &$parser, $tag ) {
-
- }
-
- /**
- * Converts an XML schema string to the specified DTD version.
- *
- * Call this method to convert a string containing an XML schema to a different AXMLS
- * DTD version. For instance, to convert a schema created for an pre-1.0 version for
- * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
- * parameter is specified, the schema will be converted to the current DTD version.
- * If the newFile parameter is provided, the converted schema will be written to the specified
- * file.
- * @see ConvertSchemaFile()
- *
- * @param string $schema String containing XML schema that will be converted.
- * @param string $newVersion DTD version to convert to.
- * @param string $newFile File name of (converted) output file.
- * @return string Converted XML schema or FALSE if an error occurs.
- */
- function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) {
-
- // grab current version
- if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
- return FALSE;
- }
-
- if( !isset ($newVersion) ) {
- $newVersion = $this->schemaVersion;
- }
-
- if( $version == $newVersion ) {
- $result = $schema;
- } else {
- $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion);
- }
-
- if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
- fwrite( $fp, $result );
- fclose( $fp );
- }
-
- return $result;
- }
-
- // compat for pre-4.3 - jlim
- function _file_get_contents($path)
- {
- if (function_exists('file_get_contents')) return file_get_contents($path);
- return join('',file($path));
- }
-
- /**
- * Converts an XML schema file to the specified DTD version.
- *
- * Call this method to convert the specified XML schema file to a different AXMLS
- * DTD version. For instance, to convert a schema created for an pre-1.0 version for
- * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
- * parameter is specified, the schema will be converted to the current DTD version.
- * If the newFile parameter is provided, the converted schema will be written to the specified
- * file.
- * @see ConvertSchemaString()
- *
- * @param string $filename Name of XML schema file that will be converted.
- * @param string $newVersion DTD version to convert to.
- * @param string $newFile File name of (converted) output file.
- * @return string Converted XML schema or FALSE if an error occurs.
- */
- function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) {
-
- // grab current version
- if( !( $version = $this->SchemaFileVersion( $filename ) ) ) {
- return FALSE;
- }
-
- if( !isset ($newVersion) ) {
- $newVersion = $this->schemaVersion;
- }
-
- if( $version == $newVersion ) {
- $result = _file_get_contents( $filename );
-
- // remove unicode BOM if present
- if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) {
- $result = substr( $result, 3 );
- }
- } else {
- $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' );
- }
-
- if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
- fwrite( $fp, $result );
- fclose( $fp );
- }
-
- return $result;
- }
-
- function TransformSchema( $schema, $xsl, $schematype='string' )
- {
- // Fail if XSLT extension is not available
- if( ! function_exists( 'xslt_create' ) ) {
- return FALSE;
- }
-
- $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl';
-
- // look for xsl
- if( !is_readable( $xsl_file ) ) {
- return FALSE;
- }
-
- switch( $schematype )
- {
- case 'file':
- if( !is_readable( $schema ) ) {
- return FALSE;
- }
-
- $schema = _file_get_contents( $schema );
- break;
- case 'string':
- default:
- if( !is_string( $schema ) ) {
- return FALSE;
- }
- }
-
- $arguments = array (
- '/_xml' => $schema,
- '/_xsl' => _file_get_contents( $xsl_file )
- );
-
- // create an XSLT processor
- $xh = xslt_create ();
-
- // set error handler
- xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler'));
-
- // process the schema
- $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
-
- xslt_free ($xh);
-
- return $result;
- }
-
- /**
- * Processes XSLT transformation errors
- *
- * @param object $parser XML parser object
- * @param integer $errno Error number
- * @param integer $level Error level
- * @param array $fields Error information fields
- *
- * @access private
- */
- function xslt_error_handler( $parser, $errno, $level, $fields ) {
- if( is_array( $fields ) ) {
- $msg = array(
- 'Message Type' => ucfirst( $fields['msgtype'] ),
- 'Message Code' => $fields['code'],
- 'Message' => $fields['msg'],
- 'Error Number' => $errno,
- 'Level' => $level
- );
-
- switch( $fields['URI'] ) {
- case 'arg:/_xml':
- $msg['Input'] = 'XML';
- break;
- case 'arg:/_xsl':
- $msg['Input'] = 'XSL';
- break;
- default:
- $msg['Input'] = $fields['URI'];
- }
-
- $msg['Line'] = $fields['line'];
- } else {
- $msg = array(
- 'Message Type' => 'Error',
- 'Error Number' => $errno,
- 'Level' => $level,
- 'Fields' => var_export( $fields, TRUE )
- );
- }
-
- $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n"
- . '<table>' . "\n";
-
- foreach( $msg as $label => $details ) {
- $error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n";
- }
-
- $error_details .= '</table>';
-
- trigger_error( $error_details, E_USER_ERROR );
- }
-
- /**
- * Returns the AXMLS Schema Version of the requested XML schema file.
- *
- * Call this method to obtain the AXMLS DTD version of the requested XML schema file.
- * @see SchemaStringVersion()
- *
- * @param string $filename AXMLS schema file
- * @return string Schema version number or FALSE on error
- */
- function SchemaFileVersion( $filename ) {
- // Open the file
- if( !($fp = fopen( $filename, 'r' )) ) {
- // die( 'Unable to open file' );
- return FALSE;
- }
-
- // Process the file
- while( $data = fread( $fp, 4096 ) ) {
- if( preg_match( $this->versionRegex, $data, $matches ) ) {
- return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
- }
- }
-
- return FALSE;
- }
-
- /**
- * Returns the AXMLS Schema Version of the provided XML schema string.
- *
- * Call this method to obtain the AXMLS DTD version of the provided XML schema string.
- * @see SchemaFileVersion()
- *
- * @param string $xmlstring XML schema string
- * @return string Schema version number or FALSE on error
- */
- function SchemaStringVersion( $xmlstring ) {
- if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
- return FALSE;
- }
-
- if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) {
- return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
- }
-
- return FALSE;
- }
-
- /**
- * Extracts an XML schema from an existing database.
- *
- * Call this method to create an XML schema string from an existing database.
- * If the data parameter is set to TRUE, AXMLS will include the data from the database
- * in the schema.
- *
- * @param boolean $data Include data in schema dump
- * @return string Generated XML schema
- */
- function ExtractSchema( $data = FALSE ) {
- $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM );
-
- $schema = '<?xml version="1.0"?>' . "\n"
- . '<schema version="' . $this->schemaVersion . '">' . "\n";
-
- if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) {
- foreach( $tables as $table ) {
- $schema .= ' <table name="' . $table . '">' . "\n";
-
- // grab details from database
- $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE 1=1' );
- $fields = $this->db->MetaColumns( $table );
- $indexes = $this->db->MetaIndexes( $table );
-
- if( is_array( $fields ) ) {
- foreach( $fields as $details ) {
- $extra = '';
- $content = array();
-
- if( $details->max_length > 0 ) {
- $extra .= ' size="' . $details->max_length . '"';
- }
-
- if( $details->primary_key ) {
- $content[] = '<KEY/>';
- } elseif( $details->not_null ) {
- $content[] = '<NOTNULL/>';
- }
-
- if( $details->has_default ) {
- $content[] = '<DEFAULT value="' . $details->default_value . '"/>';
- }
-
- if( $details->auto_increment ) {
- $content[] = '<AUTOINCREMENT/>';
- }
-
- // this stops the creation of 'R' columns,
- // AUTOINCREMENT is used to create auto columns
- $details->primary_key = 0;
- $type = $rs->MetaType( $details );
-
- $schema .= ' <field name="' . $details->name . '" type="' . $type . '"' . $extra . '>';
-
- if( !empty( $content ) ) {
- $schema .= "\n " . implode( "\n ", $content ) . "\n ";
- }
-
- $schema .= '</field>' . "\n";
- }
- }
-
- if( is_array( $indexes ) ) {
- foreach( $indexes as $index => $details ) {
- $schema .= ' <index name="' . $index . '">' . "\n";
-
- if( $details['unique'] ) {
- $schema .= ' <UNIQUE/>' . "\n";
- }
-
- foreach( $details['columns'] as $column ) {
- $schema .= ' <col>' . $column . '</col>' . "\n";
- }
-
- $schema .= ' </index>' . "\n";
- }
- }
-
- if( $data ) {
- $rs = $this->db->Execute( 'SELECT * FROM ' . $table );
-
- if( is_object( $rs ) ) {
- $schema .= ' <data>' . "\n";
-
- while( $row = $rs->FetchRow() ) {
- foreach( $row as $key => $val ) {
- $row[$key] = htmlentities($val);
- }
-
- $schema .= ' <row><f>' . implode( '</f><f>', $row ) . '</f></row>' . "\n";
- }
-
- $schema .= ' </data>' . "\n";
- }
- }
-
- $schema .= ' </table>' . "\n";
- }
- }
-
- $this->db->SetFetchMode( $old_mode );
-
- $schema .= '</schema>';
- return $schema;
- }
-
- /**
- * Sets a prefix for database objects
- *
- * Call this method to set a standard prefix that will be prepended to all database tables
- * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix.
- *
- * @param string $prefix Prefix that will be prepended.
- * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix.
- * @return boolean TRUE if successful, else FALSE
- */
- function SetPrefix( $prefix = '', $underscore = TRUE ) {
- switch( TRUE ) {
- // clear prefix
- case empty( $prefix ):
- logMsg( 'Cleared prefix' );
- $this->objectPrefix = '';
- return TRUE;
- // prefix too long
- case strlen( $prefix ) > XMLS_PREFIX_MAXLEN:
- // prefix contains invalid characters
- case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ):
- logMsg( 'Invalid prefix: ' . $prefix );
- return FALSE;
- }
-
- if( $underscore AND substr( $prefix, -1 ) != '_' ) {
- $prefix .= '_';
- }
-
- // prefix valid
- logMsg( 'Set prefix: ' . $prefix );
- $this->objectPrefix = $prefix;
- return TRUE;
- }
-
- /**
- * Returns an object name with the current prefix prepended.
- *
- * @param string $name Name
- * @return string Prefixed name
- *
- * @access private
- */
- function prefix( $name = '' ) {
- // if prefix is set
- if( !empty( $this->objectPrefix ) ) {
- // Prepend the object prefix to the table name
- // prepend after quote if used
- return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name );
- }
-
- // No prefix set. Use name provided.
- return $name;
- }
-
- /**
- * Checks if element references a specific platform
- *
- * @param string $platform Requested platform
- * @returns boolean TRUE if platform check succeeds
- *
- * @access private
- */
- function supportedPlatform( $platform = NULL ) {
- $regex = '/^(\w*\|)*' . $this->db->databaseType . '(\|\w*)*$/';
-
- if( !isset( $platform ) OR preg_match( $regex, $platform ) ) {
- logMsg( "Platform $platform is supported" );
- return TRUE;
- } else {
- logMsg( "Platform $platform is NOT supported" );
- return FALSE;
- }
- }
-
- /**
- * Clears the array of generated SQL.
- *
- * @access private
- */
- function clearSQL() {
- $this->sqlArray = array();
- }
-
- /**
- * Adds SQL into the SQL array.
- *
- * @param mixed $sql SQL to Add
- * @return boolean TRUE if successful, else FALSE.
- *
- * @access private
- */
- function addSQL( $sql = NULL ) {
- if( is_array( $sql ) ) {
- foreach( $sql as $line ) {
- $this->addSQL( $line );
- }
-
- return TRUE;
- }
-
- if( is_string( $sql ) ) {
- $this->sqlArray[] = $sql;
-
- // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL.
- if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) {
- $saved = $this->db->debug;
- $this->db->debug = $this->debug;
- $ok = $this->db->Execute( $sql );
- $this->db->debug = $saved;
-
- if( !$ok ) {
- if( $this->debug ) {
- ADOConnection::outp( $this->db->ErrorMsg() );
- }
-
- $this->success = 1;
- }
- }
-
- return TRUE;
- }
-
- return FALSE;
- }
-
- /**
- * Gets the SQL array in the specified format.
- *
- * @param string $format Format
- * @return mixed SQL
- *
- * @access private
- */
- function getSQL( $format = NULL, $sqlArray = NULL ) {
- if( !is_array( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
-
- if( !is_array( $sqlArray ) ) {
- return FALSE;
- }
-
- switch( strtolower( $format ) ) {
- case 'string':
- case 'text':
- return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : '';
- case'html':
- return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : '';
- }
-
- return $this->sqlArray;
- }
-
- /**
- * Destroys an adoSchema object.
- *
- * Call this method to clean up after an adoSchema object that is no longer in use.
- * @deprecated adoSchema now cleans up automatically.
- */
- function Destroy() {
- set_magic_quotes_runtime( $this->mgq );
- unset( $this );
- }
-}
-
-/**
-* Message logging function
-*
-* @access private
-*/
-function logMsg( $msg, $title = NULL, $force = FALSE ) {
- if( XMLS_DEBUG or $force ) {
- echo '<pre>';
-
- if( isset( $title ) ) {
- echo '<h3>' . htmlentities( $title ) . '</h3>';
- }
-
- if( is_object( $this ) ) {
- echo '[' . get_class( $this ) . '] ';
- }
-
- print_r( $msg );
-
- echo '</pre>';
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb-xmlschema03.inc.php b/lib/adodb/adodb-xmlschema03.inc.php
deleted file mode 100644
index ffd4460..0000000
--- a/lib/adodb/adodb-xmlschema03.inc.php
+++ /dev/null
@@ -1,2403 +0,0 @@
-<?php
-// Copyright (c) 2004-2005 ars Cognita Inc., 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.
-*******************************************************************************/
-/**
- * xmlschema is a class that allows the user to quickly and easily
- * build a database on any ADOdb-supported platform using a simple
- * XML schema.
- *
- * Last Editor: $Author: jlim $
- * @author Richard Tango-Lowy & Dan Cech
- * @version $Revision: 1.62 $
- *
- * @package axmls
- * @tutorial getting_started.pkg
- */
-
-function _file_get_contents($file)
-{
- if (function_exists('file_get_contents')) return file_get_contents($file);
-
- $f = fopen($file,'r');
- if (!$f) return '';
- $t = '';
-
- while ($s = fread($f,100000)) $t .= $s;
- fclose($f);
- return $t;
-}
-
-
-/**
-* Debug on or off
-*/
-if( !defined( 'XMLS_DEBUG' ) ) {
- define( 'XMLS_DEBUG', FALSE );
-}
-
-/**
-* Default prefix key
-*/
-if( !defined( 'XMLS_PREFIX' ) ) {
- define( 'XMLS_PREFIX', '%%P' );
-}
-
-/**
-* Maximum length allowed for object prefix
-*/
-if( !defined( 'XMLS_PREFIX_MAXLEN' ) ) {
- define( 'XMLS_PREFIX_MAXLEN', 10 );
-}
-
-/**
-* Execute SQL inline as it is generated
-*/
-if( !defined( 'XMLS_EXECUTE_INLINE' ) ) {
- define( 'XMLS_EXECUTE_INLINE', FALSE );
-}
-
-/**
-* Continue SQL Execution if an error occurs?
-*/
-if( !defined( 'XMLS_CONTINUE_ON_ERROR' ) ) {
- define( 'XMLS_CONTINUE_ON_ERROR', FALSE );
-}
-
-/**
-* Current Schema Version
-*/
-if( !defined( 'XMLS_SCHEMA_VERSION' ) ) {
- define( 'XMLS_SCHEMA_VERSION', '0.3' );
-}
-
-/**
-* Default Schema Version. Used for Schemas without an explicit version set.
-*/
-if( !defined( 'XMLS_DEFAULT_SCHEMA_VERSION' ) ) {
- define( 'XMLS_DEFAULT_SCHEMA_VERSION', '0.1' );
-}
-
-/**
-* How to handle data rows that already exist in a database during and upgrade.
-* Options are INSERT (attempts to insert duplicate rows), UPDATE (updates existing
-* rows) and IGNORE (ignores existing rows).
-*/
-if( !defined( 'XMLS_MODE_INSERT' ) ) {
- define( 'XMLS_MODE_INSERT', 0 );
-}
-if( !defined( 'XMLS_MODE_UPDATE' ) ) {
- define( 'XMLS_MODE_UPDATE', 1 );
-}
-if( !defined( 'XMLS_MODE_IGNORE' ) ) {
- define( 'XMLS_MODE_IGNORE', 2 );
-}
-if( !defined( 'XMLS_EXISTING_DATA' ) ) {
- define( 'XMLS_EXISTING_DATA', XMLS_MODE_INSERT );
-}
-
-/**
-* Default Schema Version. Used for Schemas without an explicit version set.
-*/
-if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) {
- define( 'XMLS_DEFAULT_UPGRADE_METHOD', 'ALTER' );
-}
-
-/**
-* Include the main ADODB library
-*/
-if( !defined( '_ADODB_LAYER' ) ) {
- require( 'adodb.inc.php' );
- require( 'adodb-datadict.inc.php' );
-}
-
-/**
-* Abstract DB Object. This class provides basic methods for database objects, such
-* as tables and indexes.
-*
-* @package axmls
-* @access private
-*/
-class dbObject {
-
- /**
- * var object Parent
- */
- var $parent;
-
- /**
- * var string current element
- */
- var $currentElement;
-
- /**
- * NOP
- */
- function dbObject( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- }
-
- /**
- * XML Callback to process start elements
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
-
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
-
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
-
- }
-
- function create() {
- return array();
- }
-
- /**
- * Destroys the object
- */
- function destroy() {
- unset( $this );
- }
-
- /**
- * Checks whether the specified RDBMS is supported by the current
- * database object or its ranking ancestor.
- *
- * @param string $platform RDBMS platform name (from ADODB platform list).
- * @return boolean TRUE if RDBMS is supported; otherwise returns FALSE.
- */
- function supportedPlatform( $platform = NULL ) {
- return is_object( $this->parent ) ? $this->parent->supportedPlatform( $platform ) : TRUE;
- }
-
- /**
- * Returns the prefix set by the ranking ancestor of the database object.
- *
- * @param string $name Prefix string.
- * @return string Prefix.
- */
- function prefix( $name = '' ) {
- return is_object( $this->parent ) ? $this->parent->prefix( $name ) : $name;
- }
-
- /**
- * Extracts a field ID from the specified field.
- *
- * @param string $field Field.
- * @return string Field ID.
- */
- function FieldID( $field ) {
- return strtoupper( preg_replace( '/^`(.+)`$/', '$1', $field ) );
- }
-}
-
-/**
-* Creates a table object in ADOdb's datadict format
-*
-* This class stores information about a database table. As charactaristics
-* of the table are loaded from the external source, methods and properties
-* of this class are used to build up the table description in ADOdb's
-* datadict format.
-*
-* @package axmls
-* @access private
-*/
-class dbTable extends dbObject {
-
- /**
- * @var string Table name
- */
- var $name;
-
- /**
- * @var array Field specifier: Meta-information about each field
- */
- var $fields = array();
-
- /**
- * @var array List of table indexes.
- */
- var $indexes = array();
-
- /**
- * @var array Table options: Table-level options
- */
- var $opts = array();
-
- /**
- * @var string Field index: Keeps track of which field is currently being processed
- */
- var $current_field;
-
- /**
- * @var boolean Mark table for destruction
- * @access private
- */
- var $drop_table;
-
- /**
- * @var boolean Mark field for destruction (not yet implemented)
- * @access private
- */
- var $drop_field = array();
-
- /**
- * @var array Platform-specific options
- * @access private
- */
- var $currentPlatform = true;
-
-
- /**
- * Iniitializes a new table object.
- *
- * @param string $prefix DB Object prefix
- * @param array $attributes Array of table attributes.
- */
- function dbTable( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- $this->name = $this->prefix($attributes['NAME']);
- }
-
- /**
- * XML Callback to process start elements. Elements currently
- * processed are: INDEX, DROP, FIELD, KEY, NOTNULL, AUTOINCREMENT & DEFAULT.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'INDEX':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- xml_set_object( $parser, $this->addIndex( $attributes ) );
- }
- break;
- case 'DATA':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- xml_set_object( $parser, $this->addData( $attributes ) );
- }
- break;
- case 'DROP':
- $this->drop();
- break;
- case 'FIELD':
- // Add a field
- $fieldName = $attributes['NAME'];
- $fieldType = $attributes['TYPE'];
- $fieldSize = isset( $attributes['SIZE'] ) ? $attributes['SIZE'] : NULL;
- $fieldOpts = !empty( $attributes['OPTS'] ) ? $attributes['OPTS'] : NULL;
-
- $this->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts );
- break;
- case 'KEY':
- case 'NOTNULL':
- case 'AUTOINCREMENT':
- case 'DEFDATE':
- case 'DEFTIMESTAMP':
- case 'UNSIGNED':
- // Add a field option
- $this->addFieldOpt( $this->current_field, $this->currentElement );
- break;
- case 'DEFAULT':
- // Add a field option to the table object
-
- // Work around ADOdb datadict issue that misinterprets empty strings.
- if( $attributes['VALUE'] == '' ) {
- $attributes['VALUE'] = " '' ";
- }
-
- $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] );
- break;
- case 'OPT':
- case 'CONSTRAINT':
- // Accept platform-specific options
- $this->currentPlatform = ( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) );
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Table/field constraint
- case 'CONSTRAINT':
- if( isset( $this->current_field ) ) {
- $this->addFieldOpt( $this->current_field, $this->currentElement, $cdata );
- } else {
- $this->addTableOpt( $cdata );
- }
- break;
- // Table/field option
- case 'OPT':
- if( isset( $this->current_field ) ) {
- $this->addFieldOpt( $this->current_field, $cdata );
- } else {
- $this->addTableOpt( $cdata );
- }
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'TABLE':
- $this->parent->addSQL( $this->create( $this->parent ) );
- xml_set_object( $parser, $this->parent );
- $this->destroy();
- break;
- case 'FIELD':
- unset($this->current_field);
- break;
- case 'OPT':
- case 'CONSTRAINT':
- $this->currentPlatform = true;
- break;
- default:
-
- }
- }
-
- /**
- * Adds an index to a table object
- *
- * @param array $attributes Index attributes
- * @return object dbIndex object
- */
- function &addIndex( $attributes ) {
- $name = strtoupper( $attributes['NAME'] );
- $this->indexes[$name] =& new dbIndex( $this, $attributes );
- return $this->indexes[$name];
- }
-
- /**
- * Adds data to a table object
- *
- * @param array $attributes Data attributes
- * @return object dbData object
- */
- function &addData( $attributes ) {
- if( !isset( $this->data ) ) {
- $this->data =& new dbData( $this, $attributes );
- }
- return $this->data;
- }
-
- /**
- * Adds a field to a table object
- *
- * $name is the name of the table to which the field should be added.
- * $type is an ADODB datadict field type. The following field types
- * are supported as of ADODB 3.40:
- * - C: varchar
- * - X: CLOB (character large object) or largest varchar size
- * if CLOB is not supported
- * - C2: Multibyte varchar
- * - X2: Multibyte CLOB
- * - B: BLOB (binary large object)
- * - D: Date (some databases do not support this, and we return a datetime type)
- * - T: Datetime or Timestamp
- * - L: Integer field suitable for storing booleans (0 or 1)
- * - I: Integer (mapped to I4)
- * - I1: 1-byte integer
- * - I2: 2-byte integer
- * - I4: 4-byte integer
- * - I8: 8-byte integer
- * - F: Floating point number
- * - N: Numeric or decimal number
- *
- * @param string $name Name of the table to which the field will be added.
- * @param string $type ADODB datadict field type.
- * @param string $size Field size
- * @param array $opts Field options array
- * @return array Field specifier array
- */
- function addField( $name, $type, $size = NULL, $opts = NULL ) {
- $field_id = $this->FieldID( $name );
-
- // Set the field index so we know where we are
- $this->current_field = $field_id;
-
- // Set the field name (required)
- $this->fields[$field_id]['NAME'] = $name;
-
- // Set the field type (required)
- $this->fields[$field_id]['TYPE'] = $type;
-
- // Set the field size (optional)
- if( isset( $size ) ) {
- $this->fields[$field_id]['SIZE'] = $size;
- }
-
- // Set the field options
- if( isset( $opts ) ) {
- $this->fields[$field_id]['OPTS'] = array($opts);
- } else {
- $this->fields[$field_id]['OPTS'] = array();
- }
- }
-
- /**
- * Adds a field option to the current field specifier
- *
- * This method adds a field option allowed by the ADOdb datadict
- * and appends it to the given field.
- *
- * @param string $field Field name
- * @param string $opt ADOdb field option
- * @param mixed $value Field option value
- * @return array Field specifier array
- */
- function addFieldOpt( $field, $opt, $value = NULL ) {
- if( $this->currentPlatform ) {
- if( !isset( $value ) ) {
- $this->fields[$this->FieldID( $field )]['OPTS'][] = $opt;
- // Add the option and value
- } else {
- $this->fields[$this->FieldID( $field )]['OPTS'][] = array( $opt => $value );
- }
- }
- }
-
- /**
- * Adds an option to the table
- *
- * This method takes a comma-separated list of table-level options
- * and appends them to the table object.
- *
- * @param string $opt Table option
- * @return array Options
- */
- function addTableOpt( $opt ) {
- if( $this->currentPlatform ) {
- $this->opts[] = $opt;
- }
- return $this->opts;
- }
-
- /**
- * Generates the SQL that will create the table in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing table creation SQL
- */
- function create( &$xmls ) {
- $sql = array();
-
- // drop any existing indexes
- if( is_array( $legacy_indexes = $xmls->dict->MetaIndexes( $this->name ) ) ) {
- foreach( $legacy_indexes as $index => $index_details ) {
- $sql[] = $xmls->dict->DropIndexSQL( $index, $this->name );
- }
- }
-
- // remove fields to be dropped from table object
- foreach( $this->drop_field as $field ) {
- unset( $this->fields[$field] );
- }
-
- // if table exists
- if( is_array( $legacy_fields = $xmls->dict->MetaColumns( $this->name ) ) ) {
- // drop table
- if( $this->drop_table ) {
- $sql[] = $xmls->dict->DropTableSQL( $this->name );
-
- return $sql;
- }
-
- // drop any existing fields not in schema
- foreach( $legacy_fields as $field_id => $field ) {
- if( !isset( $this->fields[$field_id] ) ) {
- $sql[] = $xmls->dict->DropColumnSQL( $this->name, $field->name );
- }
- }
- // if table doesn't exist
- } else {
- if( $this->drop_table ) {
- return $sql;
- }
-
- $legacy_fields = array();
- }
-
- // Loop through the field specifier array, building the associative array for the field options
- $fldarray = array();
-
- foreach( $this->fields as $field_id => $finfo ) {
- // Set an empty size if it isn't supplied
- if( !isset( $finfo['SIZE'] ) ) {
- $finfo['SIZE'] = '';
- }
-
- // Initialize the field array with the type and size
- $fldarray[$field_id] = array(
- 'NAME' => $finfo['NAME'],
- 'TYPE' => $finfo['TYPE'],
- 'SIZE' => $finfo['SIZE']
- );
-
- // Loop through the options array and add the field options.
- if( isset( $finfo['OPTS'] ) ) {
- foreach( $finfo['OPTS'] as $opt ) {
- // Option has an argument.
- if( is_array( $opt ) ) {
- $key = key( $opt );
- $value = $opt[key( $opt )];
- @$fldarray[$field_id][$key] .= $value;
- // Option doesn't have arguments
- } else {
- $fldarray[$field_id][$opt] = $opt;
- }
- }
- }
- }
-
- if( empty( $legacy_fields ) ) {
- // Create the new table
- $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
- logMsg( end( $sql ), 'Generated CreateTableSQL' );
- } else {
- // Upgrade an existing table
- logMsg( "Upgrading {$this->name} using '{$xmls->upgrade}'" );
- switch( $xmls->upgrade ) {
- // Use ChangeTableSQL
- case 'ALTER':
- logMsg( 'Generated ChangeTableSQL (ALTERing table)' );
- $sql[] = $xmls->dict->ChangeTableSQL( $this->name, $fldarray, $this->opts );
- break;
- case 'REPLACE':
- logMsg( 'Doing upgrade REPLACE (testing)' );
- $sql[] = $xmls->dict->DropTableSQL( $this->name );
- $sql[] = $xmls->dict->CreateTableSQL( $this->name, $fldarray, $this->opts );
- break;
- // ignore table
- default:
- return array();
- }
- }
-
- foreach( $this->indexes as $index ) {
- $sql[] = $index->create( $xmls );
- }
-
- if( isset( $this->data ) ) {
- $sql[] = $this->data->create( $xmls );
- }
-
- return $sql;
- }
-
- /**
- * Marks a field or table for destruction
- */
- function drop() {
- if( isset( $this->current_field ) ) {
- // Drop the current field
- logMsg( "Dropping field '{$this->current_field}' from table '{$this->name}'" );
- // $this->drop_field[$this->current_field] = $xmls->dict->DropColumnSQL( $this->name, $this->current_field );
- $this->drop_field[$this->current_field] = $this->current_field;
- } else {
- // Drop the current table
- logMsg( "Dropping table '{$this->name}'" );
- // $this->drop_table = $xmls->dict->DropTableSQL( $this->name );
- $this->drop_table = TRUE;
- }
- }
-}
-
-/**
-* Creates an index object in ADOdb's datadict format
-*
-* This class stores information about a database index. As charactaristics
-* of the index are loaded from the external source, methods and properties
-* of this class are used to build up the index description in ADOdb's
-* datadict format.
-*
-* @package axmls
-* @access private
-*/
-class dbIndex extends dbObject {
-
- /**
- * @var string Index name
- */
- var $name;
-
- /**
- * @var array Index options: Index-level options
- */
- var $opts = array();
-
- /**
- * @var array Indexed fields: Table columns included in this index
- */
- var $columns = array();
-
- /**
- * @var boolean Mark index for destruction
- * @access private
- */
- var $drop = FALSE;
-
- /**
- * Initializes the new dbIndex object.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- *
- * @internal
- */
- function dbIndex( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
-
- $this->name = $this->prefix ($attributes['NAME']);
- }
-
- /**
- * XML Callback to process start elements
- *
- * Processes XML opening tags.
- * Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'DROP':
- $this->drop();
- break;
- case 'CLUSTERED':
- case 'BITMAP':
- case 'UNIQUE':
- case 'FULLTEXT':
- case 'HASH':
- // Add index Option
- $this->addIndexOpt( $this->currentElement );
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * Processes XML cdata.
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Index field name
- case 'COL':
- $this->addField( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'INDEX':
- xml_set_object( $parser, $this->parent );
- break;
- }
- }
-
- /**
- * Adds a field to the index
- *
- * @param string $name Field name
- * @return string Field list
- */
- function addField( $name ) {
- $this->columns[$this->FieldID( $name )] = $name;
-
- // Return the field list
- return $this->columns;
- }
-
- /**
- * Adds options to the index
- *
- * @param string $opt Comma-separated list of index options.
- * @return string Option list
- */
- function addIndexOpt( $opt ) {
- $this->opts[] = $opt;
-
- // Return the options list
- return $this->opts;
- }
-
- /**
- * Generates the SQL that will create the index in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing index creation SQL
- */
- function create( &$xmls ) {
- if( $this->drop ) {
- return NULL;
- }
-
- // eliminate any columns that aren't in the table
- foreach( $this->columns as $id => $col ) {
- if( !isset( $this->parent->fields[$id] ) ) {
- unset( $this->columns[$id] );
- }
- }
-
- return $xmls->dict->CreateIndexSQL( $this->name, $this->parent->name, $this->columns, $this->opts );
- }
-
- /**
- * Marks an index for destruction
- */
- function drop() {
- $this->drop = TRUE;
- }
-}
-
-/**
-* Creates a data object in ADOdb's datadict format
-*
-* This class stores information about table data, and is called
-* when we need to load field data into a table.
-*
-* @package axmls
-* @access private
-*/
-class dbData extends dbObject {
-
- var $data = array();
-
- var $row;
-
- /**
- * Initializes the new dbData object.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- *
- * @internal
- */
- function dbData( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
- }
-
- /**
- * XML Callback to process start elements
- *
- * Processes XML opening tags.
- * Elements currently processed are: ROW and F (field).
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'ROW':
- $this->row = count( $this->data );
- $this->data[$this->row] = array();
- break;
- case 'F':
- $this->addField($attributes);
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * Processes XML cdata.
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Index field name
- case 'F':
- $this->addData( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'DATA':
- xml_set_object( $parser, $this->parent );
- break;
- }
- }
-
- /**
- * Adds a field to the insert
- *
- * @param string $name Field name
- * @return string Field list
- */
- function addField( $attributes ) {
- // check we're in a valid row
- if( !isset( $this->row ) || !isset( $this->data[$this->row] ) ) {
- return;
- }
-
- // Set the field index so we know where we are
- if( isset( $attributes['NAME'] ) ) {
- $this->current_field = $this->FieldID( $attributes['NAME'] );
- } else {
- $this->current_field = count( $this->data[$this->row] );
- }
-
- // initialise data
- if( !isset( $this->data[$this->row][$this->current_field] ) ) {
- $this->data[$this->row][$this->current_field] = '';
- }
- }
-
- /**
- * Adds options to the index
- *
- * @param string $opt Comma-separated list of index options.
- * @return string Option list
- */
- function addData( $cdata ) {
- // check we're in a valid field
- if ( isset( $this->data[$this->row][$this->current_field] ) ) {
- // add data to field
- $this->data[$this->row][$this->current_field] .= $cdata;
- }
- }
-
- /**
- * Generates the SQL that will add/update the data in the database
- *
- * @param object $xmls adoSchema object
- * @return array Array containing index creation SQL
- */
- function create( &$xmls ) {
- $table = $xmls->dict->TableName($this->parent->name);
- $table_field_count = count($this->parent->fields);
- $tables = $xmls->db->MetaTables();
- $sql = array();
-
- $ukeys = $xmls->db->MetaPrimaryKeys( $table );
- if( !empty( $this->parent->indexes ) and !empty( $ukeys ) ) {
- foreach( $this->parent->indexes as $indexObj ) {
- if( !in_array( $indexObj->name, $ukeys ) ) $ukeys[] = $indexObj->name;
- }
- }
-
- // eliminate any columns that aren't in the table
- foreach( $this->data as $row ) {
- $table_fields = $this->parent->fields;
- $fields = array();
- $rawfields = array(); // Need to keep some of the unprocessed data on hand.
-
- foreach( $row as $field_id => $field_data ) {
- if( !array_key_exists( $field_id, $table_fields ) ) {
- if( is_numeric( $field_id ) ) {
- $field_id = reset( array_keys( $table_fields ) );
- } else {
- continue;
- }
- }
-
- $name = $table_fields[$field_id]['NAME'];
-
- switch( $table_fields[$field_id]['TYPE'] ) {
- case 'I':
- case 'I1':
- case 'I2':
- case 'I4':
- case 'I8':
- $fields[$name] = intval($field_data);
- break;
- case 'C':
- case 'C2':
- case 'X':
- case 'X2':
- default:
- $fields[$name] = $xmls->db->qstr( $field_data );
- $rawfields[$name] = $field_data;
- }
-
- unset($table_fields[$field_id]);
-
- }
-
- // check that at least 1 column is specified
- if( empty( $fields ) ) {
- continue;
- }
-
- // check that no required columns are missing
- if( count( $fields ) < $table_field_count ) {
- foreach( $table_fields as $field ) {
- if( isset( $field['OPTS'] ) and ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) {
- continue(2);
- }
- }
- }
-
- // The rest of this method deals with updating existing data records.
-
- if( !in_array( $table, $tables ) or ( $mode = $xmls->existingData() ) == XMLS_MODE_INSERT ) {
- // Table doesn't yet exist, so it's safe to insert.
- logMsg( "$table doesn't exist, inserting or mode is INSERT" );
- $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
- continue;
- }
-
- // Prepare to test for potential violations. Get primary keys and unique indexes
- $mfields = array_merge( $fields, $rawfields );
- $keyFields = array_intersect( $ukeys, array_keys( $mfields ) );
-
- if( empty( $ukeys ) or count( $keyFields ) == 0 ) {
- // No unique keys in schema, so safe to insert
- logMsg( "Either schema or data has no unique keys, so safe to insert" );
- $sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
- continue;
- }
-
- // Select record containing matching unique keys.
- $where = '';
- foreach( $ukeys as $key ) {
- if( isset( $mfields[$key] ) and $mfields[$key] ) {
- if( $where ) $where .= ' AND ';
- $where .= $key . ' = ' . $xmls->db->qstr( $mfields[$key] );
- }
- }
- $records = $xmls->db->Execute( 'SELECT * FROM ' . $table . ' WHERE ' . $where );
- switch( $records->RecordCount() ) {
- case 0:
- // No matching record, so safe to insert.
- logMsg( "No matching records. Inserting new row with unique data" );
- $sql[] = $xmls->db->GetInsertSQL( $records, $mfields );
- break;
- case 1:
- // Exactly one matching record, so we can update if the mode permits.
- logMsg( "One matching record..." );
- if( $mode == XMLS_MODE_UPDATE ) {
- logMsg( "...Updating existing row from unique data" );
- $sql[] = $xmls->db->GetUpdateSQL( $records, $mfields );
- }
- break;
- default:
- // More than one matching record; the result is ambiguous, so we must ignore the row.
- logMsg( "More than one matching record. Ignoring row." );
- }
- }
- return $sql;
- }
-}
-
-/**
-* Creates the SQL to execute a list of provided SQL queries
-*
-* @package axmls
-* @access private
-*/
-class dbQuerySet extends dbObject {
-
- /**
- * @var array List of SQL queries
- */
- var $queries = array();
-
- /**
- * @var string String used to build of a query line by line
- */
- var $query;
-
- /**
- * @var string Query prefix key
- */
- var $prefixKey = '';
-
- /**
- * @var boolean Auto prefix enable (TRUE)
- */
- var $prefixMethod = 'AUTO';
-
- /**
- * Initializes the query set.
- *
- * @param object $parent Parent object
- * @param array $attributes Attributes
- */
- function dbQuerySet( &$parent, $attributes = NULL ) {
- $this->parent =& $parent;
-
- // Overrides the manual prefix key
- if( isset( $attributes['KEY'] ) ) {
- $this->prefixKey = $attributes['KEY'];
- }
-
- $prefixMethod = isset( $attributes['PREFIXMETHOD'] ) ? strtoupper( trim( $attributes['PREFIXMETHOD'] ) ) : '';
-
- // Enables or disables automatic prefix prepending
- switch( $prefixMethod ) {
- case 'AUTO':
- $this->prefixMethod = 'AUTO';
- break;
- case 'MANUAL':
- $this->prefixMethod = 'MANUAL';
- break;
- case 'NONE':
- $this->prefixMethod = 'NONE';
- break;
- }
- }
-
- /**
- * XML Callback to process start elements. Elements currently
- * processed are: QUERY.
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- $this->currentElement = strtoupper( $tag );
-
- switch( $this->currentElement ) {
- case 'QUERY':
- // Create a new query in a SQL queryset.
- // Ignore this query set if a platform is specified and it's different than the
- // current connection platform.
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- $this->newQuery();
- } else {
- $this->discardQuery();
- }
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
- }
-
- /**
- * XML Callback to process CDATA elements
- */
- function _tag_cdata( &$parser, $cdata ) {
- switch( $this->currentElement ) {
- // Line of queryset SQL data
- case 'QUERY':
- $this->buildQuery( $cdata );
- break;
- default:
-
- }
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- */
- function _tag_close( &$parser, $tag ) {
- $this->currentElement = '';
-
- switch( strtoupper( $tag ) ) {
- case 'QUERY':
- // Add the finished query to the open query set.
- $this->addQuery();
- break;
- case 'SQL':
- $this->parent->addSQL( $this->create( $this->parent ) );
- xml_set_object( $parser, $this->parent );
- $this->destroy();
- break;
- default:
-
- }
- }
-
- /**
- * Re-initializes the query.
- *
- * @return boolean TRUE
- */
- function newQuery() {
- $this->query = '';
-
- return TRUE;
- }
-
- /**
- * Discards the existing query.
- *
- * @return boolean TRUE
- */
- function discardQuery() {
- unset( $this->query );
-
- return TRUE;
- }
-
- /**
- * Appends a line to a query that is being built line by line
- *
- * @param string $data Line of SQL data or NULL to initialize a new query
- * @return string SQL query string.
- */
- function buildQuery( $sql = NULL ) {
- if( !isset( $this->query ) OR empty( $sql ) ) {
- return FALSE;
- }
-
- $this->query .= $sql;
-
- return $this->query;
- }
-
- /**
- * Adds a completed query to the query list
- *
- * @return string SQL of added query
- */
- function addQuery() {
- if( !isset( $this->query ) ) {
- return FALSE;
- }
-
- $this->queries[] = $return = trim($this->query);
-
- unset( $this->query );
-
- return $return;
- }
-
- /**
- * Creates and returns the current query set
- *
- * @param object $xmls adoSchema object
- * @return array Query set
- */
- function create( &$xmls ) {
- foreach( $this->queries as $id => $query ) {
- switch( $this->prefixMethod ) {
- case 'AUTO':
- // Enable auto prefix replacement
-
- // Process object prefix.
- // Evaluate SQL statements to prepend prefix to objects
- $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
- $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
- $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
-
- // SELECT statements aren't working yet
- #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data );
-
- case 'MANUAL':
- // If prefixKey is set and has a value then we use it to override the default constant XMLS_PREFIX.
- // If prefixKey is not set, we use the default constant XMLS_PREFIX
- if( isset( $this->prefixKey ) AND( $this->prefixKey !== '' ) ) {
- // Enable prefix override
- $query = str_replace( $this->prefixKey, $xmls->objectPrefix, $query );
- } else {
- // Use default replacement
- $query = str_replace( XMLS_PREFIX , $xmls->objectPrefix, $query );
- }
- }
-
- $this->queries[$id] = trim( $query );
- }
-
- // Return the query set array
- return $this->queries;
- }
-
- /**
- * Rebuilds the query with the prefix attached to any objects
- *
- * @param string $regex Regex used to add prefix
- * @param string $query SQL query string
- * @param string $prefix Prefix to be appended to tables, indices, etc.
- * @return string Prefixed SQL query string.
- */
- function prefixQuery( $regex, $query, $prefix = NULL ) {
- if( !isset( $prefix ) ) {
- return $query;
- }
-
- if( preg_match( $regex, $query, $match ) ) {
- $preamble = $match[1];
- $postamble = $match[5];
- $objectList = explode( ',', $match[3] );
- // $prefix = $prefix . '_';
-
- $prefixedList = '';
-
- foreach( $objectList as $object ) {
- if( $prefixedList !== '' ) {
- $prefixedList .= ', ';
- }
-
- $prefixedList .= $prefix . trim( $object );
- }
-
- $query = $preamble . ' ' . $prefixedList . ' ' . $postamble;
- }
-
- return $query;
- }
-}
-
-/**
-* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements
-*
-* This class is used to load and parse the XML file, to create an array of SQL statements
-* that can be used to build a database, and to build the database using the SQL array.
-*
-* @tutorial getting_started.pkg
-*
-* @author Richard Tango-Lowy & Dan Cech
-* @version $Revision: 1.62 $
-*
-* @package axmls
-*/
-class adoSchema {
-
- /**
- * @var array Array containing SQL queries to generate all objects
- * @access private
- */
- var $sqlArray;
-
- /**
- * @var object ADOdb connection object
- * @access private
- */
- var $db;
-
- /**
- * @var object ADOdb Data Dictionary
- * @access private
- */
- var $dict;
-
- /**
- * @var string Current XML element
- * @access private
- */
- var $currentElement = '';
-
- /**
- * @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
- * @access private
- */
- var $upgrade = '';
-
- /**
- * @var string Optional object prefix
- * @access private
- */
- var $objectPrefix = '';
-
- /**
- * @var long Original Magic Quotes Runtime value
- * @access private
- */
- var $mgq;
-
- /**
- * @var long System debug
- * @access private
- */
- var $debug;
-
- /**
- * @var string Regular expression to find schema version
- * @access private
- */
- var $versionRegex = '/<schema.*?( version="([^"]*)")?.*?>/';
-
- /**
- * @var string Current schema version
- * @access private
- */
- var $schemaVersion;
-
- /**
- * @var int Success of last Schema execution
- */
- var $success;
-
- /**
- * @var bool Execute SQL inline as it is generated
- */
- var $executeInline;
-
- /**
- * @var bool Continue SQL execution if errors occur
- */
- var $continueOnError;
-
- /**
- * @var int How to handle existing data rows (insert, update, or ignore)
- */
- var $existingData;
-
- /**
- * Creates an adoSchema object
- *
- * Creating an adoSchema object is the first step in processing an XML schema.
- * The only parameter is an ADOdb database connection object, which must already
- * have been created.
- *
- * @param object $db ADOdb database connection object.
- */
- function adoSchema( &$db ) {
- // Initialize the environment
- $this->mgq = get_magic_quotes_runtime();
- set_magic_quotes_runtime(0);
-
- $this->db =& $db;
- $this->debug = $this->db->debug;
- $this->dict = NewDataDictionary( $this->db );
- $this->sqlArray = array();
- $this->schemaVersion = XMLS_SCHEMA_VERSION;
- $this->executeInline( XMLS_EXECUTE_INLINE );
- $this->continueOnError( XMLS_CONTINUE_ON_ERROR );
- $this->existingData( XMLS_EXISTING_DATA );
- $this->setUpgradeMethod();
- }
-
- /**
- * Sets the method to be used for upgrading an existing database
- *
- * Use this method to specify how existing database objects should be upgraded.
- * The method option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to
- * alter each database object directly, REPLACE attempts to rebuild each object
- * from scratch, BEST attempts to determine the best upgrade method for each
- * object, and NONE disables upgrading.
- *
- * This method is not yet used by AXMLS, but exists for backward compatibility.
- * The ALTER method is automatically assumed when the adoSchema object is
- * instantiated; other upgrade methods are not currently supported.
- *
- * @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE)
- * @returns string Upgrade method used
- */
- function SetUpgradeMethod( $method = '' ) {
- if( !is_string( $method ) ) {
- return FALSE;
- }
-
- $method = strtoupper( $method );
-
- // Handle the upgrade methods
- switch( $method ) {
- case 'ALTER':
- $this->upgrade = $method;
- break;
- case 'REPLACE':
- $this->upgrade = $method;
- break;
- case 'BEST':
- $this->upgrade = 'ALTER';
- break;
- case 'NONE':
- $this->upgrade = 'NONE';
- break;
- default:
- // Use default if no legitimate method is passed.
- $this->upgrade = XMLS_DEFAULT_UPGRADE_METHOD;
- }
-
- return $this->upgrade;
- }
-
- /**
- * Specifies how to handle existing data row when there is a unique key conflict.
- *
- * The existingData setting specifies how the parser should handle existing rows
- * when a unique key violation occurs during the insert. This can happen when inserting
- * data into an existing table with one or more primary keys or unique indexes.
- * The existingData method takes one of three options: XMLS_MODE_INSERT attempts
- * to always insert the data as a new row. In the event of a unique key violation,
- * the database will generate an error. XMLS_MODE_UPDATE attempts to update the
- * any existing rows with the new data based upon primary or unique key fields in
- * the schema. If the data row in the schema specifies no unique fields, the row
- * data will be inserted as a new row. XMLS_MODE_IGNORE specifies that any data rows
- * that would result in a unique key violation be ignored; no inserts or updates will
- * take place. For backward compatibility, the default setting is XMLS_MODE_INSERT,
- * but XMLS_MODE_UPDATE will generally be the most appropriate setting.
- *
- * @param int $mode XMLS_MODE_INSERT, XMLS_MODE_UPDATE, or XMLS_MODE_IGNORE
- * @return int current mode
- */
- function ExistingData( $mode = NULL ) {
- if( is_int( $mode ) ) {
- switch( $mode ) {
- case XMLS_MODE_UPDATE:
- $mode = XMLS_MODE_UPDATE;
- break;
- case XMLS_MODE_IGNORE:
- $mode = XMLS_MODE_IGNORE;
- break;
- case XMLS_MODE_INSERT:
- $mode = XMLS_MODE_INSERT;
- break;
- default:
- $mode = XMLS_EXISITNG_DATA;
- break;
- }
- $this->existingData = $mode;
- }
-
- return $this->existingData;
- }
-
- /**
- * Enables/disables inline SQL execution.
- *
- * Call this method to enable or disable inline execution of the schema. If the mode is set to TRUE (inline execution),
- * AXMLS applies the SQL to the database immediately as each schema entity is parsed. If the mode
- * is set to FALSE (post execution), AXMLS parses the entire schema and you will need to call adoSchema::ExecuteSchema()
- * to apply the schema to the database.
- *
- * @param bool $mode execute
- * @return bool current execution mode
- *
- * @see ParseSchema(), ExecuteSchema()
- */
- function ExecuteInline( $mode = NULL ) {
- if( is_bool( $mode ) ) {
- $this->executeInline = $mode;
- }
-
- return $this->executeInline;
- }
-
- /**
- * Enables/disables SQL continue on error.
- *
- * Call this method to enable or disable continuation of SQL execution if an error occurs.
- * If the mode is set to TRUE (continue), AXMLS will continue to apply SQL to the database, even if an error occurs.
- * If the mode is set to FALSE (halt), AXMLS will halt execution of generated sql if an error occurs, though parsing
- * of the schema will continue.
- *
- * @param bool $mode execute
- * @return bool current continueOnError mode
- *
- * @see addSQL(), ExecuteSchema()
- */
- function ContinueOnError( $mode = NULL ) {
- if( is_bool( $mode ) ) {
- $this->continueOnError = $mode;
- }
-
- return $this->continueOnError;
- }
-
- /**
- * Loads an XML schema from a file and converts it to SQL.
- *
- * Call this method to load the specified schema (see the DTD for the proper format) from
- * the filesystem and generate the SQL necessary to create the database
- * described. This method automatically converts the schema to the latest
- * axmls schema version.
- * @see ParseSchemaString()
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute
- */
- function ParseSchema( $filename, $returnSchema = FALSE ) {
- return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
- }
-
- /**
- * Loads an XML schema from a file and converts it to SQL.
- *
- * Call this method to load the specified schema directly from a file (see
- * the DTD for the proper format) and generate the SQL necessary to create
- * the database described by the schema. Use this method when you are dealing
- * with large schema files. Otherwise, ParseSchema() is faster.
- * This method does not automatically convert the schema to the latest axmls
- * schema version. You must convert the schema manually using either the
- * ConvertSchemaFile() or ConvertSchemaString() method.
- * @see ParseSchema()
- * @see ConvertSchemaFile()
- * @see ConvertSchemaString()
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- *
- * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString()
- * @see ParseSchema(), ParseSchemaString()
- */
- function ParseSchemaFile( $filename, $returnSchema = FALSE ) {
- // Open the file
- if( !($fp = fopen( $filename, 'r' )) ) {
- logMsg( 'Unable to open file' );
- return FALSE;
- }
-
- // do version detection here
- if( $this->SchemaFileVersion( $filename ) != $this->schemaVersion ) {
- logMsg( 'Invalid Schema Version' );
- return FALSE;
- }
-
- if( $returnSchema ) {
- $xmlstring = '';
- while( $data = fread( $fp, 4096 ) ) {
- $xmlstring .= $data . "\n";
- }
- return $xmlstring;
- }
-
- $this->success = 2;
-
- $xmlParser = $this->create_parser();
-
- // Process the file
- while( $data = fread( $fp, 4096 ) ) {
- if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) {
- die( sprintf(
- "XML error: %s at line %d",
- xml_error_string( xml_get_error_code( $xmlParser) ),
- xml_get_current_line_number( $xmlParser)
- ) );
- }
- }
-
- xml_parser_free( $xmlParser );
-
- return $this->sqlArray;
- }
-
- /**
- * Converts an XML schema string to SQL.
- *
- * Call this method to parse a string containing an XML schema (see the DTD for the proper format)
- * and generate the SQL necessary to create the database described by the schema.
- * @see ParseSchema()
- *
- * @param string $xmlstring XML schema string.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- */
- function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) {
- if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
- logMsg( 'Empty or Invalid Schema' );
- return FALSE;
- }
-
- // do version detection here
- if( $this->SchemaStringVersion( $xmlstring ) != $this->schemaVersion ) {
- logMsg( 'Invalid Schema Version' );
- return FALSE;
- }
-
- if( $returnSchema ) {
- return $xmlstring;
- }
-
- $this->success = 2;
-
- $xmlParser = $this->create_parser();
-
- if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) {
- die( sprintf(
- "XML error: %s at line %d",
- xml_error_string( xml_get_error_code( $xmlParser) ),
- xml_get_current_line_number( $xmlParser)
- ) );
- }
-
- xml_parser_free( $xmlParser );
-
- return $this->sqlArray;
- }
-
- /**
- * Loads an XML schema from a file and converts it to uninstallation SQL.
- *
- * Call this method to load the specified schema (see the DTD for the proper format) from
- * the filesystem and generate the SQL necessary to remove the database described.
- * @see RemoveSchemaString()
- *
- * @param string $file Name of XML schema file.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute
- */
- function RemoveSchema( $filename, $returnSchema = FALSE ) {
- return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
- }
-
- /**
- * Converts an XML schema string to uninstallation SQL.
- *
- * Call this method to parse a string containing an XML schema (see the DTD for the proper format)
- * and generate the SQL necessary to uninstall the database described by the schema.
- * @see RemoveSchema()
- *
- * @param string $schema XML schema string.
- * @param bool $returnSchema Return schema rather than parsing.
- * @return array Array of SQL queries, ready to execute.
- */
- function RemoveSchemaString( $schema, $returnSchema = FALSE ) {
-
- // grab current version
- if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
- return FALSE;
- }
-
- return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema );
- }
-
- /**
- * Applies the current XML schema to the database (post execution).
- *
- * Call this method to apply the current schema (generally created by calling
- * ParseSchema() or ParseSchemaString() ) to the database (creating the tables, indexes,
- * and executing other SQL specified in the schema) after parsing.
- * @see ParseSchema(), ParseSchemaString(), ExecuteInline()
- *
- * @param array $sqlArray Array of SQL statements that will be applied rather than
- * the current schema.
- * @param boolean $continueOnErr Continue to apply the schema even if an error occurs.
- * @returns integer 0 if failure, 1 if errors, 2 if successful.
- */
- function ExecuteSchema( $sqlArray = NULL, $continueOnErr = NULL ) {
- if( !is_bool( $continueOnErr ) ) {
- $continueOnErr = $this->ContinueOnError();
- }
-
- if( !isset( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
-
- if( !is_array( $sqlArray ) ) {
- $this->success = 0;
- } else {
- $this->success = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr );
- }
-
- return $this->success;
- }
-
- /**
- * Returns the current SQL array.
- *
- * Call this method to fetch the array of SQL queries resulting from
- * ParseSchema() or ParseSchemaString().
- *
- * @param string $format Format: HTML, TEXT, or NONE (PHP array)
- * @return array Array of SQL statements or FALSE if an error occurs
- */
- function PrintSQL( $format = 'NONE' ) {
- $sqlArray = null;
- return $this->getSQL( $format, $sqlArray );
- }
-
- /**
- * Saves the current SQL array to the local filesystem as a list of SQL queries.
- *
- * Call this method to save the array of SQL queries (generally resulting from a
- * parsed XML schema) to the filesystem.
- *
- * @param string $filename Path and name where the file should be saved.
- * @return boolean TRUE if save is successful, else FALSE.
- */
- function SaveSQL( $filename = './schema.sql' ) {
-
- if( !isset( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
- if( !isset( $sqlArray ) ) {
- return FALSE;
- }
-
- $fp = fopen( $filename, "w" );
-
- foreach( $sqlArray as $key => $query ) {
- fwrite( $fp, $query . ";\n" );
- }
- fclose( $fp );
- }
-
- /**
- * Create an xml parser
- *
- * @return object PHP XML parser object
- *
- * @access private
- */
- function &create_parser() {
- // Create the parser
- $xmlParser = xml_parser_create();
- xml_set_object( $xmlParser, $this );
-
- // Initialize the XML callback functions
- xml_set_element_handler( $xmlParser, '_tag_open', '_tag_close' );
- xml_set_character_data_handler( $xmlParser, '_tag_cdata' );
-
- return $xmlParser;
- }
-
- /**
- * XML Callback to process start elements
- *
- * @access private
- */
- function _tag_open( &$parser, $tag, $attributes ) {
- switch( strtoupper( $tag ) ) {
- case 'TABLE':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- $this->obj = new dbTable( $this, $attributes );
- xml_set_object( $parser, $this->obj );
- }
- break;
- case 'SQL':
- if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
- $this->obj = new dbQuerySet( $this, $attributes );
- xml_set_object( $parser, $this->obj );
- }
- break;
- default:
- // print_r( array( $tag, $attributes ) );
- }
-
- }
-
- /**
- * XML Callback to process CDATA elements
- *
- * @access private
- */
- function _tag_cdata( &$parser, $cdata ) {
- }
-
- /**
- * XML Callback to process end elements
- *
- * @access private
- * @internal
- */
- function _tag_close( &$parser, $tag ) {
-
- }
-
- /**
- * Converts an XML schema string to the specified DTD version.
- *
- * Call this method to convert a string containing an XML schema to a different AXMLS
- * DTD version. For instance, to convert a schema created for an pre-1.0 version for
- * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
- * parameter is specified, the schema will be converted to the current DTD version.
- * If the newFile parameter is provided, the converted schema will be written to the specified
- * file.
- * @see ConvertSchemaFile()
- *
- * @param string $schema String containing XML schema that will be converted.
- * @param string $newVersion DTD version to convert to.
- * @param string $newFile File name of (converted) output file.
- * @return string Converted XML schema or FALSE if an error occurs.
- */
- function ConvertSchemaString( $schema, $newVersion = NULL, $newFile = NULL ) {
-
- // grab current version
- if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
- return FALSE;
- }
-
- if( !isset ($newVersion) ) {
- $newVersion = $this->schemaVersion;
- }
-
- if( $version == $newVersion ) {
- $result = $schema;
- } else {
- $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion);
- }
-
- if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
- fwrite( $fp, $result );
- fclose( $fp );
- }
-
- return $result;
- }
-
- /*
- // compat for pre-4.3 - jlim
- function _file_get_contents($path)
- {
- if (function_exists('file_get_contents')) return file_get_contents($path);
- return join('',file($path));
- }*/
-
- /**
- * Converts an XML schema file to the specified DTD version.
- *
- * Call this method to convert the specified XML schema file to a different AXMLS
- * DTD version. For instance, to convert a schema created for an pre-1.0 version for
- * AXMLS (DTD version 0.1) to a newer version of the DTD (e.g. 0.2). If no DTD version
- * parameter is specified, the schema will be converted to the current DTD version.
- * If the newFile parameter is provided, the converted schema will be written to the specified
- * file.
- * @see ConvertSchemaString()
- *
- * @param string $filename Name of XML schema file that will be converted.
- * @param string $newVersion DTD version to convert to.
- * @param string $newFile File name of (converted) output file.
- * @return string Converted XML schema or FALSE if an error occurs.
- */
- function ConvertSchemaFile( $filename, $newVersion = NULL, $newFile = NULL ) {
-
- // grab current version
- if( !( $version = $this->SchemaFileVersion( $filename ) ) ) {
- return FALSE;
- }
-
- if( !isset ($newVersion) ) {
- $newVersion = $this->schemaVersion;
- }
-
- if( $version == $newVersion ) {
- $result = _file_get_contents( $filename );
-
- // remove unicode BOM if present
- if( substr( $result, 0, 3 ) == sprintf( '%c%c%c', 239, 187, 191 ) ) {
- $result = substr( $result, 3 );
- }
- } else {
- $result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' );
- }
-
- if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
- fwrite( $fp, $result );
- fclose( $fp );
- }
-
- return $result;
- }
-
- function TransformSchema( $schema, $xsl, $schematype='string' )
- {
- // Fail if XSLT extension is not available
- if( ! function_exists( 'xslt_create' ) ) {
- return FALSE;
- }
-
- $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl';
-
- // look for xsl
- if( !is_readable( $xsl_file ) ) {
- return FALSE;
- }
-
- switch( $schematype )
- {
- case 'file':
- if( !is_readable( $schema ) ) {
- return FALSE;
- }
-
- $schema = _file_get_contents( $schema );
- break;
- case 'string':
- default:
- if( !is_string( $schema ) ) {
- return FALSE;
- }
- }
-
- $arguments = array (
- '/_xml' => $schema,
- '/_xsl' => _file_get_contents( $xsl_file )
- );
-
- // create an XSLT processor
- $xh = xslt_create ();
-
- // set error handler
- xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler'));
-
- // process the schema
- $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
-
- xslt_free ($xh);
-
- return $result;
- }
-
- /**
- * Processes XSLT transformation errors
- *
- * @param object $parser XML parser object
- * @param integer $errno Error number
- * @param integer $level Error level
- * @param array $fields Error information fields
- *
- * @access private
- */
- function xslt_error_handler( $parser, $errno, $level, $fields ) {
- if( is_array( $fields ) ) {
- $msg = array(
- 'Message Type' => ucfirst( $fields['msgtype'] ),
- 'Message Code' => $fields['code'],
- 'Message' => $fields['msg'],
- 'Error Number' => $errno,
- 'Level' => $level
- );
-
- switch( $fields['URI'] ) {
- case 'arg:/_xml':
- $msg['Input'] = 'XML';
- break;
- case 'arg:/_xsl':
- $msg['Input'] = 'XSL';
- break;
- default:
- $msg['Input'] = $fields['URI'];
- }
-
- $msg['Line'] = $fields['line'];
- } else {
- $msg = array(
- 'Message Type' => 'Error',
- 'Error Number' => $errno,
- 'Level' => $level,
- 'Fields' => var_export( $fields, TRUE )
- );
- }
-
- $error_details = $msg['Message Type'] . ' in XSLT Transformation' . "\n"
- . '<table>' . "\n";
-
- foreach( $msg as $label => $details ) {
- $error_details .= '<tr><td><b>' . $label . ': </b></td><td>' . htmlentities( $details ) . '</td></tr>' . "\n";
- }
-
- $error_details .= '</table>';
-
- trigger_error( $error_details, E_USER_ERROR );
- }
-
- /**
- * Returns the AXMLS Schema Version of the requested XML schema file.
- *
- * Call this method to obtain the AXMLS DTD version of the requested XML schema file.
- * @see SchemaStringVersion()
- *
- * @param string $filename AXMLS schema file
- * @return string Schema version number or FALSE on error
- */
- function SchemaFileVersion( $filename ) {
- // Open the file
- if( !($fp = fopen( $filename, 'r' )) ) {
- // die( 'Unable to open file' );
- return FALSE;
- }
-
- // Process the file
- while( $data = fread( $fp, 4096 ) ) {
- if( preg_match( $this->versionRegex, $data, $matches ) ) {
- return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
- }
- }
-
- return FALSE;
- }
-
- /**
- * Returns the AXMLS Schema Version of the provided XML schema string.
- *
- * Call this method to obtain the AXMLS DTD version of the provided XML schema string.
- * @see SchemaFileVersion()
- *
- * @param string $xmlstring XML schema string
- * @return string Schema version number or FALSE on error
- */
- function SchemaStringVersion( $xmlstring ) {
- if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
- return FALSE;
- }
-
- if( preg_match( $this->versionRegex, $xmlstring, $matches ) ) {
- return !empty( $matches[2] ) ? $matches[2] : XMLS_DEFAULT_SCHEMA_VERSION;
- }
-
- return FALSE;
- }
-
- /**
- * Extracts an XML schema from an existing database.
- *
- * Call this method to create an XML schema string from an existing database.
- * If the data parameter is set to TRUE, AXMLS will include the data from the database
- * in the schema.
- *
- * @param boolean $data Include data in schema dump
- * @indent string indentation to use
- * @prefix string extract only tables with given prefix
- * @stripprefix strip prefix string when storing in XML schema
- * @return string Generated XML schema
- */
- function ExtractSchema( $data = FALSE, $indent = ' ', $prefix = '' , $stripprefix=false) {
- $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM );
-
- $schema = '<?xml version="1.0"?>' . "\n"
- . '<schema version="' . $this->schemaVersion . '">' . "\n";
-
- if( is_array( $tables = $this->db->MetaTables( 'TABLES' , ($prefix) ? $prefix.'%' : '') ) ) {
- foreach( $tables as $table ) {
- if ($stripprefix) $table = str_replace(str_replace('\\_', '_', $pfx ), '', $table);
- $schema .= $indent . '<table name="' . htmlentities( $table ) . '">' . "\n";
-
- // grab details from database
- $rs = $this->db->Execute( 'SELECT * FROM ' . $table . ' WHERE -1' );
- $fields = $this->db->MetaColumns( $table );
- $indexes = $this->db->MetaIndexes( $table );
-
- if( is_array( $fields ) ) {
- foreach( $fields as $details ) {
- $extra = '';
- $content = array();
-
- if( isset($details->max_length) && $details->max_length > 0 ) {
- $extra .= ' size="' . $details->max_length . '"';
- }
-
- if( isset($details->primary_key) && $details->primary_key ) {
- $content[] = '<KEY/>';
- } elseif( isset($details->not_null) && $details->not_null ) {
- $content[] = '<NOTNULL/>';
- }
-
- if( isset($details->has_default) && $details->has_default ) {
- $content[] = '<DEFAULT value="' . htmlentities( $details->default_value ) . '"/>';
- }
-
- if( isset($details->auto_increment) && $details->auto_increment ) {
- $content[] = '<AUTOINCREMENT/>';
- }
-
- if( isset($details->unsigned) && $details->unsigned ) {
- $content[] = '<UNSIGNED/>';
- }
-
- // this stops the creation of 'R' columns,
- // AUTOINCREMENT is used to create auto columns
- $details->primary_key = 0;
- $type = $rs->MetaType( $details );
-
- $schema .= str_repeat( $indent, 2 ) . '<field name="' . htmlentities( $details->name ) . '" type="' . $type . '"' . $extra;
-
- if( !empty( $content ) ) {
- $schema .= ">\n" . str_repeat( $indent, 3 )
- . implode( "\n" . str_repeat( $indent, 3 ), $content ) . "\n"
- . str_repeat( $indent, 2 ) . '</field>' . "\n";
- } else {
- $schema .= "/>\n";
- }
- }
- }
-
- if( is_array( $indexes ) ) {
- foreach( $indexes as $index => $details ) {
- $schema .= str_repeat( $indent, 2 ) . '<index name="' . $index . '">' . "\n";
-
- if( $details['unique'] ) {
- $schema .= str_repeat( $indent, 3 ) . '<UNIQUE/>' . "\n";
- }
-
- foreach( $details['columns'] as $column ) {
- $schema .= str_repeat( $indent, 3 ) . '<col>' . htmlentities( $column ) . '</col>' . "\n";
- }
-
- $schema .= str_repeat( $indent, 2 ) . '</index>' . "\n";
- }
- }
-
- if( $data ) {
- $rs = $this->db->Execute( 'SELECT * FROM ' . $table );
-
- if( is_object( $rs ) && !$rs->EOF ) {
- $schema .= str_repeat( $indent, 2 ) . "<data>\n";
-
- while( $row = $rs->FetchRow() ) {
- foreach( $row as $key => $val ) {
- if ( $val != htmlentities( $val ) ) {
- $row[$key] = '<![CDATA[' . $val . ']]>';
- }
- }
-
- $schema .= str_repeat( $indent, 3 ) . '<row><f>' . implode( '</f><f>', $row ) . "</f></row>\n";
- }
-
- $schema .= str_repeat( $indent, 2 ) . "</data>\n";
- }
- }
-
- $schema .= $indent . "</table>\n";
- }
- }
-
- $this->db->SetFetchMode( $old_mode );
-
- $schema .= '</schema>';
- return $schema;
- }
-
- /**
- * Sets a prefix for database objects
- *
- * Call this method to set a standard prefix that will be prepended to all database tables
- * and indices when the schema is parsed. Calling setPrefix with no arguments clears the prefix.
- *
- * @param string $prefix Prefix that will be prepended.
- * @param boolean $underscore If TRUE, automatically append an underscore character to the prefix.
- * @return boolean TRUE if successful, else FALSE
- */
- function SetPrefix( $prefix = '', $underscore = TRUE ) {
- switch( TRUE ) {
- // clear prefix
- case empty( $prefix ):
- logMsg( 'Cleared prefix' );
- $this->objectPrefix = '';
- return TRUE;
- // prefix too long
- case strlen( $prefix ) > XMLS_PREFIX_MAXLEN:
- // prefix contains invalid characters
- case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ):
- logMsg( 'Invalid prefix: ' . $prefix );
- return FALSE;
- }
-
- if( $underscore AND substr( $prefix, -1 ) != '_' ) {
- $prefix .= '_';
- }
-
- // prefix valid
- logMsg( 'Set prefix: ' . $prefix );
- $this->objectPrefix = $prefix;
- return TRUE;
- }
-
- /**
- * Returns an object name with the current prefix prepended.
- *
- * @param string $name Name
- * @return string Prefixed name
- *
- * @access private
- */
- function prefix( $name = '' ) {
- // if prefix is set
- if( !empty( $this->objectPrefix ) ) {
- // Prepend the object prefix to the table name
- // prepend after quote if used
- return preg_replace( '/^(`?)(.+)$/', '$1' . $this->objectPrefix . '$2', $name );
- }
-
- // No prefix set. Use name provided.
- return $name;
- }
-
- /**
- * Checks if element references a specific platform
- *
- * @param string $platform Requested platform
- * @returns boolean TRUE if platform check succeeds
- *
- * @access private
- */
- function supportedPlatform( $platform = NULL ) {
- if( !empty( $platform ) ) {
- $regex = '/(^|\|)' . $this->db->databaseType . '(\||$)/i';
-
- if( preg_match( '/^- /', $platform ) ) {
- if (preg_match ( $regex, substr( $platform, 2 ) ) ) {
- logMsg( 'Platform ' . $platform . ' is NOT supported' );
- return FALSE;
- }
- } else {
- if( !preg_match ( $regex, $platform ) ) {
- logMsg( 'Platform ' . $platform . ' is NOT supported' );
- return FALSE;
- }
- }
- }
-
- logMsg( 'Platform ' . $platform . ' is supported' );
- return TRUE;
- }
-
- /**
- * Clears the array of generated SQL.
- *
- * @access private
- */
- function clearSQL() {
- $this->sqlArray = array();
- }
-
- /**
- * Adds SQL into the SQL array.
- *
- * @param mixed $sql SQL to Add
- * @return boolean TRUE if successful, else FALSE.
- *
- * @access private
- */
- function addSQL( $sql = NULL ) {
- if( is_array( $sql ) ) {
- foreach( $sql as $line ) {
- $this->addSQL( $line );
- }
-
- return TRUE;
- }
-
- if( is_string( $sql ) ) {
- $this->sqlArray[] = $sql;
-
- // if executeInline is enabled, and either no errors have occurred or continueOnError is enabled, execute SQL.
- if( $this->ExecuteInline() && ( $this->success == 2 || $this->ContinueOnError() ) ) {
- $saved = $this->db->debug;
- $this->db->debug = $this->debug;
- $ok = $this->db->Execute( $sql );
- $this->db->debug = $saved;
-
- if( !$ok ) {
- if( $this->debug ) {
- ADOConnection::outp( $this->db->ErrorMsg() );
- }
-
- $this->success = 1;
- }
- }
-
- return TRUE;
- }
-
- return FALSE;
- }
-
- /**
- * Gets the SQL array in the specified format.
- *
- * @param string $format Format
- * @return mixed SQL
- *
- * @access private
- */
- function getSQL( $format = NULL, $sqlArray = NULL ) {
- if( !is_array( $sqlArray ) ) {
- $sqlArray = $this->sqlArray;
- }
-
- if( !is_array( $sqlArray ) ) {
- return FALSE;
- }
-
- switch( strtolower( $format ) ) {
- case 'string':
- case 'text':
- return !empty( $sqlArray ) ? implode( ";\n\n", $sqlArray ) . ';' : '';
- case'html':
- return !empty( $sqlArray ) ? nl2br( htmlentities( implode( ";\n\n", $sqlArray ) . ';' ) ) : '';
- }
-
- return $this->sqlArray;
- }
-
- /**
- * Destroys an adoSchema object.
- *
- * Call this method to clean up after an adoSchema object that is no longer in use.
- * @deprecated adoSchema now cleans up automatically.
- */
- function Destroy() {
- set_magic_quotes_runtime( $this->mgq );
- unset( $this );
- }
-}
-
-/**
-* Message logging function
-*
-* @access private
-*/
-function logMsg( $msg, $title = NULL, $force = FALSE ) {
- if( XMLS_DEBUG or $force ) {
- echo '<pre>';
-
- if( isset( $title ) ) {
- echo '<h3>' . htmlentities( $title ) . '</h3>';
- }
-
- if( @is_object( $this ) ) {
- echo '[' . get_class( $this ) . '] ';
- }
-
- print_r( $msg );
-
- echo '</pre>';
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/adodb.inc.php b/lib/adodb/adodb.inc.php
deleted file mode 100644
index 351d505..0000000
--- a/lib/adodb/adodb.inc.php
+++ /dev/null
@@ -1,4231 +0,0 @@
-<?php
-/*
- * Set tabs to 4 for best viewing.
- *
- * Latest version is available at http://adodb.sourceforge.net
- *
- * This is the main include file for ADOdb.
- * Database specific drivers are stored in the adodb/drivers/adodb-*.inc.php
- *
- * The ADOdb files are formatted so that doxygen can be used to generate documentation.
- * Doxygen is a documentation generation tool and can be downloaded from http://doxygen.org/
- */
-
-/**
- \mainpage
-
- @version V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
-
- Released under both BSD license and Lesser GPL library license. You can choose which license
- you prefer.
-
- PHP's database access functions are not standardised. This creates a need for a database
- class library to hide the differences between the different database API's (encapsulate
- the differences) so we can easily switch databases.
-
- We currently support MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, DB2,
- Informix, PostgreSQL, FrontBase, Interbase (Firebird and Borland variants), Foxpro, Access,
- ADO, SAP DB, SQLite and ODBC. We have had successful reports of connecting to Progress and
- other databases via ODBC.
-
- Latest Download at http://adodb.sourceforge.net/
-
- */
-
- if (!defined('_ADODB_LAYER')) {
- define('_ADODB_LAYER',1);
-
- //==============================================================================================
- // CONSTANT DEFINITIONS
- //==============================================================================================
-
-
- /**
- * Set ADODB_DIR to the directory where this file resides...
- * This constant was formerly called $ADODB_RootPath
- */
- if (!defined('ADODB_DIR')) define('ADODB_DIR',dirname(__FILE__));
-
- //==============================================================================================
- // GLOBAL VARIABLES
- //==============================================================================================
-
- GLOBAL
- $ADODB_vers, // database version
- $ADODB_COUNTRECS, // count number of records returned - slows down query
- $ADODB_CACHE_DIR, // directory to cache recordsets
- $ADODB_EXTENSION, // ADODB extension installed
- $ADODB_COMPAT_FETCH, // If $ADODB_COUNTRECS and this is true, $rs->fields is available on EOF
- $ADODB_FETCH_MODE, // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default...
- $ADODB_QUOTE_FIELDNAMES; // Allows you to force quotes (backticks) around field names in queries generated by getinsertsql and getupdatesql.
-
- //==============================================================================================
- // GLOBAL SETUP
- //==============================================================================================
-
- $ADODB_EXTENSION = defined('ADODB_EXTENSION');
-
- //********************************************************//
- /*
- Controls $ADODB_FORCE_TYPE mode. Default is ADODB_FORCE_VALUE (3).
- Used in GetUpdateSql and GetInsertSql functions. Thx to Niko, nuko#mbnet.fi
-
- 0 = ignore empty fields. All empty fields in array are ignored.
- 1 = force null. All empty, php null and string 'null' fields are changed to sql NULL values.
- 2 = force empty. All empty, php null and string 'null' fields are changed to sql empty '' or 0 values.
- 3 = force value. Value is left as it is. Php null and string 'null' are set to sql NULL values and empty fields '' are set to empty '' sql values.
- */
- define('ADODB_FORCE_IGNORE',0);
- define('ADODB_FORCE_NULL',1);
- define('ADODB_FORCE_EMPTY',2);
- define('ADODB_FORCE_VALUE',3);
- //********************************************************//
-
-
- if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
-
- define('ADODB_BAD_RS','<p>Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true;</p>');
-
- // allow [ ] @ ` " and . in table names
- define('ADODB_TABLE_REGEX','([]0-9a-z_\:\"\`\.\@\[-]*)');
-
- // prefetching used by oracle
- if (!defined('ADODB_PREFETCH_ROWS')) define('ADODB_PREFETCH_ROWS',10);
-
-
- /*
- Controls ADODB_FETCH_ASSOC field-name case. Default is 2, use native case-names.
- This currently works only with mssql, odbc, oci8po and ibase derived drivers.
-
- 0 = assoc lowercase field names. $rs->fields['orderid']
- 1 = assoc uppercase field names. $rs->fields['ORDERID']
- 2 = use native-case field names. $rs->fields['OrderID']
- */
-
- define('ADODB_FETCH_DEFAULT',0);
- define('ADODB_FETCH_NUM',1);
- define('ADODB_FETCH_ASSOC',2);
- define('ADODB_FETCH_BOTH',3);
-
- if (!defined('TIMESTAMP_FIRST_YEAR')) define('TIMESTAMP_FIRST_YEAR',100);
-
- // PHP's version scheme makes converting to numbers difficult - workaround
- $_adodb_ver = (float) PHP_VERSION;
- if ($_adodb_ver >= 5.2) {
- define('ADODB_PHPVER',0x5200);
- } else if ($_adodb_ver >= 5.0) {
- define('ADODB_PHPVER',0x5000);
- } else if ($_adodb_ver > 4.299999) { # 4.3
- define('ADODB_PHPVER',0x4300);
- } else if ($_adodb_ver > 4.199999) { # 4.2
- define('ADODB_PHPVER',0x4200);
- } else if (strnatcmp(PHP_VERSION,'4.0.5')>=0) {
- define('ADODB_PHPVER',0x4050);
- } else {
- define('ADODB_PHPVER',0x4000);
- }
- }
-
- //if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
-
-
- /**
- Accepts $src and $dest arrays, replacing string $data
- */
- function ADODB_str_replace($src, $dest, $data)
- {
- if (ADODB_PHPVER >= 0x4050) return str_replace($src,$dest,$data);
-
- $s = reset($src);
- $d = reset($dest);
- while ($s !== false) {
- $data = str_replace($s,$d,$data);
- $s = next($src);
- $d = next($dest);
- }
- return $data;
- }
-
- function ADODB_Setup()
- {
- GLOBAL
- $ADODB_vers, // database version
- $ADODB_COUNTRECS, // count number of records returned - slows down query
- $ADODB_CACHE_DIR, // directory to cache recordsets
- $ADODB_FETCH_MODE,
- $ADODB_FORCE_TYPE,
- $ADODB_QUOTE_FIELDNAMES;
-
- $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT;
- $ADODB_FORCE_TYPE = ADODB_FORCE_VALUE;
-
-
- if (!isset($ADODB_CACHE_DIR)) {
- $ADODB_CACHE_DIR = '/tmp'; //(isset($_ENV['TMP'])) ? $_ENV['TMP'] : '/tmp';
- } else {
- // do not accept url based paths, eg. http:/ or ftp:/
- if (strpos($ADODB_CACHE_DIR,'://') !== false)
- die("Illegal path http:// or ftp://");
- }
-
-
- // Initialize random number generator for randomizing cache flushes
- // -- note Since PHP 4.2.0, the seed becomes optional and defaults to a random value if omitted.
- srand(((double)microtime())*1000000);
-
- /**
- * ADODB version as a string.
- */
- $ADODB_vers = 'V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.';
-
- /**
- * Determines whether recordset->RecordCount() is used.
- * Set to false for highest performance -- RecordCount() will always return -1 then
- * for databases that provide "virtual" recordcounts...
- */
- if (!isset($ADODB_COUNTRECS)) $ADODB_COUNTRECS = true;
- }
-
-
- //==============================================================================================
- // CHANGE NOTHING BELOW UNLESS YOU ARE DESIGNING ADODB
- //==============================================================================================
-
- ADODB_Setup();
-
- //==============================================================================================
- // CLASS ADOFieldObject
- //==============================================================================================
- /**
- * Helper class for FetchFields -- holds info on a column
- */
- class ADOFieldObject {
- var $name = '';
- var $max_length=0;
- var $type="";
-/*
- // additional fields by dannym... (danny_milo@yahoo.com)
- var $not_null = false;
- // actually, this has already been built-in in the postgres, fbsql AND mysql module? ^-^
- // so we can as well make not_null standard (leaving it at "false" does not harm anyways)
-
- var $has_default = false; // this one I have done only in mysql and postgres for now ...
- // others to come (dannym)
- var $default_value; // default, if any, and supported. Check has_default first.
-*/
- }
-
-
-
- function ADODB_TransMonitor($dbms, $fn, $errno, $errmsg, $p1, $p2, &$thisConnection)
- {
- //print "Errorno ($fn errno=$errno m=$errmsg) ";
- $thisConnection->_transOK = false;
- if ($thisConnection->_oldRaiseFn) {
- $fn = $thisConnection->_oldRaiseFn;
- $fn($dbms, $fn, $errno, $errmsg, $p1, $p2,$thisConnection);
- }
- }
-
- //==============================================================================================
- // CLASS ADOConnection
- //==============================================================================================
-
- /**
- * Connection object. For connecting to databases, and executing queries.
- */
- class ADOConnection {
- //
- // PUBLIC VARS
- //
- var $dataProvider = 'native';
- var $databaseType = ''; /// RDBMS currently in use, eg. odbc, mysql, mssql
- var $database = ''; /// Name of database to be used.
- var $host = ''; /// The hostname of the database server
- var $user = ''; /// The username which is used to connect to the database server.
- var $password = ''; /// Password for the username. For security, we no longer store it.
- var $debug = false; /// if set to true will output sql statements
- var $maxblobsize = 262144; /// maximum size of blobs or large text fields (262144 = 256K)-- some db's die otherwise like foxpro
- var $concat_operator = '+'; /// default concat operator -- change to || for Oracle/Interbase
- var $substr = 'substr'; /// substring operator
- var $length = 'length'; /// string length ofperator
- var $random = 'rand()'; /// random function
- var $upperCase = 'upper'; /// uppercase function
- 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 A'"; /// used by DBTimeStamp as the default timestamp fmt.
- var $true = '1'; /// string that represents TRUE for a database
- var $false = '0'; /// string that represents FALSE for a database
- var $replaceQuote = "\\'"; /// string to use to replace quotes
- var $nameQuote = '"'; /// string to use to quote identifiers and names
- var $charSet=false; /// character set to use - only for interbase, postgres and oci8
- var $metaDatabasesSQL = '';
- var $metaTablesSQL = '';
- var $uniqueOrderBy = false; /// All order by columns have to be unique
- var $emptyDate = '&nbsp;';
- var $emptyTimeStamp = '&nbsp;';
- var $lastInsID = false;
- //--
- var $hasInsertID = false; /// supports autoincrement ID?
- var $hasAffectedRows = false; /// supports affected rows for update/delete?
- var $hasTop = false; /// support mssql/access SELECT TOP 10 * FROM TABLE
- var $hasLimit = false; /// support pgsql/mysql SELECT * FROM TABLE LIMIT 10
- var $readOnly = false; /// this is a readonly database - used by phpLens
- var $hasMoveFirst = false; /// has ability to run MoveFirst(), scrolling backwards
- var $hasGenID = false; /// can generate sequences using GenID();
- var $hasTransactions = true; /// has transactions
- //--
- var $genID = 0; /// sequence id used by GenID();
- var $raiseErrorFn = false; /// error function to call
- var $isoDates = false; /// accepts dates in ISO format
- var $cacheSecs = 3600; /// cache for 1 hour
-
- // memcache
- var $memCache = false; /// should we use memCache instead of caching in files
- var $memCacheHost; /// memCache host
- var $memCachePort = 11211; /// memCache port
- var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
-
- var $sysDate = false; /// name of function that returns the current date
- var $sysTimeStamp = false; /// name of function that returns the current timestamp
- var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets
-
- var $noNullStrings = false; /// oracle specific stuff - if true ensures that '' is converted to ' '
- var $numCacheHits = 0;
- var $numCacheMisses = 0;
- var $pageExecuteCountRows = true;
- var $uniqueSort = false; /// indicates that all fields in order by must be unique
- var $leftOuter = false; /// operator to use for left outer join in WHERE clause
- var $rightOuter = false; /// operator to use for right outer join in WHERE clause
- var $ansiOuter = false; /// whether ansi outer join syntax supported
- var $autoRollback = false; // autoRollback on PConnect().
- var $poorAffectedRows = false; // affectedRows not working or unreliable
-
- var $fnExecute = false;
- var $fnCacheExecute = false;
- var $blobEncodeType = false; // false=not required, 'I'=encode to integer, 'C'=encode to char
- var $rsPrefix = "ADORecordSet_";
-
- var $autoCommit = true; /// do not modify this yourself - actually private
- var $transOff = 0; /// temporarily disable transactions
- var $transCnt = 0; /// count of nested transactions
-
- var $fetchMode=false;
-
- var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null
- //
- // PRIVATE VARS
- //
- var $_oldRaiseFn = false;
- var $_transOK = null;
- var $_connectionID = false; /// The returned link identifier whenever a successful database connection is made.
- var $_errorMsg = false; /// A variable which was used to keep the returned last error message. The value will
- /// then returned by the errorMsg() function
- var $_errorCode = false; /// Last error code, not guaranteed to be used - only by oci8
- var $_queryID = false; /// This variable keeps the last created result link identifier
-
- var $_isPersistentConnection = false; /// A boolean variable to state whether its a persistent connection or normal connection. */
- var $_bindInputArray = false; /// set to true if ADOConnection.Execute() permits binding of array parameters.
- var $_evalAll = false;
- var $_affected = false;
- var $_logsql = false;
- var $_transmode = ''; // transaction mode
-
-
-
- /**
- * Constructor
- */
- function ADOConnection()
- {
- die('Virtual Class -- cannot instantiate');
- }
-
- function Version()
- {
- global $ADODB_vers;
-
- return (float) substr($ADODB_vers,1);
- }
-
- /**
- Get server version info...
-
- @returns An array with 2 elements: $arr['string'] is the description string,
- and $arr[version] is the version (also a string).
- */
- function ServerInfo()
- {
- return array('description' => '', 'version' => '');
- }
-
- function IsConnected()
- {
- return !empty($this->_connectionID);
- }
-
- function _findvers($str)
- {
- if (preg_match('/([0-9]+\.([0-9\.])+)/',$str, $arr)) return $arr[1];
- else return '';
- }
-
- /**
- * All error messages go through this bottleneck function.
- * You can define your own handler by defining the function name in ADODB_OUTP.
- */
- function outp($msg,$newline=true)
- {
- global $ADODB_FLUSH,$ADODB_OUTP;
-
- if (defined('ADODB_OUTP')) {
- $fn = ADODB_OUTP;
- $fn($msg,$newline);
- return;
- } else if (isset($ADODB_OUTP)) {
- $fn = $ADODB_OUTP;
- $fn($msg,$newline);
- return;
- }
-
- if ($newline) $msg .= "<br>\n";
-
- if (isset($_SERVER['HTTP_USER_AGENT']) || !$newline) echo $msg;
- else echo strip_tags($msg);
-
-
- if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan
-
- }
-
- function Time()
- {
- $rs =& $this->_Execute("select $this->sysTimeStamp");
- if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
-
- return false;
- }
-
- /**
- * Connect to database
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- * @param [forceNew] force new connection
- *
- * @return true or false
- */
- function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
- {
- if ($argHostname != "") $this->host = $argHostname;
- if ($argUsername != "") $this->user = $argUsername;
- if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons
- if ($argDatabaseName != "") $this->database = $argDatabaseName;
-
- $this->_isPersistentConnection = false;
- if ($forceNew) {
- if ($rez=$this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
- } else {
- if ($rez=$this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
- }
- if (isset($rez)) {
- $err = $this->ErrorMsg();
- if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
- $ret = false;
- } else {
- $err = "Missing extension for ".$this->dataProvider;
- $ret = 0;
- }
- if ($fn = $this->raiseErrorFn)
- $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
-
-
- $this->_connectionID = false;
- if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
- return $ret;
- }
-
- function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
- }
-
-
- /**
- * Always force a new connection to database - currently only works with oracle
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- *
- * @return true or false
- */
- function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
- {
- return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true);
- }
-
- /**
- * Establish persistent connect to database
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- *
- * @return return true or false
- */
- function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
- {
- if (defined('ADODB_NEVER_PERSIST'))
- return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
-
- if ($argHostname != "") $this->host = $argHostname;
- if ($argUsername != "") $this->user = $argUsername;
- if ($argPassword != "") $this->password = $argPassword;
- if ($argDatabaseName != "") $this->database = $argDatabaseName;
-
- $this->_isPersistentConnection = true;
- if ($rez = $this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
- if (isset($rez)) {
- $err = $this->ErrorMsg();
- if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
- $ret = false;
- } else {
- $err = "Missing extension for ".$this->dataProvider;
- $ret = 0;
- }
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
- }
-
- $this->_connectionID = false;
- if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
- return $ret;
- }
-
- // Format date column in sql string given an input format that understands Y M D
- function SQLDate($fmt, $col=false)
- {
- if (!$col) $col = $this->sysDate;
- return $col; // child class implement
- }
-
- /**
- * Should prepare the sql statement and return the stmt resource.
- * For databases that do not support this, we return the $sql. To ensure
- * compatibility with databases that do not support prepare:
- *
- * $stmt = $db->Prepare("insert into table (id, name) values (?,?)");
- * $db->Execute($stmt,array(1,'Jill')) or die('insert failed');
- * $db->Execute($stmt,array(2,'Joe')) or die('insert failed');
- *
- * @param sql SQL to send to database
- *
- * @return return FALSE, or the prepared statement, or the original sql if
- * if the database does not support prepare.
- *
- */
- function Prepare($sql)
- {
- return $sql;
- }
-
- /**
- * Some databases, eg. mssql require a different function for preparing
- * stored procedures. So we cannot use Prepare().
- *
- * Should prepare the stored procedure and return the stmt resource.
- * For databases that do not support this, we return the $sql. To ensure
- * compatibility with databases that do not support prepare:
- *
- * @param sql SQL to send to database
- *
- * @return return FALSE, or the prepared statement, or the original sql if
- * if the database does not support prepare.
- *
- */
- function PrepareSP($sql,$param=true)
- {
- return $this->Prepare($sql,$param);
- }
-
- /**
- * PEAR DB Compat
- */
- function Quote($s)
- {
- return $this->qstr($s,false);
- }
-
- /**
- Requested by "Karsten Dambekalns" <k.dambekalns@fishfarm.de>
- */
- function QMagic($s)
- {
- return $this->qstr($s,get_magic_quotes_gpc());
- }
-
- function q(&$s)
- {
- #if (!empty($this->qNull)) if ($s == 'null') return $s;
- $s = $this->qstr($s,false);
- }
-
- /**
- * PEAR DB Compat - do not use internally.
- */
- function ErrorNative()
- {
- return $this->ErrorNo();
- }
-
-
- /**
- * PEAR DB Compat - do not use internally.
- */
- function nextId($seq_name)
- {
- return $this->GenID($seq_name);
- }
-
- /**
- * Lock a row, will escalate and lock the table if row locking not supported
- * will normally free the lock at the end of the transaction
- *
- * @param $table name of table to lock
- * @param $where where clause to use, eg: "WHERE row=12". If left empty, will escalate to table lock
- */
- function RowLock($table,$where)
- {
- return false;
- }
-
- function CommitLock($table)
- {
- return $this->CommitTrans();
- }
-
- function RollbackLock($table)
- {
- return $this->RollbackTrans();
- }
-
- /**
- * PEAR DB Compat - do not use internally.
- *
- * The fetch modes for NUMERIC and ASSOC for PEAR DB and ADODB are identical
- * for easy porting :-)
- *
- * @param mode The fetchmode ADODB_FETCH_ASSOC or ADODB_FETCH_NUM
- * @returns The previous fetch mode
- */
- function SetFetchMode($mode)
- {
- $old = $this->fetchMode;
- $this->fetchMode = $mode;
-
- if ($old === false) {
- global $ADODB_FETCH_MODE;
- return $ADODB_FETCH_MODE;
- }
- return $old;
- }
-
-
- /**
- * PEAR DB Compat - do not use internally.
- */
- function &Query($sql, $inputarr=false)
- {
- $rs = &$this->Execute($sql, $inputarr);
- if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
- return $rs;
- }
-
-
- /**
- * PEAR DB Compat - do not use internally
- */
- function &LimitQuery($sql, $offset, $count, $params=false)
- {
- $rs = &$this->SelectLimit($sql, $count, $offset, $params);
- if (!$rs && defined('ADODB_PEAR')) return ADODB_PEAR_Error();
- return $rs;
- }
-
-
- /**
- * PEAR DB Compat - do not use internally
- */
- function Disconnect()
- {
- return $this->Close();
- }
-
- /*
- Returns placeholder for parameter, eg.
- $DB->Param('a')
-
- will return ':a' for Oracle, and '?' for most other databases...
-
- For databases that require positioned params, eg $1, $2, $3 for postgresql,
- pass in Param(false) before setting the first parameter.
- */
- function Param($name,$type='C')
- {
- return '?';
- }
-
- /*
- InParameter and OutParameter are self-documenting versions of Parameter().
- */
- function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
- {
- return $this->Parameter($stmt,$var,$name,false,$maxLen,$type);
- }
-
- /*
- */
- function OutParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false)
- {
- return $this->Parameter($stmt,$var,$name,true,$maxLen,$type);
-
- }
-
-
- /*
- Usage in oracle
- $stmt = $db->Prepare('select * from table where id =:myid and group=:group');
- $db->Parameter($stmt,$id,'myid');
- $db->Parameter($stmt,$group,'group',64);
- $db->Execute();
-
- @param $stmt Statement returned by Prepare() or PrepareSP().
- @param $var PHP variable to bind to
- @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 oci8.
- @param [$maxLen] Holds an maximum length of the variable.
- @param [$type] The data type of $var. Legal values depend on driver.
-
- */
- function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false)
- {
- return false;
- }
-
-
- function IgnoreErrors($saveErrs=false)
- {
- if (!$saveErrs) {
- $saveErrs = array($this->raiseErrorFn,$this->_transOK);
- $this->raiseErrorFn = false;
- return $saveErrs;
- } else {
- $this->raiseErrorFn = $saveErrs[0];
- $this->_transOK = $saveErrs[1];
- }
- }
-
- /**
- Improved method of initiating a transaction. Used together with CompleteTrans().
- Advantages include:
-
- a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans.
- Only the outermost block is treated as a transaction.<br>
- b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.<br>
- c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block
- are disabled, making it backward compatible.
- */
- function StartTrans($errfn = 'ADODB_TransMonitor')
- {
- if ($this->transOff > 0) {
- $this->transOff += 1;
- return;
- }
-
- $this->_oldRaiseFn = $this->raiseErrorFn;
- $this->raiseErrorFn = $errfn;
- $this->_transOK = true;
-
- if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans");
- $this->BeginTrans();
- $this->transOff = 1;
- }
-
-
- /**
- Used together with StartTrans() to end a transaction. Monitors connection
- for sql errors, and will commit or rollback as appropriate.
-
- @autoComplete if true, monitor sql errors and commit and rollback as appropriate,
- and if set to false force rollback even if no SQL error detected.
- @returns true on commit, false on rollback.
- */
- function CompleteTrans($autoComplete = true)
- {
- if ($this->transOff > 1) {
- $this->transOff -= 1;
- return true;
- }
- $this->raiseErrorFn = $this->_oldRaiseFn;
-
- $this->transOff = 0;
- if ($this->_transOK && $autoComplete) {
- if (!$this->CommitTrans()) {
- $this->_transOK = false;
- if ($this->debug) ADOConnection::outp("Smart Commit failed");
- } else
- if ($this->debug) ADOConnection::outp("Smart Commit occurred");
- } else {
- $this->_transOK = false;
- $this->RollbackTrans();
- if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred");
- }
-
- return $this->_transOK;
- }
-
- /*
- At the end of a StartTrans/CompleteTrans block, perform a rollback.
- */
- function FailTrans()
- {
- if ($this->debug)
- if ($this->transOff == 0) {
- ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans");
- } else {
- ADOConnection::outp("FailTrans was called");
- adodb_backtrace();
- }
- $this->_transOK = false;
- }
-
- /**
- Check if transaction has failed, only for Smart Transactions.
- */
- function HasFailedTrans()
- {
- if ($this->transOff > 0) return $this->_transOK == false;
- return false;
- }
-
- /**
- * Execute SQL
- *
- * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
- * @param [inputarr] holds the input data to bind to. Null elements will be set to null.
- * @return RecordSet or false
- */
- function &Execute($sql,$inputarr=false)
- {
- if ($this->fnExecute) {
- $fn = $this->fnExecute;
- $ret =& $fn($this,$sql,$inputarr);
- if (isset($ret)) return $ret;
- }
- if ($inputarr) {
- if (!is_array($inputarr)) $inputarr = array($inputarr);
-
- $element0 = reset($inputarr);
- # is_object check because oci8 descriptors can be passed in
- $array_2d = is_array($element0) && !is_object(reset($element0));
- //remove extra memory copy of input -mikefedyk
- unset($element0);
-
- if (!is_array($sql) && !$this->_bindInputArray) {
- $sqlarr = explode('?',$sql);
-
- if (!$array_2d) $inputarr = array($inputarr);
- foreach($inputarr as $arr) {
- $sql = ''; $i = 0;
- //Use each() instead of foreach to reduce memory usage -mikefedyk
- while(list(, $v) = each($arr)) {
- $sql .= $sqlarr[$i];
- // from Ron Baldwin <ron.baldwin#sourceprose.com>
- // Only quote string types
- $typ = gettype($v);
- if ($typ == 'string')
- //New memory copy of input created here -mikefedyk
- $sql .= $this->qstr($v);
- else if ($typ == 'double')
- $sql .= str_replace(',','.',$v); // locales fix so 1.1 does not get converted to 1,1
- else if ($typ == 'boolean')
- $sql .= $v ? $this->true : $this->false;
- else if ($typ == 'object') {
- if (method_exists($v, '__toString')) $sql .= $this->qstr($v->__toString());
- else $sql .= $this->qstr((string) $v);
- } else if ($v === null)
- $sql .= 'NULL';
- else
- $sql .= $v;
- $i += 1;
- }
- if (isset($sqlarr[$i])) {
- $sql .= $sqlarr[$i];
- if ($i+1 != sizeof($sqlarr)) ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql));
- } else if ($i != sizeof($sqlarr))
- ADOConnection::outp( "Input array does not match ?: ".htmlspecialchars($sql));
-
- $ret =& $this->_Execute($sql);
- if (!$ret) return $ret;
- }
- } else {
- if ($array_2d) {
- if (is_string($sql))
- $stmt = $this->Prepare($sql);
- else
- $stmt = $sql;
-
- foreach($inputarr as $arr) {
- $ret =& $this->_Execute($stmt,$arr);
- if (!$ret) return $ret;
- }
- } else {
- $ret =& $this->_Execute($sql,$inputarr);
- }
- }
- } else {
- $ret =& $this->_Execute($sql,false);
- }
-
- return $ret;
- }
-
-
- function &_Execute($sql,$inputarr=false)
- {
- if ($this->debug) {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr);
- } else {
- $this->_queryID = @$this->_query($sql,$inputarr);
- }
-
- /************************
- // OK, query executed
- *************************/
-
- if ($this->_queryID === false) { // error handling if query fails
- if ($this->debug == 99) adodb_backtrace(true,5);
- $fn = $this->raiseErrorFn;
- if ($fn) {
- $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
- }
- $false = false;
- return $false;
- }
-
- if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead
- $rs = new ADORecordSet_empty();
- return $rs;
- }
-
- // return real recordset from select statement
- $rsclass = $this->rsPrefix.$this->databaseType;
- $rs = new $rsclass($this->_queryID,$this->fetchMode);
- $rs->connection = &$this; // Pablo suggestion
- $rs->Init();
- if (is_array($sql)) $rs->sql = $sql[0];
- else $rs->sql = $sql;
- if ($rs->_numOfRows <= 0) {
- global $ADODB_COUNTRECS;
- if ($ADODB_COUNTRECS) {
- if (!$rs->EOF) {
- $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
- $rs->_queryID = $this->_queryID;
- } else
- $rs->_numOfRows = 0;
- }
- }
- return $rs;
- }
-
- function CreateSequence($seqname='adodbseq',$startID=1)
- {
- if (empty($this->_genSeqSQL)) return false;
- return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
- }
-
- function DropSequence($seqname='adodbseq')
- {
- if (empty($this->_dropSeqSQL)) return false;
- return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
- }
-
- /**
- * Generates a sequence id and stores it in $this->genID;
- * GenID is only available if $this->hasGenID = true;
- *
- * @param seqname name of sequence to use
- * @param startID if sequence does not exist, start at this ID
- * @return 0 if not supported, otherwise a sequence id
- */
- function GenID($seqname='adodbseq',$startID=1)
- {
- if (!$this->hasGenID) {
- return 0; // formerly returns false pre 1.60
- }
-
- $getnext = sprintf($this->_genIDSQL,$seqname);
-
- $holdtransOK = $this->_transOK;
-
- $save_handler = $this->raiseErrorFn;
- $this->raiseErrorFn = '';
- @($rs = $this->Execute($getnext));
- $this->raiseErrorFn = $save_handler;
-
- if (!$rs) {
- $this->_transOK = $holdtransOK; //if the status was ok before reset
- $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
- $rs = $this->Execute($getnext);
- }
- if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
- else $this->genID = 0; // false
-
- if ($rs) $rs->Close();
-
- return $this->genID;
- }
-
- /**
- * @param $table string name of the table, not needed by all databases (eg. mysql), default ''
- * @param $column string name of the column, not needed by all databases (eg. mysql), default ''
- * @return the last inserted ID. Not all databases support this.
- */
- function Insert_ID($table='',$column='')
- {
- if ($this->_logsql && $this->lastInsID) return $this->lastInsID;
- if ($this->hasInsertID) return $this->_insertid($table,$column);
- if ($this->debug) {
- ADOConnection::outp( '<p>Insert_ID error</p>');
- adodb_backtrace();
- }
- return false;
- }
-
-
- /**
- * Portable Insert ID. Pablo Roca <pabloroca#mvps.org>
- *
- * @return the last inserted ID. All databases support this. But aware possible
- * problems in multiuser environments. Heavy test this before deploying.
- */
- function PO_Insert_ID($table="", $id="")
- {
- if ($this->hasInsertID){
- return $this->Insert_ID($table,$id);
- } else {
- return $this->GetOne("SELECT MAX($id) FROM $table");
- }
- }
-
- /**
- * @return # rows affected by UPDATE/DELETE
- */
- function Affected_Rows()
- {
- if ($this->hasAffectedRows) {
- if ($this->fnExecute === 'adodb_log_sql') {
- if ($this->_logsql && $this->_affected !== false) return $this->_affected;
- }
- $val = $this->_affectedrows();
- return ($val < 0) ? false : $val;
- }
-
- if ($this->debug) ADOConnection::outp( '<p>Affected_Rows error</p>',false);
- return false;
- }
-
-
- /**
- * @return the last error message
- */
- function ErrorMsg()
- {
- if ($this->_errorMsg) return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg;
- else return '';
- }
-
-
- /**
- * @return the last error number. Normally 0 means no error.
- */
- function ErrorNo()
- {
- return ($this->_errorMsg) ? -1 : 0;
- }
-
- function MetaError($err=false)
- {
- include_once(ADODB_DIR."/adodb-error.inc.php");
- if ($err === false) $err = $this->ErrorNo();
- return adodb_error($this->dataProvider,$this->databaseType,$err);
- }
-
- function MetaErrorMsg($errno)
- {
- include_once(ADODB_DIR."/adodb-error.inc.php");
- return adodb_errormsg($errno);
- }
-
- /**
- * @returns an array with the primary key columns in it.
- */
- function MetaPrimaryKeys($table, $owner=false)
- {
- // owner not used in base class - see oci8
- $p = array();
- $objs =& $this->MetaColumns($table);
- if ($objs) {
- foreach($objs as $v) {
- if (!empty($v->primary_key))
- $p[] = $v->name;
- }
- }
- if (sizeof($p)) return $p;
- if (function_exists('ADODB_VIEW_PRIMARYKEYS'))
- return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);
- return false;
- }
-
- /**
- * @returns assoc array where keys are tables, and values are foreign keys
- */
- function MetaForeignKeys($table, $owner=false, $upper=false)
- {
- return false;
- }
- /**
- * Choose a database to connect to. Many databases do not support this.
- *
- * @param dbName is the name of the database to select
- * @return true or false
- */
- function SelectDB($dbName)
- {return false;}
-
-
- /**
- * Will select, getting rows from $offset (1-based), for $nrows.
- * This simulates the MySQL "select * from table limit $offset,$nrows" , and
- * the PostgreSQL "select * from table limit $nrows offset $offset". Note that
- * MySQL and PostgreSQL parameter ordering is the opposite of the other.
- * eg.
- * SelectLimit('select * from table',3); will return rows 1 to 3 (1-based)
- * SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based)
- *
- * Uses SELECT TOP for Microsoft databases (when $this->hasTop is set)
- * BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set
- *
- * @param sql
- * @param [offset] is the row to start calculations from (1-based)
- * @param [nrows] is the number of rows to get
- * @param [inputarr] array of bind variables
- * @param [secs2cache] is a private parameter only used by jlim
- * @return the recordset ($rs->databaseType == 'array')
- */
- function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
- {
- if ($this->hasTop && $nrows > 0) {
- // suggested by Reinhard Balling. Access requires top after distinct
- // Informix requires first before distinct - F Riosa
- $ismssql = (strpos($this->databaseType,'mssql') !== false);
- if ($ismssql) $isaccess = false;
- else $isaccess = (strpos($this->databaseType,'access') !== false);
-
- if ($offset <= 0) {
-
- // access includes ties in result
- if ($isaccess) {
- $sql = preg_replace(
- '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
-
- if ($secs2cache != 0) {
- $ret =& $this->CacheExecute($secs2cache, $sql,$inputarr);
- } else {
- $ret =& $this->Execute($sql,$inputarr);
- }
- return $ret; // PHP5 fix
- } else if ($ismssql){
- $sql = preg_replace(
- '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
- } else {
- $sql = preg_replace(
- '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
- }
- } else {
- $nn = $nrows + $offset;
- if ($isaccess || $ismssql) {
- $sql = preg_replace(
- '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
- } else {
- $sql = preg_replace(
- '/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);
- }
- }
- }
-
- // if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer rows
- // 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS.
- global $ADODB_COUNTRECS;
-
- $savec = $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
-
- if ($offset>0){
- if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
- else $rs = &$this->Execute($sql,$inputarr);
- } else {
- if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
- else $rs = &$this->Execute($sql,$inputarr);
- }
- $ADODB_COUNTRECS = $savec;
- if ($rs && !$rs->EOF) {
- $rs =& $this->_rs2rs($rs,$nrows,$offset);
- }
- //print_r($rs);
- return $rs;
- }
-
- /**
- * Create serializable recordset. Breaks rs link to connection.
- *
- * @param rs the recordset to serialize
- */
- function &SerializableRS(&$rs)
- {
- $rs2 =& $this->_rs2rs($rs);
- $ignore = false;
- $rs2->connection =& $ignore;
-
- return $rs2;
- }
-
- /**
- * Convert database recordset to an array recordset
- * input recordset's cursor should be at beginning, and
- * old $rs will be closed.
- *
- * @param rs the recordset to copy
- * @param [nrows] number of rows to retrieve (optional)
- * @param [offset] offset by number of rows (optional)
- * @return the new recordset
- */
- function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true)
- {
- if (! $rs) {
- $false = false;
- return $false;
- }
- $dbtype = $rs->databaseType;
- if (!$dbtype) {
- $rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ?
- return $rs;
- }
- if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) {
- $rs->MoveFirst();
- $rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ?
- return $rs;
- }
- $flds = array();
- for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
- $flds[] = $rs->FetchField($i);
- }
-
- $arr =& $rs->GetArrayLimit($nrows,$offset);
- //print_r($arr);
- if ($close) $rs->Close();
-
- $arrayClass = $this->arrayClass;
-
- $rs2 = new $arrayClass();
- $rs2->connection = &$this;
- $rs2->sql = $rs->sql;
- $rs2->dataProvider = $this->dataProvider;
- $rs2->InitArrayFields($arr,$flds);
- $rs2->fetchMode = isset($rs->adodbFetchMode) ? $rs->adodbFetchMode : $rs->fetchMode;
- return $rs2;
- }
-
- /*
- * Return all rows. Compat with PEAR DB
- */
- function &GetAll($sql, $inputarr=false)
- {
- $arr =& $this->GetArray($sql,$inputarr);
- return $arr;
- }
-
- function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false)
- {
- $rs =& $this->Execute($sql, $inputarr);
- if (!$rs) {
- $false = false;
- return $false;
- }
- $arr =& $rs->GetAssoc($force_array,$first2cols);
- return $arr;
- }
-
- function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false)
- {
- if (!is_numeric($secs2cache)) {
- $first2cols = $force_array;
- $force_array = $inputarr;
- }
- $rs =& $this->CacheExecute($secs2cache, $sql, $inputarr);
- if (!$rs) {
- $false = false;
- return $false;
- }
- $arr =& $rs->GetAssoc($force_array,$first2cols);
- return $arr;
- }
-
- /**
- * Return first element of first row of sql statement. Recordset is disposed
- * for you.
- *
- * @param sql SQL statement
- * @param [inputarr] input bind array
- */
- function GetOne($sql,$inputarr=false)
- {
- global $ADODB_COUNTRECS;
- $crecs = $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
-
- $ret = false;
- $rs = &$this->Execute($sql,$inputarr);
- if ($rs) {
- if (!$rs->EOF) $ret = reset($rs->fields);
- $rs->Close();
- }
- $ADODB_COUNTRECS = $crecs;
- return $ret;
- }
-
- function CacheGetOne($secs2cache,$sql=false,$inputarr=false)
- {
- $ret = false;
- $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
- if ($rs) {
- if (!$rs->EOF) $ret = reset($rs->fields);
- $rs->Close();
- }
-
- return $ret;
- }
-
- function GetCol($sql, $inputarr = false, $trim = false)
- {
- $rv = false;
- $rs = &$this->Execute($sql, $inputarr);
- if ($rs) {
- $rv = array();
- if ($trim) {
- while (!$rs->EOF) {
- $rv[] = trim(reset($rs->fields));
- $rs->MoveNext();
- }
- } else {
- while (!$rs->EOF) {
- $rv[] = reset($rs->fields);
- $rs->MoveNext();
- }
- }
- $rs->Close();
- }
- return $rv;
- }
-
- function CacheGetCol($secs, $sql = false, $inputarr = false,$trim=false)
- {
- $rv = false;
- $rs = &$this->CacheExecute($secs, $sql, $inputarr);
- if ($rs) {
- if ($trim) {
- while (!$rs->EOF) {
- $rv[] = trim(reset($rs->fields));
- $rs->MoveNext();
- }
- } else {
- while (!$rs->EOF) {
- $rv[] = reset($rs->fields);
- $rs->MoveNext();
- }
- }
- $rs->Close();
- }
- return $rv;
- }
-
- function &Transpose(&$rs,$addfieldnames=true)
- {
- $rs2 =& $this->_rs2rs($rs);
- $false = false;
- if (!$rs2) return $false;
-
- $rs2->_transpose($addfieldnames);
- return $rs2;
- }
-
- /*
- Calculate the offset of a date for a particular database and generate
- appropriate SQL. Useful for calculating future/past dates and storing
- in a database.
-
- If dayFraction=1.5 means 1.5 days from now, 1.0/24 for 1 hour.
- */
- function OffsetDate($dayFraction,$date=false)
- {
- if (!$date) $date = $this->sysDate;
- return '('.$date.'+'.$dayFraction.')';
- }
-
-
- /**
- *
- * @param sql SQL statement
- * @param [inputarr] input bind array
- */
- function &GetArray($sql,$inputarr=false)
- {
- global $ADODB_COUNTRECS;
-
- $savec = $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
- $rs =& $this->Execute($sql,$inputarr);
- $ADODB_COUNTRECS = $savec;
- if (!$rs)
- if (defined('ADODB_PEAR')) {
- $cls = ADODB_PEAR_Error();
- return $cls;
- } else {
- $false = false;
- return $false;
- }
- $arr =& $rs->GetArray();
- $rs->Close();
- return $arr;
- }
-
- function &CacheGetAll($secs2cache,$sql=false,$inputarr=false)
- {
- $arr =& $this->CacheGetArray($secs2cache,$sql,$inputarr);
- return $arr;
- }
-
- function &CacheGetArray($secs2cache,$sql=false,$inputarr=false)
- {
- global $ADODB_COUNTRECS;
-
- $savec = $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
- $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr);
- $ADODB_COUNTRECS = $savec;
-
- if (!$rs)
- if (defined('ADODB_PEAR')) {
- $cls = ADODB_PEAR_Error();
- return $cls;
- } else {
- $false = false;
- return $false;
- }
- $arr =& $rs->GetArray();
- $rs->Close();
- return $arr;
- }
-
-
-
- /**
- * Return one row of sql statement. Recordset is disposed for you.
- *
- * @param sql SQL statement
- * @param [inputarr] input bind array
- */
- function &GetRow($sql,$inputarr=false)
- {
- global $ADODB_COUNTRECS;
- $crecs = $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
-
- $rs =& $this->Execute($sql,$inputarr);
-
- $ADODB_COUNTRECS = $crecs;
- if ($rs) {
- if (!$rs->EOF) $arr = $rs->fields;
- else $arr = array();
- $rs->Close();
- return $arr;
- }
-
- $false = false;
- return $false;
- }
-
- function &CacheGetRow($secs2cache,$sql=false,$inputarr=false)
- {
- $rs =& $this->CacheExecute($secs2cache,$sql,$inputarr);
- if ($rs) {
- $arr = false;
- if (!$rs->EOF) $arr = $rs->fields;
- $rs->Close();
- return $arr;
- }
- $false = false;
- return $false;
- }
-
- /**
- * Insert or replace a single record. Note: this is not the same as MySQL's replace.
- * ADOdb's Replace() uses update-insert semantics, not insert-delete-duplicates of MySQL.
- * Also note that no table locking is done currently, so it is possible that the
- * record be inserted twice by two programs...
- *
- * $this->Replace('products', array('prodname' =>"'Nails'","price" => 3.99), 'prodname');
- *
- * $table table name
- * $fieldArray associative array of data (you must quote strings yourself).
- * $keyCol the primary key field name or if compound key, array of field names
- * autoQuote set to true to use a hueristic to quote strings. Works with nulls and numbers
- * but does not work with dates nor SQL functions.
- * has_autoinc the primary key is an auto-inc field, so skip in insert.
- *
- * Currently blob replace not supported
- *
- * returns 0 = fail, 1 = update, 2 = insert
- */
-
- function Replace($table, $fieldArray, $keyCol, $autoQuote=false, $has_autoinc=false)
- {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
-
- return _adodb_replace($this, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc);
- }
-
-
- /**
- * Will select, getting rows from $offset (1-based), for $nrows.
- * This simulates the MySQL "select * from table limit $offset,$nrows" , and
- * the PostgreSQL "select * from table limit $nrows offset $offset". Note that
- * MySQL and PostgreSQL parameter ordering is the opposite of the other.
- * eg.
- * CacheSelectLimit(15,'select * from table',3); will return rows 1 to 3 (1-based)
- * CacheSelectLimit(15,'select * from table',3,2); will return rows 3 to 5 (1-based)
- *
- * BUG: Currently CacheSelectLimit fails with $sql with LIMIT or TOP clause already set
- *
- * @param [secs2cache] seconds to cache data, set to 0 to force query. This is optional
- * @param sql
- * @param [offset] is the row to start calculations from (1-based)
- * @param [nrows] is the number of rows to get
- * @param [inputarr] array of bind variables
- * @return the recordset ($rs->databaseType == 'array')
- */
- function &CacheSelectLimit($secs2cache,$sql,$nrows=-1,$offset=-1,$inputarr=false)
- {
- if (!is_numeric($secs2cache)) {
- if ($sql === false) $sql = -1;
- if ($offset == -1) $offset = false;
- // sql, nrows, offset,inputarr
- $rs =& $this->SelectLimit($secs2cache,$sql,$nrows,$offset,$this->cacheSecs);
- } else {
- if ($sql === false) ADOConnection::outp( "Warning: \$sql missing from CacheSelectLimit()");
- $rs =& $this->SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
- }
- return $rs;
- }
-
-
- /**
- * Flush cached recordsets that match a particular $sql statement.
- * If $sql == false, then we purge all files in the cache.
- */
-
- /**
- * Flush cached recordsets that match a particular $sql statement.
- * If $sql == false, then we purge all files in the cache.
- */
- function CacheFlush($sql=false,$inputarr=false)
- {
- global $ADODB_CACHE_DIR;
-
- if ($this->memCache) {
- global $ADODB_INCLUDED_MEMCACHE;
-
- $key = false;
- if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
- if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true);
- FlushMemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug);
- return;
- }
-
- if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
- /*if (strncmp(PHP_OS,'WIN',3) === 0)
- $dir = str_replace('/', '\\', $ADODB_CACHE_DIR);
- else */
- $dir = $ADODB_CACHE_DIR;
-
- if ($this->debug) {
- ADOConnection::outp( "CacheFlush: $dir<br><pre>\n", $this->_dirFlush($dir),"</pre>");
- } else {
- $this->_dirFlush($dir);
- }
- return;
- }
-
- global $ADODB_INCLUDED_CSV;
- if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
-
- $f = $this->_gencachename($sql.serialize($inputarr),false);
- adodb_write_file($f,''); // is adodb_write_file needed?
- if (!@unlink($f)) {
- if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
- }
- }
-
- /**
- * Private function to erase all of the files and subdirectories in a directory.
- *
- * Just specify the directory, and tell it if you want to delete the directory or just clear it out.
- * Note: $kill_top_level is used internally in the function to flush subdirectories.
- */
- function _dirFlush($dir, $kill_top_level = false) {
- if(!$dh = @opendir($dir)) return;
-
- while (($obj = readdir($dh))) {
- if($obj=='.' || $obj=='..')
- continue;
-
- if (!@unlink($dir.'/'.$obj))
- $this->_dirFlush($dir.'/'.$obj, true);
- }
- if ($kill_top_level === true)
- @rmdir($dir);
- return true;
- }
-
-
- function xCacheFlush($sql=false,$inputarr=false)
- {
- global $ADODB_CACHE_DIR;
-
- if ($this->memCache) {
- global $ADODB_INCLUDED_MEMCACHE;
- $key = false;
- if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
- if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true);
- flushmemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug);
- return;
- }
-
- if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
- if (strncmp(PHP_OS,'WIN',3) === 0) {
- $cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache';
- } else {
- //$cmd = 'find "'.$ADODB_CACHE_DIR.'" -type f -maxdepth 1 -print0 | xargs -0 rm -f';
- $cmd = 'rm -rf '.$ADODB_CACHE_DIR.'/[0-9a-f][0-9a-f]/';
- // old version 'rm -f `find '.$ADODB_CACHE_DIR.' -name adodb_*.cache`';
- }
- if ($this->debug) {
- ADOConnection::outp( "CacheFlush: $cmd<br><pre>\n", system($cmd),"</pre>");
- } else {
- exec($cmd);
- }
- return;
- }
-
- global $ADODB_INCLUDED_CSV;
- if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
-
- $f = $this->_gencachename($sql.serialize($inputarr),false);
- adodb_write_file($f,''); // is adodb_write_file needed?
- if (!@unlink($f)) {
- if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
- }
- }
-
- /**
- * Private function to generate filename for caching.
- * Filename is generated based on:
- *
- * - sql statement
- * - database type (oci8, ibase, ifx, etc)
- * - database name
- * - userid
- * - setFetchMode (adodb 4.23)
- *
- * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
- * Assuming that we can have 50,000 files per directory with good performance,
- * then we can scale to 12.8 million unique cached recordsets. Wow!
- */
- function _gencachename($sql,$createdir,$memcache=false)
- {
- global $ADODB_CACHE_DIR;
- static $notSafeMode;
-
- if ($this->fetchMode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- } else {
- $mode = $this->fetchMode;
- }
- $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode);
- if ($memcache) return $m;
-
- if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode');
- $dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR;
-
- if ($createdir && $notSafeMode && !file_exists($dir)) {
- $oldu = umask(0);
- if (!mkdir($dir,0771))
- if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql");
- umask($oldu);
- }
- return $dir.'/adodb_'.$m.'.cache';
- }
-
-
- /**
- * Execute SQL, caching recordsets.
- *
- * @param [secs2cache] seconds to cache data, set to 0 to force query.
- * This is an optional parameter.
- * @param sql SQL statement to execute
- * @param [inputarr] holds the input data to bind to
- * @return RecordSet or false
- */
- function &CacheExecute($secs2cache,$sql=false,$inputarr=false)
- {
-
-
- if (!is_numeric($secs2cache)) {
- $inputarr = $sql;
- $sql = $secs2cache;
- $secs2cache = $this->cacheSecs;
- }
-
- if (is_array($sql)) {
- $sqlparam = $sql;
- $sql = $sql[0];
- } else
- $sqlparam = $sql;
-
- if ($this->memCache) {
- global $ADODB_INCLUDED_MEMCACHE;
- if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
- $md5file = $this->_gencachename($sql.serialize($inputarr),false,true);
- } else {
- global $ADODB_INCLUDED_CSV;
- if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
- $md5file = $this->_gencachename($sql.serialize($inputarr),true);
- }
-
- $err = '';
-
- if ($secs2cache > 0){
- if ($this->memCache)
- $rs = &getmemCache($md5file,$err,$secs2cache, $this->memCacheHost, $this->memCachePort);
- else
- $rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass);
- $this->numCacheHits += 1;
- } else {
- $err='Timeout 1';
- $rs = false;
- $this->numCacheMisses += 1;
- }
- if (!$rs) {
- // no cached rs found
- if ($this->debug) {
- if (get_magic_quotes_runtime() && !$this->memCache) {
- ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :(");
- }
- if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)");
- }
-
- $rs = &$this->Execute($sqlparam,$inputarr);
-
- if ($rs && $this->memCache) {
- $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
- if(!putmemCache($md5file, $rs, $this->memCacheHost, $this->memCachePort, $this->memCacheCompress, $this->debug)) {
- if ($fn = $this->raiseErrorFn)
- $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
- if ($this->debug) ADOConnection::outp( " Cache write error");
- }
- } else
- if ($rs) {
- $eof = $rs->EOF;
- $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
- $txt = _rs2serialize($rs,false,$sql); // serialize
-
- if (!adodb_write_file($md5file,$txt,$this->debug)) {
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
- }
- if ($this->debug) ADOConnection::outp( " Cache write error");
- }
- if ($rs->EOF && !$eof) {
- $rs->MoveFirst();
- //$rs = &csv2rs($md5file,$err);
- $rs->connection = &$this; // Pablo suggestion
- }
-
- } else
- if (!$this->memCache)
- @unlink($md5file);
- } else {
- $this->_errorMsg = '';
- $this->_errorCode = 0;
-
- if ($this->fnCacheExecute) {
- $fn = $this->fnCacheExecute;
- $fn($this, $secs2cache, $sql, $inputarr);
- }
- // ok, set cached object found
- $rs->connection = &$this; // Pablo suggestion
- if ($this->debug){
-
- $inBrowser = isset($_SERVER['HTTP_USER_AGENT']);
- $ttl = $rs->timeCreated + $secs2cache - time();
- $s = is_array($sql) ? $sql[0] : $sql;
- if ($inBrowser) $s = '<i>'.htmlspecialchars($s).'</i>';
-
- ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]");
- }
- }
- return $rs;
- }
-
-
- /*
- Similar to PEAR DB's autoExecute(), except that
- $mode can be 'INSERT' or 'UPDATE' or DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE
- If $mode == 'UPDATE', then $where is compulsory as a safety measure.
-
- $forceUpdate means that even if the data has not changed, perform update.
- */
- function& AutoExecute($table, $fields_values, $mode = 'INSERT', $where = FALSE, $forceUpdate=true, $magicq=false)
- {
- $false = false;
- $sql = 'SELECT * FROM '.$table;
- if ($where!==FALSE) $sql .= ' WHERE '.$where;
- else if ($mode == 'UPDATE' || $mode == 2 /* DB_AUTOQUERY_UPDATE */) {
- ADOConnection::outp('AutoExecute: Illegal mode=UPDATE with empty WHERE clause');
- return $false;
- }
-
- $rs =& $this->SelectLimit($sql,1);
- if (!$rs) return $false; // table does not exist
- $rs->tableName = $table;
-
- switch((string) $mode) {
- case 'UPDATE':
- case '2':
- $sql = $this->GetUpdateSQL($rs, $fields_values, $forceUpdate, $magicq);
- break;
- case 'INSERT':
- case '1':
- $sql = $this->GetInsertSQL($rs, $fields_values, $magicq);
- break;
- default:
- ADOConnection::outp("AutoExecute: Unknown mode=$mode");
- return $false;
- }
- $ret = false;
- if ($sql) $ret = $this->Execute($sql);
- if ($ret) $ret = true;
- return $ret;
- }
-
-
- /**
- * Generates an Update Query based on an existing recordset.
- * $arrFields is an associative array of fields with the value
- * that should be assigned.
- *
- * Note: This function should only be used on a recordset
- * that is run against a single table and sql should only
- * be a simple select stmt with no groupby/orderby/limit
- *
- * "Jonathan Younger" <jyounger@unilab.com>
- */
- function GetUpdateSQL(&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=null)
- {
- global $ADODB_INCLUDED_LIB;
-
- //********************************************************//
- //This is here to maintain compatibility
- //with older adodb versions. Sets force type to force nulls if $forcenulls is set.
- if (!isset($force)) {
- global $ADODB_FORCE_TYPE;
- $force = $ADODB_FORCE_TYPE;
- }
- //********************************************************//
-
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$force);
- }
-
- /**
- * Generates an Insert Query based on an existing recordset.
- * $arrFields is an associative array of fields with the value
- * that should be assigned.
- *
- * Note: This function should only be used on a recordset
- * that is run against a single table.
- */
- function GetInsertSQL(&$rs, $arrFields,$magicq=false,$force=null)
- {
- global $ADODB_INCLUDED_LIB;
- if (!isset($force)) {
- global $ADODB_FORCE_TYPE;
- $force = $ADODB_FORCE_TYPE;
-
- }
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$force);
- }
-
-
- /**
- * Update a blob column, given a where clause. There are more sophisticated
- * blob handling functions that we could have implemented, but all require
- * a very complex API. Instead we have chosen something that is extremely
- * simple to understand and use.
- *
- * Note: $blobtype supports 'BLOB' and 'CLOB', default is BLOB of course.
- *
- * Usage to update a $blobvalue which has a primary key blob_id=1 into a
- * field blobtable.blobcolumn:
- *
- * UpdateBlob('blobtable', 'blobcolumn', $blobvalue, 'blob_id=1');
- *
- * Insert example:
- *
- * $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;
- }
-
- /**
- * Usage:
- * UpdateBlob('TABLE', 'COLUMN', '/path/to/file', 'ID=1');
- *
- * $blobtype supports 'BLOB' and 'CLOB'
- *
- * $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
- * $conn->UpdateBlob('blobtable','blobcol',$blobpath,'id=1');
- */
- function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
- {
- $fd = fopen($path,'rb');
- if ($fd === false) return false;
- $val = fread($fd,filesize($path));
- fclose($fd);
- return $this->UpdateBlob($table,$column,$val,$where,$blobtype);
- }
-
- function BlobDecode($blob)
- {
- return $blob;
- }
-
- function BlobEncode($blob)
- {
- return $blob;
- }
-
- function SetCharSet($charset)
- {
- return false;
- }
-
- function IfNull( $field, $ifNull )
- {
- return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
- }
-
- function LogSQL($enable=true)
- {
- include_once(ADODB_DIR.'/adodb-perf.inc.php');
-
- if ($enable) $this->fnExecute = 'adodb_log_sql';
- else $this->fnExecute = false;
-
- $old = $this->_logsql;
- $this->_logsql = $enable;
- if ($enable && !$old) $this->_affected = false;
- return $old;
- }
-
- function GetCharSet()
- {
- return false;
- }
-
- /**
- * Usage:
- * UpdateClob('TABLE', 'COLUMN', $var, 'ID=1', 'CLOB');
- *
- * $conn->Execute('INSERT INTO clobtable (id, clobcol) VALUES (1, null)');
- * $conn->UpdateClob('clobtable','clobcol',$clob,'id=1');
- */
- function UpdateClob($table,$column,$val,$where)
- {
- return $this->UpdateBlob($table,$column,$val,$where,'CLOB');
- }
-
- // not the fastest implementation - quick and dirty - jlim
- // for best performance, use the actual $rs->MetaType().
- function MetaType($t,$len=-1,$fieldobj=false)
- {
-
- if (empty($this->_metars)) {
- $rsclass = $this->rsPrefix.$this->databaseType;
- $this->_metars = new $rsclass(false,$this->fetchMode);
- $this->_metars->connection =& $this;
- }
- return $this->_metars->MetaType($t,$len,$fieldobj);
- }
-
-
- /**
- * Change the SQL connection locale to a specified locale.
- * This is used to get the date formats written depending on the client locale.
- */
- function SetDateLocale($locale = 'En')
- {
- $this->locale = $locale;
- switch (strtoupper($locale))
- {
- case 'EN':
- $this->fmtDate="'Y-m-d'";
- $this->fmtTimeStamp = "'Y-m-d H:i:s'";
- break;
-
- case 'US':
- $this->fmtDate = "'m-d-Y'";
- $this->fmtTimeStamp = "'m-d-Y H:i:s'";
- break;
-
- case 'PT_BR':
- case 'NL':
- case 'FR':
- case 'RO':
- case 'IT':
- $this->fmtDate="'d-m-Y'";
- $this->fmtTimeStamp = "'d-m-Y H:i:s'";
- break;
-
- case 'GE':
- $this->fmtDate="'d.m.Y'";
- $this->fmtTimeStamp = "'d.m.Y H:i:s'";
- break;
-
- default:
- $this->fmtDate="'Y-m-d'";
- $this->fmtTimeStamp = "'Y-m-d H:i:s'";
- break;
- }
- }
-
- function &GetActiveRecordsClass($class, $table,$whereOrderBy=false,$bindarr=false, $primkeyArr=false)
- {
- global $_ADODB_ACTIVE_DBS;
-
- $save = $this->SetFetchMode(ADODB_FETCH_NUM);
- if (empty($whereOrderBy)) $whereOrderBy = '1=1';
- $rows = $this->GetAll("select * from ".$table.' WHERE '.$whereOrderBy,$bindarr);
- $this->SetFetchMode($save);
-
- $false = false;
-
- if ($rows === false) {
- return $false;
- }
-
-
- if (!isset($_ADODB_ACTIVE_DBS)) {
- include(ADODB_DIR.'/adodb-active-record.inc.php');
- }
- if (!class_exists($class)) {
- ADOConnection::outp("Unknown class $class in GetActiveRcordsClass()");
- return $false;
- }
- $arr = array();
- foreach($rows as $row) {
-
- $obj = new $class($table,$primkeyArr,$this);
- if ($obj->ErrorMsg()){
- $this->_errorMsg = $obj->ErrorMsg();
- return $false;
- }
- $obj->Set($row);
- $arr[] = $obj;
- }
- return $arr;
- }
-
- function &GetActiveRecords($table,$where=false,$bindarr=false,$primkeyArr=false)
- {
- $arr =& $this->GetActiveRecordsClass('ADODB_Active_Record', $table, $where, $bindarr, $primkeyArr);
- return $arr;
- }
-
- /**
- * Close Connection
- */
- function Close()
- {
- $rez = $this->_close();
- $this->_connectionID = false;
- return $rez;
- }
-
- /**
- * Begin a Transaction. Must be followed by CommitTrans() or RollbackTrans().
- *
- * @return true if succeeded or false if database does not support transactions
- */
- function BeginTrans()
- {
- if ($this->debug) ADOConnection::outp("BeginTrans: Transactions not supported for this driver");
- return false;
- }
-
- /* set transaction mode */
- function SetTransactionMode( $transaction_mode )
- {
- $transaction_mode = $this->MetaTransaction($transaction_mode, $this->dataProvider);
- $this->_transmode = $transaction_mode;
- }
-/*
-http://msdn2.microsoft.com/en-US/ms173763.aspx
-http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-isolation.html
-http://www.postgresql.org/docs/8.1/interactive/sql-set-transaction.html
-http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_10005.htm
-*/
- function MetaTransaction($mode,$db)
- {
- $mode = strtoupper($mode);
- $mode = str_replace('ISOLATION LEVEL ','',$mode);
-
- switch($mode) {
-
- case 'READ UNCOMMITTED':
- switch($db) {
- case 'oci8':
- case 'oracle':
- return 'ISOLATION LEVEL READ COMMITTED';
- default:
- return 'ISOLATION LEVEL READ UNCOMMITTED';
- }
- break;
-
- case 'READ COMMITTED':
- return 'ISOLATION LEVEL READ COMMITTED';
- break;
-
- case 'REPEATABLE READ':
- switch($db) {
- case 'oci8':
- case 'oracle':
- return 'ISOLATION LEVEL SERIALIZABLE';
- default:
- return 'ISOLATION LEVEL REPEATABLE READ';
- }
- break;
-
- case 'SERIALIZABLE':
- return 'ISOLATION LEVEL SERIALIZABLE';
- break;
-
- default:
- return $mode;
- }
- }
-
- /**
- * If database does not support transactions, always return true as data always commited
- *
- * @param $ok set to false to rollback transaction, true to commit
- *
- * @return true/false.
- */
- function CommitTrans($ok=true)
- { return true;}
-
-
- /**
- * If database does not support transactions, rollbacks always fail, so return false
- *
- * @return true/false.
- */
- function RollbackTrans()
- { return false;}
-
-
- /**
- * return the databases that the driver can connect to.
- * Some databases will return an empty array.
- *
- * @return an array of database names.
- */
- function MetaDatabases()
- {
- global $ADODB_FETCH_MODE;
-
- if ($this->metaDatabasesSQL) {
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
- if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
-
- $arr = $this->GetCol($this->metaDatabasesSQL);
- if (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- return $arr;
- }
-
- return false;
- }
-
-
- /**
- * @param ttype can either be 'VIEW' or 'TABLE' or false.
- * If false, both views and tables are returned.
- * "VIEW" returns only views
- * "TABLE" returns only tables
- * @param showSchema returns the schema/user with the table name, eg. USER.TABLE
- * @param mask is the input mask - only supported by oci8 and postgresql
- *
- * @return array of tables for current database.
- */
- function &MetaTables($ttype=false,$showSchema=false,$mask=false)
- {
- global $ADODB_FETCH_MODE;
-
-
- $false = false;
- if ($mask) {
- return $false;
- }
- if ($this->metaTablesSQL) {
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
- if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
-
- $rs = $this->Execute($this->metaTablesSQL);
- if (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if ($rs === false) return $false;
- $arr =& $rs->GetArray();
- $arr2 = array();
-
- if ($hast = ($ttype && isset($arr[0][1]))) {
- $showt = strncmp($ttype,'T',1);
- }
-
- for ($i=0; $i < sizeof($arr); $i++) {
- if ($hast) {
- if ($showt == 0) {
- if (strncmp($arr[$i][1],'T',1) == 0) $arr2[] = trim($arr[$i][0]);
- } else {
- if (strncmp($arr[$i][1],'V',1) == 0) $arr2[] = trim($arr[$i][0]);
- }
- } else
- $arr2[] = trim($arr[$i][0]);
- }
- $rs->Close();
- return $arr2;
- }
- return $false;
- }
-
-
- function _findschema(&$table,&$schema)
- {
- if (!$schema && ($at = strpos($table,'.')) !== false) {
- $schema = substr($table,0,$at);
- $table = substr($table,$at+1);
- }
- }
-
- /**
- * List columns in a database as an array of ADOFieldObjects.
- * See top of file for definition of object.
- *
- * @param $table table name to query
- * @param $normalize makes table name case-insensitive (required by some databases)
- * @schema is optional database schema to use - not supported by all databases.
- *
- * @return array of ADOFieldObjects for current table.
- */
- function &MetaColumns($table,$normalize=true)
- {
- global $ADODB_FETCH_MODE;
-
- $false = false;
-
- if (!empty($this->metaColumnsSQL)) {
-
- $schema = false;
- $this->_findschema($table,$schema);
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
- $rs = $this->Execute(sprintf($this->metaColumnsSQL,($normalize)?strtoupper($table):$table));
- if (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- if ($rs === false || $rs->EOF) return $false;
-
- $retarr = array();
- while (!$rs->EOF) { //print_r($rs->fields);
- $fld = new ADOFieldObject();
- $fld->name = $rs->fields[0];
- $fld->type = $rs->fields[1];
- if (isset($rs->fields[3]) && $rs->fields[3]) {
- if ($rs->fields[3]>0) $fld->max_length = $rs->fields[3];
- $fld->scale = $rs->fields[4];
- if ($fld->scale>0) $fld->max_length += 1;
- } else
- $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;
- }
- return $false;
- }
-
- /**
- * List indexes on a table as an array.
- * @param table table name to query
- * @param primary true to only show primary keys. Not actually used for most databases
- *
- * @return array of indexes on current table. Each element represents an index, and is itself an associative array.
-
- Array (
- [name_of_index] => Array
- (
- [unique] => true or false
- [columns] => Array
- (
- [0] => firstname
- [1] => lastname
- )
- )
- */
- function &MetaIndexes($table, $primary = false, $owner = false)
- {
- $false = false;
- return $false;
- }
-
- /**
- * List columns names in a table as an array.
- * @param table table name to query
- *
- * @return array of column names for current table.
- */
- function &MetaColumnNames($table, $numIndexes=false,$useattnum=false /* only for postgres */)
- {
- $objarr =& $this->MetaColumns($table);
- if (!is_array($objarr)) {
- $false = false;
- return $false;
- }
- $arr = array();
- if ($numIndexes) {
- $i = 0;
- if ($useattnum) {
- foreach($objarr as $v)
- $arr[$v->attnum] = $v->name;
-
- } else
- foreach($objarr as $v) $arr[$i++] = $v->name;
- } else
- foreach($objarr as $v) $arr[strtoupper($v->name)] = $v->name;
-
- return $arr;
- }
-
- /**
- * Different SQL databases used different methods to combine strings together.
- * This function provides a wrapper.
- *
- * param s variable number of string parameters
- *
- * Usage: $db->Concat($str1,$str2);
- *
- * @return concatenated string
- */
- function Concat()
- {
- $arr = func_get_args();
- return implode($this->concat_operator, $arr);
- }
-
-
- /**
- * Converts a date "d" to a string that the database can understand.
- *
- * @param d a date in Unix date time format.
- *
- * @return date string in database date format
- */
- function DBDate($d)
- {
- if (empty($d) && $d !== 0) return 'null';
-
- if (is_string($d) && !is_numeric($d)) {
- if ($d === 'null' || strncmp($d,"'",1) === 0) return $d;
- if ($this->isoDates) return "'$d'";
- $d = ADOConnection::UnixDate($d);
- }
-
- return adodb_date($this->fmtDate,$d);
- }
-
- function BindDate($d)
- {
- $d = $this->DBDate($d);
- if (strncmp($d,"'",1)) return $d;
-
- return substr($d,1,strlen($d)-2);
- }
-
- function BindTimeStamp($d)
- {
- $d = $this->DBTimeStamp($d);
- if (strncmp($d,"'",1)) return $d;
-
- return substr($d,1,strlen($d)-2);
- }
-
-
- /**
- * Converts a timestamp "ts" to a string that the database can understand.
- *
- * @param ts a timestamp in Unix date time format.
- *
- * @return timestamp string in database timestamp format
- */
- function DBTimeStamp($ts)
- {
- if (empty($ts) && $ts !== 0) return 'null';
-
- # strlen(14) allows YYYYMMDDHHMMSS format
- if (!is_string($ts) || (is_numeric($ts) && strlen($ts)<14))
- return adodb_date($this->fmtTimeStamp,$ts);
-
- if ($ts === 'null') return $ts;
- if ($this->isoDates && strlen($ts) !== 14) return "'$ts'";
-
- $ts = ADOConnection::UnixTimeStamp($ts);
- return adodb_date($this->fmtTimeStamp,$ts);
- }
-
- /**
- * Also in ADORecordSet.
- * @param $v is a date string in YYYY-MM-DD format
- *
- * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
- */
- function UnixDate($v)
- {
- if (is_object($v)) {
- // odbtp support
- //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 )
- return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
- }
-
- if (is_numeric($v) && strlen($v) !== 8) return $v;
- if (!preg_match( "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})|",
- ($v), $rr)) return false;
-
- if ($rr[1] <= TIMESTAMP_FIRST_YEAR) return 0;
- // h-m-s-MM-DD-YY
- return @adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
- }
-
-
- /**
- * Also in ADORecordSet.
- * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
- *
- * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
- */
- function UnixTimeStamp($v)
- {
- if (is_object($v)) {
- // odbtp support
- //( [year] => 2004 [month] => 9 [day] => 4 [hour] => 12 [minute] => 44 [second] => 8 [fraction] => 0 )
- return adodb_mktime($v->hour,$v->minute,$v->second,$v->month,$v->day, $v->year);
- }
-
- if (!preg_match(
- "|^([0-9]{4})[-/\.]?([0-9]{1,2})[-/\.]?([0-9]{1,2})[ ,-]*(([0-9]{1,2}):?([0-9]{1,2}):?([0-9\.]{1,4}))?|",
- ($v), $rr)) return false;
-
- if ($rr[1] <= TIMESTAMP_FIRST_YEAR && $rr[2]<= 1) return 0;
-
- // h-m-s-MM-DD-YY
- if (!isset($rr[5])) return adodb_mktime(0,0,0,$rr[2],$rr[3],$rr[1]);
- return @adodb_mktime($rr[5],$rr[6],$rr[7],$rr[2],$rr[3],$rr[1]);
- }
-
- /**
- * Also in ADORecordSet.
- *
- * Format database date based on user defined format.
- *
- * @param v is the character date in YYYY-MM-DD format, returned by database
- * @param fmt is the format to apply to it, using date()
- *
- * @return a date formated as user desires
- */
-
- function UserDate($v,$fmt='Y-m-d',$gmt=false)
- {
- $tt = $this->UnixDate($v);
-
- // $tt == -1 if pre TIMESTAMP_FIRST_YEAR
- if (($tt === false || $tt == -1) && $v != false) return $v;
- else if ($tt == 0) return $this->emptyDate;
- else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
- }
-
- return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt);
-
- }
-
- /**
- *
- * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format
- * @param fmt is the format to apply to it, using date()
- *
- * @return a timestamp formated as user desires
- */
- function UserTimeStamp($v,$fmt='Y-m-d H:i:s',$gmt=false)
- {
- if (!isset($v)) return $this->emptyTimeStamp;
- # strlen(14) allows YYYYMMDDHHMMSS format
- if (is_numeric($v) && strlen($v)<14) return ($gmt) ? adodb_gmdate($fmt,$v) : adodb_date($fmt,$v);
- $tt = $this->UnixTimeStamp($v);
- // $tt == -1 if pre TIMESTAMP_FIRST_YEAR
- if (($tt === false || $tt == -1) && $v != false) return $v;
- if ($tt == 0) return $this->emptyTimeStamp;
- return ($gmt) ? adodb_gmdate($fmt,$tt) : adodb_date($fmt,$tt);
- }
-
- function escape($s,$magic_quotes=false)
- {
- return $this->addq($s,$magic_quotes);
- }
-
- /**
- * Quotes a string, without prefixing nor appending quotes.
- */
- function addq($s,$magic_quotes=false)
- {
- if (!$magic_quotes) {
-
- if ($this->replaceQuote[0] == '\\'){
- // only since php 4.0.5
- $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
- //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s));
- }
- return str_replace("'",$this->replaceQuote,$s);
- }
-
- // undo magic quotes for "
- $s = str_replace('\\"','"',$s);
-
- if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
- return $s;
- else {// change \' to '' for sybase/mssql
- $s = str_replace('\\\\','\\',$s);
- return str_replace("\\'",$this->replaceQuote,$s);
- }
- }
-
- /**
- * Correctly quotes a string so that all strings are escaped. We prefix and append
- * to the string single-quotes.
- * An example is $db->qstr("Don't bother",magic_quotes_runtime());
- *
- * @param s the string to quote
- * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
- * This undoes the stupidity of magic quotes for GPC.
- *
- * @return quoted string to be sent back to database
- */
- function qstr($s,$magic_quotes=false)
- {
- if (!$magic_quotes) {
-
- if ($this->replaceQuote[0] == '\\'){
- // only since php 4.0.5
- $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\0"),$s);
- //$s = str_replace("\0","\\\0", str_replace('\\','\\\\',$s));
- }
- return "'".str_replace("'",$this->replaceQuote,$s)."'";
- }
-
- // undo magic quotes for "
- $s = str_replace('\\"','"',$s);
-
- if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
- return "'$s'";
- else {// change \' to '' for sybase/mssql
- $s = str_replace('\\\\','\\',$s);
- return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
- }
- }
-
-
- /**
- * Will select the supplied $page number from a recordset, given that it is paginated in pages of
- * $nrows rows per page. It also saves two boolean values saying if the given page is the first
- * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination.
- *
- * See readme.htm#ex8 for an example of usage.
- *
- * @param sql
- * @param nrows is the number of rows per page to get
- * @param page is the page number to get (1-based)
- * @param [inputarr] array of bind variables
- * @param [secs2cache] is a private parameter only used by jlim
- * @return the recordset ($rs->databaseType == 'array')
- *
- * NOTE: phpLens uses a different algorithm and does not use PageExecute().
- *
- */
- function &PageExecute($sql, $nrows, $page, $inputarr=false, $secs2cache=0)
- {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- if ($this->pageExecuteCountRows) $rs =& _adodb_pageexecute_all_rows($this, $sql, $nrows, $page, $inputarr, $secs2cache);
- else $rs =& _adodb_pageexecute_no_last_page($this, $sql, $nrows, $page, $inputarr, $secs2cache);
- return $rs;
- }
-
-
- /**
- * Will select the supplied $page number from a recordset, given that it is paginated in pages of
- * $nrows rows per page. It also saves two boolean values saying if the given page is the first
- * and/or last one of the recordset. Added by Iván Oliva to provide recordset pagination.
- *
- * @param secs2cache seconds to cache data, set to 0 to force query
- * @param sql
- * @param nrows is the number of rows per page to get
- * @param page is the page number to get (1-based)
- * @param [inputarr] array of bind variables
- * @return the recordset ($rs->databaseType == 'array')
- */
- function &CachePageExecute($secs2cache, $sql, $nrows, $page,$inputarr=false)
- {
- /*switch($this->dataProvider) {
- case 'postgres':
- case 'mysql':
- break;
- default: $secs2cache = 0; break;
- }*/
- $rs =& $this->PageExecute($sql,$nrows,$page,$inputarr,$secs2cache);
- return $rs;
- }
-
-} // end class ADOConnection
-
-
-
- //==============================================================================================
- // CLASS ADOFetchObj
- //==============================================================================================
-
- /**
- * Internal placeholder for record objects. Used by ADORecordSet->FetchObj().
- */
- class ADOFetchObj {
- };
-
- //==============================================================================================
- // CLASS ADORecordSet_empty
- //==============================================================================================
-
- /**
- * Lightweight recordset when there are no records to be returned
- */
- class ADORecordSet_empty
- {
- var $dataProvider = 'empty';
- var $databaseType = false;
- var $EOF = true;
- var $_numOfRows = 0;
- var $fields = false;
- var $connection = false;
- function RowCount() {return 0;}
- function RecordCount() {return 0;}
- function PO_RecordCount(){return 0;}
- function Close(){return true;}
- function FetchRow() {return false;}
- function FieldCount(){ return 0;}
- function Init() {}
- }
-
- //==============================================================================================
- // DATE AND TIME FUNCTIONS
- //==============================================================================================
- if (!defined('ADODB_DATE_VERSION')) include(ADODB_DIR.'/adodb-time.inc.php');
-
- //==============================================================================================
- // CLASS ADORecordSet
- //==============================================================================================
-
- if (PHP_VERSION < 5) include_once(ADODB_DIR.'/adodb-php4.inc.php');
- else include_once(ADODB_DIR.'/adodb-iterator.inc.php');
- /**
- * RecordSet class that represents the dataset returned by the database.
- * To keep memory overhead low, this class holds only the current row in memory.
- * No prefetching of data is done, so the RecordCount() can return -1 ( which
- * means recordcount not known).
- */
- class ADORecordSet extends ADODB_BASE_RS {
- /*
- * public variables
- */
- var $dataProvider = "native";
- var $fields = false; /// holds the current row data
- var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
- /// in other words, we use a text area for editing.
- var $canSeek = false; /// indicates that seek is supported
- var $sql; /// sql text
- var $EOF = false; /// Indicates that the current record position is after the last record in a Recordset object.
-
- var $emptyTimeStamp = '&nbsp;'; /// what to display when $time==0
- var $emptyDate = '&nbsp;'; /// what to display when $time==0
- var $debug = false;
- var $timeCreated=0; /// datetime in Unix format rs created -- for cached recordsets
-
- var $bind = false; /// used by Fields() to hold array - should be private?
- var $fetchMode; /// default fetch mode
- var $connection = false; /// the parent connection
- /*
- * private variables
- */
- var $_numOfRows = -1; /** number of rows, or -1 */
- var $_numOfFields = -1; /** number of fields in recordset */
- var $_queryID = -1; /** This variable keeps the result link identifier. */
- var $_currentRow = -1; /** This variable keeps the current row in the Recordset. */
- var $_closed = false; /** has recordset been closed */
- var $_inited = false; /** Init() should only be called once */
- var $_obj; /** Used by FetchObj */
- var $_names; /** Used by FetchObj */
-
- var $_currentPage = -1; /** Added by Iván Oliva to implement recordset pagination */
- var $_atFirstPage = false; /** Added by Iván Oliva to implement recordset pagination */
- var $_atLastPage = false; /** Added by Iván Oliva to implement recordset pagination */
- var $_lastPageNo = -1;
- var $_maxRecordCount = 0;
- var $datetime = false;
-
- /**
- * Constructor
- *
- * @param queryID this is the queryID returned by ADOConnection->_query()
- *
- */
- function ADORecordSet($queryID)
- {
- $this->_queryID = $queryID;
- }
-
-
-
- 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->_numOfFields && $this->_currentRow == -1) {
-
- $this->_currentRow = 0;
- if ($this->EOF = ($this->_fetch() === false)) {
- $this->_numOfRows = 0; // _numOfRows could be -1
- }
- } else {
- $this->EOF = true;
- }
- }
-
-
- /**
- * Generate a SELECT tag string from a recordset, and return the string.
- * If the recordset has 2 cols, we treat the 1st col as the containing
- * the text to display to the user, and 2nd col as the return value. Default
- * strings are compared with the FIRST column.
- *
- * @param name name of SELECT tag
- * @param [defstr] the value to hilite. Use an array for multiple hilites for listbox.
- * @param [blank1stItem] true to leave the 1st item in list empty
- * @param [multiple] true for listbox, false for popup
- * @param [size] #rows to show for listbox. not used by popup
- * @param [selectAttr] additional attributes to defined for SELECT tag.
- * useful for holding javascript onChange='...' handlers.
- & @param [compareFields0] when we have 2 cols in recordset, we compare the defstr with
- * column 0 (1st col) if this is true. This is not documented.
- *
- * @return HTML
- *
- * changes by glen.davies@cce.ac.nz to support multiple hilited items
- */
- function GetMenu($name,$defstr='',$blank1stItem=true,$multiple=false,
- $size=0, $selectAttr='',$compareFields0=true)
- {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- return _adodb_getmenu($this, $name,$defstr,$blank1stItem,$multiple,
- $size, $selectAttr,$compareFields0);
- }
-
-
-
- /**
- * Generate a SELECT tag string from a recordset, and return the string.
- * If the recordset has 2 cols, we treat the 1st col as the containing
- * the text to display to the user, and 2nd col as the return value. Default
- * strings are compared with the SECOND column.
- *
- */
- function GetMenu2($name,$defstr='',$blank1stItem=true,$multiple=false,$size=0, $selectAttr='')
- {
- return $this->GetMenu($name,$defstr,$blank1stItem,$multiple,
- $size, $selectAttr,false);
- }
-
- /*
- Grouped Menu
- */
- function GetMenu3($name,$defstr='',$blank1stItem=true,$multiple=false,
- $size=0, $selectAttr='')
- {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- return _adodb_getmenu_gp($this, $name,$defstr,$blank1stItem,$multiple,
- $size, $selectAttr,false);
- }
-
- /**
- * return recordset as a 2-dimensional array.
- *
- * @param [nRows] is the number of rows to return. -1 means every row.
- *
- * @return an array indexed by the rows (0-based) from the recordset
- */
- function &GetArray($nRows = -1)
- {
- global $ADODB_EXTENSION; if ($ADODB_EXTENSION) {
- $results = adodb_getall($this,$nRows);
- return $results;
- }
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nRows != $cnt) {
- $results[] = $this->fields;
- $this->MoveNext();
- $cnt++;
- }
- return $results;
- }
-
- function &GetAll($nRows = -1)
- {
- $arr =& $this->GetArray($nRows);
- return $arr;
- }
-
- /*
- * Some databases allow multiple recordsets to be returned. This function
- * will return true if there is a next recordset, or false if no more.
- */
- function NextRecordSet()
- {
- return false;
- }
-
- /**
- * return recordset as a 2-dimensional array.
- * Helper function for ADOConnection->SelectLimit()
- *
- * @param offset is the row to start calculations from (1-based)
- * @param [nrows] is the number of rows to return
- *
- * @return an array indexed by the rows (0-based) from the recordset
- */
- function &GetArrayLimit($nrows,$offset=-1)
- {
- if ($offset <= 0) {
- $arr =& $this->GetArray($nrows);
- return $arr;
- }
-
- $this->Move($offset);
-
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nrows != $cnt) {
- $results[$cnt++] = $this->fields;
- $this->MoveNext();
- }
-
- return $results;
- }
-
-
- /**
- * Synonym for GetArray() for compatibility with ADO.
- *
- * @param [nRows] is the number of rows to return. -1 means every row.
- *
- * @return an array indexed by the rows (0-based) from the recordset
- */
- function &GetRows($nRows = -1)
- {
- $arr =& $this->GetArray($nRows);
- return $arr;
- }
-
- /**
- * return whole recordset as a 2-dimensional associative array if there are more than 2 columns.
- * The first column is treated as the key and is not included in the array.
- * If there is only 2 columns, it will return a 1 dimensional array of key-value pairs unless
- * $force_array == true.
- *
- * @param [force_array] has only meaning if we have 2 data columns. If false, a 1 dimensional
- * array is returned, otherwise a 2 dimensional array is returned. If this sounds confusing,
- * read the source.
- *
- * @param [first2cols] means if there are more than 2 cols, ignore the remaining cols and
- * instead of returning array[col0] => array(remaining cols), return array[col0] => col1
- *
- * @return an associative array indexed by the first column of the array,
- * or false if the data has less than 2 cols.
- */
- function &GetAssoc($force_array = false, $first2cols = false)
- {
- global $ADODB_EXTENSION;
-
- $cols = $this->_numOfFields;
- if ($cols < 2) {
- $false = false;
- return $false;
- }
- $numIndex = isset($this->fields[0]);
- $results = array();
-
- if (!$first2cols && ($cols > 2 || $force_array)) {
- if ($ADODB_EXTENSION) {
- if ($numIndex) {
- while (!$this->EOF) {
- $results[trim($this->fields[0])] = array_slice($this->fields, 1);
- adodb_movenext($this);
- }
- } else {
- while (!$this->EOF) {
- // Fix for array_slice re-numbering numeric associative keys
- $keys = array_slice(array_keys($this->fields), 1);
- $sliced_array = array();
-
- foreach($keys as $key) {
- $sliced_array[$key] = $this->fields[$key];
- }
-
- $results[trim(reset($this->fields))] = $sliced_array;
- adodb_movenext($this);
- }
- }
- } else {
- if ($numIndex) {
- while (!$this->EOF) {
- $results[trim($this->fields[0])] = array_slice($this->fields, 1);
- $this->MoveNext();
- }
- } else {
- while (!$this->EOF) {
- // Fix for array_slice re-numbering numeric associative keys
- $keys = array_slice(array_keys($this->fields), 1);
- $sliced_array = array();
-
- foreach($keys as $key) {
- $sliced_array[$key] = $this->fields[$key];
- }
-
- $results[trim(reset($this->fields))] = $sliced_array;
- $this->MoveNext();
- }
- }
- }
- } else {
- if ($ADODB_EXTENSION) {
- // return scalar values
- if ($numIndex) {
- while (!$this->EOF) {
- // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
- $results[trim(($this->fields[0]))] = $this->fields[1];
- adodb_movenext($this);
- }
- } else {
- while (!$this->EOF) {
- // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
- $v1 = trim(reset($this->fields));
- $v2 = ''.next($this->fields);
- $results[$v1] = $v2;
- adodb_movenext($this);
- }
- }
- } else {
- if ($numIndex) {
- while (!$this->EOF) {
- // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
- $results[trim(($this->fields[0]))] = $this->fields[1];
- $this->MoveNext();
- }
- } else {
- while (!$this->EOF) {
- // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
- $v1 = trim(reset($this->fields));
- $v2 = ''.next($this->fields);
- $results[$v1] = $v2;
- $this->MoveNext();
- }
- }
- }
- }
-
- $ref =& $results; # workaround accelerator incompat with PHP 4.4 :(
- return $ref;
- }
-
-
- /**
- *
- * @param v is the character timestamp in YYYY-MM-DD hh:mm:ss format
- * @param fmt is the format to apply to it, using date()
- *
- * @return a timestamp formated as user desires
- */
- function UserTimeStamp($v,$fmt='Y-m-d H:i:s')
- {
- if (is_numeric($v) && strlen($v)<14) return adodb_date($fmt,$v);
- $tt = $this->UnixTimeStamp($v);
- // $tt == -1 if pre TIMESTAMP_FIRST_YEAR
- if (($tt === false || $tt == -1) && $v != false) return $v;
- if ($tt === 0) return $this->emptyTimeStamp;
- return adodb_date($fmt,$tt);
- }
-
-
- /**
- * @param v is the character date in YYYY-MM-DD format, returned by database
- * @param fmt is the format to apply to it, using date()
- *
- * @return a date formated as user desires
- */
- function UserDate($v,$fmt='Y-m-d')
- {
- $tt = $this->UnixDate($v);
- // $tt == -1 if pre TIMESTAMP_FIRST_YEAR
- if (($tt === false || $tt == -1) && $v != false) return $v;
- else if ($tt == 0) return $this->emptyDate;
- else if ($tt == -1) { // pre-TIMESTAMP_FIRST_YEAR
- }
- return adodb_date($fmt,$tt);
- }
-
-
- /**
- * @param $v is a date string in YYYY-MM-DD format
- *
- * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
- */
- function UnixDate($v)
- {
- return ADOConnection::UnixDate($v);
- }
-
-
- /**
- * @param $v is a timestamp string in YYYY-MM-DD HH-NN-SS format
- *
- * @return date in unix timestamp format, or 0 if before TIMESTAMP_FIRST_YEAR, or false if invalid date format
- */
- function UnixTimeStamp($v)
- {
- return ADOConnection::UnixTimeStamp($v);
- }
-
-
- /**
- * PEAR DB Compat - do not use internally
- */
- function Free()
- {
- return $this->Close();
- }
-
-
- /**
- * PEAR DB compat, number of rows
- */
- function NumRows()
- {
- return $this->_numOfRows;
- }
-
-
- /**
- * PEAR DB compat, number of cols
- */
- function NumCols()
- {
- return $this->_numOfFields;
- }
-
- /**
- * Fetch a row, returning false if no more rows.
- * This is PEAR DB compat mode.
- *
- * @return false or array containing the current record
- */
- function &FetchRow()
- {
- if ($this->EOF) {
- $false = false;
- return $false;
- }
- $arr = $this->fields;
- $this->_currentRow++;
- if (!$this->_fetch()) $this->EOF = true;
- return $arr;
- }
-
-
- /**
- * Fetch a row, returning PEAR_Error if no more rows.
- * This is PEAR DB compat mode.
- *
- * @return DB_OK or error object
- */
- function FetchInto(&$arr)
- {
- if ($this->EOF) return (defined('PEAR_ERROR_RETURN')) ? new PEAR_Error('EOF',-1): false;
- $arr = $this->fields;
- $this->MoveNext();
- return 1; // DB_OK
- }
-
-
- /**
- * Move to the first row in the recordset. Many databases do NOT support this.
- *
- * @return true or false
- */
- function MoveFirst()
- {
- if ($this->_currentRow == 0) return true;
- return $this->Move(0);
- }
-
-
- /**
- * Move to the last row in the recordset.
- *
- * @return true or false
- */
- function MoveLast()
- {
- if ($this->_numOfRows >= 0) return $this->Move($this->_numOfRows-1);
- if ($this->EOF) return false;
- while (!$this->EOF) {
- $f = $this->fields;
- $this->MoveNext();
- }
- $this->fields = $f;
- $this->EOF = false;
- return true;
- }
-
-
- /**
- * Move to next record in the recordset.
- *
- * @return true if there still rows available, or false if there are no more rows (EOF).
- */
- function MoveNext()
- {
- if (!$this->EOF) {
- $this->_currentRow++;
- if ($this->_fetch()) return true;
- }
- $this->EOF = true;
- /* -- tested error handling when scrolling cursor -- seems useless.
- $conn = $this->connection;
- if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) {
- $fn = $conn->raiseErrorFn;
- $fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database);
- }
- */
- return false;
- }
-
-
- /**
- * Random access to a specific row in the recordset. Some databases do not support
- * access to previous rows in the databases (no scrolling backwards).
- *
- * @param rowNumber is the row to move to (0-based)
- *
- * @return true if there still rows available, or false if there are no more rows (EOF).
- */
- function Move($rowNumber = 0)
- {
- $this->EOF = false;
- if ($rowNumber == $this->_currentRow) return true;
- if ($rowNumber >= $this->_numOfRows)
- if ($this->_numOfRows != -1) $rowNumber = $this->_numOfRows-2;
-
- if ($this->canSeek) {
-
- if ($this->_seek($rowNumber)) {
- $this->_currentRow = $rowNumber;
- if ($this->_fetch()) {
- return true;
- }
- } else {
- $this->EOF = true;
- return false;
- }
- } else {
- if ($rowNumber < $this->_currentRow) return false;
- global $ADODB_EXTENSION;
- if ($ADODB_EXTENSION) {
- while (!$this->EOF && $this->_currentRow < $rowNumber) {
- adodb_movenext($this);
- }
- } else {
-
- while (! $this->EOF && $this->_currentRow < $rowNumber) {
- $this->_currentRow++;
-
- if (!$this->_fetch()) $this->EOF = true;
- }
- }
- return !($this->EOF);
- }
-
- $this->fields = false;
- $this->EOF = true;
- return false;
- }
-
-
- /**
- * Get the value of a field in the current row by column name.
- * Will not work if ADODB_FETCH_MODE is set to ADODB_FETCH_NUM.
- *
- * @param colname is the field to access
- *
- * @return the value of $colname column
- */
- function Fields($colname)
- {
- return $this->fields[$colname];
- }
-
- function GetAssocKeys($upper=true)
- {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- if ($upper === 2) $this->bind[$o->name] = $i;
- else $this->bind[($upper) ? strtoupper($o->name) : strtolower($o->name)] = $i;
- }
- }
-
- /**
- * Use associative array to get fields array for databases that do not support
- * associative arrays. Submitted by Paolo S. Asioli paolo.asioli#libero.it
- *
- * If you don't want uppercase cols, set $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC
- * before you execute your SQL statement, and access $rs->fields['col'] directly.
- *
- * $upper 0 = lowercase, 1 = uppercase, 2 = whatever is returned by FetchField
- */
- function &GetRowAssoc($upper=1)
- {
- $record = array();
- // if (!$this->fields) return $record;
-
- if (!$this->bind) {
- $this->GetAssocKeys($upper);
- }
-
- foreach($this->bind as $k => $v) {
- $record[$k] = $this->fields[$v];
- }
-
- return $record;
- }
-
-
- /**
- * Clean up recordset
- *
- * @return true or false
- */
- function Close()
- {
- // free connection object - this seems to globally free the object
- // and not merely the reference, so don't do this...
- // $this->connection = false;
- if (!$this->_closed) {
- $this->_closed = true;
- return $this->_close();
- } else
- return true;
- }
-
- /**
- * synonyms RecordCount and RowCount
- *
- * @return the number of rows or -1 if this is not supported
- */
- function RecordCount() {return $this->_numOfRows;}
-
-
- /*
- * If we are using PageExecute(), this will return the maximum possible rows
- * that can be returned when paging a recordset.
- */
- function MaxRecordCount()
- {
- return ($this->_maxRecordCount) ? $this->_maxRecordCount : $this->RecordCount();
- }
-
- /**
- * synonyms RecordCount and RowCount
- *
- * @return the number of rows or -1 if this is not supported
- */
- function RowCount() {return $this->_numOfRows;}
-
-
- /**
- * Portable RecordCount. Pablo Roca <pabloroca@mvps.org>
- *
- * @return the number of records from a previous SELECT. All databases support this.
- *
- * But aware possible problems in multiuser environments. For better speed the table
- * must be indexed by the condition. Heavy test this before deploying.
- */
- function PO_RecordCount($table="", $condition="") {
-
- $lnumrows = $this->_numOfRows;
- // the database doesn't support native recordcount, so we do a workaround
- if ($lnumrows == -1 && $this->connection) {
- IF ($table) {
- if ($condition) $condition = " WHERE " . $condition;
- $resultrows = &$this->connection->Execute("SELECT COUNT(*) FROM $table $condition");
- if ($resultrows) $lnumrows = reset($resultrows->fields);
- }
- }
- return $lnumrows;
- }
-
-
- /**
- * @return the current row in the recordset. If at EOF, will return the last row. 0-based.
- */
- function CurrentRow() {return $this->_currentRow;}
-
- /**
- * synonym for CurrentRow -- for ADO compat
- *
- * @return the current row in the recordset. If at EOF, will return the last row. 0-based.
- */
- function AbsolutePosition() {return $this->_currentRow;}
-
- /**
- * @return the number of columns in the recordset. Some databases will set this to 0
- * if no records are returned, others will return the number of columns in the query.
- */
- function FieldCount() {return $this->_numOfFields;}
-
-
- /**
- * Get the ADOFieldObject of a specific column.
- *
- * @param fieldoffset is the column position to access(0-based).
- *
- * @return the ADOFieldObject for that column, or false.
- */
- function &FetchField($fieldoffset = -1)
- {
- // must be defined by child class
-
- $false = false;
- return $false;
- }
-
- /**
- * Get the ADOFieldObjects of all columns in an array.
- *
- */
- function& FieldTypesArray()
- {
- $arr = array();
- for ($i=0, $max=$this->_numOfFields; $i < $max; $i++)
- $arr[] = $this->FetchField($i);
- return $arr;
- }
-
- /**
- * Return the fields array of the current row as an object for convenience.
- * The default case is lowercase field names.
- *
- * @return the object with the properties set to the fields of the current row
- */
- function &FetchObj()
- {
- $o =& $this->FetchObject(false);
- return $o;
- }
-
- /**
- * Return the fields array of the current row as an object for convenience.
- * The default case is uppercase.
- *
- * @param $isupper to set the object property names to uppercase
- *
- * @return the object with the properties set to the fields of the current row
- */
- function &FetchObject($isupper=true)
- {
- if (empty($this->_obj)) {
- $this->_obj = new ADOFetchObj();
- $this->_names = array();
- for ($i=0; $i <$this->_numOfFields; $i++) {
- $f = $this->FetchField($i);
- $this->_names[] = $f->name;
- }
- }
- $i = 0;
- if (PHP_VERSION >= 5) $o = clone($this->_obj);
- else $o = $this->_obj;
-
- for ($i=0; $i <$this->_numOfFields; $i++) {
- $name = $this->_names[$i];
- if ($isupper) $n = strtoupper($name);
- else $n = $name;
-
- $o->$n = $this->Fields($name);
- }
- return $o;
- }
-
- /**
- * Return the fields array of the current row as an object for convenience.
- * The default is lower-case field names.
- *
- * @return the object with the properties set to the fields of the current row,
- * or false if EOF
- *
- * Fixed bug reported by tim@orotech.net
- */
- function &FetchNextObj()
- {
- $o =& $this->FetchNextObject(false);
- return $o;
- }
-
-
- /**
- * Return the fields array of the current row as an object for convenience.
- * The default is upper case field names.
- *
- * @param $isupper to set the object property names to uppercase
- *
- * @return the object with the properties set to the fields of the current row,
- * or false if EOF
- *
- * Fixed bug reported by tim@orotech.net
- */
- function &FetchNextObject($isupper=true)
- {
- $o = false;
- if ($this->_numOfRows != 0 && !$this->EOF) {
- $o = $this->FetchObject($isupper);
- $this->_currentRow++;
- if ($this->_fetch()) return $o;
- }
- $this->EOF = true;
- return $o;
- }
-
- /**
- * Get the metatype of the column. This is used for formatting. This is because
- * many databases use different names for the same type, so we transform the original
- * type to our standardised version which uses 1 character codes:
- *
- * @param t is the type passed in. Normally is ADOFieldObject->type.
- * @param len is the maximum length of that field. This is because we treat character
- * fields bigger than a certain size as a 'B' (blob).
- * @param fieldobj is the field object returned by the database driver. Can hold
- * additional info (eg. primary_key for mysql).
- *
- * @return the general type of the data:
- * C for character < 250 chars
- * X for teXt (>= 250 chars)
- * B for Binary
- * N for numeric or floating point
- * D for date
- * T for timestamp
- * L for logical/Boolean
- * I for integer
- * R for autoincrement counter/integer
- *
- *
- */
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
- // changed in 2.32 to hashing instead of switch stmt for speed...
- static $typeMap = array(
- 'VARCHAR' => 'C',
- 'VARCHAR2' => 'C',
- 'CHAR' => 'C',
- 'C' => 'C',
- 'STRING' => 'C',
- 'NCHAR' => 'C',
- 'NVARCHAR' => 'C',
- 'VARYING' => 'C',
- 'BPCHAR' => 'C',
- 'CHARACTER' => 'C',
- 'INTERVAL' => 'C', # Postgres
- 'MACADDR' => 'C', # postgres
- ##
- 'LONGCHAR' => 'X',
- 'TEXT' => 'X',
- 'NTEXT' => 'X',
- 'M' => 'X',
- 'X' => 'X',
- 'CLOB' => 'X',
- 'NCLOB' => 'X',
- 'LVARCHAR' => 'X',
- ##
- 'BLOB' => 'B',
- 'IMAGE' => 'B',
- 'BINARY' => 'B',
- 'VARBINARY' => 'B',
- 'LONGBINARY' => 'B',
- 'B' => 'B',
- ##
- 'YEAR' => 'D', // mysql
- 'DATE' => 'D',
- 'D' => 'D',
- ##
- 'UNIQUEIDENTIFIER' => 'C', # MS SQL Server
- ##
- 'TIME' => 'T',
- 'TIMESTAMP' => 'T',
- 'DATETIME' => 'T',
- 'TIMESTAMPTZ' => 'T',
- 'T' => 'T',
- 'TIMESTAMP WITHOUT TIME ZONE' => 'T', // postgresql
- ##
- 'BOOL' => 'L',
- 'BOOLEAN' => 'L',
- 'BIT' => 'L',
- 'L' => 'L',
- ##
- 'COUNTER' => 'R',
- 'R' => 'R',
- 'SERIAL' => 'R', // ifx
- 'INT IDENTITY' => 'R',
- ##
- 'INT' => 'I',
- 'INT2' => 'I',
- 'INT4' => 'I',
- 'INT8' => 'I',
- 'INTEGER' => 'I',
- 'INTEGER UNSIGNED' => 'I',
- 'SHORT' => 'I',
- 'TINYINT' => 'I',
- 'SMALLINT' => 'I',
- 'I' => 'I',
- ##
- 'LONG' => 'N', // interbase is numeric, oci8 is blob
- 'BIGINT' => 'N', // this is bigger than PHP 32-bit integers
- 'DECIMAL' => 'N',
- 'DEC' => 'N',
- 'REAL' => 'N',
- 'DOUBLE' => 'N',
- 'DOUBLE PRECISION' => 'N',
- 'SMALLFLOAT' => 'N',
- 'FLOAT' => 'N',
- 'NUMBER' => 'N',
- 'NUM' => 'N',
- 'NUMERIC' => 'N',
- 'MONEY' => 'N',
-
- ## informix 9.2
- 'SQLINT' => 'I',
- 'SQLSERIAL' => 'I',
- 'SQLSMINT' => 'I',
- 'SQLSMFLOAT' => 'N',
- 'SQLFLOAT' => 'N',
- 'SQLMONEY' => 'N',
- 'SQLDECIMAL' => 'N',
- 'SQLDATE' => 'D',
- 'SQLVCHAR' => 'C',
- 'SQLCHAR' => 'C',
- 'SQLDTIME' => 'T',
- 'SQLINTERVAL' => 'N',
- 'SQLBYTES' => 'B',
- 'SQLTEXT' => 'X',
- ## informix 10
- "SQLINT8" => 'I8',
- "SQLSERIAL8" => 'I8',
- "SQLNCHAR" => 'C',
- "SQLNVCHAR" => 'C',
- "SQLLVARCHAR" => 'X',
- "SQLBOOL" => 'L'
- );
-
- $tmap = false;
- $t = strtoupper($t);
- $tmap = (isset($typeMap[$t])) ? $typeMap[$t] : 'N';
- switch ($tmap) {
- case 'C':
-
- // is the char field is too long, return as text field...
- if ($this->blobSize >= 0) {
- if ($len > $this->blobSize) return 'X';
- } else if ($len > 250) {
- return 'X';
- }
- return 'C';
-
- case 'I':
- if (!empty($fieldobj->primary_key)) return 'R';
- return 'I';
-
- case false:
- return 'N';
-
- case 'B':
- if (isset($fieldobj->binary))
- return ($fieldobj->binary) ? 'B' : 'X';
- return 'B';
-
- case 'D':
- if (!empty($this->connection) && !empty($this->connection->datetime)) return 'T';
- return 'D';
-
- default:
- if ($t == 'LONG' && $this->dataProvider == 'oci8') return 'B';
- return $tmap;
- }
- }
-
-
- function _close() {}
-
- /**
- * set/returns the current recordset page when paginating
- */
- function AbsolutePage($page=-1)
- {
- if ($page != -1) $this->_currentPage = $page;
- return $this->_currentPage;
- }
-
- /**
- * set/returns the status of the atFirstPage flag when paginating
- */
- function AtFirstPage($status=false)
- {
- if ($status != false) $this->_atFirstPage = $status;
- return $this->_atFirstPage;
- }
-
- function LastPageNo($page = false)
- {
- if ($page != false) $this->_lastPageNo = $page;
- return $this->_lastPageNo;
- }
-
- /**
- * set/returns the status of the atLastPage flag when paginating
- */
- function AtLastPage($status=false)
- {
- if ($status != false) $this->_atLastPage = $status;
- return $this->_atLastPage;
- }
-
-} // end class ADORecordSet
-
- //==============================================================================================
- // CLASS ADORecordSet_array
- //==============================================================================================
-
- /**
- * This class encapsulates the concept of a recordset created in memory
- * as an array. This is useful for the creation of cached recordsets.
- *
- * Note that the constructor is different from the standard ADORecordSet
- */
-
- class ADORecordSet_array extends ADORecordSet
- {
- var $databaseType = 'array';
-
- var $_array; // holds the 2-dimensional data array
- var $_types; // the array of types of each column (C B I L M)
- var $_colnames; // names of each column in array
- var $_skiprow1; // skip 1st row because it holds column names
- var $_fieldobjects; // holds array of field objects
- var $canSeek = true;
- var $affectedrows = false;
- var $insertid = false;
- var $sql = '';
- var $compat = false;
- /**
- * Constructor
- *
- */
- function ADORecordSet_array($fakeid=1)
- {
- global $ADODB_FETCH_MODE,$ADODB_COMPAT_FETCH;
-
- // fetch() on EOF does not delete $this->fields
- $this->compat = !empty($ADODB_COMPAT_FETCH);
- $this->ADORecordSet($fakeid); // fake queryID
- $this->fetchMode = $ADODB_FETCH_MODE;
- }
-
- function _transpose($addfieldnames=true)
- {
- global $ADODB_INCLUDED_LIB;
-
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- $hdr = true;
-
- $fobjs = $addfieldnames ? $this->_fieldobjects : false;
- adodb_transpose($this->_array, $newarr, $hdr, $fobjs);
- //adodb_pr($newarr);
-
- $this->_skiprow1 = false;
- $this->_array =& $newarr;
- $this->_colnames = $hdr;
-
- adodb_probetypes($newarr,$this->_types);
-
- $this->_fieldobjects = array();
-
- foreach($hdr as $k => $name) {
- $f = new ADOFieldObject();
- $f->name = $name;
- $f->type = $this->_types[$k];
- $f->max_length = -1;
- $this->_fieldobjects[] = $f;
- }
- $this->fields = reset($this->_array);
-
- $this->_initrs();
-
- }
-
- /**
- * Setup the array.
- *
- * @param array is a 2-dimensional array holding the data.
- * The first row should hold the column names
- * unless paramter $colnames is used.
- * @param typearr holds an array of types. These are the same types
- * used in MetaTypes (C,B,L,I,N).
- * @param [colnames] array of column names. If set, then the first row of
- * $array should not hold the column names.
- */
- function InitArray($array,$typearr,$colnames=false)
- {
- $this->_array = $array;
- $this->_types = $typearr;
- if ($colnames) {
- $this->_skiprow1 = false;
- $this->_colnames = $colnames;
- } else {
- $this->_skiprow1 = true;
- $this->_colnames = $array[0];
- }
- $this->Init();
- }
- /**
- * Setup the Array and datatype file objects
- *
- * @param array is a 2-dimensional array holding the data.
- * The first row should hold the column names
- * unless paramter $colnames is used.
- * @param fieldarr holds an array of ADOFieldObject's.
- */
- function InitArrayFields(&$array,&$fieldarr)
- {
- $this->_array =& $array;
- $this->_skiprow1= false;
- if ($fieldarr) {
- $this->_fieldobjects =& $fieldarr;
- }
- $this->Init();
- }
-
- function &GetArray($nRows=-1)
- {
- if ($nRows == -1 && $this->_currentRow <= 0 && !$this->_skiprow1) {
- return $this->_array;
- } else {
- $arr =& ADORecordSet::GetArray($nRows);
- return $arr;
- }
- }
-
- function _initrs()
- {
- $this->_numOfRows = sizeof($this->_array);
- if ($this->_skiprow1) $this->_numOfRows -= 1;
-
- $this->_numOfFields =(isset($this->_fieldobjects)) ?
- sizeof($this->_fieldobjects):sizeof($this->_types);
- }
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- $mode = isset($this->adodbFetchMode) ? $this->adodbFetchMode : $this->fetchMode;
-
- if ($mode & ADODB_FETCH_ASSOC) {
- if (!isset($this->fields[$colname])) $colname = strtolower($colname);
- 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 &FetchField($fieldOffset = -1)
- {
- if (isset($this->_fieldobjects)) {
- return $this->_fieldobjects[$fieldOffset];
- }
- $o = new ADOFieldObject();
- $o->name = $this->_colnames[$fieldOffset];
- $o->type = $this->_types[$fieldOffset];
- $o->max_length = -1; // length not known
-
- return $o;
- }
-
- function _seek($row)
- {
- if (sizeof($this->_array) && 0 <= $row && $row < $this->_numOfRows) {
- $this->_currentRow = $row;
- if ($this->_skiprow1) $row += 1;
- $this->fields = $this->_array[$row];
- return true;
- }
- return false;
- }
-
- function MoveNext()
- {
- if (!$this->EOF) {
- $this->_currentRow++;
-
- $pos = $this->_currentRow;
-
- if ($this->_numOfRows <= $pos) {
- if (!$this->compat) $this->fields = false;
- } else {
- if ($this->_skiprow1) $pos += 1;
- $this->fields = $this->_array[$pos];
- return true;
- }
- $this->EOF = true;
- }
-
- return false;
- }
-
- function _fetch()
- {
- $pos = $this->_currentRow;
-
- if ($this->_numOfRows <= $pos) {
- if (!$this->compat) $this->fields = false;
- return false;
- }
- if ($this->_skiprow1) $pos += 1;
- $this->fields = $this->_array[$pos];
- return true;
- }
-
- function _close()
- {
- return true;
- }
-
- } // ADORecordSet_array
-
- //==============================================================================================
- // HELPER FUNCTIONS
- //==============================================================================================
-
- /**
- * Synonym for ADOLoadCode. Private function. Do not use.
- *
- * @deprecated
- */
- function ADOLoadDB($dbType)
- {
- return ADOLoadCode($dbType);
- }
-
- /**
- * Load the code for a specific database driver. Private function. Do not use.
- */
- function ADOLoadCode($dbType)
- {
- global $ADODB_LASTDB;
-
- if (!$dbType) return false;
- $db = strtolower($dbType);
- switch ($db) {
- case 'ado':
- if (PHP_VERSION >= 5) $db = 'ado5';
- $class = 'ado';
- break;
- case 'ifx':
- case 'maxsql': $class = $db = 'mysqlt'; break;
- case 'postgres':
- case 'postgres8':
- case 'pgsql': $class = $db = 'postgres7'; break;
- default:
- $class = $db; break;
- }
-
- $file = ADODB_DIR."/drivers/adodb-".$db.".inc.php";
- @include_once($file);
- $ADODB_LASTDB = $class;
- if (class_exists("ADODB_" . $class)) return $class;
-
- //ADOConnection::outp(adodb_pr(get_declared_classes(),true));
- if (!file_exists($file)) ADOConnection::outp("Missing file: $file");
- else ADOConnection::outp("Syntax error in file: $file");
- return false;
- }
-
- /**
- * synonym for ADONewConnection for people like me who cannot remember the correct name
- */
- function &NewADOConnection($db='')
- {
- $tmp =& ADONewConnection($db);
- return $tmp;
- }
-
- /**
- * Instantiate a new Connection class for a specific database driver.
- *
- * @param [db] is the database Connection object to create. If undefined,
- * use the last database driver that was loaded by ADOLoadCode().
- *
- * @return the freshly created instance of the Connection class.
- */
- function &ADONewConnection($db='')
- {
- GLOBAL $ADODB_NEWCONNECTION, $ADODB_LASTDB;
-
- if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
- $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false;
- $false = false;
- if ($at = strpos($db,'://')) {
- $origdsn = $db;
- if (PHP_VERSION < 5) $dsna = @parse_url($db);
- else {
- $fakedsn = 'fake'.substr($db,$at);
- $dsna = @parse_url($fakedsn);
- $dsna['scheme'] = substr($db,0,$at);
-
- if (strncmp($db,'pdo',3) == 0) {
- $sch = explode('_',$dsna['scheme']);
- if (sizeof($sch)>1) {
- $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : '';
- $dsna['host'] = rawurlencode($sch[1].':host='.rawurldecode($dsna['host']));
- $dsna['scheme'] = 'pdo';
- }
- }
- }
-
- if (!$dsna) {
- // special handling of oracle, which might not have host
- $db = str_replace('@/','@adodb-fakehost/',$db);
- $dsna = parse_url($db);
- if (!$dsna) return $false;
- $dsna['host'] = '';
- }
- $db = @$dsna['scheme'];
- if (!$db) return $false;
- $dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : '';
- $dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : '';
- $dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : '';
- $dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : ''; # strip off initial /
-
- if (isset($dsna['query'])) {
- $opt1 = explode('&',$dsna['query']);
- foreach($opt1 as $k => $v) {
- $arr = explode('=',$v);
- $opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1;
- }
- } else $opt = array();
- }
- /*
- * 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
- */
- if (!empty($ADODB_NEWCONNECTION)) {
- $obj = $ADODB_NEWCONNECTION($db);
-
- } else {
-
- if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = '';
- if (empty($db)) $db = $ADODB_LASTDB;
-
- if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db);
-
- if (!$db) {
- if (isset($origdsn)) $db = $origdsn;
- if ($errorfn) {
- // raise an error
- $ignore = false;
- $errorfn('ADONewConnection', 'ADONewConnection', -998,
- "could not load the database driver for '$db'",
- $db,false,$ignore);
- } else
- ADOConnection::outp( "<p>ADONewConnection: Unable to load database driver '$db'</p>",false);
-
- return $false;
- }
-
- $cls = 'ADODB_'.$db;
- if (!class_exists($cls)) {
- adodb_backtrace();
- return $false;
- }
-
- $obj = new $cls();
- }
-
- # constructor should not fail
- if ($obj) {
- if ($errorfn) $obj->raiseErrorFn = $errorfn;
- if (isset($dsna)) {
- if (isset($dsna['port'])) $obj->port = $dsna['port'];
- foreach($opt as $k => $v) {
- switch(strtolower($k)) {
- case 'new':
- $nconnect = true; $persist = true; break;
- case 'persist':
- case 'persistent': $persist = $v; break;
- case 'debug': $obj->debug = (integer) $v; break;
- #ibase
- case 'role': $obj->role = $v; break;
- case 'dialect': $obj->dialect = (integer) $v; break;
- case 'charset': $obj->charset = $v; $obj->charSet=$v; break;
- case 'buffers': $obj->buffers = $v; break;
- case 'fetchmode': $obj->SetFetchMode($v); break;
- #ado
- case 'charpage': $obj->charPage = $v; break;
- #mysql, mysqli
- case 'clientflags': $obj->clientFlags = $v; break;
- #mysql, mysqli, postgres
- case 'port': $obj->port = $v; break;
- #mysqli
- case 'socket': $obj->socket = $v; break;
- #oci8
- case 'nls_date_format': $obj->NLS_DATE_FORMAT = $v; break;
- }
- }
- if (empty($persist))
- $ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
- else if (empty($nconnect))
- $ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
- else
- $ok = $obj->NConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
-
- if (!$ok) return $false;
- }
- }
- return $obj;
- }
-
-
-
- // $perf == true means called by NewPerfMonitor(), otherwise for data dictionary
- function _adodb_getdriver($provider,$drivername,$perf=false)
- {
- switch ($provider) {
- case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6);
- case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5);
- case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4);
- case 'native': break;
- default:
- return $provider;
- }
-
- switch($drivername) {
- case 'mysqlt':
- case 'mysqli':
- $drivername='mysql';
- break;
- case 'postgres7':
- case 'postgres8':
- $drivername = 'postgres';
- break;
- case 'firebird15': $drivername = 'firebird'; break;
- case 'oracle': $drivername = 'oci8'; break;
- case 'access': if ($perf) $drivername = ''; break;
- case 'db2' : break;
- case 'sapdb' : break;
- default:
- $drivername = 'generic';
- break;
- }
- return $drivername;
- }
-
- function &NewPerfMonitor(&$conn)
- {
- $false = false;
- $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType,true);
- if (!$drivername || $drivername == 'generic') return $false;
- include_once(ADODB_DIR.'/adodb-perf.inc.php');
- @include_once(ADODB_DIR."/perf/perf-$drivername.inc.php");
- $class = "Perf_$drivername";
- if (!class_exists($class)) return $false;
- $perf = new $class($conn);
-
- return $perf;
- }
-
- function &NewDataDictionary(&$conn,$drivername=false)
- {
- $false = false;
- if (!$drivername) $drivername = _adodb_getdriver($conn->dataProvider,$conn->databaseType);
-
- include_once(ADODB_DIR.'/adodb-lib.inc.php');
- include_once(ADODB_DIR.'/adodb-datadict.inc.php');
- $path = ADODB_DIR."/datadict/datadict-$drivername.inc.php";
-
- if (!file_exists($path)) {
- ADOConnection::outp("Dictionary driver '$path' not available");
- return $false;
- }
- include_once($path);
- $class = "ADODB2_$drivername";
- $dict = new $class();
- $dict->dataProvider = $conn->dataProvider;
- $dict->connection = &$conn;
- $dict->upperName = strtoupper($drivername);
- $dict->quote = $conn->nameQuote;
- if (!empty($conn->_connectionID))
- $dict->serverInfo = $conn->ServerInfo();
-
- return $dict;
- }
-
-
-
- /*
- Perform a print_r, with pre tags for better formatting.
- */
- function adodb_pr($var,$as_string=false)
- {
- if ($as_string) ob_start();
-
- if (isset($_SERVER['HTTP_USER_AGENT'])) {
- echo " <pre>\n";print_r($var);echo "</pre>\n";
- } else
- print_r($var);
-
- if ($as_string) {
- $s = ob_get_contents();
- ob_end_clean();
- return $s;
- }
- }
-
- /*
- Perform a stack-crawl and pretty print it.
-
- @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then).
- @param levels Number of levels to display
- */
- function adodb_backtrace($printOrArr=true,$levels=9999)
- {
- global $ADODB_INCLUDED_LIB;
- if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
- return _adodb_backtrace($printOrArr,$levels);
- }
-
-
-}
-?>
diff --git a/lib/adodb/contrib/toxmlrpc.inc.php b/lib/adodb/contrib/toxmlrpc.inc.php
deleted file mode 100644
index ef49235..0000000
--- a/lib/adodb/contrib/toxmlrpc.inc.php
+++ /dev/null
@@ -1,183 +0,0 @@
-<?php
- /**
- * Helper functions to convert between ADODB recordset objects and XMLRPC values.
- * Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs
- *
- * @author Daniele Baroncelli
- * @author Gaetano Giunta
- * @copyright (c) 2003-2004 Giunta/Baroncelli. All rights reserved.
- *
- * @todo some more error checking here and there
- * @todo document the xmlrpc-struct used to encode recordset info
- * @todo verify if using xmlrpc_encode($rs->GetArray()) would work with:
- * - ADODB_FETCH_BOTH
- * - null values
- */
-
- /**
- * Include the main libraries
- */
- require_once('xmlrpc.inc');
- if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
-
- /**
- * Builds an xmlrpc struct value out of an AdoDB recordset
- */
- function rs2xmlrpcval(&$adodbrs) {
-
- $header =& rs2xmlrpcval_header($adodbrs);
- $body =& rs2xmlrpcval_body($adodbrs);
-
- // put it all together and build final xmlrpc struct
- $xmlrpcrs =& new xmlrpcval ( array(
- "header" => $header,
- "body" => $body,
- ), "struct");
-
- return $xmlrpcrs;
-
- }
-
- /**
- * Builds an xmlrpc struct value describing an AdoDB recordset
- */
- function rs2xmlrpcval_header($adodbrs)
- {
- $numfields = $adodbrs->FieldCount();
- $numrecords = $adodbrs->RecordCount();
-
- // build structure holding recordset information
- $fieldstruct = array();
- for ($i = 0; $i < $numfields; $i++) {
- $fld = $adodbrs->FetchField($i);
- $fieldarray = array();
- if (isset($fld->name))
- $fieldarray["name"] =& new xmlrpcval ($fld->name);
- if (isset($fld->type))
- $fieldarray["type"] =& new xmlrpcval ($fld->type);
- if (isset($fld->max_length))
- $fieldarray["max_length"] =& new xmlrpcval ($fld->max_length, "int");
- if (isset($fld->not_null))
- $fieldarray["not_null"] =& new xmlrpcval ($fld->not_null, "boolean");
- if (isset($fld->has_default))
- $fieldarray["has_default"] =& new xmlrpcval ($fld->has_default, "boolean");
- if (isset($fld->default_value))
- $fieldarray["default_value"] =& new xmlrpcval ($fld->default_value);
- $fieldstruct[$i] =& new xmlrpcval ($fieldarray, "struct");
- }
- $fieldcount =& new xmlrpcval ($numfields, "int");
- $recordcount =& new xmlrpcval ($numrecords, "int");
- $sql =& new xmlrpcval ($adodbrs->sql);
- $fieldinfo =& new xmlrpcval ($fieldstruct, "array");
-
- $header =& new xmlrpcval ( array(
- "fieldcount" => $fieldcount,
- "recordcount" => $recordcount,
- "sql" => $sql,
- "fieldinfo" => $fieldinfo
- ), "struct");
-
- return $header;
- }
-
- /**
- * Builds an xmlrpc struct value out of an AdoDB recordset
- * (data values only, no data definition)
- */
- function rs2xmlrpcval_body($adodbrs)
- {
- $numfields = $adodbrs->FieldCount();
-
- // build structure containing recordset data
- $adodbrs->MoveFirst();
- $rows = array();
- while (!$adodbrs->EOF) {
- $columns = array();
- // This should work on all cases of fetch mode: assoc, num, both or default
- if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
- for ($i = 0; $i < $numfields; $i++)
- if ($adodbrs->fields[$i] === null)
- $columns[$i] =& new xmlrpcval ('');
- else
- $columns[$i] =& xmlrpc_encode ($adodbrs->fields[$i]);
- else
- foreach ($adodbrs->fields as $val)
- if ($val === null)
- $columns[] =& new xmlrpcval ('');
- else
- $columns[] =& xmlrpc_encode ($val);
-
- $rows[] =& new xmlrpcval ($columns, "array");
-
- $adodbrs->MoveNext();
- }
- $body =& new xmlrpcval ($rows, "array");
-
- return $body;
- }
-
- /**
- * Returns an xmlrpc struct value as string out of an AdoDB recordset
- */
- function rs2xmlrpcstring (&$adodbrs) {
- $xmlrpc = rs2xmlrpcval ($adodbrs);
- if ($xmlrpc)
- return $xmlrpc->serialize();
- else
- return null;
- }
-
- /**
- * Given a well-formed xmlrpc struct object returns an AdoDB object
- *
- * @todo add some error checking on the input value
- */
- function xmlrpcval2rs (&$xmlrpcval) {
-
- $fields_array = array();
- $data_array = array();
-
- // rebuild column information
- $header =& $xmlrpcval->structmem('header');
-
- $numfields = $header->structmem('fieldcount');
- $numfields = $numfields->scalarval();
- $numrecords = $header->structmem('recordcount');
- $numrecords = $numrecords->scalarval();
- $sqlstring = $header->structmem('sql');
- $sqlstring = $sqlstring->scalarval();
-
- $fieldinfo =& $header->structmem('fieldinfo');
- for ($i = 0; $i < $numfields; $i++) {
- $temp =& $fieldinfo->arraymem($i);
- $fld =& new ADOFieldObject();
- while (list($key,$value) = $temp->structeach()) {
- if ($key == "name") $fld->name = $value->scalarval();
- if ($key == "type") $fld->type = $value->scalarval();
- if ($key == "max_length") $fld->max_length = $value->scalarval();
- if ($key == "not_null") $fld->not_null = $value->scalarval();
- if ($key == "has_default") $fld->has_default = $value->scalarval();
- if ($key == "default_value") $fld->default_value = $value->scalarval();
- } // while
- $fields_array[] = $fld;
- } // for
-
- // fetch recordset information into php array
- $body =& $xmlrpcval->structmem('body');
- for ($i = 0; $i < $numrecords; $i++) {
- $data_array[$i]= array();
- $xmlrpcrs_row =& $body->arraymem($i);
- for ($j = 0; $j < $numfields; $j++) {
- $temp =& $xmlrpcrs_row->arraymem($j);
- $data_array[$i][$j] = $temp->scalarval();
- } // for j
- } // for i
-
- // finally build in-memory recordset object and return it
- $rs =& new ADORecordSet_array();
- $rs->InitArrayFields($data_array,$fields_array);
- return $rs;
-
- }
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-access.inc.php b/lib/adodb/datadict/datadict-access.inc.php
deleted file mode 100644
index 4b62eb8..0000000
--- a/lib/adodb/datadict/datadict-access.inc.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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();
- }
-
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-db2.inc.php b/lib/adodb/datadict/datadict-db2.inc.php
deleted file mode 100644
index 21191b3..0000000
--- a/lib/adodb/datadict/datadict-db2.inc.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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;
- }
-
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-firebird.inc.php b/lib/adodb/datadict/datadict-firebird.inc.php
deleted file mode 100644
index 6598d95..0000000
--- a/lib/adodb/datadict/datadict-firebird.inc.php
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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.
-
-*/
-
-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;
- }
-
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-generic.inc.php b/lib/adodb/datadict/datadict-generic.inc.php
deleted file mode 100644
index fc5ba76..0000000
--- a/lib/adodb/datadict/datadict-generic.inc.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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;
- }
- }
-*/
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-ibase.inc.php b/lib/adodb/datadict/datadict-ibase.inc.php
deleted file mode 100644
index 163ba81..0000000
--- a/lib/adodb/datadict/datadict-ibase.inc.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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();
- }
-
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-informix.inc.php b/lib/adodb/datadict/datadict-informix.inc.php
deleted file mode 100644
index 879813b..0000000
--- a/lib/adodb/datadict/datadict-informix.inc.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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;
- }
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-mssql.inc.php b/lib/adodb/datadict/datadict-mssql.inc.php
deleted file mode 100644
index 5737c27..0000000
--- a/lib/adodb/datadict/datadict-mssql.inc.php
+++ /dev/null
@@ -1,282 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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.
-
-*/
-
-/*
-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 '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);
-
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-mysql.inc.php b/lib/adodb/datadict/datadict-mysql.inc.php
deleted file mode 100644
index a4af25f..0000000
--- a/lib/adodb/datadict/datadict-mysql.inc.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-oci8.inc.php b/lib/adodb/datadict/datadict-oci8.inc.php
deleted file mode 100644
index 238fab4..0000000
--- a/lib/adodb/datadict/datadict-oci8.inc.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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 'DECIMAL(1)';
- case 'I1': return 'DECIMAL(3)';
- case 'I2': return 'DECIMAL(5)';
- case 'I':
- case 'I4': return 'DECIMAL(10)';
-
- case 'I8': return 'DECIMAL(20)';
- case 'F': return 'DECIMAL';
- case 'N': return 'DECIMAL';
- 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";
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-postgres.inc.php b/lib/adodb/datadict/datadict-postgres.inc.php
deleted file mode 100644
index c56d3b6..0000000
--- a/lib/adodb/datadict/datadict-postgres.inc.php
+++ /dev/null
@@ -1,371 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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);
- }
-
- /**
- * 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;
- }
-
- /*
- 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;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-sapdb.inc.php b/lib/adodb/datadict/datadict-sapdb.inc.php
deleted file mode 100644
index 37de29e..0000000
--- a/lib/adodb/datadict/datadict-sapdb.inc.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-
-/**
- V4.50 6 July 2004 (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.
-
- 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) . ')' );
- }
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-sybase.inc.php b/lib/adodb/datadict/datadict-sybase.inc.php
deleted file mode 100644
index 4d21502..0000000
--- a/lib/adodb/datadict/datadict-sybase.inc.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-
-/**
- V4.94 23 Jan 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_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;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-access.inc.php b/lib/adodb/drivers/adodb-access.inc.php
deleted file mode 100644
index 0b2cb2b..0000000
--- a/lib/adodb/drivers/adodb-access.inc.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. 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
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado.inc.php b/lib/adodb/drivers/adodb-ado.inc.php
deleted file mode 100644
index 4d730f2..0000000
--- a/lib/adodb/drivers/adodb-ado.inc.php
+++ /dev/null
@@ -1,634 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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;
- 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;
- }
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado5.inc.php b/lib/adodb/drivers/adodb-ado5.inc.php
deleted file mode 100644
index a0e2e3e..0000000
--- a/lib/adodb/drivers/adodb-ado5.inc.php
+++ /dev/null
@@ -1,668 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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;
- 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;
- }
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado_access.inc.php b/lib/adodb/drivers/adodb-ado_access.inc.php
deleted file mode 100644
index ab83e26..0000000
--- a/lib/adodb/drivers/adodb-ado_access.inc.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado_mssql.inc.php b/lib/adodb/drivers/adodb-ado_mssql.inc.php
deleted file mode 100644
index 576223d..0000000
--- a/lib/adodb/drivers/adodb-ado_mssql.inc.php
+++ /dev/null
@@ -1,154 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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 @@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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-borland_ibase.inc.php b/lib/adodb/drivers/adodb-borland_ibase.inc.php
deleted file mode 100644
index ab15fef..0000000
--- a/lib/adodb/drivers/adodb-borland_ibase.inc.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-csv.inc.php b/lib/adodb/drivers/adodb-csv.inc.php
deleted file mode 100644
index a977416..0000000
--- a/lib/adodb/drivers/adodb-csv.inc.php
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-db2.inc.php b/lib/adodb/drivers/adodb-db2.inc.php
deleted file mode 100644
index 9c1882d..0000000
--- a/lib/adodb/drivers/adodb-db2.inc.php
+++ /dev/null
@@ -1,828 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 2007 (c) 2006 John Lim (jlim#natsoft.com.my). 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 1 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));
- 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);
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-fbsql.inc.php b/lib/adodb/drivers/adodb-fbsql.inc.php
deleted file mode 100644
index 6a19bc2..0000000
--- a/lib/adodb/drivers/adodb-fbsql.inc.php
+++ /dev/null
@@ -1,266 +0,0 @@
-<?php
-/*
- @version V4.94 23 Jan 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.
- 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
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-firebird.inc.php b/lib/adodb/drivers/adodb-firebird.inc.php
deleted file mode 100644
index 9b7b59e..0000000
--- a/lib/adodb/drivers/adodb-firebird.inc.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ibase.inc.php b/lib/adodb/drivers/adodb-ibase.inc.php
deleted file mode 100644
index 335493d..0000000
--- a/lib/adodb/drivers/adodb-ibase.inc.php
+++ /dev/null
@@ -1,887 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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';
- }
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-informix.inc.php b/lib/adodb/drivers/adodb-informix.inc.php
deleted file mode 100644
index eed00b0..0000000
--- a/lib/adodb/drivers/adodb-informix.inc.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-/**
-* @version V4.94 23 Jan 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.
-*
-* 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-informix72.inc.php b/lib/adodb/drivers/adodb-informix72.inc.php
deleted file mode 100644
index 3bf65ef..0000000
--- a/lib/adodb/drivers/adodb-informix72.inc.php
+++ /dev/null
@@ -1,475 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 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);
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ldap.inc.php b/lib/adodb/drivers/adodb-ldap.inc.php
deleted file mode 100644
index bbf0cbf..0000000
--- a/lib/adodb/drivers/adodb-ldap.inc.php
+++ /dev/null
@@ -1,406 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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 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;
-
- 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 = 'Could not bind to ' . $conn_info[0] . " as ".$username;
- $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;
- return $rs;
- }
-
- /* 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;
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mssql.inc.php b/lib/adodb/drivers/adodb-mssql.inc.php
deleted file mode 100644
index 8eebd91..0000000
--- a/lib/adodb/drivers/adodb-mssql.inc.php
+++ /dev/null
@@ -1,1037 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Native mssql driver. Requires mssql client. Works on Windows.
- To configure for Unix, see
- http://phpbuilder.com/columns/alberto20000919.php3
-
-*/
-
-// 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)
-//----------------------------------------------------------------
-
-
-// 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_mssql extends ADOConnection {
- var $databaseType = "mssql";
- var $dataProvider = "mssql";
- 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 $metaDatabasesSQL = "select name from 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 $_has_mssql_init;
- var $maxParameterLen = 4000;
- var $arrayClass = 'ADORecordSet_array_mssql';
- var $uniqueSort = true;
- var $leftOuter = '*=';
- var $rightOuter = '=*';
- var $ansiOuter = true; // for mssql7 or later
- var $poorAffectedRows = true;
- var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000
- var $uniqueOrderBy = true;
- var $_bindInputArray = true;
-
- function ADODB_mssql()
- {
- $this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=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);
-
- if (0) {
- $stmt = $this->PrepareSP('sp_server_info');
- $val = 2;
- $this->Parameter($stmt,$val,'attribute_id');
- $row = $this->GetRow($stmt);
- }
-
- $row = $this->GetRow("execute sp_server_info 2");
-
-
- if ($this->fetchMode === false) {
- $ADODB_FETCH_MODE = $savem;
- } else
- $this->SetFetchMode($savem);
-
- $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 _affectedrows()
- {
- return $this->GetOne('select @@rowcount');
- }
-
- var $_dropSeqSQL = "drop table %s";
-
- 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'");
- }
-
-
- 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;
- }
-
-
- 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();
- if ($this->transCnt) $this->transCnt -= 1;
- $this->Execute('COMMIT TRAN');
- return true;
- }
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $this->Execute('ROLLBACK TRAN');
- 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 &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()
- {
- if(@mssql_select_db("master")) {
- $qry=$this->metaDatabasesSQL;
- if($rs=@mssql_query($qry,$this->_connectionID)){
- $tmpAr=$ar=array();
- while($tmpAr=@mssql_fetch_row($rs))
- $ar[]=$tmpAr[0];
- @mssql_select_db($this->database);
- if(sizeof($ar))
- return($ar);
- else
- return(false);
- } else {
- @mssql_select_db($this->database);
- return(false);
- }
- }
- 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;
- }
-
- function SelectDB($dbName)
- {
- $this->database = $dbName;
- $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
- if ($this->_connectionID) {
- return @mssql_select_db($dbName);
- }
- else return false;
- }
-
- function ErrorMsg()
- {
- if (empty($this->_errorMsg)){
- $this->_errorMsg = mssql_get_last_message();
- }
- return $this->_errorMsg;
- }
-
- function ErrorNo()
- {
- if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode;
- if (empty($this->_errorMsg)) {
- $this->_errorMsg = mssql_get_last_message();
- }
- $id = @mssql_query("select @@ERROR",$this->_connectionID);
- if (!$id) return false;
- $arr = mssql_fetch_array($id);
- @mssql_free_result($id);
- if (is_array($arr)) return $arr[0];
- else return -1;
- }
-
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (!function_exists('mssql_pconnect')) return null;
- $this->_connectionID = mssql_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('mssql_pconnect')) return null;
- $this->_connectionID = mssql_pconnect($argHostname,$argUsername,$argPassword);
- if ($this->_connectionID === false) return false;
-
- // persistent connections can forget to rollback on crash, so we do it here.
- if ($this->autoRollback) {
- $cnt = $this->GetOne('select @@TRANCOUNT');
- while (--$cnt >= 0) $this->Execute('ROLLBACK TRAN');
- }
- if ($argDatabasename) return $this->SelectDB($argDatabasename);
- return true;
- }
-
- function Prepare($sql)
- {
- $sqlarr = explode('?',$sql);
- if (sizeof($sqlarr) <= 1) return $sql;
- $sql2 = $sqlarr[0];
- for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
- $sql2 .= '@P'.($i-1) . $sqlarr[$i];
- }
- return array($sql,$this->qstr($sql2),$max);
- }
-
- function PrepareSP($sql)
- {
- if (!$this->_has_mssql_init) {
- ADOConnection::outp( "PrepareSP: mssql_init only available since PHP 4.1.0");
- return $sql;
- }
- $stmt = mssql_init($sql,$this->_connectionID);
- 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 '';
- }
-
- /*
- 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->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 oci8.
- @param [$maxLen] Holds an maximum length of the variable.
- @param [$type] The data type of $var. Legal values depend on driver.
-
- See mssql_bind documentation at php.net.
- */
- function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=4000, $type=false)
- {
- if (!$this->_has_mssql_init) {
- ADOConnection::outp( "Parameter: mssql_bind only available since PHP 4.1.0");
- return false;
- }
-
- $isNull = is_null($var); // php 4.0.4 and above...
-
- if ($type === false)
- switch(gettype($var)) {
- default:
- case 'string': $type = SQLCHAR; break;
- case 'double': $type = SQLFLT8; break;
- case 'integer': $type = SQLINT4; break;
- case 'boolean': $type = SQLINT1; break; # SQLBIT not supported in 4.1.0
- }
-
- if ($this->debug) {
- $prefix = ($isOutput) ? 'Out' : 'In';
- $ztype = (empty($type)) ? 'false' : $type;
- ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);");
- }
- /*
- See http://phplens.com/lens/lensforum/msgs.php?id=7231
-
- RETVAL is HARD CODED into php_mssql extension:
- The return value (a long integer value) is treated like a special OUTPUT parameter,
- called "RETVAL" (without the @). See the example at mssql_execute to
- see how it works. - type: one of this new supported PHP constants.
- SQLTEXT, SQLVARCHAR,SQLCHAR, SQLINT1,SQLINT2, SQLINT4, SQLBIT,SQLFLT8
- */
- if ($name !== 'RETVAL') $name = '@'.$name;
- return mssql_bind($stmt[1], $name, $var, $type, $isOutput, $isNull, $maxLen);
- }
-
- /*
- 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)) {
-
- # bind input params with sp_executesql:
- # see http://www.quest-pipelines.com/newsletter-v3/0402_F.htm
- # works only with sql server 7 and newer
- if (!is_array($sql)) $sql = $this->Prepare($sql);
- $params = '';
- $decl = '';
- $i = 0;
- foreach($inputarr as $v) {
- if ($decl) {
- $decl .= ', ';
- $params .= ', ';
- }
- if (is_string($v)) {
- $len = strlen($v);
- if ($len == 0) $len = 1;
-
- if ($len > 4000 ) {
- // NVARCHAR is max 4000 chars. Let's use NTEXT
- $decl .= "@P$i NTEXT";
- } else {
- $decl .= "@P$i NVARCHAR($len)";
- }
-
- $params .= "@P$i=N". (strncmp($v,"'",1)==0? $v : $this->qstr($v));
- } else if (is_integer($v)) {
- $decl .= "@P$i INT";
- $params .= "@P$i=".$v;
- } else if (is_float($v)) {
- $decl .= "@P$i FLOAT";
- $params .= "@P$i=".$v;
- } else if (is_bool($v)) {
- $decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately.
- $params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field
- } else {
- $decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL.
- $params .= "@P$i=NULL";
- }
- $i += 1;
- }
- $decl = $this->qstr($decl);
- if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>");
- $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID);
-
- } else if (is_array($sql)) {
- # PrepareSP()
- $rez = mssql_execute($sql[1]);
-
- } else {
- $rez = mssql_query($sql,$this->_connectionID);
- }
- return $rez;
- }
-
- // returns true or false
- function _close()
- {
- if ($this->transCnt) $this->RollbackTrans();
- $rez = @mssql_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);
- }
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordset_mssql extends ADORecordSet {
-
- var $databaseType = "mssql";
- var $canSeek = true;
- var $hasFetchAssoc; // see http://phplens.com/lens/lensforum/msgs.php?id=6083
- // _mths works only in non-localised system
-
- function ADORecordset_mssql($id,$mode=false)
- {
- // freedts check...
- $this->hasFetchAssoc = function_exists('mssql_fetch_assoc');
-
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
-
- }
- $this->fetchMode = $mode;
- return $this->ADORecordSet($id,$mode);
- }
-
-
- function _initrs()
- {
- GLOBAL $ADODB_COUNTRECS;
- $this->_numOfRows = ($ADODB_COUNTRECS)? @mssql_num_rows($this->_queryID):-1;
- $this->_numOfFields = @mssql_num_fields($this->_queryID);
- }
-
-
- //Contributed by "Sven Axelsson" <sven.axelsson@bokochwebb.se>
- // get next resultset - requires PHP 4.0.5 or later
- function NextRecordSet()
- {
- if (!mssql_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 ($fieldOffset != -1) {
- $f = @mssql_fetch_field($this->_queryID, $fieldOffset);
- }
- else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
- $f = @mssql_fetch_field($this->_queryID);
- }
- $false = false;
- if (empty($f)) return $false;
- return $f;
- }
-
- function _seek($row)
- {
- return @mssql_data_seek($this->_queryID, $row);
- }
-
- // speedup
- function MoveNext()
- {
- if ($this->EOF) return false;
-
- $this->_currentRow++;
-
- if ($this->fetchMode & ADODB_FETCH_ASSOC) {
- if ($this->fetchMode & ADODB_FETCH_NUM) {
- //ADODB_FETCH_BOTH mode
- $this->fields = @mssql_fetch_array($this->_queryID);
- }
- else {
- if ($this->hasFetchAssoc) {// only for PHP 4.2.0 or later
- $this->fields = @mssql_fetch_assoc($this->_queryID);
- } else {
- $flds = @mssql_fetch_array($this->_queryID);
- if (is_array($flds)) {
- $fassoc = array();
- foreach($flds as $k => $v) {
- if (is_numeric($k)) continue;
- $fassoc[$k] = $v;
- }
- $this->fields = $fassoc;
- } else
- $this->fields = false;
- }
- }
-
- if (is_array($this->fields)) {
- 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 {
- $this->fields = @mssql_fetch_row($this->_queryID);
- }
- if ($this->fields) return true;
- $this->EOF = true;
-
- 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->fetchMode & ADODB_FETCH_ASSOC) {
- if ($this->fetchMode & ADODB_FETCH_NUM) {
- //ADODB_FETCH_BOTH mode
- $this->fields = @mssql_fetch_array($this->_queryID);
- } else {
- if ($this->hasFetchAssoc) // only for PHP 4.2.0 or later
- $this->fields = @mssql_fetch_assoc($this->_queryID);
- else {
- $this->fields = @mssql_fetch_array($this->_queryID);
- if (@is_array($$this->fields)) {
- $fassoc = array();
- foreach($$this->fields as $k => $v) {
- if (is_integer($k)) continue;
- $fassoc[$k] = $v;
- }
- $this->fields = $fassoc;
- }
- }
- }
-
- if (!$this->fields) {
- } else 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 {
- $this->fields = @mssql_fetch_row($this->_queryID);
- }
- 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 = mssql_free_result($this->_queryID);
- $this->_queryID = 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);
- }
-
-}
-
-
-class ADORecordSet_array_mssql extends ADORecordSet_array {
- function ADORecordSet_array_mssql($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
-*/
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mssql_n.inc.php b/lib/adodb/drivers/adodb-mssql_n.inc.php
deleted file mode 100644
index d112f89..0000000
--- a/lib/adodb/drivers/adodb-mssql_n.inc.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-
-/// $Id $
-
-///////////////////////////////////////////////////////////////////////////
-// //
-// NOTICE OF COPYRIGHT //
-// //
-// ADOdb - Database Abstraction Library for PHP //
-// http://adodb.sourceforge.net/ //
-// //
-// Copyright (C) 2000-2007 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);
- }
-
- /// 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mssqlpo.inc.php b/lib/adodb/drivers/adodb-mssqlpo.inc.php
deleted file mode 100644
index df48286..0000000
--- a/lib/adodb/drivers/adodb-mssqlpo.inc.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/**
-* @version V4.94 23 Jan 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.
-*
-* 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mysql.inc.php b/lib/adodb/drivers/adodb-mysql.inc.php
deleted file mode 100644
index 14d288e..0000000
--- a/lib/adodb/drivers/adodb-mysql.inc.php
+++ /dev/null
@@ -1,782 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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 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 (!$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 $_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));
- $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
- $rs = $this->Execute($getnext);
- }
- $this->genID = mysql_insert_id($this->_connectionID);
-
- if ($rs) $rs->Close();
-
- $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);
- $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;
- }
-
- // 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 = $a_create_table["Create Table"];
- 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);
- $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
- $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);
- $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':
- 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);
- }
-}
-
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mysqli.inc.php b/lib/adodb/drivers/adodb-mysqli.inc.php
deleted file mode 100644
index 00b53cc..0000000
--- a/lib/adodb/drivers/adodb-mysqli.inc.php
+++ /dev/null
@@ -1,1020 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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 8.
-
- MySQL code that does not support transactions. Use mysqlt if you need transactions.
- Requires mysql client. Works on Windows and Unix.
-
-21 October 2003: MySQLi extension implementation by Arjen de Rijke (a.de.rijke@xs4all.nl)
-Based on adodb 3.40
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-if (! defined("_ADODB_MYSQLI_LAYER")) {
- define("_ADODB_MYSQLI_LAYER", 1 );
-
- // PHP5 compat...
- if (! defined("MYSQLI_BINARY_FLAG")) define("MYSQLI_BINARY_FLAG", 128);
- if (!defined('MYSQLI_READ_DEFAULT_GROUP')) define('MYSQLI_READ_DEFAULT_GROUP',1);
-
- // disable adodb extension - currently incompatible.
- global $ADODB_EXTENSION; $ADODB_EXTENSION = false;
-
-class ADODB_mysqli extends ADOConnection {
- var $databaseType = 'mysqli';
- var $dataProvider = 'native';
- 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 = true;
- var $forceNewConnect = false;
- var $poorAffectedRows = true;
- var $clientFlags = 0;
- var $substr = "substring";
- var $port = false;
- var $socket = false;
- var $_bindInputArray = false;
- var $nameQuote = '`'; /// string to use to quote identifiers and names
- var $optionFlags = array(array(MYSQLI_READ_DEFAULT_GROUP,0));
-
- function ADODB_mysqli()
- {
- // if(!extension_loaded("mysqli"))
- ;//trigger_error("You must have the mysqli extension installed.", E_USER_ERROR);
-
- }
-
- 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);
- }
-
- // returns true or false
- // To add: parameter int $port,
- // parameter string $socket
- function _connect($argHostname = NULL,
- $argUsername = NULL,
- $argPassword = NULL,
- $argDatabasename = NULL, $persist=false)
- {
- if(!extension_loaded("mysqli")) {
- return null;
- }
- $this->_connectionID = @mysqli_init();
-
- if (is_null($this->_connectionID)) {
- // mysqli_init only fails if insufficient memory
- if ($this->debug)
- ADOConnection::outp("mysqli_init() failed : " . $this->ErrorMsg());
- return false;
- }
- /*
- I suggest a simple fix which would enable adodb and mysqli driver to
- read connection options from the standard mysql configuration file
- /etc/my.cnf - "Bastien Duclaux" <bduclaux#yahoo.com>
- */
- foreach($this->optionFlags as $arr) {
- mysqli_options($this->_connectionID,$arr[0],$arr[1]);
- }
-
- #if (!empty($this->port)) $argHostname .= ":".$this->port;
- $ok = mysqli_real_connect($this->_connectionID,
- $argHostname,
- $argUsername,
- $argPassword,
- $argDatabasename,
- $this->port,
- $this->socket,
- $this->clientFlags);
-
- if ($ok) {
- if ($argDatabasename) return $this->SelectDB($argDatabasename);
- return true;
- } else {
- if ($this->debug)
- ADOConnection::outp("Could't connect : " . $this->ErrorMsg());
- return false;
- }
- }
-
- // returns true or false
- // How to force a persistent connection
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true);
-
- }
-
- // When is this used? Close old connection first?
- // In _connect(), check $this->forceNewConnect?
- function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- $this->forceNewConnect = true;
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
- }
-
- function IfNull( $field, $ifNull )
- {
- return " IFNULL($field, $ifNull) "; // if MySQL
- }
-
- // do not use $ADODB_COUNTRECS
- function GetOne($sql,$inputarr=false)
- {
- $ret = false;
- $rs = &$this->Execute($sql,$inputarr);
- if ($rs) {
- if (!$rs->EOF) $ret = reset($rs->fields);
- $rs->Close();
- }
- return $ret;
- }
-
- function ServerInfo()
- {
- $arr['description'] = $this->GetOne("select version()");
- $arr['version'] = ADOConnection::_findvers($arr['description']);
- return $arr;
- }
-
-
- function BeginTrans()
- {
- if ($this->transOff) return true;
- $this->transCnt += 1;
-
- //$this->Execute('SET AUTOCOMMIT=0');
- mysqli_autocommit($this->_connectionID, false);
- $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');
- mysqli_autocommit($this->_connectionID, true);
- return true;
- }
-
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $this->Execute('ROLLBACK');
- //$this->Execute('SET AUTOCOMMIT=1');
- mysqli_autocommit($this->_connectionID, true);
- 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);
- }
-
- // if magic quotes disabled, use mysql_real_escape_string()
- // From readme.htm:
- // Quotes a string to be sent to the database. The $magic_quotes_enabled
- // parameter may look funny, but the idea is if you are quoting a
- // string extracted from a POST/GET variable, then
- // pass get_magic_quotes_gpc() as the second parameter. This will
- // ensure that the variable is not quoted twice, once by qstr and once
- // by the magic_quotes_gpc.
- //
- //Eg. $s = $db->qstr(_GET['name'],get_magic_quotes_gpc());
- function qstr($s, $magic_quotes = false)
- {
- if (!$magic_quotes) {
- if (PHP_VERSION >= 5)
- return "'" . mysqli_real_escape_string($this->_connectionID, $s) . "'";
-
- 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()
- {
- $result = @mysqli_insert_id($this->_connectionID);
- if ($result == -1){
- if ($this->debug) ADOConnection::outp("mysqli_insert_id() failed : " . $this->ErrorMsg());
- }
- return $result;
- }
-
- // Only works for INSERT, UPDATE and DELETE query's
- function _affectedrows()
- {
- $result = @mysqli_affected_rows($this->_connectionID);
- if ($result == -1) {
- if ($this->debug) ADOConnection::outp("mysqli_affected_rows() failed : " . $this->ErrorMsg());
- }
- return $result;
- }
-
- // 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 $_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;
-
- $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));
- $this->Execute(sprintf($this->_genSeq2SQL,$seqname,$startID-1));
- $rs = $this->Execute($getnext);
- }
- $this->genID = mysqli_insert_id($this->_connectionID);
-
- if ($rs) $rs->Close();
-
- return $this->genID;
- }
-
- function &MetaDatabases()
- {
- $query = "SHOW DATABASES";
- $ret =& $this->Execute($query);
- if ($ret && is_object($ret)){
- $arr = array();
- while (!$ret->EOF){
- $db = $ret->Fields('Database');
- if ($db != 'mysql') $arr[] = $db;
- $ret->MoveNext();
- }
- return $arr;
- }
- return $ret;
- }
-
-
- function &MetaIndexes ($table, $primary = 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 INDEXES 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;
- }
-
-
- // 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) {
- case 'Y':
- case 'y':
- $s .= '%Y';
- break;
- case 'Q':
- case 'q':
- $s .= "'),Quarter($col)";
-
- if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
- else $s .= ",('";
- $concat = true;
- break;
- case 'M':
- $s .= '%b';
- break;
-
- case 'm':
- $s .= '%m';
- break;
- case 'D':
- case 'd':
- $s .= '%d';
- 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 'l':
- $s .= '%W';
- break;
-
- default:
-
- if ($ch == '\\') {
- $i++;
- $ch = substr($fmt,$i,1);
- }
- $s .= $ch;
- 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 '';
- }
-
- // 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 &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;
- }
-
- // "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 = $a_create_table["Create Table"];
- 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;
- }
-
- function &MetaColumns($table)
- {
- $false = false;
- if (!$this->metaColumnsSQL)
- return $false;
-
- 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 (isset($savem)) $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- if (!is_object($rs))
- 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];
- $fld->max_length = max(array_map("strlen",explode(",",$query_array[2]))) - 2; // PHP >= 4.0.6
- $fld->max_length = ($fld->max_length == 0 ? 1 : $fld->max_length);
- } 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;
- }
-
- // returns true or false
- function SelectDB($dbName)
- {
-// $this->_connectionID = $this->mysqli_resolve_link($this->_connectionID);
- $this->database = $dbName;
- $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
-
- if ($this->_connectionID) {
- $result = @mysqli_select_db($this->_connectionID, $dbName);
- if (!$result) {
- ADOConnection::outp("Select of database " . $dbName . " failed. " . $this->ErrorMsg());
- }
- return $result;
- }
- return false;
- }
-
- // parameters use PostgreSQL convention, not MySQL
- function &SelectLimit($sql,
- $nrows = -1,
- $offset = -1,
- $inputarr = false,
- $arg3 = false,
- $secs = 0)
- {
- $offsetStr = ($offset >= 0) ? "$offset," : '';
- if ($nrows < 0) $nrows = '18446744073709551615';
-
- if ($secs)
- $rs =& $this->CacheExecute($secs, $sql . " LIMIT $offsetStr$nrows" , $inputarr , $arg3);
- else
- $rs =& $this->Execute($sql . " LIMIT $offsetStr$nrows" , $inputarr , $arg3);
-
- return $rs;
- }
-
-
- function Prepare($sql)
- {
- return $sql;
-
- $stmt = $this->_connectionID->prepare($sql);
- if (!$stmt) {
- echo $this->ErrorMsg();
- return $sql;
- }
- return array($sql,$stmt);
- }
-
-
- // returns queryID or false
- function _query($sql, $inputarr)
- {
- global $ADODB_COUNTRECS;
-
- if (is_array($sql)) {
- $stmt = $sql[1];
- $a = '';
- foreach($inputarr as $k => $v) {
- if (is_string($v)) $a .= 's';
- else if (is_integer($v)) $a .= 'i';
- else $a .= 'd';
- }
-
- $fnarr = array_merge( array($stmt,$a) , $inputarr);
- $ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr);
-
- $ret = mysqli_stmt_execute($stmt);
- return $ret;
- }
- if (!$mysql_res = mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {
- if ($this->debug) ADOConnection::outp("Query: " . $sql . " failed. " . $this->ErrorMsg());
- return false;
- }
-
- return $mysql_res;
- }
-
- /* Returns: the last error message from previous database operation */
- function ErrorMsg()
- {
- if (empty($this->_connectionID))
- $this->_errorMsg = @mysqli_connect_error();
- else
- $this->_errorMsg = @mysqli_error($this->_connectionID);
- return $this->_errorMsg;
- }
-
- /* Returns: the last error number from previous database operation */
- function ErrorNo()
- {
- if (empty($this->_connectionID))
- return @mysqli_connect_errno();
- else
- return @mysqli_errno($this->_connectionID);
- }
-
- // returns true or false
- function _close()
- {
- @mysqli_close($this->_connectionID);
- $this->_connectionID = false;
- }
-
- /*
- * Maximum size of C field
- */
- function CharMax()
- {
- return 255;
- }
-
- /*
- * Maximum size of X field
- */
- function TextMax()
- {
- return 4294967295;
- }
-
-
-
- // 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 UTF8 database and server it on-site as latin1 etc.
- // GetCharSet - get the name of the character set the client is using now
- // Under Windows, the functions should work with MySQL 4.1.11 and above, the set of charsets supported
- // depends on compile flags of mysql distribution
-
- function GetCharSet()
- {
- //we will use ADO's builtin property charSet
- if (!method_exists($this->_connectionID,'character_set_name'))
- return false;
-
- $this->charSet = @$this->_connectionID->character_set_name();
- if (!$this->charSet) {
- return false;
- } else {
- return $this->charSet;
- }
- }
-
- // SetCharSet - switch the client encoding
- function SetCharSet($charset_name)
- {
- if (!method_exists($this->_connectionID,'set_charset'))
- return false;
-
- if ($this->charSet !== $charset_name) {
- $if = @$this->_connectionID->set_charset($charset_name);
- if ($if == "0" & $this->GetCharSet() == $charset_name) {
- return true;
- } else return false;
- } else return true;
- }
-
-
-
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordSet_mysqli extends ADORecordSet{
-
- var $databaseType = "mysqli";
- var $canSeek = true;
-
- function ADORecordSet_mysqli($queryID, $mode = false)
- {
- if ($mode === false)
- {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
-
- switch ($mode)
- {
- case ADODB_FETCH_NUM:
- $this->fetchMode = MYSQLI_NUM;
- break;
- case ADODB_FETCH_ASSOC:
- $this->fetchMode = MYSQLI_ASSOC;
- break;
- case ADODB_FETCH_DEFAULT:
- case ADODB_FETCH_BOTH:
- default:
- $this->fetchMode = MYSQLI_BOTH;
- break;
- }
- $this->adodbFetchMode = $mode;
- $this->ADORecordSet($queryID);
- }
-
- function _initrs()
- {
- global $ADODB_COUNTRECS;
-
- $this->_numOfRows = $ADODB_COUNTRECS ? @mysqli_num_rows($this->_queryID) : -1;
- $this->_numOfFields = @mysqli_num_fields($this->_queryID);
- }
-
-/*
-1 = MYSQLI_NOT_NULL_FLAG
-2 = MYSQLI_PRI_KEY_FLAG
-4 = MYSQLI_UNIQUE_KEY_FLAG
-8 = MYSQLI_MULTIPLE_KEY_FLAG
-16 = MYSQLI_BLOB_FLAG
-32 = MYSQLI_UNSIGNED_FLAG
-64 = MYSQLI_ZEROFILL_FLAG
-128 = MYSQLI_BINARY_FLAG
-256 = MYSQLI_ENUM_FLAG
-512 = MYSQLI_AUTO_INCREMENT_FLAG
-1024 = MYSQLI_TIMESTAMP_FLAG
-2048 = MYSQLI_SET_FLAG
-32768 = MYSQLI_NUM_FLAG
-16384 = MYSQLI_PART_KEY_FLAG
-32768 = MYSQLI_GROUP_FLAG
-65536 = MYSQLI_UNIQUE_FLAG
-131072 = MYSQLI_BINCMP_FLAG
-*/
-
- function &FetchField($fieldOffset = -1)
- {
- $fieldnr = $fieldOffset;
- if ($fieldOffset != -1) {
- $fieldOffset = mysqli_field_seek($this->_queryID, $fieldnr);
- }
- $o = mysqli_fetch_field($this->_queryID);
- /* Properties of an ADOFieldObject as set by MetaColumns */
- $o->primary_key = $o->flags & MYSQLI_PRI_KEY_FLAG;
- $o->not_null = $o->flags & MYSQLI_NOT_NULL_FLAG;
- $o->auto_increment = $o->flags & MYSQLI_AUTO_INCREMENT_FLAG;
- $o->binary = $o->flags & MYSQLI_BINARY_FLAG;
- // $o->blob = $o->flags & MYSQLI_BLOB_FLAG; /* not returned by MetaColumns */
- $o->unsigned = $o->flags & MYSQLI_UNSIGNED_FLAG;
-
- return $o;
- }
-
- function &GetRowAssoc($upper = true)
- {
- if ($this->fetchMode == MYSQLI_ASSOC && !$upper)
- return $this->fields;
- $row =& ADORecordSet::GetRowAssoc($upper);
- return $row;
- }
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- if ($this->fetchMode != MYSQLI_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;
-
- if ($row < 0)
- return false;
-
- mysqli_data_seek($this->_queryID, $row);
- $this->EOF = false;
- return true;
- }
-
- // 10% speedup to move MoveNext to child class
- // This is the only implementation that works now (23-10-2003).
- // Other functions return no or the wrong results.
- function MoveNext()
- {
- if ($this->EOF) return false;
- $this->_currentRow++;
- $this->fields = @mysqli_fetch_array($this->_queryID,$this->fetchMode);
-
- if (is_array($this->fields)) return true;
- $this->EOF = true;
- return false;
- }
-
- function _fetch()
- {
- $this->fields = mysqli_fetch_array($this->_queryID,$this->fetchMode);
- return is_array($this->fields);
- }
-
- function _close()
- {
- mysqli_free_result($this->_queryID);
- $this->_queryID = false;
- }
-
-/*
-
-0 = MYSQLI_TYPE_DECIMAL
-1 = MYSQLI_TYPE_CHAR
-1 = MYSQLI_TYPE_TINY
-2 = MYSQLI_TYPE_SHORT
-3 = MYSQLI_TYPE_LONG
-4 = MYSQLI_TYPE_FLOAT
-5 = MYSQLI_TYPE_DOUBLE
-6 = MYSQLI_TYPE_NULL
-7 = MYSQLI_TYPE_TIMESTAMP
-8 = MYSQLI_TYPE_LONGLONG
-9 = MYSQLI_TYPE_INT24
-10 = MYSQLI_TYPE_DATE
-11 = MYSQLI_TYPE_TIME
-12 = MYSQLI_TYPE_DATETIME
-13 = MYSQLI_TYPE_YEAR
-14 = MYSQLI_TYPE_NEWDATE
-247 = MYSQLI_TYPE_ENUM
-248 = MYSQLI_TYPE_SET
-249 = MYSQLI_TYPE_TINY_BLOB
-250 = MYSQLI_TYPE_MEDIUM_BLOB
-251 = MYSQLI_TYPE_LONG_BLOB
-252 = MYSQLI_TYPE_BLOB
-253 = MYSQLI_TYPE_VAR_STRING
-254 = MYSQLI_TYPE_STRING
-255 = MYSQLI_TYPE_GEOMETRY
-*/
-
- 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':
-
- case MYSQLI_TYPE_TINY_BLOB :
- case MYSQLI_TYPE_CHAR :
- case MYSQLI_TYPE_STRING :
- case MYSQLI_TYPE_ENUM :
- case MYSQLI_TYPE_SET :
- case 253 :
- 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 MYSQLI_TYPE_BLOB :
- case MYSQLI_TYPE_LONG_BLOB :
- case MYSQLI_TYPE_MEDIUM_BLOB :
-
- return !empty($fieldobj->binary) ? 'B' : 'X';
- case 'YEAR':
- case 'DATE':
- case MYSQLI_TYPE_DATE :
- case MYSQLI_TYPE_YEAR :
-
- return 'D';
-
- case 'TIME':
- case 'DATETIME':
- case 'TIMESTAMP':
-
- case MYSQLI_TYPE_DATETIME :
- case MYSQLI_TYPE_NEWDATE :
- case MYSQLI_TYPE_TIME :
- case MYSQLI_TYPE_TIMESTAMP :
-
- return 'T';
-
- case 'INT':
- case 'INTEGER':
- case 'BIGINT':
- case 'TINYINT':
- case 'MEDIUMINT':
- case 'SMALLINT':
-
- case MYSQLI_TYPE_INT24 :
- case MYSQLI_TYPE_LONG :
- case MYSQLI_TYPE_LONGLONG :
- case MYSQLI_TYPE_SHORT :
- case MYSQLI_TYPE_TINY :
-
- if (!empty($fieldobj->primary_key)) return 'R';
-
- return 'I';
-
-
- // Added floating-point types
- // Maybe not necessery.
- case 'FLOAT':
- case 'DOUBLE':
- // case 'DOUBLE PRECISION':
- case 'DECIMAL':
- case 'DEC':
- case 'FIXED':
- default:
- //if (!is_numeric($t)) echo "<p>--- Error in type matching $t -----</p>";
- return 'N';
- }
- } // function
-
-
-} // rs class
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-mysqlt.inc.php b/lib/adodb/drivers/adodb-mysqlt.inc.php
deleted file mode 100644
index 9f1b53a..0000000
--- a/lib/adodb/drivers/adodb-mysqlt.inc.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 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 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);
- }
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-netezza.inc.php b/lib/adodb/drivers/adodb-netezza.inc.php
deleted file mode 100644
index eedf51d..0000000
--- a/lib/adodb/drivers/adodb-netezza.inc.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). 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);
- }
-
-}
-?>
diff --git a/lib/adodb/drivers/adodb-oci8.inc.php b/lib/adodb/drivers/adodb-oci8.inc.php
deleted file mode 100644
index 3681876..0000000
--- a/lib/adodb/drivers/adodb-oci8.inc.php
+++ /dev/null
@@ -1,1512 +0,0 @@
-<?php
-/*
-
- version V4.94 23 Jan 2007 (c) 2000-2007 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
-
- Code contributed by George Fourlanos <fou@infomap.gr>
-
- 13 Nov 2000 jlim - removed all ora_* references.
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-/*
-NLS_Date_Format
-Allows you to use a date format other than the Oracle Lite default. When a literal
-character string appears where a date value is expected, the Oracle Lite database
-tests the string to see if it matches the formats of Oracle, SQL-92, or the value
-specified for this parameter in the POLITE.INI file. Setting this parameter also
-defines the default format used in the TO_CHAR or TO_DATE functions when no
-other format string is supplied.
-
-For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is
-yy-mm-dd or yyyy-mm-dd.
-
-Using 'RR' in the format forces two-digit years less than or equal to 49 to be
-interpreted as years in the 21st century (2000–2049), and years over 50 as years in
-the 20th century (1950–1999). Setting the RR format as the default for all two-digit
-year entries allows you to become year-2000 compliant. For example:
-NLS_DATE_FORMAT='RR-MM-DD'
-
-You can also modify the date format using the ALTER SESSION command.
-*/
-
-# define the LOB descriptor type for the given type
-# returns false if no LOB descriptor
-function oci_lob_desc($type) {
- switch ($type) {
- case OCI_B_BFILE: $result = OCI_D_FILE; break;
- case OCI_B_CFILEE: $result = OCI_D_FILE; break;
- case OCI_B_CLOB: $result = OCI_D_LOB; break;
- case OCI_B_BLOB: $result = OCI_D_LOB; break;
- case OCI_B_ROWID: $result = OCI_D_ROWID; break;
- default: $result = false; break;
- }
- return $result;
-}
-
-class ADODB_oci8 extends ADOConnection {
- var $databaseType = 'oci8';
- var $dataProvider = 'oci8';
- var $replaceQuote = "''"; // string to use to replace quotes
- var $concat_operator='||';
- var $sysDate = "TRUNC(SYSDATE)";
- var $sysTimeStamp = 'SYSDATE';
- var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1";
- var $_stmt;
- var $_commit = OCI_COMMIT_ON_SUCCESS;
- var $_initdate = true; // init date to YYYY-MM-DD
- var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables
- var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
- var $_bindInputArray = true;
- var $hasGenID = true;
- var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL";
- var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s";
- var $_dropSeqSQL = "DROP SEQUENCE %s";
- var $hasAffectedRows = true;
- var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
- var $noNullStrings = false;
- var $connectSID = false;
- var $_bind = false;
- var $_nestedSQL = true;
- var $_hasOCIFetchStatement = false;
- var $_getarray = false; // currently not working
- var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER
- var $session_sharing_force_blob = false; // alter session on updateblob if set to true
- var $firstrows = true; // enable first rows optimization on SelectLimit()
- var $selectOffsetAlg1 = 100; // when to use 1st algorithm of selectlimit.
- var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
- var $useDBDateFormatForTextInput=false;
- var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true)
- var $_refLOBs = array();
-
- // var $ansiOuter = true; // if oracle9
-
- function ADODB_oci8()
- {
- $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
- if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
- }
-
- /* Function &MetaColumns($table) added by smondino@users.sourceforge.net*/
- 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') {
- if ($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;
- }
-
- function Time()
- {
- $rs =& $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual");
- if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
-
- return false;
- }
-
-/*
-
- Multiple modes of connection are supported:
-
- a. Local Database
- $conn->Connect(false,'scott','tiger');
-
- b. From tnsnames.ora
- $conn->Connect(false,'scott','tiger',$tnsname);
- $conn->Connect($tnsname,'scott','tiger');
-
- c. Server + service name
- $conn->Connect($serveraddress,'scott,'tiger',$service_name);
-
- d. Server + SID
- $conn->connectSID = true;
- $conn->Connect($serveraddress,'scott,'tiger',$SID);
-
-
-Example TNSName:
----------------
-NATSOFT.DOMAIN =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523))
- )
- (CONNECT_DATA =
- (SERVICE_NAME = natsoft.domain)
- )
- )
-
- There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection
-
-*/
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0)
- {
- if (!function_exists('OCIPLogon')) return null;
-
-
- $this->_errorMsg = false;
- $this->_errorCode = false;
-
- if($argHostname) { // added 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 = empty($this->port)? "1521" : $this->port;
- }
-
- 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 ($argHostname) print "<p>Connect: 1st argument should be left blank for $this->databaseType</p>";
- if ($mode==1) {
- $this->_connectionID = ($this->charSet) ?
- OCIPLogon($argUsername,$argPassword, $argDatabasename,$this->charSet)
- :
- OCIPLogon($argUsername,$argPassword, $argDatabasename)
- ;
- if ($this->_connectionID && $this->autoRollback) OCIrollback($this->_connectionID);
- } else if ($mode==2) {
- $this->_connectionID = ($this->charSet) ?
- OCINLogon($argUsername,$argPassword, $argDatabasename,$this->charSet)
- :
- OCINLogon($argUsername,$argPassword, $argDatabasename);
-
- } else {
- $this->_connectionID = ($this->charSet) ?
- OCILogon($argUsername,$argPassword, $argDatabasename,$this->charSet)
- :
- OCILogon($argUsername,$argPassword, $argDatabasename);
- }
- if (!$this->_connectionID) return false;
- if ($this->_initdate) {
- $this->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
- }
-
- // looks like:
- // Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production With the Partitioning option JServer Release 8.1.7.0.0 - Production
- // $vers = OCIServerVersion($this->_connectionID);
- // if (strpos($vers,'8i') !== false) $this->ansiOuter = true;
- return true;
- }
-
- function ServerInfo()
- {
- $arr['compat'] = $this->GetOne('select value from sys.database_compatible_level');
- $arr['description'] = @OCIServerVersion($this->_connectionID);
- $arr['version'] = ADOConnection::_findvers($arr['description']);
- return $arr;
- }
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1);
- }
-
- // returns true or false
- function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,2);
- }
-
- function _affectedrows()
- {
- if (is_resource($this->_stmt)) return @OCIRowCount($this->_stmt);
- return 0;
- }
-
- function IfNull( $field, $ifNull )
- {
- return " NVL($field, $ifNull) "; // if Oracle
- }
-
- // format and return date string in database date format
- function DBDate($d)
- {
- if (empty($d) && $d !== 0) return 'null';
-
- if (is_string($d)) $d = ADORecordSet::UnixDate($d);
- return "TO_DATE(".adodb_date($this->fmtDate,$d).",'".$this->NLS_DATE_FORMAT."')";
- }
-
- 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);
- }
-
- // 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).",'RRRR-MM-DD, HH:MI:SS AM')";
- }
-
- 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,$mask=false)
- {
- if ($mask) {
- $save = $this->metaTablesSQL;
- $mask = $this->qstr(strtoupper($mask));
- $this->metaTablesSQL .= " AND upper(table_name) like $mask";
- }
- $ret =& ADOConnection::MetaTables($ttype,$showSchema);
-
- if ($mask) {
- $this->metaTablesSQL = $save;
- }
- return $ret;
- }
-
- // Mark Newnham
- 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);
- }
-
- // get index details
- $table = strtoupper($table);
-
- // get Primary index
- $primary_key = '';
-
- $false = false;
- $rs = $this->Execute(sprintf("SELECT * FROM ALL_CONSTRAINTS WHERE UPPER(TABLE_NAME)='%s' AND CONSTRAINT_TYPE='P'",$table));
- if ($row = $rs->FetchRow())
- $primary_key = $row[1]; //constraint_name
-
- if ($primary==TRUE && $primary_key=='') {
- if (isset($savem))
- $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- return $false; //There is no primary key
- }
-
- $rs = $this->Execute(sprintf("SELECT ALL_INDEXES.INDEX_NAME, ALL_INDEXES.UNIQUENESS, ALL_IND_COLUMNS.COLUMN_POSITION, ALL_IND_COLUMNS.COLUMN_NAME FROM ALL_INDEXES,ALL_IND_COLUMNS WHERE UPPER(ALL_INDEXES.TABLE_NAME)='%s' AND ALL_IND_COLUMNS.INDEX_NAME=ALL_INDEXES.INDEX_NAME",$table));
-
-
- 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()) {
- if ($primary && $row[0] != $primary_key) continue;
- if (!isset($indexes[$row[0]])) {
- $indexes[$row[0]] = array(
- 'unique' => ($row[1] == 'UNIQUE'),
- 'columns' => array()
- );
- }
- $indexes[$row[0]]['columns'][$row[2] - 1] = $row[3];
- }
-
- // sort columns by order in the index
- foreach ( array_keys ($indexes) as $index ) {
- ksort ($indexes[$index]['columns']);
- }
-
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
- }
- return $indexes;
- }
-
- function BeginTrans()
- {
- if ($this->transOff) return true;
- $this->transCnt += 1;
- $this->autoCommit = false;
- $this->_commit = OCI_DEFAULT;
-
- if ($this->_transmode) $this->Execute("SET TRANSACTION ".$this->_transmode);
- return true;
- }
-
- function CommitTrans($ok=true)
- {
- if ($this->transOff) return true;
- if (!$ok) return $this->RollbackTrans();
-
- if ($this->transCnt) $this->transCnt -= 1;
- $ret = OCIcommit($this->_connectionID);
- $this->_commit = OCI_COMMIT_ON_SUCCESS;
- $this->autoCommit = true;
- return $ret;
- }
-
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $ret = OCIrollback($this->_connectionID);
- $this->_commit = OCI_COMMIT_ON_SUCCESS;
- $this->autoCommit = true;
- return $ret;
- }
-
-
- function SelectDB($dbName)
- {
- return false;
- }
-
- function ErrorMsg()
- {
- if ($this->_errorMsg !== false) return $this->_errorMsg;
-
- if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt);
- if (empty($arr)) {
- if (is_resource($this->_connectionID)) $arr = @OCIError($this->_connectionID);
- else $arr = @OCIError();
- if ($arr === false) return '';
- }
- $this->_errorMsg = $arr['message'];
- $this->_errorCode = $arr['code'];
- return $this->_errorMsg;
- }
-
- function ErrorNo()
- {
- if ($this->_errorCode !== false) return $this->_errorCode;
-
- if (is_resource($this->_stmt)) $arr = @OCIError($this->_stmt);
- if (empty($arr)) {
- $arr = @OCIError($this->_connectionID);
- if ($arr == false) $arr = @OCIError();
- if ($arr == false) return '';
- }
-
- $this->_errorMsg = $arr['message'];
- $this->_errorCode = $arr['code'];
-
- return $arr['code'];
- }
-
- // 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 = 'TO_CHAR('.$col.",'";
-
- $len = strlen($fmt);
- for ($i=0; $i < $len; $i++) {
- $ch = $fmt[$i];
- switch($ch) {
- case 'Y':
- case 'y':
- $s .= 'YYYY';
- break;
- case 'Q':
- case 'q':
- $s .= 'Q';
- break;
-
- case 'M':
- $s .= 'Mon';
- break;
-
- case 'm':
- $s .= 'MM';
- break;
- case 'D':
- case 'd':
- $s .= 'DD';
- break;
-
- case 'H':
- $s.= 'HH24';
- break;
-
- case 'h':
- $s .= 'HH';
- break;
-
- case 'i':
- $s .= 'MI';
- break;
-
- case 's':
- $s .= 'SS';
- break;
-
- case 'a':
- case 'A':
- $s .= 'AM';
- break;
-
- case 'w':
- $s .= 'D';
- break;
-
- case 'l':
- $s .= 'DAY';
- break;
-
- case 'W':
- $s .= 'WW';
- break;
-
- default:
- // handle escape characters...
- if ($ch == '\\') {
- $i++;
- $ch = substr($fmt,$i,1);
- }
- if (strpos('-/.:;, ',$ch) !== false) $s .= $ch;
- else $s .= '"'.$ch.'"';
-
- }
- }
- return $s. "')";
- }
-
-
- /*
- This algorithm makes use of
-
- a. FIRST_ROWS hint
- The FIRST_ROWS hint explicitly chooses the approach to optimize response time,
- that is, minimum resource usage to return the first row. Results will be returned
- as soon as they are identified.
-
- b. Uses rownum tricks to obtain only the required rows from a given offset.
- As this uses complicated sql statements, we only use this if the $offset >= 100.
- This idea by Tomas V V Cox.
-
- This implementation does not appear to work with oracle 8.0.5 or earlier. Comment
- out this function then, and the slower SelectLimit() in the base class will be used.
- */
- function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
- {
- // seems that oracle only supports 1 hint comment in 8i
- if ($this->firstrows) {
- if (strpos($sql,'/*+') !== false)
- $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
- else
- $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
- }
-
- if ($offset < $this->selectOffsetAlg1) {
- if ($nrows > 0) {
- if ($offset > 0) $nrows += $offset;
- //$inputarr['adodb_rownum'] = $nrows;
- if ($this->databaseType == 'oci8po') {
- $sql = "select * from (".$sql.") where rownum <= ?";
- } else {
- $sql = "select * from (".$sql.") where rownum <= :adodb_offset";
- }
- $inputarr['adodb_offset'] = $nrows;
- $nrows = -1;
- }
- // note that $nrows = 0 still has to work ==> no rows returned
-
- $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
- return $rs;
-
- } else {
- // Algorithm by Tomas V V Cox, from PEAR DB oci8.php
-
- // Let Oracle return the name of the columns
- $q_fields = "SELECT * FROM (".$sql.") WHERE NULL = NULL";
-
- $false = false;
- if (! $stmt_arr = $this->Prepare($q_fields)) {
- return $false;
- }
- $stmt = $stmt_arr[1];
-
- if (is_array($inputarr)) {
- foreach($inputarr as $k => $v) {
- if (is_array($v)) {
- if (sizeof($v) == 2) // suggested by g.giunta@libero.
- OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]);
- else
- OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]);
- } else {
- $len = -1;
- if ($v === ' ') $len = 1;
- if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
- $bindarr[$k] = $v;
- } else { // dynamic sql, so rebind every time
- OCIBindByName($stmt,":$k",$inputarr[$k],$len);
- }
- }
- }
- }
-
- if (!OCIExecute($stmt, OCI_DEFAULT)) {
- OCIFreeStatement($stmt);
- return $false;
- }
-
- $ncols = OCINumCols($stmt);
- for ( $i = 1; $i <= $ncols; $i++ ) {
- $cols[] = '"'.OCIColumnName($stmt, $i).'"';
- }
- $result = false;
-
- OCIFreeStatement($stmt);
- $fields = implode(',', $cols);
- $nrows += $offset;
- $offset += 1; // in Oracle rownum starts at 1
-
- if ($this->databaseType == 'oci8po') {
- $sql = "SELECT $fields FROM".
- "(SELECT rownum as adodb_rownum, $fields FROM".
- " ($sql) WHERE rownum <= ?".
- ") WHERE adodb_rownum >= ?";
- } else {
- $sql = "SELECT $fields FROM".
- "(SELECT rownum as adodb_rownum, $fields FROM".
- " ($sql) WHERE rownum <= :adodb_nrows".
- ") WHERE adodb_rownum >= :adodb_offset";
- }
- $inputarr['adodb_nrows'] = $nrows;
- $inputarr['adodb_offset'] = $offset;
-
- if ($secs2cache>0) $rs =& $this->CacheExecute($secs2cache, $sql,$inputarr);
- else $rs =& $this->Execute($sql,$inputarr);
- return $rs;
- }
-
- }
-
- /**
- * Usage:
- * Store BLOBs and CLOBs
- *
- * Example: to store $var in a blob
- *
- * $conn->Execute('insert into TABLE (id,ablob) values(12,empty_blob())');
- * $conn->UpdateBlob('TABLE', 'ablob', $varHoldingBlob, 'ID=12', 'BLOB');
- *
- * $blobtype supports 'BLOB' and 'CLOB', but you need to change to 'empty_clob()'.
- *
- * to get length of LOB:
- * select DBMS_LOB.GETLENGTH(ablob) from TABLE
- *
- * If you are using CURSOR_SHARING = force, it appears this will case a segfault
- * under oracle 8.1.7.0. Run:
- * $db->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT');
- * before UpdateBlob() then...
- */
-
- function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
- {
-
- //if (strlen($val) < 4000) return $this->Execute("UPDATE $table SET $column=:blob WHERE $where",array('blob'=>$val)) != false;
-
- switch(strtoupper($blobtype)) {
- default: ADOConnection::outp("<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false;
- case 'BLOB': $type = OCI_B_BLOB; break;
- case 'CLOB': $type = OCI_B_CLOB; break;
- }
-
- if ($this->databaseType == 'oci8po')
- $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?";
- else
- $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob";
-
- $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB);
- $arr['blob'] = array($desc,-1,$type);
- if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT');
- $commit = $this->autoCommit;
- if ($commit) $this->BeginTrans();
- $rs = $this->_Execute($sql,$arr);
- if ($rez = !empty($rs)) $desc->save($val);
- $desc->free();
- if ($commit) $this->CommitTrans();
- if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=FORCE');
-
- if ($rez) $rs->Close();
- return $rez;
- }
-
- /**
- * Usage: store file pointed to by $var in a blob
- */
- function UpdateBlobFile($table,$column,$val,$where,$blobtype='BLOB')
- {
- switch(strtoupper($blobtype)) {
- default: ADOConnection::outp( "<b>UpdateBlob</b>: Unknown blobtype=$blobtype"); return false;
- case 'BLOB': $type = OCI_B_BLOB; break;
- case 'CLOB': $type = OCI_B_CLOB; break;
- }
-
- if ($this->databaseType == 'oci8po')
- $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO ?";
- else
- $sql = "UPDATE $table set $column=EMPTY_{$blobtype}() WHERE $where RETURNING $column INTO :blob";
-
- $desc = OCINewDescriptor($this->_connectionID, OCI_D_LOB);
- $arr['blob'] = array($desc,-1,$type);
-
- $this->BeginTrans();
- $rs = ADODB_oci8::Execute($sql,$arr);
- if ($rez = !empty($rs)) $desc->savefile($val);
- $desc->free();
- $this->CommitTrans();
-
- if ($rez) $rs->Close();
- return $rez;
- }
-
- /**
- * Execute SQL
- *
- * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
- * @param [inputarr] holds the input data to bind to. Null elements will be set to null.
- * @return RecordSet or false
- */
- function &Execute($sql,$inputarr=false)
- {
- if ($this->fnExecute) {
- $fn = $this->fnExecute;
- $ret =& $fn($this,$sql,$inputarr);
- if (isset($ret)) return $ret;
- }
- if ($inputarr) {
- #if (!is_array($inputarr)) $inputarr = array($inputarr);
-
- $element0 = reset($inputarr);
-
- # is_object check because oci8 descriptors can be passed in
- if (is_array($element0) && !is_object(reset($element0))) {
- if (is_string($sql))
- $stmt = $this->Prepare($sql);
- else
- $stmt = $sql;
-
- foreach($inputarr as $arr) {
- $ret =& $this->_Execute($stmt,$arr);
- if (!$ret) return $ret;
- }
- } else {
- $ret =& $this->_Execute($sql,$inputarr);
- }
-
- } else {
- $ret =& $this->_Execute($sql,false);
- }
-
- return $ret;
- }
-
- /*
- Example of usage:
-
- $stmt = $this->Prepare('insert into emp (empno, ename) values (:empno, :ename)');
- */
- function Prepare($sql,$cursor=false)
- {
- static $BINDNUM = 0;
-
- $stmt = OCIParse($this->_connectionID,$sql);
-
- if (!$stmt) {
- $this->_errorMsg = false;
- $this->_errorCode = false;
- $arr = @OCIError($this->_connectionID);
- if ($arr === false) return false;
-
- $this->_errorMsg = $arr['message'];
- $this->_errorCode = $arr['code'];
- return false;
- }
-
- $BINDNUM += 1;
-
- $sttype = @OCIStatementType($stmt);
- if ($sttype == 'BEGIN' || $sttype == 'DECLARE') {
- return array($sql,$stmt,0,$BINDNUM, ($cursor) ? OCINewCursor($this->_connectionID) : false);
- }
- return array($sql,$stmt,0,$BINDNUM);
- }
-
- /*
- Call an oracle stored procedure and returns a cursor variable as a recordset.
- Concept by Robert Tuttle robert@ud.com
-
- Example:
- Note: we return a cursor variable in :RS2
- $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS2); END;",'RS2');
-
- $rs = $db->ExecuteCursor(
- "BEGIN :RS2 = adodb.getdata(:VAR1); END;",
- 'RS2',
- array('VAR1' => 'Mr Bean'));
-
- */
- function &ExecuteCursor($sql,$cursorName='rs',$params=false)
- {
- if (is_array($sql)) $stmt = $sql;
- else $stmt = ADODB_oci8::Prepare($sql,true); # true to allocate OCINewCursor
-
- if (is_array($stmt) && sizeof($stmt) >= 5) {
- $hasref = true;
- $ignoreCur = false;
- $this->Parameter($stmt, $ignoreCur, $cursorName, false, -1, OCI_B_CURSOR);
- if ($params) {
- foreach($params as $k => $v) {
- $this->Parameter($stmt,$params[$k], $k);
- }
- }
- } else
- $hasref = false;
-
- $rs =& $this->Execute($stmt);
- if ($rs) {
- if ($rs->databaseType == 'array') OCIFreeCursor($stmt[4]);
- else if ($hasref) $rs->_refcursor = $stmt[4];
- }
- return $rs;
- }
-
- /*
- Bind a variable -- very, very fast for executing repeated statements in oracle.
- Better than using
- for ($i = 0; $i < $max; $i++) {
- $p1 = ?; $p2 = ?; $p3 = ?;
- $this->Execute("insert into table (col0, col1, col2) values (:0, :1, :2)",
- array($p1,$p2,$p3));
- }
-
- Usage:
- $stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");
- $DB->Bind($stmt, $p1);
- $DB->Bind($stmt, $p2);
- $DB->Bind($stmt, $p3);
- for ($i = 0; $i < $max; $i++) {
- $p1 = ?; $p2 = ?; $p3 = ?;
- $DB->Execute($stmt);
- }
-
- Some timings:
- ** Test table has 3 cols, and 1 index. Test to insert 1000 records
- Time 0.6081s (1644.60 inserts/sec) with direct OCIParse/OCIExecute
- Time 0.6341s (1577.16 inserts/sec) with ADOdb Prepare/Bind/Execute
- Time 1.5533s ( 643.77 inserts/sec) with pure SQL using Execute
-
- Now if PHP only had batch/bulk updating like Java or PL/SQL...
-
- Note that the order of parameters differs from OCIBindByName,
- because we default the names to :0, :1, :2
- */
- function Bind(&$stmt,&$var,$size=4000,$type=false,$name=false,$isOutput=false)
- {
-
- if (!is_array($stmt)) return false;
-
- if (($type == OCI_B_CURSOR) && sizeof($stmt) >= 5) {
- return OCIBindByName($stmt[1],":".$name,$stmt[4],$size,$type);
- }
-
- if ($name == false) {
- if ($type !== false) $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size,$type);
- else $rez = OCIBindByName($stmt[1],":".$stmt[2],$var,$size); // +1 byte for null terminator
- $stmt[2] += 1;
- } else if (oci_lob_desc($type)) {
- if ($this->debug) {
- ADOConnection::outp("<b>Bind</b>: name = $name");
- }
- //we have to create a new Descriptor here
- $numlob = count($this->_refLOBs);
- $this->_refLOBs[$numlob]['LOB'] = OCINewDescriptor($this->_connectionID, oci_lob_desc($type));
- $this->_refLOBs[$numlob]['TYPE'] = $isOutput;
-
- $tmp = &$this->_refLOBs[$numlob]['LOB'];
- $rez = OCIBindByName($stmt[1], ":".$name, $tmp, -1, $type);
- if ($this->debug) {
- ADOConnection::outp("<b>Bind</b>: descriptor has been allocated, var (".$name.") binded");
- }
-
- // if type is input then write data to lob now
- if ($isOutput == false) {
- $var = $this->BlobEncode($var);
- $tmp->WriteTemporary($var);
- $this->_refLOBs[$numlob]['VAR'] = &$var;
- if ($this->debug) {
- ADOConnection::outp("<b>Bind</b>: LOB has been written to temp");
- }
- } else {
- $this->_refLOBs[$numlob]['VAR'] = &$var;
- }
- $rez = $tmp;
- } else {
- if ($this->debug)
- ADOConnection::outp("<b>Bind</b>: name = $name");
-
- if ($type !== false) $rez = OCIBindByName($stmt[1],":".$name,$var,$size,$type);
- else $rez = OCIBindByName($stmt[1],":".$name,$var,$size); // +1 byte for null terminator
- }
-
- return $rez;
- }
-
- function Param($name,$type=false)
- {
- return ':'.$name;
- }
-
- /*
- Usage:
- $stmt = $db->Prepare('select * from table where id =:myid and group=:group');
- $db->Parameter($stmt,$id,'myid');
- $db->Parameter($stmt,$group,'group');
- $db->Execute($stmt);
-
- @param $stmt Statement returned by Prepare() or PrepareSP().
- @param $var PHP variable to bind to
- @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 oci8.
- @param [$maxLen] Holds an maximum length of the variable.
- @param [$type] The data type of $var. Legal values depend on driver.
-
- See OCIBindByName documentation at php.net.
- */
- function Parameter(&$stmt,&$var,$name,$isOutput=false,$maxLen=4000,$type=false)
- {
- if ($this->debug) {
- $prefix = ($isOutput) ? 'Out' : 'In';
- $ztype = (empty($type)) ? 'false' : $type;
- ADOConnection::outp( "{$prefix}Parameter(\$stmt, \$php_var='$var', \$name='$name', \$maxLen=$maxLen, \$type=$ztype);");
- }
- return $this->Bind($stmt,$var,$maxLen,$type,$name,$isOutput);
- }
-
- /*
- returns query ID if successful, otherwise false
- this version supports:
-
- 1. $db->execute('select * from table');
-
- 2. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)');
- $db->execute($prepared_statement, array(1,2,3));
-
- 3. $db->execute('insert into table (a,b,c) values (:a,:b,:c)',array('a'=>1,'b'=>2,'c'=>3));
-
- 4. $db->prepare('insert into table (a,b,c) values (:0,:1,:2)');
- $db->bind($stmt,1); $db->bind($stmt,2); $db->bind($stmt,3);
- $db->execute($stmt);
- */
- function _query($sql,$inputarr)
- {
- if (is_array($sql)) { // is prepared sql
- $stmt = $sql[1];
-
- // we try to bind to permanent array, so that OCIBindByName is persistent
- // and carried out once only - note that max array element size is 4000 chars
- if (is_array($inputarr)) {
- $bindpos = $sql[3];
- if (isset($this->_bind[$bindpos])) {
- // all tied up already
- $bindarr = &$this->_bind[$bindpos];
- } else {
- // one statement to bind them all
- $bindarr = array();
- foreach($inputarr as $k => $v) {
- $bindarr[$k] = $v;
- OCIBindByName($stmt,":$k",$bindarr[$k],is_string($v) && strlen($v)>4000 ? -1 : 4000);
- }
- $this->_bind[$bindpos] = &$bindarr;
- }
- }
- } else {
- $stmt=OCIParse($this->_connectionID,$sql);
- }
-
- $this->_stmt = $stmt;
- if (!$stmt) return false;
-
- if (defined('ADODB_PREFETCH_ROWS')) @OCISetPrefetch($stmt,ADODB_PREFETCH_ROWS);
-
- if (is_array($inputarr)) {
- foreach($inputarr as $k => $v) {
- if (is_array($v)) {
- if (sizeof($v) == 2) // suggested by g.giunta@libero.
- OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1]);
- else
- OCIBindByName($stmt,":$k",$inputarr[$k][0],$v[1],$v[2]);
-
- if ($this->debug==99) echo "name=:$k",' var='.$inputarr[$k][0],' len='.$v[1],' type='.$v[2],'<br>';
- } else {
- $len = -1;
- if ($v === ' ') $len = 1;
- if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
- $bindarr[$k] = $v;
- } else { // dynamic sql, so rebind every time
- OCIBindByName($stmt,":$k",$inputarr[$k],$len);
- }
- }
- }
- }
-
- $this->_errorMsg = false;
- $this->_errorCode = false;
- if (OCIExecute($stmt,$this->_commit)) {
-//OCIInternalDebug(1);
- if (count($this -> _refLOBs) > 0) {
-
- foreach ($this -> _refLOBs as $key => $value) {
- if ($this -> _refLOBs[$key]['TYPE'] == true) {
- $tmp = $this -> _refLOBs[$key]['LOB'] -> load();
- if ($this -> debug) {
- ADOConnection::outp("<b>OUT LOB</b>: LOB has been loaded. <br>");
- }
- //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp;
- $this -> _refLOBs[$key]['VAR'] = $tmp;
- } else {
- $this->_refLOBs[$key]['LOB']->save($this->_refLOBs[$key]['VAR']);
- $this -> _refLOBs[$key]['LOB']->free();
- unset($this -> _refLOBs[$key]);
- if ($this->debug) {
- ADOConnection::outp("<b>IN LOB</b>: LOB has been saved. <br>");
- }
- }
- }
- }
-
- switch (@OCIStatementType($stmt)) {
- case "SELECT":
- return $stmt;
-
- case 'DECLARE':
- case "BEGIN":
- if (is_array($sql) && !empty($sql[4])) {
- $cursor = $sql[4];
- if (is_resource($cursor)) {
- $ok = OCIExecute($cursor);
- return $cursor;
- }
- return $stmt;
- } else {
- if (is_resource($stmt)) {
- OCIFreeStatement($stmt);
- return true;
- }
- return $stmt;
- }
- break;
- default :
- // ociclose -- no because it could be used in a LOB?
- return true;
- }
- }
- return false;
- }
-
- // returns true or false
- function _close()
- {
- if (!$this->_connectionID) return;
-
- if (!$this->autoCommit) OCIRollback($this->_connectionID);
- if (count($this->_refLOBs) > 0) {
- foreach ($this ->_refLOBs as $key => $value) {
- $this->_refLOBs[$key]['LOB']->free();
- unset($this->_refLOBs[$key]);
- }
- }
- OCILogoff($this->_connectionID);
-
- $this->_stmt = false;
- $this->_connectionID = false;
- }
-
- function MetaPrimaryKeys($table, $owner=false,$internalKey=false)
- {
- if ($internalKey) return array('ROWID');
-
- // tested with oracle 8.1.7
- $table = strtoupper($table);
- if ($owner) {
- $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))";
- $ptab = 'ALL_';
- } else {
- $owner_clause = '';
- $ptab = 'USER_';
- }
- $sql = "
-SELECT /*+ RULE */ distinct b.column_name
- FROM {$ptab}CONSTRAINTS a
- , {$ptab}CONS_COLUMNS b
- WHERE ( UPPER(b.table_name) = ('$table'))
- AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P')
- $owner_clause
- AND (a.constraint_name = b.constraint_name)";
-
- $rs = $this->Execute($sql);
- if ($rs && !$rs->EOF) {
- $arr =& $rs->GetArray();
- $a = array();
- foreach($arr as $v) {
- $a[] = reset($v);
- }
- return $a;
- }
- else return false;
- }
-
- // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html
- function MetaForeignKeys($table, $owner=false)
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $table = $this->qstr(strtoupper($table));
- if (!$owner) {
- $owner = $this->user;
- $tabp = 'user_';
- } else
- $tabp = 'all_';
-
- $owner = ' and owner='.$this->qstr(strtoupper($owner));
-
- $sql =
-"select constraint_name,r_owner,r_constraint_name
- from {$tabp}constraints
- where constraint_type = 'R' and table_name = $table $owner";
-
- $constraints =& $this->GetArray($sql);
- $arr = false;
- foreach($constraints as $constr) {
- $cons = $this->qstr($constr[0]);
- $rowner = $this->qstr($constr[1]);
- $rcons = $this->qstr($constr[2]);
- $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position");
- $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position");
-
- if ($cols && $tabcol)
- for ($i=0, $max=sizeof($cols); $i < $max; $i++) {
- $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1];
- }
- }
- $ADODB_FETCH_MODE = $save;
-
- return $arr;
- }
-
-
- function CharMax()
- {
- return 4000;
- }
-
- function TextMax()
- {
- return 4000;
- }
-
- /**
- * Quotes a string.
- * An example is $db->qstr("Don't bother",magic_quotes_runtime());
- *
- * @param s the string to quote
- * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
- * This undoes the stupidity of magic quotes for GPC.
- *
- * @return quoted string to be sent back to database
- */
- function qstr($s,$magic_quotes=false)
- {
- //$nofixquotes=false;
-
- if ($this->noNullStrings && strlen($s)==0)$s = ' ';
- if (!$magic_quotes) {
- if ($this->replaceQuote[0] == '\\'){
- $s = str_replace('\\','\\\\',$s);
- }
- return "'".str_replace("'",$this->replaceQuote,$s)."'";
- }
-
- // undo magic quotes for "
- $s = str_replace('\\"','"',$s);
-
- $s = str_replace('\\\\','\\',$s);
- return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
-
- }
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordset_oci8 extends ADORecordSet {
-
- var $databaseType = 'oci8';
- var $bind=false;
- var $_fieldobjs;
-
- //var $_arr = false;
-
- function ADORecordset_oci8($queryID,$mode=false)
- {
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- switch ($mode)
- {
- case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- case ADODB_FETCH_DEFAULT:
- case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- case ADODB_FETCH_NUM:
- default:
- $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- }
-
- $this->adodbFetchMode = $mode;
- $this->_queryID = $queryID;
- }
-
-
- function Init()
- {
- if ($this->_inited) return;
-
- $this->_inited = true;
- if ($this->_queryID) {
-
- $this->_currentRow = 0;
- @$this->_initrs();
- $this->EOF = !$this->_fetch();
-
- /*
- // based on idea by Gaetano Giunta to detect unusual oracle errors
- // see http://phplens.com/lens/lensforum/msgs.php?id=6771
- $err = OCIError($this->_queryID);
- if ($err && $this->connection->debug) ADOConnection::outp($err);
- */
-
- if (!is_array($this->fields)) {
- $this->_numOfRows = 0;
- $this->fields = array();
- }
- } else {
- $this->fields = array();
- $this->_numOfRows = 0;
- $this->_numOfFields = 0;
- $this->EOF = true;
- }
- }
-
- function _initrs()
- {
- $this->_numOfRows = -1;
- $this->_numOfFields = OCInumcols($this->_queryID);
- if ($this->_numOfFields>0) {
- $this->_fieldobjs = array();
- $max = $this->_numOfFields;
- for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i);
- }
- }
-
- /* 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;
- $fieldOffset += 1;
- $fld->name =OCIcolumnname($this->_queryID, $fieldOffset);
- $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 ($p != 0 && $sc == 0) $fld->type = 'INT';
- //echo " $this->name ($p.$sc) ";
- }
- return $fld;
- }
-
- /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */
- function &FetchField($fieldOffset = -1)
- {
- return $this->_fieldobjs[$fieldOffset];
- }
-
-
- /*
- // 10% speedup to move MoveNext to child class
- function _MoveNext()
- {
- //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this);
-
- if ($this->EOF) return false;
-
- $this->_currentRow++;
- if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode))
- return true;
- $this->EOF = true;
-
- return false;
- } */
-
-
- 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;
- }
-
- /*
- # does not work as first record is retrieved in _initrs(), so is not included in GetArray()
- function &GetArray($nRows = -1)
- {
- global $ADODB_OCI8_GETARRAY;
-
- if (true || !empty($ADODB_OCI8_GETARRAY)) {
- # does not support $ADODB_ANSI_PADDING_OFF
-
- //OCI_RETURN_NULLS and OCI_RETURN_LOBS is set by OCIfetchstatement
- switch($this->adodbFetchMode) {
- case ADODB_FETCH_NUM:
-
- $ncols = @OCIfetchstatement($this->_queryID, $results, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW+OCI_NUM);
- $results = array_merge(array($this->fields),$results);
- return $results;
-
- case ADODB_FETCH_ASSOC:
- if (ADODB_ASSOC_CASE != 2 || $this->databaseType != 'oci8') break;
-
- $ncols = @OCIfetchstatement($this->_queryID, $assoc, 0, $nRows, OCI_FETCHSTATEMENT_BY_ROW);
- $results =& array_merge(array($this->fields),$assoc);
- return $results;
-
- default:
- break;
- }
- }
-
- $results =& ADORecordSet::GetArray($nRows);
- return $results;
-
- } */
-
- /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
- function &GetArrayLimit($nrows,$offset=-1)
- {
- if ($offset <= 0) {
- $arr =& $this->GetArray($nrows);
- return $arr;
- }
- $arr = array();
- for ($i=1; $i < $offset; $i++)
- if (!@OCIFetch($this->_queryID)) return $arr;
-
- if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return $arr;;
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nrows != $cnt) {
- $results[$cnt++] = $this->fields;
- $this->MoveNext();
- }
-
- return $results;
- }
-
-
- /* 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 _seek($row)
- {
- return false;
- }
-
- function _fetch()
- {
- return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
- }
-
- /* 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()
- {
- if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false;
- if (!empty($this->_refcursor)) {
- OCIFreeCursor($this->_refcursor);
- $this->_refcursor = false;
- }
- @OCIFreeStatement($this->_queryID);
- $this->_queryID = false;
-
- }
-
- 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':
- case 'NCHAR':
- case 'NVARCHAR':
- case 'NVARCHAR2':
- if (isset($this) && $len <= $this->blobSize) return 'C';
-
- case 'NCLOB':
- case 'LONG':
- case 'LONG VARCHAR':
- case 'CLOB':
- return 'X';
-
- case 'LONG RAW':
- case 'LONG VARBINARY':
- case 'BLOB':
- return 'B';
-
- case 'DATE':
- return ($this->connection->datetime) ? 'T' : 'D';
-
-
- case 'TIMESTAMP': return 'T';
-
- case 'INT':
- case 'SMALLINT':
- case 'INTEGER':
- return 'I';
-
- default: return 'N';
- }
- }
-}
-
-class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 {
- function ADORecordSet_ext_oci8($queryID,$mode=false)
- {
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- switch ($mode)
- {
- case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- case ADODB_FETCH_DEFAULT:
- case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- case ADODB_FETCH_NUM:
- default: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
- }
- $this->adodbFetchMode = $mode;
- $this->_queryID = $queryID;
- }
-
- function MoveNext()
- {
- return adodb_movenext($this);
- }
-}
-?>
diff --git a/lib/adodb/drivers/adodb-oci805.inc.php b/lib/adodb/drivers/adodb-oci805.inc.php
deleted file mode 100644
index 8da0ba1..0000000
--- a/lib/adodb/drivers/adodb-oci805.inc.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * @version V4.94 23 Jan 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.
- *
- * 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-oci8po.inc.php b/lib/adodb/drivers/adodb-oci8po.inc.php
deleted file mode 100644
index 2432f39..0000000
--- a/lib/adodb/drivers/adodb-oci8po.inc.php
+++ /dev/null
@@ -1,217 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 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 = strtolower(OCIcolumnname($this->_queryID, $fieldOffset));
- $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;
- }
-
-}
-
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc.inc.php b/lib/adodb/drivers/adodb-odbc.inc.php
deleted file mode 100644
index d8b8f18..0000000
--- a/lib/adodb/drivers/adodb-odbc.inc.php
+++ /dev/null
@@ -1,738 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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);
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc_db2.inc.php b/lib/adodb/drivers/adodb-odbc_db2.inc.php
deleted file mode 100644
index 3ae91d7..0000000
--- a/lib/adodb/drivers/adodb-odbc_db2.inc.php
+++ /dev/null
@@ -1,368 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc_mssql.inc.php b/lib/adodb/drivers/adodb-odbc_mssql.inc.php
deleted file mode 100644
index 2181739..0000000
--- a/lib/adodb/drivers/adodb-odbc_mssql.inc.php
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- Latest version is available at http://adodb.sourceforge.net
-
- MSSQL support via ODBC. Requires ODBC. Works on Windows and Unix.
- For Unix configuration, see http://phpbuilder.com/columns/alberto20000919.php3
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-if (!defined('_ADODB_ODBC_LAYER')) {
- include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
-}
-
-
-class ADODB_odbc_mssql extends ADODB_odbc {
- var $databaseType = 'odbc_mssql';
- var $fmtDate = "'Y-m-d'";
- var $fmtTimeStamp = "'Y-m-d H:i:s'";
- var $_bindInputArray = true;
- var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE'))";
- var $metaColumnsSQL = "select c.name,t.name,c.length from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";
- var $hasTop = 'top'; // support mssql/interbase SELECT TOP 10 * FROM TABLE
- var $sysDate = 'GetDate()';
- var $sysTimeStamp = 'GetDate()';
- var $leftOuter = '*=';
- var $rightOuter = '=*';
- var $substr = 'substring';
- var $length = 'len';
- var $ansiOuter = true; // for mssql7 or later
- var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000
- var $hasInsertID = true;
- var $connectStmt = 'SET CONCAT_NULL_YIELDS_NULL OFF'; # When SET CONCAT_NULL_YIELDS_NULL is ON,
- # concatenating a null value with a string yields a NULL result
-
- function ADODB_odbc_mssql()
- {
- $this->ADODB_odbc();
- //$this->curmode = SQL_CUR_USE_ODBC;
- }
-
- // crashes php...
- function ServerInfo()
- {
- global $ADODB_FETCH_MODE;
- $save = $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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc_oracle.inc.php b/lib/adodb/drivers/adodb-odbc_oracle.inc.php
deleted file mode 100644
index cb29f0b..0000000
--- a/lib/adodb/drivers/adodb-odbc_oracle.inc.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbtp.inc.php b/lib/adodb/drivers/adodb-odbtp.inc.php
deleted file mode 100644
index 6f52ae7..0000000
--- a/lib/adodb/drivers/adodb-odbtp.inc.php
+++ /dev/null
@@ -1,743 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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. 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 @@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 @@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 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);
- }
-}
-?>
diff --git a/lib/adodb/drivers/adodb-odbtp_unicode.inc.php b/lib/adodb/drivers/adodb-odbtp_unicode.inc.php
deleted file mode 100644
index ff79373..0000000
--- a/lib/adodb/drivers/adodb-odbtp_unicode.inc.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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. 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();
- }
-}
-?>
diff --git a/lib/adodb/drivers/adodb-oracle.inc.php b/lib/adodb/drivers/adodb-oracle.inc.php
deleted file mode 100644
index 3c6dbd3..0000000
--- a/lib/adodb/drivers/adodb-oracle.inc.php
+++ /dev/null
@@ -1,338 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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';
- }
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-pdo.inc.php b/lib/adodb/drivers/adodb-pdo.inc.php
deleted file mode 100644
index e3f77f1..0000000
--- a/lib/adodb/drivers/adodb-pdo.inc.php
+++ /dev/null
@@ -1,569 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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_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 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;
- }
-
- // 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 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)]];
- }
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-pdo_mssql.inc.php b/lib/adodb/drivers/adodb-pdo_mssql.inc.php
deleted file mode 100644
index 9470dd8..0000000
--- a/lib/adodb/drivers/adodb-pdo_mssql.inc.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 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 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;
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-pdo_mysql.inc.php b/lib/adodb/drivers/adodb-pdo_mysql.inc.php
deleted file mode 100644
index b80241d..0000000
--- a/lib/adodb/drivers/adodb-pdo_mysql.inc.php
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 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 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 $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 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;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-pdo_oci.inc.php b/lib/adodb/drivers/adodb-pdo_oci.inc.php
deleted file mode 100644
index 9d40f14..0000000
--- a/lib/adodb/drivers/adodb-pdo_oci.inc.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 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 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;
- }
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-pdo_pgsql.inc.php b/lib/adodb/drivers/adodb-pdo_pgsql.inc.php
deleted file mode 100644
index e802d79..0000000
--- a/lib/adodb/drivers/adodb-pdo_pgsql.inc.php
+++ /dev/null
@@ -1,230 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 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 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;
-
- }
-
-}
-
-?>
diff --git a/lib/adodb/drivers/adodb-postgres.inc.php b/lib/adodb/drivers/adodb-postgres.inc.php
deleted file mode 100644
index 5e8ce48..0000000
--- a/lib/adodb/drivers/adodb-postgres.inc.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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.
-
- 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.
-*/
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-postgres64.inc.php b/lib/adodb/drivers/adodb-postgres64.inc.php
deleted file mode 100644
index 69d44fc..0000000
--- a/lib/adodb/drivers/adodb-postgres64.inc.php
+++ /dev/null
@@ -1,1064 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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 8.
-
- Original version derived from Alberto Cerezal (acerezalp@dbnet.es) - DBNet Informatica & Comunicaciones.
- 08 Nov 2000 jlim - Minor corrections, removing mysql stuff
- 09 Nov 2000 jlim - added insertid support suggested by "Christopher Kings-Lynne" <chriskl@familyhealth.com.au>
- jlim - changed concat operator to || and data types to MetaType to match documented pgsql types
- see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm
- 22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser" <raser@mail.zen.com.tw>
- 27 Nov 2000 jlim - added changes to _connect/_pconnect from ideas by "Lennie" <leen@wirehub.nl>
- 15 Dec 2000 jlim - added changes suggested by Additional code changes by "Eric G. Werk" egw@netguide.dk.
- 31 Jan 2002 jlim - finally installed postgresql. testing
- 01 Mar 2001 jlim - Freek Dijkstra changes, also support for text type
-
- See http://www.varlena.com/varlena/GeneralBits/47.php
-
- -- What indexes are on my table?
- select * from pg_indexes where tablename = 'tablename';
-
- -- What triggers are on my table?
- select c.relname as "Table", t.tgname as "Trigger Name",
- t.tgconstrname as "Constraint Name", t.tgenabled as "Enabled",
- t.tgisconstraint as "Is Constraint", cc.relname as "Referenced Table",
- p.proname as "Function Name"
- from pg_trigger t, pg_class c, pg_class cc, pg_proc p
- where t.tgfoid = p.oid and t.tgrelid = c.oid
- and t.tgconstrrelid = cc.oid
- and c.relname = 'tablename';
-
- -- What constraints are on my table?
- select r.relname as "Table", c.conname as "Constraint Name",
- contype as "Constraint Type", conkey as "Key Columns",
- confkey as "Foreign Columns", consrc as "Source"
- from pg_class r, pg_constraint c
- where r.oid = c.conrelid
- and relname = 'tablename';
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-function adodb_addslashes($s)
-{
- $len = strlen($s);
- if ($len == 0) return "''";
- if (strncmp($s,"'",1) === 0 && substr($s,$len-1) == "'") return $s; // already quoted
-
- return "'".addslashes($s)."'";
-}
-
-class ADODB_postgres64 extends ADOConnection{
- var $databaseType = 'postgres64';
- var $dataProvider = 'postgres';
- var $hasInsertID = true;
- var $_resultid = false;
- var $concat_operator='||';
- 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 = 'TRUE'; // string that represents TRUE for a database
- var $false = 'FALSE'; // 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 H: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 $autoRollback = true; // apparently pgsql does not autorollback properly before php 4.3.4
- // http://bugs.php.net/bug.php?id=25404
-
- var $_bindInputArray = false; // requires postgresql 7.3+ and ability to modify database
- var $disableBlobs = false; // set to true to disable blob checking, resulting in 2-5% improvement in performance.
-
- // The last (fmtTimeStamp is not entirely correct:
- // PostgreSQL also has support for time zones,
- // and writes these time in this format: "2001-03-01 18:59:26+02".
- // There is no code for the "+02" time zone information, so I just left that out.
- // I'm not familiar enough with both ADODB as well as Postgres
- // to know what the concequences are. The other values are correct (wheren't in 0.94)
- // -- Freek Dijkstra
-
- function ADODB_postgres64()
- {
- // changes the metaColumnsSQL, adds columns: attnum[6]
- }
-
- function ServerInfo()
- {
- if (isset($this->version)) return $this->version;
-
- $arr['description'] = $this->GetOne("select version()");
- $arr['version'] = ADOConnection::_findvers($arr['description']);
- $this->version = $arr;
- return $arr;
- }
-
- function IfNull( $field, $ifNull )
- {
- return " coalesce($field, $ifNull) ";
- }
-
- // get the last id - never tested
- function pg_insert_id($tablename,$fieldname)
- {
- $result=pg_exec($this->_connectionID, "SELECT last_value FROM ${tablename}_${fieldname}_seq");
- if ($result) {
- $arr = @pg_fetch_row($result,0);
- pg_freeresult($result);
- if (isset($arr[0])) return $arr[0];
- }
- return false;
- }
-
-/* Warning from http://www.php.net/manual/function.pg-getlastoid.php:
-Using a OID as a unique identifier is not generally wise.
-Unless you are very careful, you might end up with a tuple having
-a different OID if a database must be reloaded. */
- function _insertid($table,$column)
- {
- if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false;
- $oid = pg_getlastoid($this->_resultid);
- // to really return the id, we need the table and column-name, else we can only return the oid != id
- return empty($table) || empty($column) ? $oid : $this->GetOne("SELECT $column FROM $table WHERE oid=".(int)$oid);
- }
-
-// I get this error with PHP before 4.0.6 - jlim
-// Warning: This compilation does not support pg_cmdtuples() in adodb-postgres.inc.php on line 44
- function _affectedrows()
- {
- if (!is_resource($this->_resultid) || get_resource_type($this->_resultid) !== 'pgsql result') return false;
- return pg_cmdtuples($this->_resultid);
- }
-
-
- // returns true/false
- function BeginTrans()
- {
- if ($this->transOff) return true;
- $this->transCnt += 1;
- return @pg_Exec($this->_connectionID, "begin ".$this->_transmode);
- }
-
- function RowLock($tables,$where,$flds='1 as ignore')
- {
- if (!$this->transCnt) $this->BeginTrans();
- return $this->GetOne("select $flds from $tables where $where for update");
- }
-
- // returns true/false.
- function CommitTrans($ok=true)
- {
- if ($this->transOff) return true;
- if (!$ok) return $this->RollbackTrans();
-
- $this->transCnt -= 1;
- return @pg_Exec($this->_connectionID, "commit");
- }
-
- // returns true/false
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- $this->transCnt -= 1;
- return @pg_Exec($this->_connectionID, "rollback");
- }
-
- 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;
- }
-
-
- // if magic quotes disabled, use pg_escape_string()
- function qstr($s,$magic_quotes=false)
- {
- if (!$magic_quotes) {
- if (ADODB_PHPVER >= 0x5200) {
- return "'".pg_escape_string($this->_connectionID,$s)."'";
- }
- if (ADODB_PHPVER >= 0x4200) {
- return "'".pg_escape_string($s)."'";
- }
- if ($this->replaceQuote[0] == '\\'){
- $s = adodb_str_replace(array('\\',"\0"),array('\\\\',"\\\\000"),$s);
- }
- return "'".str_replace("'",$this->replaceQuote,$s)."'";
- }
-
- // undo magic quotes for "
- $s = str_replace('\\"','"',$s);
- return "'$s'";
- }
-
-
-
- // 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 = 'TO_CHAR('.$col.",'";
-
- $len = strlen($fmt);
- for ($i=0; $i < $len; $i++) {
- $ch = $fmt[$i];
- switch($ch) {
- case 'Y':
- case 'y':
- $s .= 'YYYY';
- break;
- case 'Q':
- case 'q':
- $s .= 'Q';
- break;
-
- case 'M':
- $s .= 'Mon';
- break;
-
- case 'm':
- $s .= 'MM';
- break;
- case 'D':
- case 'd':
- $s .= 'DD';
- break;
-
- case 'H':
- $s.= 'HH24';
- break;
-
- case 'h':
- $s .= 'HH';
- break;
-
- case 'i':
- $s .= 'MI';
- break;
-
- case 's':
- $s .= 'SS';
- break;
-
- case 'a':
- case 'A':
- $s .= 'AM';
- break;
-
- case 'w':
- $s .= 'D';
- break;
-
- case 'l':
- $s .= 'DAY';
- break;
-
- case 'W':
- $s .= 'WW';
- break;
-
- default:
- // handle escape characters...
- if ($ch == '\\') {
- $i++;
- $ch = substr($fmt,$i,1);
- }
- if (strpos('-/.:;, ',$ch) !== false) $s .= $ch;
- else $s .= '"'.$ch.'"';
-
- }
- }
- return $s. "')";
- }
-
-
-
- /*
- * Load a Large Object from a file
- * - the procedure stores the object id in the table and imports the object using
- * postgres proprietary blob handling routines
- *
- * contributed by Mattia Rossi mattia@technologist.com
- * modified for safe mode by juraj chlebec
- */
- function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB')
- {
- pg_exec ($this->_connectionID, "begin");
-
- $fd = fopen($path,'r');
- $contents = fread($fd,filesize($path));
- fclose($fd);
-
- $oid = pg_lo_create($this->_connectionID);
- $handle = pg_lo_open($this->_connectionID, $oid, 'w');
- pg_lo_write($handle, $contents);
- pg_lo_close($handle);
-
- // $oid = pg_lo_import ($path);
- pg_exec($this->_connectionID, "commit");
- $rs = ADOConnection::UpdateBlob($table,$column,$oid,$where,$blobtype);
- $rez = !empty($rs);
- return $rez;
- }
-
- /*
- * Deletes/Unlinks a Blob from the database, otherwise it
- * will be left behind
- *
- * Returns TRUE on success or FALSE on failure.
- *
- * contributed by Todd Rogers todd#windfox.net
- */
- function BlobDelete( $blob )
- {
- pg_exec ($this->_connectionID, "begin");
- $result = @pg_lo_unlink($blob);
- pg_exec ($this->_connectionID, "commit");
- return( $result );
- }
-
- /*
- Hueristic - not guaranteed to work.
- */
- function GuessOID($oid)
- {
- if (strlen($oid)>16) return false;
- return is_numeric($oid);
- }
-
- /*
- * If an OID is detected, then we use pg_lo_* to open the oid file and read the
- * real blob from the db using the oid supplied as a parameter. If you are storing
- * blobs using bytea, we autodetect and process it so this function is not needed.
- *
- * contributed by Mattia Rossi mattia@technologist.com
- *
- * see http://www.postgresql.org/idocs/index.php?largeobjects.html
- *
- * Since adodb 4.54, this returns the blob, instead of sending it to stdout. Also
- * added maxsize parameter, which defaults to $db->maxblobsize if not defined.
- */
- function BlobDecode($blob,$maxsize=false,$hastrans=true)
- {
- if (!$this->GuessOID($blob)) return $blob;
-
- if ($hastrans) @pg_exec($this->_connectionID,"begin");
- $fd = @pg_lo_open($this->_connectionID,$blob,"r");
- if ($fd === false) {
- if ($hastrans) @pg_exec($this->_connectionID,"commit");
- return $blob;
- }
- if (!$maxsize) $maxsize = $this->maxblobsize;
- $realblob = @pg_loread($fd,$maxsize);
- @pg_loclose($fd);
- if ($hastrans) @pg_exec($this->_connectionID,"commit");
- return $realblob;
- }
-
- /*
- See http://www.postgresql.org/idocs/index.php?datatype-binary.html
-
- NOTE: SQL string literals (input strings) must be preceded with two backslashes
- due to the fact that they must pass through two parsers in the PostgreSQL
- backend.
- */
- function BlobEncode($blob)
- {
- if (ADODB_PHPVER >= 0x5200) return pg_escape_bytea($this->_connectionID, $blob);
- if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob);
-
- /*92=backslash, 0=null, 39=single-quote*/
- $badch = array(chr(92),chr(0),chr(39)); # \ null '
- $fixch = array('\\\\134','\\\\000','\\\\047');
- return adodb_str_replace($badch,$fixch,$blob);
-
- // note that there is a pg_escape_bytea function only for php 4.2.0 or later
- }
-
- // assumes bytea for blob, and varchar for clob
- function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
- {
-
- if ($blobtype == 'CLOB') {
- return $this->Execute("UPDATE $table SET $column=" . $this->qstr($val) . " WHERE $where");
- }
- // do not use bind params which uses qstr(), as blobencode() already quotes data
- return $this->Execute("UPDATE $table SET $column='".$this->BlobEncode($val)."'::bytea WHERE $where");
- }
-
- function OffsetDate($dayFraction,$date=false)
- {
- if (!$date) $date = $this->sysDate;
- else if (strncmp($date,"'",1) == 0) {
- $len = strlen($date);
- if (10 <= $len && $len <= 12) $date = 'date '.$date;
- else $date = 'timestamp '.$date;
- }
- return "($date+interval'$dayFraction days')";
- }
-
-
- // for schema support, pass in the $table param "$schema.$tabname".
- // converts field names to lowercase, $upper is ignored
- // see http://phplens.com/lens/lensforum/msgs.php?id=14018 for more info
- function &MetaColumns($table,$normalize=true)
- {
- global $ADODB_FETCH_MODE;
-
- $schema = false;
- $false = 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) {
- 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];
- $fld->attnum = $rs->fields[6];
-
- 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
- $fld->not_null = $rs->fields[4] == 't';
-
-
- // Freek
- if (is_array($keys)) {
- foreach($keys as $key) {
- if ($fld->name == $key['column_name'] AND $key['primary_key'] == 't')
- $fld->primary_key = true;
- if ($fld->name == $key['column_name'] AND $key['unique_key'] == 't')
- $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))
- return $false;
- else
- return $retarr;
-
- }
-
- function &MetaIndexes ($table, $primary = FALSE)
- {
- global $ADODB_FETCH_MODE;
-
- $schema = false;
- $this->_findschema($table,$schema);
-
- if ($schema) { // requires pgsql 7.3+ - pg_namespace used.
- $sql = '
-SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns"
-FROM pg_catalog.pg_class c
-JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid
-JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid
- ,pg_namespace n
-WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\')) and c.relnamespace=c2.relnamespace and c.relnamespace=n.oid and n.nspname=\'%s\'';
- } else {
- $sql = '
-SELECT c.relname as "Name", i.indisunique as "Unique", i.indkey as "Columns"
-FROM pg_catalog.pg_class c
-JOIN pg_catalog.pg_index i ON i.indexrelid=c.oid
-JOIN pg_catalog.pg_class c2 ON c2.oid=i.indrelid
-WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))';
- }
-
- if ($primary == FALSE) {
- $sql .= ' AND i.indisprimary=false;';
- }
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->fetchMode !== FALSE) {
- $savem = $this->SetFetchMode(FALSE);
- }
-
- $rs = $this->Execute(sprintf($sql,$table,$table,$schema));
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- }
- $ADODB_FETCH_MODE = $save;
-
- if (!is_object($rs)) {
- $false = false;
- return $false;
- }
-
- $col_names = $this->MetaColumnNames($table,true,true);
- //3rd param is use attnum,
- // see http://sourceforge.net/tracker/index.php?func=detail&aid=1451245&group_id=42718&atid=433976
- $indexes = array();
- while ($row = $rs->FetchRow()) {
- $columns = array();
- foreach (explode(' ', $row[2]) as $col) {
- $columns[] = $col_names[$col];
- }
-
- $indexes[$row[0]] = array(
- 'unique' => ($row[1] == 't'),
- 'columns' => $columns
- );
- }
- return $indexes;
- }
-
- // returns true or false
- //
- // examples:
- // $db->Connect("host=host1 user=user1 password=secret port=4341");
- // $db->Connect('host1','user1','secret');
- function _connect($str,$user='',$pwd='',$db='',$ctype=0)
- {
-
- if (!function_exists('pg_connect')) return null;
-
- $this->_errorMsg = false;
-
- if ($user || $pwd || $db) {
- $user = adodb_addslashes($user);
- $pwd = adodb_addslashes($pwd);
- if (strlen($db) == 0) $db = 'template1';
- $db = adodb_addslashes($db);
- if ($str) {
- $host = split(":", $str);
- if ($host[0]) $str = "host=".adodb_addslashes($host[0]);
- else $str = '';
- if (isset($host[1])) $str .= " port=$host[1]";
- else if (!empty($this->port)) $str .= " port=".$this->port;
- }
- if ($user) $str .= " user=".$user;
- if ($pwd) $str .= " password=".$pwd;
- if ($db) $str .= " dbname=".$db;
- }
-
- //if ($user) $linea = "user=$user host=$linea password=$pwd dbname=$db port=5432";
-
- if ($ctype === 1) { // persistent
- $this->_connectionID = pg_pconnect($str);
- } else {
- if ($ctype === -1) { // nconnect, we trick pgsql ext by changing the connection str
- static $ncnt;
-
- if (empty($ncnt)) $ncnt = 1;
- else $ncnt += 1;
-
- $str .= str_repeat(' ',$ncnt);
- }
- $this->_connectionID = pg_connect($str);
- }
- if ($this->_connectionID === false) return false;
- $this->Execute("set datestyle='ISO'");
-
- $info = $this->ServerInfo();
- $this->pgVersion = (float) substr($info['version'],0,3);
- if ($this->pgVersion >= 7.1) { // good till version 999
- $this->_nestedSQL = true;
- }
- return true;
- }
-
- function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName,-1);
- }
-
- // returns true or false
- //
- // examples:
- // $db->PConnect("host=host1 user=user1 password=secret port=4341");
- // $db->PConnect('host1','user1','secret');
- function _pconnect($str,$user='',$pwd='',$db='')
- {
- return $this->_connect($str,$user,$pwd,$db,1);
- }
-
-
- // returns queryID or false
- function _query($sql,$inputarr)
- {
- $this->_errorMsg = false;
- if ($inputarr) {
- /*
- It appears that PREPARE/EXECUTE is slower for many queries.
-
- For query executed 1000 times:
- "select id,firstname,lastname from adoxyz
- where firstname not like ? and lastname not like ? and id = ?"
-
- with plan = 1.51861286163 secs
- no plan = 1.26903700829 secs
-
-
-
- */
- $plan = 'P'.md5($sql);
-
- $execp = '';
- foreach($inputarr as $v) {
- if ($execp) $execp .= ',';
- if (is_string($v)) {
- if (strncmp($v,"'",1) !== 0) $execp .= $this->qstr($v);
- } else {
- $execp .= $v;
- }
- }
-
- if ($execp) $exsql = "EXECUTE $plan ($execp)";
- else $exsql = "EXECUTE $plan";
-
-
- $rez = @pg_exec($this->_connectionID,$exsql);
- if (!$rez) {
- # Perhaps plan does not exist? Prepare/compile plan.
- $params = '';
- foreach($inputarr as $v) {
- if ($params) $params .= ',';
- if (is_string($v)) {
- $params .= 'VARCHAR';
- } else if (is_integer($v)) {
- $params .= 'INTEGER';
- } else {
- $params .= "REAL";
- }
- }
- $sqlarr = explode('?',$sql);
- //print_r($sqlarr);
- $sql = '';
- $i = 1;
- foreach($sqlarr as $v) {
- $sql .= $v.' $'.$i;
- $i++;
- }
- $s = "PREPARE $plan ($params) AS ".substr($sql,0,strlen($sql)-2);
- //adodb_pr($s);
- $rez = pg_exec($this->_connectionID,$s);
- //echo $this->ErrorMsg();
- }
- if ($rez)
- $rez = pg_exec($this->_connectionID,$exsql);
- } else {
- //adodb_backtrace();
- $rez = pg_exec($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;
- }
-
- function _errconnect()
- {
- if (defined('DB_ERROR_CONNECT_FAILED')) return DB_ERROR_CONNECT_FAILED;
- else return 'Database connection failed';
- }
-
- /* Returns: the last error message from previous database operation */
- function ErrorMsg()
- {
- if ($this->_errorMsg !== false) return $this->_errorMsg;
- if (ADODB_PHPVER >= 0x4300) {
- if (!empty($this->_resultid)) {
- $this->_errorMsg = @pg_result_error($this->_resultid);
- if ($this->_errorMsg) return $this->_errorMsg;
- }
-
- if (!empty($this->_connectionID)) {
- $this->_errorMsg = @pg_last_error($this->_connectionID);
- } else $this->_errorMsg = $this->_errconnect();
- } else {
- if (empty($this->_connectionID)) $this->_errconnect();
- else $this->_errorMsg = @pg_errormessage($this->_connectionID);
- }
- return $this->_errorMsg;
- }
-
- function ErrorNo()
- {
- $e = $this->ErrorMsg();
- if (strlen($e)) {
- return ADOConnection::MetaError($e);
- }
- return 0;
- }
-
- // returns true or false
- function _close()
- {
- if ($this->transCnt) $this->RollbackTrans();
- if ($this->_resultid) {
- @pg_freeresult($this->_resultid);
- $this->_resultid = false;
- }
- @pg_close($this->_connectionID);
- $this->_connectionID = false;
- return true;
- }
-
-
- /*
- * Maximum size of C field
- */
- function CharMax()
- {
- return 1000000000; // should be 1 Gb?
- }
-
- /*
- * Maximum size of X field
- */
- function TextMax()
- {
- return 1000000000; // should be 1 Gb?
- }
-
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordSet_postgres64 extends ADORecordSet{
- var $_blobArr;
- var $databaseType = "postgres64";
- var $canSeek = true;
- function ADORecordSet_postgres64($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);
- }
-
- function &GetRowAssoc($upper=true)
- {
- if ($this->fetchMode == PGSQL_ASSOC && !$upper) return $this->fields;
- $row =& ADORecordSet::GetRowAssoc($upper);
- return $row;
- }
-
- function _initrs()
- {
- global $ADODB_COUNTRECS;
- $qid = $this->_queryID;
- $this->_numOfRows = ($ADODB_COUNTRECS)? @pg_numrows($qid):-1;
- $this->_numOfFields = @pg_numfields($qid);
-
- // cache types for blob decode check
- // apparently pg_fieldtype actually performs an sql query on the database to get the type.
- if (empty($this->connection->noBlobs))
- for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
- if (pg_fieldtype($qid,$i) == 'bytea') {
- $this->_blobArr[$i] = pg_fieldname($qid,$i);
- }
- }
- }
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- if ($this->fetchMode != PGSQL_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 &FetchField($off = 0)
- {
- // offsets begin at 0
-
- $o= new ADOFieldObject();
- $o->name = @pg_fieldname($this->_queryID,$off);
- $o->type = @pg_fieldtype($this->_queryID,$off);
- $o->max_length = @pg_fieldsize($this->_queryID,$off);
- return $o;
- }
-
- function _seek($row)
- {
- return @pg_fetch_row($this->_queryID,$row);
- }
-
- function _decode($blob)
- {
- eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";');
- return $realblob;
- }
-
- function _fixblobs()
- {
- if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) {
- foreach($this->_blobArr as $k => $v) {
- $this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]);
- }
- }
- if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) {
- foreach($this->_blobArr as $k => $v) {
- $this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]);
- }
- }
- }
-
- // 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) && $this->fields) {
- if (isset($this->_blobArr)) $this->_fixblobs();
- return true;
- }
- }
- $this->fields = false;
- $this->EOF = true;
- }
- return false;
- }
-
- 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 && isset($this->_blobArr)) $this->_fixblobs();
-
- return (is_array($this->fields));
- }
-
- function _close()
- {
- return @pg_freeresult($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 'MONEY': // stupid, postgres expects money to be a string
- case 'INTERVAL':
- case 'CHAR':
- case 'CHARACTER':
- case 'VARCHAR':
- case 'NAME':
- case 'BPCHAR':
- case '_VARCHAR':
- case 'INET':
- case 'MACADDR':
- 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 'TIMESTAMP WITHOUT TIME ZONE':
- case 'TIME':
- case 'DATETIME':
- case 'TIMESTAMP':
- case 'TIMESTAMPTZ':
- return 'T';
-
- case 'SMALLINT':
- case 'BIGINT':
- case 'INTEGER':
- case 'INT8':
- case 'INT4':
- case 'INT2':
- if (isset($fieldobj) &&
- empty($fieldobj->primary_key) && empty($fieldobj->unique)) return 'I';
-
- case 'OID':
- case 'SERIAL':
- return 'R';
-
- default:
- return 'N';
- }
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-postgres7.inc.php b/lib/adodb/drivers/adodb-postgres7.inc.php
deleted file mode 100644
index 5c3d7bb..0000000
--- a/lib/adodb/drivers/adodb-postgres7.inc.php
+++ /dev/null
@@ -1,264 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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.
-
- 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;
- }
- */
-
-
- // from Edward Jaramilla, improved version - works on pg 7.4
- function 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;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-postgres8.inc.php b/lib/adodb/drivers/adodb-postgres8.inc.php
deleted file mode 100644
index f3712a3..0000000
--- a/lib/adodb/drivers/adodb-postgres8.inc.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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.
-
- NOTE: The "postgres8" driver is remapped to "postgres7".
-*/
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-proxy.inc.php b/lib/adodb/drivers/adodb-proxy.inc.php
deleted file mode 100644
index 022a64e..0000000
--- a/lib/adodb/drivers/adodb-proxy.inc.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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
-
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-sapdb.inc.php b/lib/adodb/drivers/adodb-sapdb.inc.php
deleted file mode 100644
index 493893e..0000000
--- a/lib/adodb/drivers/adodb-sapdb.inc.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-sqlanywhere.inc.php b/lib/adodb/drivers/adodb-sqlanywhere.inc.php
deleted file mode 100644
index 88af3ae..0000000
--- a/lib/adodb/drivers/adodb-sqlanywhere.inc.php
+++ /dev/null
@@ -1,169 +0,0 @@
-<?php
-/*
-version V4.94 23 Jan 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.
-
- 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
-?>
diff --git a/lib/adodb/drivers/adodb-sqlite.inc.php b/lib/adodb/drivers/adodb-sqlite.inc.php
deleted file mode 100644
index 665cc54..0000000
--- a/lib/adodb/drivers/adodb-sqlite.inc.php
+++ /dev/null
@@ -1,398 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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()
- {
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-sqlitepo.inc.php b/lib/adodb/drivers/adodb-sqlitepo.inc.php
deleted file mode 100644
index dbd0271..0000000
--- a/lib/adodb/drivers/adodb-sqlitepo.inc.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-sybase.inc.php b/lib/adodb/drivers/adodb-sybase.inc.php
deleted file mode 100644
index ba6b919..0000000
--- a/lib/adodb/drivers/adodb-sybase.inc.php
+++ /dev/null
@@ -1,418 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 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);
- }
-
- function UnixDate($v)
- {
- return ADORecordSet_array_sybase::UnixDate($v);
- }
-
- 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 .= "replace(str(month($col),2),' ','0')";
- break;
- case 'Q':
- case 'q':
- $s .= "datename(qq,$col)";
- break;
- case 'D':
- case 'd':
- $s .= "replace(str(datepart(dd,$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;
- }
-
- # 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
- function UnixDate($v)
- {
- return ADORecordSet_array_sybase::UnixDate($v);
- }
-
- 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
- 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]);
- }
-
- 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]);
- }
-}
-?>
diff --git a/lib/adodb/drivers/adodb-sybase_ase.inc.php b/lib/adodb/drivers/adodb-sybase_ase.inc.php
deleted file mode 100644
index 9b5334d..0000000
--- a/lib/adodb/drivers/adodb-sybase_ase.inc.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/*
- V4.94 23 Jan 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.
-
- 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);
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-vfp.inc.php b/lib/adodb/drivers/adodb-vfp.inc.php
deleted file mode 100644
index 034eee2..0000000
--- a/lib/adodb/drivers/adodb-vfp.inc.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
-
- 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
-?> \ No newline at end of file
diff --git a/lib/adodb/icons/adodb.gif b/lib/adodb/icons/adodb.gif
deleted file mode 100644
index c5e8dfc..0000000
--- a/lib/adodb/icons/adodb.gif
+++ /dev/null
Binary files differ
diff --git a/lib/adodb/icons/adodb2.gif b/lib/adodb/icons/adodb2.gif
deleted file mode 100644
index f12ae20..0000000
--- a/lib/adodb/icons/adodb2.gif
+++ /dev/null
Binary files differ
diff --git a/lib/adodb/lang/adodb-ar.inc.php b/lib/adodb/lang/adodb-ar.inc.php
deleted file mode 100644
index dd0f830..0000000
--- a/lib/adodb/lang/adodb-ar.inc.php
+++ /dev/null
@@ -1,34 +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 => 'ÓãÇÍíÇÊ ÛíÑ ßÇÝíÉ'
-);
-?>
-
diff --git a/lib/adodb/lang/adodb-bg.inc.php b/lib/adodb/lang/adodb-bg.inc.php
deleted file mode 100644
index 4fb1dc0..0000000
--- a/lib/adodb/lang/adodb-bg.inc.php
+++ /dev/null
@@ -1,38 +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 => 'íÿìàòå äîñòàòú÷íî ïðàâà'
-);
-?>
- \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-bgutf8.inc.php b/lib/adodb/lang/adodb-bgutf8.inc.php
deleted file mode 100644
index 6f3a417..0000000
--- a/lib/adodb/lang/adodb-bgutf8.inc.php
+++ /dev/null
@@ -1,38 +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 => 'нÑмате доÑтатъчно права'
-);
-?>
- \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-ca.inc.php b/lib/adodb/lang/adodb-ca.inc.php
deleted file mode 100644
index 3e6a449..0000000
--- a/lib/adodb/lang/adodb-ca.inc.php
+++ /dev/null
@@ -1,35 +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'
-);
-?>
- \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-cn.inc.php b/lib/adodb/lang/adodb-cn.inc.php
deleted file mode 100644
index eb8c7de..0000000
--- a/lib/adodb/lang/adodb-cn.inc.php
+++ /dev/null
@@ -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 => 'ûÓкÏÊʵÄȨÏÞ'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-cz.inc.php b/lib/adodb/lang/adodb-cz.inc.php
deleted file mode 100644
index 2424c24..0000000
--- a/lib/adodb/lang/adodb-cz.inc.php
+++ /dev/null
@@ -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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-da.inc.php b/lib/adodb/lang/adodb-da.inc.php
deleted file mode 100644
index ca0e72d..0000000
--- a/lib/adodb/lang/adodb-da.inc.php
+++ /dev/null
@@ -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&aelig;nsning kr&aelig;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&aring;st',
- DB_ERROR_SYNTAX => 'syntaksfejl',
- DB_ERROR_UNSUPPORTED => 'ikke underst&oslash;ttet',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'resulterende antal felter svarer ikke til foresp&oslash;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&aelig;kkelige data angivet',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'udvidelse ikke fundet',
- DB_ERROR_NOSUCHDB => 'database ikke fundet',
- DB_ERROR_ACCESS_VIOLATION => 'utilstr&aelig;kkelige rettigheder'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-de.inc.php b/lib/adodb/lang/adodb-de.inc.php
deleted file mode 100644
index 244cb2f..0000000
--- a/lib/adodb/lang/adodb-de.inc.php
+++ /dev/null
@@ -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&ouml;schen',
- DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gel&ouml;scht werden',
- DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
- DB_ERROR_DIVZERO => 'Division durch Null',
- DB_ERROR_INVALID => 'ung&uml;ltig',
- DB_ERROR_INVALID_DATE => 'ung&uml;ltiges Datum oder Zeit',
- DB_ERROR_INVALID_NUMBER => 'ung&uml;ltige Zahl',
- DB_ERROR_MISMATCH => 'Unvertr&auml;glichkeit',
- DB_ERROR_NODBSELECTED => 'keine Dantebank ausgew&auml;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&uml;tzt',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur&uml;ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
- DB_ERROR_INVALID_DSN => 'ung&uml;ltiger DSN',
- DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
- 0 => 'kein Fehler', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'Nicht gen&uml;gend Daten geliefert',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
- DB_ERROR_NOSUCHDB => 'keine Datenbank',
- DB_ERROR_ACCESS_VIOLATION => 'ungen&uml;gende Rechte'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-en.inc.php b/lib/adodb/lang/adodb-en.inc.php
deleted file mode 100644
index ed1b8f1..0000000
--- a/lib/adodb/lang/adodb-en.inc.php
+++ /dev/null
@@ -1,34 +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'
-);
-?>
- \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-es.inc.php b/lib/adodb/lang/adodb-es.inc.php
deleted file mode 100644
index 1e0afbb..0000000
--- a/lib/adodb/lang/adodb-es.inc.php
+++ /dev/null
@@ -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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-esperanto.inc.php b/lib/adodb/lang/adodb-esperanto.inc.php
deleted file mode 100644
index 16ca00e..0000000
--- a/lib/adodb/lang/adodb-esperanto.inc.php
+++ /dev/null
@@ -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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-fr.inc.php b/lib/adodb/lang/adodb-fr.inc.php
deleted file mode 100644
index 066a2a5..0000000
--- a/lib/adodb/lang/adodb-fr.inc.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'fr',
- DB_ERROR => 'erreur inconnue',
- DB_ERROR_ALREADY_EXISTS => 'existe d&eacute;j&agrave;',
- DB_ERROR_CANNOT_CREATE => 'cr&eacute;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&eacute;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&eacute;ess&eacute;lectionn&eacute;e',
- DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide',
- DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante',
- DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non install&eacute;e',
- DB_ERROR_NOT_FOUND => 'pas trouv&eacute;',
- DB_ERROR_NOT_LOCKED => 'non verrouill&eacute;',
- DB_ERROR_SYNTAX => 'erreur de syntaxe',
- DB_ERROR_UNSUPPORTED => 'non support&eacute;',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur ins&eacute;r&eacute;e trop grande pour colonne',
- DB_ERROR_INVALID_DSN => 'DSN invalide',
- DB_ERROR_CONNECT_FAILED => '&eacute;chec &agrave; la connexion',
- 0 => "pas d'erreur", // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'donn&eacute;es fournies insuffisantes',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouv&eacute;e',
- DB_ERROR_NOSUCHDB => 'base de donn&eacute;es inconnue',
- DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-hu.inc.php b/lib/adodb/lang/adodb-hu.inc.php
deleted file mode 100644
index d6f0ef8..0000000
--- a/lib/adodb/lang/adodb-hu.inc.php
+++ /dev/null
@@ -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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-it.inc.php b/lib/adodb/lang/adodb-it.inc.php
deleted file mode 100644
index 20c5b93..0000000
--- a/lib/adodb/lang/adodb-it.inc.php
+++ /dev/null
@@ -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&agrave;',
- 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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-nl.inc.php b/lib/adodb/lang/adodb-nl.inc.php
deleted file mode 100644
index abe77b5..0000000
--- a/lib/adodb/lang/adodb-nl.inc.php
+++ /dev/null
@@ -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'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-pl.inc.php b/lib/adodb/lang/adodb-pl.inc.php
deleted file mode 100644
index aee5bfd..0000000
--- a/lib/adodb/lang/adodb-pl.inc.php
+++ /dev/null
@@ -1,36 +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'
-);
-?>
- \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-pt-br.inc.php b/lib/adodb/lang/adodb-pt-br.inc.php
deleted file mode 100644
index 3424099..0000000
--- a/lib/adodb/lang/adodb-pt-br.inc.php
+++ /dev/null
@@ -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'
-);
-?>
diff --git a/lib/adodb/lang/adodb-ro.inc.php b/lib/adodb/lang/adodb-ro.inc.php
deleted file mode 100644
index 7c9aa52..0000000
--- a/lib/adodb/lang/adodb-ro.inc.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-/* Romanian - by "bogdan stefan" <sbogdan#rsb.ro> */
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'ro',
- DB_ERROR => 'eroare necunoscuta',
- DB_ERROR_ALREADY_EXISTS => 'deja exista',
- DB_ERROR_CANNOT_CREATE => 'nu se poate creea',
- DB_ERROR_CANNOT_DELETE => 'nu se poate sterge',
- DB_ERROR_CANNOT_DROP => 'nu se poate executa drop',
- DB_ERROR_CONSTRAINT => 'violare de constrain',
- DB_ERROR_DIVZERO => 'se divide la zero',
- DB_ERROR_INVALID => 'invalid',
- DB_ERROR_INVALID_DATE => 'data sau timp invalide',
- DB_ERROR_INVALID_NUMBER => 'numar invalid',
- DB_ERROR_MISMATCH => 'nepotrivire-mismatch',
- DB_ERROR_NODBSELECTED => 'nu exista baza de date selectata',
- DB_ERROR_NOSUCHFIELD => 'camp inexistent',
- DB_ERROR_NOSUCHTABLE => 'tabela inexistenta',
- DB_ERROR_NOT_CAPABLE => 'functie optionala neinstalata',
- DB_ERROR_NOT_FOUND => 'negasit',
- DB_ERROR_NOT_LOCKED => 'neblocat',
- DB_ERROR_SYNTAX => 'eroare de sintaxa',
- DB_ERROR_UNSUPPORTED => 'nu e suportat',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'valoare prea mare pentru coloana',
- DB_ERROR_INVALID_DSN => 'DSN invalid',
- DB_ERROR_CONNECT_FAILED => 'conectare esuata',
- 0 => 'fara eroare', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'data introduse insuficiente',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'extensie negasita',
- DB_ERROR_NOSUCHDB => 'nu exista baza de date',
- DB_ERROR_ACCESS_VIOLATION => 'permisiuni insuficiente'
-);
-?>
-
diff --git a/lib/adodb/lang/adodb-ru1251.inc.php b/lib/adodb/lang/adodb-ru1251.inc.php
deleted file mode 100644
index 3a20538..0000000
--- a/lib/adodb/lang/adodb-ru1251.inc.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-// Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'ru1251',
- DB_ERROR => 'íåèçâåñòíàÿ îøèáêà',
- DB_ERROR_ALREADY_EXISTS => 'óæå ñóùåñòâóåò',
- DB_ERROR_CANNOT_CREATE => 'íåâîçìîæíî ñîçäàòü',
- DB_ERROR_CANNOT_DELETE => 'íåâîçìîæíî óäàëèòü',
- DB_ERROR_CANNOT_DROP => 'íåâîçìîæíî óäàëèòü (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 => 'íåäîñòàòî÷íî ïðàâ äîñòóïà'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-sv.inc.php b/lib/adodb/lang/adodb-sv.inc.php
deleted file mode 100644
index a9fd698..0000000
--- a/lib/adodb/lang/adodb-sv.inc.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-// Christian Tiberg" christian@commsoft.nu
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'en',
- DB_ERROR => 'Okänt fel',
- DB_ERROR_ALREADY_EXISTS => 'finns redan',
- DB_ERROR_CANNOT_CREATE => 'kan inte skapa',
- DB_ERROR_CANNOT_DELETE => 'kan inte ta bort',
- DB_ERROR_CANNOT_DROP => 'kan inte släppa',
- DB_ERROR_CONSTRAINT => 'begränsning kränkt',
- DB_ERROR_DIVZERO => 'division med noll',
- DB_ERROR_INVALID => 'ogiltig',
- DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid',
- DB_ERROR_INVALID_NUMBER => 'ogiltigt tal',
- DB_ERROR_MISMATCH => 'felaktig matchning',
- DB_ERROR_NODBSELECTED => 'ingen databas vald',
- DB_ERROR_NOSUCHFIELD => 'inget sådant fält',
- DB_ERROR_NOSUCHTABLE => 'ingen sådan tabell',
- DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte',
- DB_ERROR_NOT_FOUND => 'finns inte',
- DB_ERROR_NOT_LOCKED => 'inte låst',
- DB_ERROR_SYNTAX => 'syntaxfel',
- DB_ERROR_UNSUPPORTED => 'stöds ej',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'värde räknat på rad',
- DB_ERROR_INVALID_DSN => 'ogiltig DSN',
- DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades',
- 0 => 'inget fel', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'otillräckligt med data angivet',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'utökning hittades ej',
- DB_ERROR_NOSUCHDB => 'ingen sådan databas',
- DB_ERROR_ACCESS_VIOLATION => 'otillräckliga rättigheter'
-);
-?> \ No newline at end of file
diff --git a/lib/adodb/lang/adodb-uk1251.inc.php b/lib/adodb/lang/adodb-uk1251.inc.php
deleted file mode 100644
index 9fa32ed..0000000
--- a/lib/adodb/lang/adodb-uk1251.inc.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-
-// Ukrainian language file contributed by Alex Rootoff rootoff{AT}pisem.net.
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'uk1251',
- DB_ERROR => 'íåâ³äîìà ïîìèëêà',
- DB_ERROR_ALREADY_EXISTS => 'âæå ³ñíóº',
- DB_ERROR_CANNOT_CREATE => 'íåìîæëèâî ñòâîðèòè',
- DB_ERROR_CANNOT_DELETE => 'íåìîæëèâî âèäàëèòè',
- DB_ERROR_CANNOT_DROP => 'íåìîæëèâî çíèùèòè (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 => 'íåäîñòàòíüî ïðàâ äîñòóïà'
-);
-?>
diff --git a/lib/adodb/perf/perf-db2.inc.php b/lib/adodb/perf/perf-db2.inc.php
deleted file mode 100644
index 9c8e772..0000000
--- a/lib/adodb/perf/perf-db2.inc.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-// Simple guide to configuring db2: so-so http://www.devx.com/gethelpon/10MinuteSolution/16575
-
-// SELECT * FROM TABLE(SNAPSHOT_APPL('SAMPLE', -1)) as t
-class perf_db2 extends adodb_perf{
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created TIMESTAMP NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 varchar(4000) NOT NULL,
- params varchar(3000) NOT NULL,
- tracer varchar(500) NOT NULL,
- timer decimal(16,6) NOT NULL
- )";
-
- var $settings = array(
- 'Ratios',
- 'data cache hit ratio' => array('RATIO',
- "SELECT
- case when sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)=0 then 0
- else 100*(1-sum(POOL_DATA_P_READS+POOL_INDEX_P_READS)/sum(POOL_DATA_L_READS+POOL_INDEX_L_READS)) end
- FROM TABLE(SNAPSHOT_APPL('',-2)) as t",
- '=WarnCacheRatio'),
-
- 'Data Cache',
- 'data cache buffers' => array('DATAC',
- 'select sum(npages) from SYSCAT.BUFFERPOOLS',
- 'See <a href=http://www7b.boulder.ibm.com/dmdd/library/techarticle/anshum/0107anshum.html#bufferpoolsize>tuning reference</a>.' ),
- 'cache blocksize' => array('DATAC',
- 'select avg(pagesize) from SYSCAT.BUFFERPOOLS',
- '' ),
- 'data cache size' => array('DATAC',
- 'select sum(npages*pagesize) from SYSCAT.BUFFERPOOLS',
- '' ),
- 'Connections',
- 'current connections' => array('SESS',
- "SELECT count(*) FROM TABLE(SNAPSHOT_APPL_INFO('',-2)) as t",
- ''),
-
- false
- );
-
-
- function perf_db2(&$conn)
- {
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
- $save = $this->conn->LogSQL(false);
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
- $qno = rand();
- $ok = $this->conn->Execute("EXPLAIN PLAN SET QUERYNO=$qno FOR $sql");
- ob_start();
- if (!$ok) echo "<p>Have EXPLAIN tables been created?</p>";
- else {
- $rs = $this->conn->Execute("select * from explain_statement where queryno=$qno");
- if ($rs) rs2html($rs);
- }
- $s = ob_get_contents();
- ob_end_clean();
- $this->conn->LogSQL($save);
-
- $s .= $this->Tracer($sql);
- return $s;
- }
-
-
- function Tables()
- {
- $rs = $this->conn->Execute("select tabschema,tabname,card as rows,
- npages pages_used,fpages pages_allocated, tbspace tablespace
- from syscat.tables where tabschema not in ('SYSCAT','SYSIBM','SYSSTAT') order by 1,2");
- return rs2html($rs,false,false,false,false);
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/perf/perf-informix.inc.php b/lib/adodb/perf/perf-informix.inc.php
deleted file mode 100644
index d5e4757..0000000
--- a/lib/adodb/perf/perf-informix.inc.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-//
-// Thx to Fernando Ortiz, mailto:fortiz#lacorona.com.mx
-// With info taken from http://www.oninit.com/oninit/sysmaster/index.html
-//
-class perf_informix extends adodb_perf{
-
- // Maximum size on varchar upto 9.30 255 chars
- // better truncate varchar to 255 than char(4000) ?
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created datetime year to second NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 varchar(255) NOT NULL,
- params varchar(255) NOT NULL,
- tracer varchar(255) NOT NULL,
- timer decimal(16,6) NOT NULL
- )";
-
- var $tablesSQL = "select a.tabname tablename, ti_nptotal*2 size_in_k, ti_nextns extents, ti_nrows records from systables c, sysmaster:systabnames a, sysmaster:systabinfo b where c.tabname not matches 'sys*' and c.partnum = a.partnum and c.partnum = b.ti_partnum";
-
- var $settings = array(
- 'Ratios',
- 'data cache hit ratio' => array('RATIOH',
- "select round((1-(wt.value / (rd.value + wr.value)))*100,2)
- from sysmaster:sysprofile wr, sysmaster:sysprofile rd, sysmaster:sysprofile wt
- where rd.name = 'pagreads' and
- wr.name = 'pagwrites' and
- wt.name = 'buffwts'",
- '=WarnCacheRatio'),
- 'IO',
- 'data reads' => array('IO',
- "select value from sysmaster:sysprofile where name='pagreads'",
- 'Page reads'),
-
- 'data writes' => array('IO',
- "select value from sysmaster:sysprofile where name='pagwrites'",
- 'Page writes'),
-
- 'Connections',
- 'current connections' => array('SESS',
- 'select count(*) from sysmaster:syssessions',
- 'Number of sessions'),
-
- false
-
- );
-
- function perf_informix(&$conn)
- {
- $this->conn =& $conn;
- }
-
-}
-?>
diff --git a/lib/adodb/perf/perf-mssql.inc.php b/lib/adodb/perf/perf-mssql.inc.php
deleted file mode 100644
index f2dfa7b..0000000
--- a/lib/adodb/perf/perf-mssql.inc.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-/*
- MSSQL has moved most performance info to Performance Monitor
-*/
-class perf_mssql extends adodb_perf{
- var $sql1 = 'cast(sql1 as text)';
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created datetime NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 varchar(4000) NOT NULL,
- params varchar(3000) NOT NULL,
- tracer varchar(500) NOT NULL,
- timer decimal(16,6) NOT NULL
- )";
-
- var $settings = array(
- 'Ratios',
- 'data cache hit ratio' => array('RATIO',
- "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'",
- '=WarnCacheRatio'),
- 'prepared sql hit ratio' => array('RATIO',
- array('dbcc cachestats','Prepared',1,100),
- ''),
- 'adhoc sql hit ratio' => array('RATIO',
- array('dbcc cachestats','Adhoc',1,100),
- ''),
- 'IO',
- 'data reads' => array('IO',
- "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"),
- 'data writes' => array('IO',
- "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"),
-
- 'Data Cache',
- 'data cache size' => array('DATAC',
- "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'",
- '' ),
- 'data cache blocksize' => array('DATAC',
- "select 8192",'page size'),
- 'Connections',
- 'current connections' => array('SESS',
- '=sp_who',
- ''),
- 'max connections' => array('SESS',
- "SELECT @@MAX_CONNECTIONS",
- ''),
-
- false
- );
-
-
- function perf_mssql(&$conn)
- {
- if ($conn->dataProvider == 'odbc') {
- $this->sql1 = 'sql1';
- //$this->explain = false;
- }
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
-
- $save = $this->conn->LogSQL(false);
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
-
- $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
- $this->conn->Execute("SET SHOWPLAN_ALL ON;");
- $sql = str_replace('?',"''",$sql);
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $rs =& $this->conn->Execute($sql);
- //adodb_printr($rs);
- $ADODB_FETCH_MODE = $save;
- if ($rs) {
- $rs->MoveNext();
- $s .= '<table bgcolor=white border=0 cellpadding="1" callspacing=0><tr><td nowrap align=center> Rows<td nowrap align=center> IO<td nowrap align=center> CPU<td align=left> &nbsp; &nbsp; Plan</tr>';
- while (!$rs->EOF) {
- $s .= '<tr><td>'.round($rs->fields[8],1).'<td>'.round($rs->fields[9],3).'<td align=right>'.round($rs->fields[10],3).'<td nowrap><pre>'.htmlspecialchars($rs->fields[0])."</td></pre></tr>\n"; ## NOTE CORRUPT </td></pre> tag is intentional!!!!
- $rs->MoveNext();
- }
- $s .= '</table>';
-
- $rs->NextRecordSet();
- }
-
- $this->conn->Execute("SET SHOWPLAN_ALL OFF;");
- $this->conn->LogSQL($save);
- $s .= $this->Tracer($sql);
- return $s;
- }
-
- function Tables()
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- //$this->conn->debug=1;
- $s = '<table border=1 bgcolor=white><tr><td><b>tablename</b></td><td><b>size_in_k</b></td><td><b>index size</b></td><td><b>reserved size</b></td></tr>';
- $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'");
- if ($rs1) {
- while (!$rs1->EOF) {
- $tab = $rs1->fields[0];
- $tabq = $this->conn->qstr($tab);
- $rs2 = $this->conn->Execute("sp_spaceused $tabq");
- if ($rs2) {
- $s .= '<tr><td>'.$tab.'</td><td align=right>'.$rs2->fields[3].'</td><td align=right>'.$rs2->fields[4].'</td><td align=right>'.$rs2->fields[2].'</td></tr>';
- $rs2->Close();
- }
- $rs1->MoveNext();
- }
- $rs1->Close();
- }
- $ADODB_FETCH_MODE = $save;
- return $s.'</table>';
- }
-
- function sp_who()
- {
- $arr = $this->conn->GetArray('sp_who');
- return sizeof($arr);
- }
-
- function HealthCheck($cli=false)
- {
-
- $this->conn->Execute('dbcc traceon(3604)');
- $html = adodb_perf::HealthCheck($cli);
- $this->conn->Execute('dbcc traceoff(3604)');
- return $html;
- }
-
-
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/perf/perf-mysql.inc.php b/lib/adodb/perf/perf-mysql.inc.php
deleted file mode 100644
index 50639d9..0000000
--- a/lib/adodb/perf/perf-mysql.inc.php
+++ /dev/null
@@ -1,315 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-class perf_mysql extends adodb_perf{
-
- var $tablesSQL = 'show table status';
-
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created datetime NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 text NOT NULL,
- params text NOT NULL,
- tracer text NOT NULL,
- timer decimal(16,6) NOT NULL
- )";
-
- var $settings = array(
- 'Ratios',
- 'MyISAM cache hit ratio' => array('RATIO',
- '=GetKeyHitRatio',
- '=WarnCacheRatio'),
- 'InnoDB cache hit ratio' => array('RATIO',
- '=GetInnoDBHitRatio',
- '=WarnCacheRatio'),
- 'data cache hit ratio' => array('HIDE', # only if called
- '=FindDBHitRatio',
- '=WarnCacheRatio'),
- 'sql cache hit ratio' => array('RATIO',
- '=GetQHitRatio',
- ''),
- 'IO',
- 'data reads' => array('IO',
- '=GetReads',
- 'Number of selects (Key_reads is not accurate)'),
- 'data writes' => array('IO',
- '=GetWrites',
- 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'),
-
- 'Data Cache',
- 'MyISAM data cache size' => array('DATAC',
- array("show variables", 'key_buffer_size'),
- '' ),
- 'BDB data cache size' => array('DATAC',
- array("show variables", 'bdb_cache_size'),
- '' ),
- 'InnoDB data cache size' => array('DATAC',
- array("show variables", 'innodb_buffer_pool_size'),
- '' ),
- 'Memory Usage',
- 'read buffer size' => array('CACHE',
- array("show variables", 'read_buffer_size'),
- '(per session)'),
- 'sort buffer size' => array('CACHE',
- array("show variables", 'sort_buffer_size'),
- 'Size of sort buffer (per session)' ),
- 'table cache' => array('CACHE',
- array("show variables", 'table_cache'),
- 'Number of tables to keep open'),
- 'Connections',
- 'current connections' => array('SESS',
- array('show status','Threads_connected'),
- ''),
- 'max connections' => array( 'SESS',
- array("show variables",'max_connections'),
- ''),
-
- false
- );
-
- function perf_mysql(&$conn)
- {
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
-
- if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>';
- $save = $this->conn->LogSQL(false);
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
- $sql = str_replace('?',"''",$sql);
-
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq");
- }
-
- $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
- $rs = $this->conn->Execute('EXPLAIN '.$sql);
- $s .= rs2html($rs,false,false,false,false);
- $this->conn->LogSQL($save);
- $s .= $this->Tracer($sql);
- return $s;
- }
-
- function Tables()
- {
- if (!$this->tablesSQL) return false;
-
- $rs = $this->conn->Execute($this->tablesSQL);
- if (!$rs) return false;
-
- $html = rs2html($rs,false,false,false,false);
- return $html;
- }
-
- function GetReads()
- {
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs = $this->conn->Execute('show status');
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if (!$rs) return 0;
- $val = 0;
- while (!$rs->EOF) {
- switch($rs->fields[0]) {
- case 'Com_select':
- $val = $rs->fields[1];
- $rs->Close();
- return $val;
- }
- $rs->MoveNext();
- }
-
- $rs->Close();
-
- return $val;
- }
-
- function GetWrites()
- {
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs = $this->conn->Execute('show status');
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if (!$rs) return 0;
- $val = 0.0;
- while (!$rs->EOF) {
- switch($rs->fields[0]) {
- case 'Com_insert':
- $val += $rs->fields[1]; break;
- case 'Com_delete':
- $val += $rs->fields[1]; break;
- case 'Com_update':
- $val += $rs->fields[1]/2;
- $rs->Close();
- return $val;
- }
- $rs->MoveNext();
- }
-
- $rs->Close();
-
- return $val;
- }
-
- function FindDBHitRatio()
- {
- // first find out type of table
- //$this->conn->debug=1;
-
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs = $this->conn->Execute('show table status');
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if (!$rs) return '';
- $type = strtoupper($rs->fields[1]);
- $rs->Close();
- switch($type){
- case 'MYISAM':
- case 'ISAM':
- return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)';
- case 'INNODB':
- return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)';
- default:
- return $type.' not supported';
- }
-
- }
-
- function GetQHitRatio()
- {
- //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached
- $hits = $this->_DBParameter(array("show status","Qcache_hits"));
- $total = $this->_DBParameter(array("show status","Qcache_inserts"));
- $total += $this->_DBParameter(array("show status","Qcache_not_cached"));
-
- $total += $hits;
- if ($total) return round(($hits*100)/$total,2);
- return 0;
- }
-
- /*
- Use session variable to store Hit percentage, because MySQL
- does not remember last value of SHOW INNODB STATUS hit ratio
-
- # 1st query to SHOW INNODB STATUS
- 0.00 reads/s, 0.00 creates/s, 0.00 writes/s
- Buffer pool hit rate 1000 / 1000
-
- # 2nd query to SHOW INNODB STATUS
- 0.00 reads/s, 0.00 creates/s, 0.00 writes/s
- No buffer pool activity since the last printout
- */
- function GetInnoDBHitRatio()
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $rs = $this->conn->Execute('show innodb status');
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_FETCH_MODE = $save;
-
- if (!$rs || $rs->EOF) return 0;
- $stat = $rs->fields[0];
- $rs->Close();
- $at = strpos($stat,'Buffer pool hit rate');
- $stat = substr($stat,$at,200);
- if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) {
- $val = 100*$arr[1]/$arr[2];
- $_SESSION['INNODB_HIT_PCT'] = $val;
- return round($val,2);
- } else {
- if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT'];
- return 0;
- }
- return 0;
- }
-
- function GetKeyHitRatio()
- {
- $hits = $this->_DBParameter(array("show status","Key_read_requests"));
- $reqs = $this->_DBParameter(array("show status","Key_reads"));
- if ($reqs == 0) return 0;
-
- return round(($hits/($reqs+$hits))*100,2);
- }
-
- // start hack
- var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK';
- var $optimizeTableHigh = 'OPTIMIZE TABLE %s';
-
- /**
- * @see adodb_perf#optimizeTable
- */
- function optimizeTable( $table, $mode = ADODB_OPT_LOW)
- {
- if ( !is_string( $table)) return false;
-
- $conn = $this->conn;
- if ( !$conn) return false;
-
- $sql = '';
- switch( $mode) {
- case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break;
- case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break;
- default :
- {
- // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0)
- ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode));
- return false;
- }
- }
- $sql = sprintf( $sql, $table);
-
- return $conn->Execute( $sql) !== false;
- }
- // end hack
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/perf/perf-oci8.inc.php b/lib/adodb/perf/perf-oci8.inc.php
deleted file mode 100644
index a4bcda6..0000000
--- a/lib/adodb/perf/perf-oci8.inc.php
+++ /dev/null
@@ -1,509 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-class perf_oci8 extends ADODB_perf{
-
- var $tablesSQL = "select segment_name as \"tablename\", sum(bytes)/1024 as \"size_in_k\",tablespace_name as \"tablespace\",count(*) \"extents\" from sys.user_extents
- group by segment_name,tablespace_name";
-
- var $version;
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created date NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 varchar(4000) NOT NULL,
- params varchar(4000),
- tracer varchar(4000),
- timer decimal(16,6) NOT NULL
- )";
-
- var $settings = array(
- 'Ratios',
- 'data cache hit ratio' => array('RATIOH',
- "select round((1-(phy.value / (cur.value + con.value)))*100,2)
- from v\$sysstat cur, v\$sysstat con, v\$sysstat phy
- where cur.name = 'db block gets' and
- con.name = 'consistent gets' and
- phy.name = 'physical reads'",
- '=WarnCacheRatio'),
-
- 'sql cache hit ratio' => array( 'RATIOH',
- 'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache',
- 'increase <i>shared_pool_size</i> if too ratio low'),
-
- 'datadict cache hit ratio' => array('RATIOH',
- "select
- round((1 - (sum(getmisses) / (sum(gets) +
- sum(getmisses))))*100,2)
- from v\$rowcache",
- 'increase <i>shared_pool_size</i> if too ratio low'),
-
- 'memory sort ratio' => array('RATIOH',
- "SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE),
- 0,1,(a.VALUE + b.VALUE)),2)
-FROM v\$sysstat a,
- v\$sysstat b
-WHERE a.name = 'sorts (disk)'
-AND b.name = 'sorts (memory)'",
- "% of memory sorts compared to disk sorts - should be over 95%"),
-
- 'IO',
- 'data reads' => array('IO',
- "select value from v\$sysstat where name='physical reads'"),
-
- 'data writes' => array('IO',
- "select value from v\$sysstat where name='physical writes'"),
-
- 'Data Cache',
- 'data cache buffers' => array( 'DATAC',
- "select a.value/b.value from v\$parameter a, v\$parameter b
- where a.name = 'db_cache_size' and b.name= 'db_block_size'",
- 'Number of cache buffers. Tune <i>db_cache_size</i> if the <i>data cache hit ratio</i> is too low.'),
- 'data cache blocksize' => array('DATAC',
- "select value from v\$parameter where name='db_block_size'",
- '' ),
- 'Memory Pools',
- 'data cache size' => array('DATAC',
- "select value from v\$parameter where name = 'db_cache_size'",
- 'db_cache_size' ),
- 'shared pool size' => array('DATAC',
- "select value from v\$parameter where name = 'shared_pool_size'",
- 'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ),
- 'java pool size' => array('DATAJ',
- "select value from v\$parameter where name = 'java_pool_size'",
- 'java_pool_size' ),
- 'large pool buffer size' => array('CACHE',
- "select value from v\$parameter where name='large_pool_size'",
- 'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ),
-
- 'pga buffer size' => array('CACHE',
- "select value from v\$parameter where name='pga_aggregate_target'",
- 'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ),
-
-
- 'Connections',
- 'current connections' => array('SESS',
- 'select count(*) from sys.v_$session where username is not null',
- ''),
- 'max connections' => array( 'SESS',
- "select value from v\$parameter where name='sessions'",
- ''),
-
- 'Memory Utilization',
- 'data cache utilization ratio' => array('RATIOU',
- "select round((1-bytes/sgasize)*100, 2)
- from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
- where name = 'free memory' and pool = 'shared pool'",
- 'Percentage of data cache actually in use - should be over 85%'),
-
- 'shared pool utilization ratio' => array('RATIOU',
- 'select round((sga.bytes/p.value)*100,2)
- from v$sgastat sga, v$parameter p
- where sga.name = \'free memory\' and sga.pool = \'shared pool\'
- and p.name = \'shared_pool_size\'',
- 'Percentage of shared pool actually used - too low is bad, too high is worse'),
-
- 'large pool utilization ratio' => array('RATIOU',
- "select round((1-bytes/sgasize)*100, 2)
- from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
- where name = 'free memory' and pool = 'large pool'",
- 'Percentage of large_pool actually in use - too low is bad, too high is worse'),
- 'sort buffer size' => array('CACHE',
- "select value from v\$parameter where name='sort_area_size'",
- 'max in-mem sort_area_size (per query), uses memory in pga' ),
-
- 'pga usage at peak' => array('RATIOU',
- '=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'),
- 'Transactions',
- 'rollback segments' => array('ROLLBACK',
- "select count(*) from sys.v_\$rollstat",
- ''),
-
- 'peak transactions' => array('ROLLBACK',
- "select max_utilization tx_hwm
- from sys.v_\$resource_limit
- where resource_name = 'transactions'",
- 'Taken from high-water-mark'),
- 'max transactions' => array('ROLLBACK',
- "select value from v\$parameter where name = 'transactions'",
- 'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'),
- 'Parameters',
- 'cursor sharing' => array('CURSOR',
- "select value from v\$parameter where name = 'cursor_sharing'",
- 'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See <a href=http://www.praetoriate.com/oracle_tips_cursor_sharing.htm>cursor_sharing</a>.'),
- /*
- 'cursor reuse' => array('CURSOR',
- "select count(*) from (select sql_text_wo_constants, count(*)
- from t1
- group by sql_text_wo_constants
-having count(*) > 100)",'These are sql statements that should be using bind variables'),*/
- 'index cache cost' => array('COST',
- "select value from v\$parameter where name = 'optimizer_index_caching'",
- '=WarnIndexCost'),
- 'random page cost' => array('COST',
- "select value from v\$parameter where name = 'optimizer_index_cost_adj'",
- '=WarnPageCost'),
-
- false
-
- );
-
-
- function perf_oci8(&$conn)
- {
- $savelog = $conn->LogSQL(false);
- $this->version = $conn->ServerInfo();
- $conn->LogSQL($savelog);
- $this->conn =& $conn;
- }
-
- function WarnPageCost($val)
- {
- if ($val == 100) $s = '<font color=red><b>Too High</b>. </font>';
- else $s = '';
-
- return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See <a href=http://www.dba-oracle.com/oracle_tips_cost_adj.htm>optimizer_index_cost_adj</a>. ';
- }
-
- function WarnIndexCost($val)
- {
- if ($val == 0) $s = '<font color=red><b>Too Low</b>. </font>';
- else $s = '';
-
- return $s.'Percentage of indexed data blocks expected in the cache.
- Recommended is 20 (fast disk array) to 50 (slower hard disks). Default is 0.
- See <a href=http://www.dba-oracle.com/oracle_tips_cbo_part1.htm>optimizer_index_caching</a>.';
- }
-
- function PGA()
- {
- if ($this->version['version'] < 9) return 'Oracle 9i or later required';
-
- $rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from
- (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
- pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
- from v\$pga_target_advice) a left join
- (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
- pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
- from v\$pga_target_advice) b on
- a.r = b.r+1 where
- b.pct < 100");
- if (!$rs) return "Only in 9i or later";
- $rs->Close();
- if ($rs->EOF) return "PGA could be too big";
-
- return reset($rs->fields);
- }
-
- function Explain($sql,$partial=false)
- {
- $savelog = $this->conn->LogSQL(false);
- $rs =& $this->conn->SelectLimit("select ID FROM PLAN_TABLE");
- if (!$rs) {
- echo "<p><b>Missing PLAN_TABLE</b></p>
-<pre>
-CREATE TABLE PLAN_TABLE (
- STATEMENT_ID VARCHAR2(30),
- TIMESTAMP DATE,
- REMARKS VARCHAR2(80),
- OPERATION VARCHAR2(30),
- OPTIONS VARCHAR2(30),
- OBJECT_NODE VARCHAR2(128),
- OBJECT_OWNER VARCHAR2(30),
- OBJECT_NAME VARCHAR2(30),
- OBJECT_INSTANCE NUMBER(38),
- OBJECT_TYPE VARCHAR2(30),
- OPTIMIZER VARCHAR2(255),
- SEARCH_COLUMNS NUMBER,
- ID NUMBER(38),
- PARENT_ID NUMBER(38),
- POSITION NUMBER(38),
- COST NUMBER(38),
- CARDINALITY NUMBER(38),
- BYTES NUMBER(38),
- OTHER_TAG VARCHAR2(255),
- PARTITION_START VARCHAR2(255),
- PARTITION_STOP VARCHAR2(255),
- PARTITION_ID NUMBER(38),
- OTHER LONG,
- DISTRIBUTION VARCHAR2(30)
-);
-</pre>";
- return false;
- }
-
- $rs->Close();
- // $this->conn->debug=1;
-
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
-
- $s = "<p><b>Explain</b>: ".htmlspecialchars($sql)."</p>";
-
- $this->conn->BeginTrans();
- $id = "ADODB ".microtime();
-
- $rs =& $this->conn->Execute("EXPLAIN PLAN SET STATEMENT_ID='$id' FOR $sql");
- $m = $this->conn->ErrorMsg();
- if ($m) {
- $this->conn->RollbackTrans();
- $this->conn->LogSQL($savelog);
- $s .= "<p>$m</p>";
- return $s;
- }
- $rs =& $this->conn->Execute("
- select
- '<pre>'||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'</pre>' as Operation,
- object_name,COST,CARDINALITY,bytes
- FROM plan_table
-START WITH id = 0 and STATEMENT_ID='$id'
-CONNECT BY prior id=parent_id and statement_id='$id'");
-
- $s .= rs2html($rs,false,false,false,false);
- $this->conn->RollbackTrans();
- $this->conn->LogSQL($savelog);
- $s .= $this->Tracer($sql,$partial);
- return $s;
- }
-
-
- function CheckMemory()
- {
- if ($this->version['version'] < 9) return 'Oracle 9i or later required';
-
- $rs =& $this->conn->Execute("
-select a.size_for_estimate as cache_mb_estimate,
- case when a.size_factor=1 then
- '&lt;&lt;= current'
- when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then
- '- BETTER - '
- else ' ' end as currsize,
- a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0
- from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a ,
- (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1");
- if (!$rs) return false;
-
- /*
- The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size
- */
- $s = "<h3>Data Cache Estimate</h3>";
- if ($rs->EOF) {
- $s .= "<p>Cache that is 50% of current size is still too big</p>";
- } else {
- $s .= "Ideal size of Data Cache is when \"best_when_0\" changes from a positive number and becomes zero.";
- $s .= rs2html($rs,false,false,false,false);
- }
- return $s;
- }
-
- /*
- Generate html for suspicious/expensive sql
- */
- function tohtml(&$rs,$type)
- {
- $o1 = $rs->FetchField(0);
- $o2 = $rs->FetchField(1);
- $o3 = $rs->FetchField(2);
- if ($rs->EOF) return '<p>None found</p>';
- $check = '';
- $sql = '';
- $s = "\n\n<table border=1 bgcolor=white><tr><td><b>".$o1->name.'</b></td><td><b>'.$o2->name.'</b></td><td><b>'.$o3->name.'</b></td></tr>';
- while (!$rs->EOF) {
- if ($check != $rs->fields[0].'::'.$rs->fields[1]) {
- if ($check) {
- $carr = explode('::',$check);
- $prefix = "<a href=\"?$type=1&sql=".rawurlencode($sql).'&x#explain">';
- $suffix = '</a>';
- if (strlen($prefix)>2000) {
- $prefix = '';
- $suffix = '';
- }
-
- $s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>';
- }
- $sql = $rs->fields[2];
- $check = $rs->fields[0].'::'.$rs->fields[1];
- } else
- $sql .= $rs->fields[2];
- if (substr($sql,strlen($sql)-1) == "\0") $sql = substr($sql,0,strlen($sql)-1);
- $rs->MoveNext();
- }
- $rs->Close();
-
- $carr = explode('::',$check);
- $prefix = "<a target=".rand()." href=\"?&hidem=1&$type=1&sql=".rawurlencode($sql).'&x#explain">';
- $suffix = '</a>';
- if (strlen($prefix)>2000) {
- $prefix = '';
- $suffix = '';
- }
- $s .= "\n<tr><td align=right>".$carr[0].'</td><td align=right>'.$carr[1].'</td><td>'.$prefix.$sql.$suffix.'</td></tr>';
-
- return $s."</table>\n\n";
- }
-
- // code thanks to Ixora.
- // http://www.ixora.com.au/scripts/query_opt.htm
- // requires oracle 8.1.7 or later
- function SuspiciousSQL($numsql=10)
- {
- $sql = "
-select
- substr(to_char(s.pct, '99.00'), 2) || '%' load,
- s.executions executes,
- p.sql_text
-from
- (
- select
- address,
- buffer_gets,
- executions,
- pct,
- rank() over (order by buffer_gets desc) ranking
- from
- (
- select
- address,
- buffer_gets,
- executions,
- 100 * ratio_to_report(buffer_gets) over () pct
- from
- sys.v_\$sql
- where
- command_type != 47 and module != 'T.O.A.D.'
- )
- where
- buffer_gets > 50 * executions
- ) s,
- sys.v_\$sqltext p
-where
- s.ranking <= $numsql and
- p.address = s.address
-order by
- 1 desc, s.address, p.piece";
-
- global $ADODB_CACHE_MODE;
- if (isset($_GET['expsixora']) && isset($_GET['sql'])) {
- $partial = empty($_GET['part']);
- echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
- }
-
- if (isset($_GET['sql'])) return $this->_SuspiciousSQL($numsql);
-
- $s = '';
- $s .= $this->_SuspiciousSQL($numsql);
- $s .= '<p>';
-
- $save = $ADODB_CACHE_MODE;
- $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $savelog = $this->conn->LogSQL(false);
- $rs =& $this->conn->SelectLimit($sql);
- $this->conn->LogSQL($savelog);
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_CACHE_MODE = $save;
- if ($rs) {
- $s .= "\n<h3>Ixora Suspicious SQL</h3>";
- $s .= $this->tohtml($rs,'expsixora');
- }
-
- return $s;
- }
-
- // code thanks to Ixora.
- // http://www.ixora.com.au/scripts/query_opt.htm
- // requires oracle 8.1.7 or later
- function ExpensiveSQL($numsql = 10)
- {
- $sql = "
-select
- substr(to_char(s.pct, '99.00'), 2) || '%' load,
- s.executions executes,
- p.sql_text
-from
- (
- select
- address,
- disk_reads,
- executions,
- pct,
- rank() over (order by disk_reads desc) ranking
- from
- (
- select
- address,
- disk_reads,
- executions,
- 100 * ratio_to_report(disk_reads) over () pct
- from
- sys.v_\$sql
- where
- command_type != 47 and module != 'T.O.A.D.'
- )
- where
- disk_reads > 50 * executions
- ) s,
- sys.v_\$sqltext p
-where
- s.ranking <= $numsql and
- p.address = s.address
-order by
- 1 desc, s.address, p.piece
-";
- global $ADODB_CACHE_MODE;
- if (isset($_GET['expeixora']) && isset($_GET['sql'])) {
- $partial = empty($_GET['part']);
- echo "<a name=explain></a>".$this->Explain($_GET['sql'],$partial)."\n";
- }
- if (isset($_GET['sql'])) {
- $var = $this->_ExpensiveSQL($numsql);
- return $var;
- }
-
- $s = '';
- $s .= $this->_ExpensiveSQL($numsql);
- $s .= '<p>';
- $save = $ADODB_CACHE_MODE;
- $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
- if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
-
- $savelog = $this->conn->LogSQL(false);
- $rs =& $this->conn->Execute($sql);
- $this->conn->LogSQL($savelog);
-
- if (isset($savem)) $this->conn->SetFetchMode($savem);
- $ADODB_CACHE_MODE = $save;
-
- if ($rs) {
- $s .= "\n<h3>Ixora Expensive SQL</h3>";
- $s .= $this->tohtml($rs,'expeixora');
- }
-
- return $s;
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/perf/perf-postgres.inc.php b/lib/adodb/perf/perf-postgres.inc.php
deleted file mode 100644
index da41ebe..0000000
--- a/lib/adodb/perf/perf-postgres.inc.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 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. See License.txt.
- Set tabs to 4 for best viewing.
-
- Latest version is available at http://adodb.sourceforge.net
-
- Library for basic performance monitoring and tuning
-
-*/
-
-// security - hide paths
-if (!defined('ADODB_DIR')) die();
-
-/*
- Notice that PostgreSQL has no sql query cache
-*/
-class perf_postgres extends adodb_perf{
-
- var $tablesSQL =
- "select a.relname as tablename,(a.relpages+CASE WHEN b.relpages is null THEN 0 ELSE b.relpages END+CASE WHEN c.relpages is null THEN 0 ELSE c.relpages END)*8 as size_in_K,a.relfilenode as \"OID\" from pg_class a left join pg_class b
- on b.relname = 'pg_toast_'||trim(a.relfilenode)
- left join pg_class c on c.relname = 'pg_toast_'||trim(a.relfilenode)||'_index'
- where a.relname in (select tablename from pg_tables where tablename not like 'pg_%')";
-
- var $createTableSQL = "CREATE TABLE adodb_logsql (
- created timestamp NOT NULL,
- sql0 varchar(250) NOT NULL,
- sql1 text NOT NULL,
- params text NOT NULL,
- tracer text NOT NULL,
- timer decimal(16,6) NOT NULL
- )";
-
- var $settings = array(
- 'Ratios',
- 'statistics collector' => array('RATIO',
- "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ",
- 'Value must be TRUE to enable hit ratio statistics (<i>stats_start_collector</i>,<i>stats_row_level</i> and <i>stats_block_level</i> must be set to true in postgresql.conf)'),
- 'data cache hit ratio' => array('RATIO',
- "select case when blks_hit=0 then 0 else round( ((1-blks_read::float/blks_hit)*100)::numeric, 2) end from pg_stat_database where datname='\$DATABASE'",
- '=WarnCacheRatio'),
- 'IO',
- 'data reads' => array('IO',
- 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables',
- ),
- 'data writes' => array('IO',
- 'select round((sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16)::numeric,2) from pg_stat_user_tables',
- 'Count of inserts/updates/deletes * coef'),
-
- 'Data Cache',
- 'data cache buffers' => array('DATAC',
- "select setting from pg_settings where name='shared_buffers'",
- 'Number of cache buffers. <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#basic>Tuning</a>'),
- 'cache blocksize' => array('DATAC',
- 'select 8192',
- '(estimate)' ),
- 'data cache size' => array( 'DATAC',
- "select setting::integer*8192 from pg_settings where name='shared_buffers'",
- '' ),
- 'operating system cache size' => array( 'DATA',
- "select setting::integer*8192 from pg_settings where name='effective_cache_size'",
- '(effective cache size)' ),
- 'Memory Usage',
- # Postgres 7.5 changelog: Rename server parameters SortMem and VacuumMem to work_mem and maintenance_work_mem;
- 'sort/work buffer size' => array('CACHE',
- "select setting::integer*1024 from pg_settings where name='sort_mem' or name = 'work_mem' order by name",
- 'Size of sort buffer (per query)' ),
- 'Connections',
- 'current connections' => array('SESS',
- 'select count(*) from pg_stat_activity',
- ''),
- 'max connections' => array('SESS',
- "select setting from pg_settings where name='max_connections'",
- ''),
- 'Parameters',
- 'rollback buffers' => array('COST',
- "select setting from pg_settings where name='wal_buffers'",
- 'WAL buffers'),
- 'random page cost' => array('COST',
- "select setting from pg_settings where name='random_page_cost'",
- 'Cost of doing a seek (default=4). See <a href=http://www.varlena.com/GeneralBits/Tidbits/perf.html#less>random_page_cost</a>'),
- false
- );
-
- function perf_postgres(&$conn)
- {
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
- $save = $this->conn->LogSQL(false);
-
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
- $sql = str_replace('?',"''",$sql);
- $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
- $rs = $this->conn->Execute('EXPLAIN '.$sql);
- $this->conn->LogSQL($save);
- $s .= '<pre>';
- if ($rs)
- while (!$rs->EOF) {
- $s .= reset($rs->fields)."\n";
- $rs->MoveNext();
- }
- $s .= '</pre>';
- $s .= $this->Tracer($sql,$partial);
- return $s;
- }
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/pivottable.inc.php b/lib/adodb/pivottable.inc.php
deleted file mode 100644
index 0e0e7b1..0000000
--- a/lib/adodb/pivottable.inc.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-/**
- * @version V4.93 10 Oct 2006 (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.
- *
-*/
-
-/*
- * Concept from daniel.lucazeau@ajornet.com.
- *
- * @param db Adodb database connection
- * @param tables List of tables to join
- * @rowfields List of fields to display on each row
- * @colfield Pivot field to slice and display in columns, if we want to calculate
- * ranges, we pass in an array (see example2)
- * @where Where clause. Optional.
- * @aggfield This is the field to sum. Optional.
- * Since 2.3.1, if you can use your own aggregate function
- * instead of SUM, eg. $aggfield = 'fieldname'; $aggfn = 'AVG';
- * @sumlabel Prefix to display in sum columns. Optional.
- * @aggfn Aggregate function to use (could be AVG, SUM, COUNT)
- * @showcount Show count of records
- *
- * @returns Sql generated
- */
-
- function PivotTableSQL(&$db,$tables,$rowfields,$colfield, $where=false,
- $aggfield = false,$sumlabel='Sum ',$aggfn ='SUM', $showcount = true)
- {
- if ($aggfield) $hidecnt = true;
- else $hidecnt = false;
-
- $iif = strpos($db->databaseType,'access') !== false;
- // note - vfp 6 still doesn' work even with IIF enabled || $db->databaseType == 'vfp';
-
- //$hidecnt = false;
-
- if ($where) $where = "\nWHERE $where";
- if (!is_array($colfield)) $colarr = $db->GetCol("select distinct $colfield from $tables $where order by 1");
- if (!$aggfield) $hidecnt = false;
-
- $sel = "$rowfields, ";
- if (is_array($colfield)) {
- foreach ($colfield as $k => $v) {
- $k = trim($k);
- if (!$hidecnt) {
- $sel .= $iif ?
- "\n\t$aggfn(IIF($v,1,0)) AS \"$k\", "
- :
- "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", ";
- }
- if ($aggfield) {
- $sel .= $iif ?
- "\n\t$aggfn(IIF($v,$aggfield,0)) AS \"$sumlabel$k\", "
- :
- "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", ";
- }
- }
- } else {
- foreach ($colarr as $v) {
- if (!is_numeric($v)) $vq = $db->qstr($v);
- else $vq = $v;
- $v = trim($v);
- if (strlen($v) == 0 ) $v = 'null';
- if (!$hidecnt) {
- $sel .= $iif ?
- "\n\t$aggfn(IIF($colfield=$vq,1,0)) AS \"$v\", "
- :
- "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", ";
- }
- if ($aggfield) {
- if ($hidecnt) $label = $v;
- else $label = "{$v}_$aggfield";
- $sel .= $iif ?
- "\n\t$aggfn(IIF($colfield=$vq,$aggfield,0)) AS \"$label\", "
- :
- "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", ";
- }
- }
- }
- if ($aggfield && $aggfield != '1'){
- $agg = "$aggfn($aggfield)";
- $sel .= "\n\t$agg as \"$sumlabel$aggfield\", ";
- }
-
- if ($showcount)
- $sel .= "\n\tSUM(1) as Total";
- else
- $sel = substr($sel,0,strlen($sel)-2);
-
-
- // Strip aliases
- $rowfields = preg_replace('/ AS (\w+)/i', '', $rowfields);
-
- $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields";
-
- return $sql;
- }
-
-/* EXAMPLES USING MS NORTHWIND DATABASE */
-if (0) {
-
-# example1
-#
-# Query the main "product" table
-# Set the rows to CompanyName and QuantityPerUnit
-# and the columns to the Categories
-# and define the joins to link to lookup tables
-# "categories" and "suppliers"
-#
-
- $sql = PivotTableSQL(
- $gDB, # adodb connection
- 'products p ,categories c ,suppliers s', # tables
- 'CompanyName,QuantityPerUnit', # row fields
- 'CategoryName', # column fields
- 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
-);
- print "<pre>$sql";
- $rs = $gDB->Execute($sql);
- rs2html($rs);
-
-/*
-Generated SQL:
-
-SELECT CompanyName,QuantityPerUnit,
- SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
- SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
- SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
- SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
- SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
- SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
- SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
- SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
- SUM(1) as Total
-FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
-GROUP BY CompanyName,QuantityPerUnit
-*/
-//=====================================================================
-
-# example2
-#
-# Query the main "product" table
-# Set the rows to CompanyName and QuantityPerUnit
-# and the columns to the UnitsInStock for diiferent ranges
-# and define the joins to link to lookup tables
-# "categories" and "suppliers"
-#
- $sql = PivotTableSQL(
- $gDB, # adodb connection
- 'products p ,categories c ,suppliers s', # tables
- 'CompanyName,QuantityPerUnit', # row fields
- # column ranges
-array(
-' 0 ' => 'UnitsInStock <= 0',
-"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
-"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
-"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
-"16+" =>'15 < UnitsInStock'
-),
- ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
- 'UnitsInStock', # sum this field
- 'Sum' # sum label prefix
-);
- print "<pre>$sql";
- $rs = $gDB->Execute($sql);
- rs2html($rs);
- /*
- Generated SQL:
-
-SELECT CompanyName,QuantityPerUnit,
- SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
- SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
- SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
- SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
- SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
- SUM(UnitsInStock) AS "Sum UnitsInStock",
- SUM(1) as Total
-FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
-GROUP BY CompanyName,QuantityPerUnit
- */
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/rsfilter.inc.php b/lib/adodb/rsfilter.inc.php
deleted file mode 100644
index 29662a2..0000000
--- a/lib/adodb/rsfilter.inc.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * @version V4.93 10 Oct 2006 (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.
- *
- * Latest version is available at http://php.weblogs.com
- *
- * Requires PHP4.01pl2 or later because it uses include_once
-*/
-
-/*
- Filter all fields and all rows in a recordset and returns the
- processed recordset. We scroll to the beginning of the new recordset
- after processing.
-
- We pass a recordset and function name to RSFilter($rs,'rowfunc');
- and the function will be called multiple times, once
- for each row in the recordset. The function will be passed
- an array containing one row repeatedly.
-
- Example:
-
- // ucwords() every element in the recordset
- function do_ucwords(&$arr,$rs)
- {
- foreach($arr as $k => $v) {
- $arr[$k] = ucwords($v);
- }
- }
- $rs = RSFilter($rs,'do_ucwords');
- */
-function &RSFilter($rs,$fn)
-{
- if ($rs->databaseType != 'array') {
- if (!$rs->connection) return false;
-
- $rs = &$rs->connection->_rs2rs($rs);
- }
- $rows = $rs->RecordCount();
- for ($i=0; $i < $rows; $i++) {
- if (is_array ($fn)) {
- $obj = $fn[0];
- $method = $fn[1];
- $obj->$method ($rs->_array[$i],$rs);
- } else {
- $fn($rs->_array[$i],$rs);
- }
-
- }
- if (!$rs->EOF) {
- $rs->_currentRow = 0;
- $rs->fields = $rs->_array[0];
- }
-
- return $rs;
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/server.php b/lib/adodb/server.php
deleted file mode 100644
index a39f9c7..0000000
--- a/lib/adodb/server.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/**
- * @version V4.93 10 Oct 2006 (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.
- */
-
-/* Documentation on usage is at http://php.weblogs.com/adodb_csv
- *
- * Legal query string parameters:
- *
- * sql = holds sql string
- * nrows = number of rows to return
- * offset = skip offset rows of data
- * fetch = $ADODB_FETCH_MODE
- *
- * example:
- *
- * http://localhost/php/server.php?select+*+from+table&nrows=10&offset=2
- */
-
-
-/*
- * Define the IP address you want to accept requests from
- * as a security measure. If blank we accept anyone promisciously!
- */
-$ACCEPTIP = '127.0.0.1';
-
-/*
- * Connection parameters
- */
-$driver = 'mysql';
-$host = 'localhost'; // DSN for odbc
-$uid = 'root';
-$pwd = 'garbase-it-is';
-$database = 'test';
-
-/*============================ DO NOT MODIFY BELOW HERE =================================*/
-// $sep must match csv2rs() in adodb.inc.php
-$sep = ' :::: ';
-
-include('./adodb.inc.php');
-include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
-
-function err($s)
-{
- die('**** '.$s.' ');
-}
-
-// undo stupid magic quotes
-function undomq(&$m)
-{
- if (get_magic_quotes_gpc()) {
- // undo the damage
- $m = str_replace('\\\\','\\',$m);
- $m = str_replace('\"','"',$m);
- $m = str_replace('\\\'','\'',$m);
-
- }
- return $m;
-}
-
-///////////////////////////////////////// DEFINITIONS
-
-
-$remote = $_SERVER["REMOTE_ADDR"];
-
-
-if (!empty($ACCEPTIP))
- if ($remote != '127.0.0.1' && $remote != $ACCEPTIP)
- err("Unauthorised client: '$remote'");
-
-
-if (empty($_REQUEST['sql'])) err('No SQL');
-
-
-$conn = &ADONewConnection($driver);
-
-if (!$conn->Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
-$sql = undomq($_REQUEST['sql']);
-
-if (isset($_REQUEST['fetch']))
- $ADODB_FETCH_MODE = $_REQUEST['fetch'];
-
-if (isset($_REQUEST['nrows'])) {
- $nrows = $_REQUEST['nrows'];
- $offset = isset($_REQUEST['offset']) ? $_REQUEST['offset'] : -1;
- $rs = $conn->SelectLimit($sql,$nrows,$offset);
-} else
- $rs = $conn->Execute($sql);
-if ($rs){
- //$rs->timeToLive = 1;
- echo _rs2serialize($rs,$conn,$sql);
- $rs->Close();
-} else
- err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-compress-bzip2.php b/lib/adodb/session/adodb-compress-bzip2.php
deleted file mode 100644
index 79c3823..0000000
--- a/lib/adodb/session/adodb-compress-bzip2.php
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-
-*/
-
-if (!function_exists('bzcompress')) {
- trigger_error('bzip2 functions are not available', E_USER_ERROR);
- return 0;
-}
-
-/*
-*/
-class ADODB_Compress_Bzip2 {
- /**
- */
- var $_block_size = null;
-
- /**
- */
- var $_work_level = null;
-
- /**
- */
- var $_min_length = 1;
-
- /**
- */
- function getBlockSize() {
- return $this->_block_size;
- }
-
- /**
- */
- function setBlockSize($block_size) {
- assert('$block_size >= 1');
- assert('$block_size <= 9');
- $this->_block_size = (int) $block_size;
- }
-
- /**
- */
- function getWorkLevel() {
- return $this->_work_level;
- }
-
- /**
- */
- function setWorkLevel($work_level) {
- assert('$work_level >= 0');
- assert('$work_level <= 250');
- $this->_work_level = (int) $work_level;
- }
-
- /**
- */
- function getMinLength() {
- return $this->_min_length;
- }
-
- /**
- */
- function setMinLength($min_length) {
- assert('$min_length >= 0');
- $this->_min_length = (int) $min_length;
- }
-
- /**
- */
- function ADODB_Compress_Bzip2($block_size = null, $work_level = null, $min_length = null) {
- if (!is_null($block_size)) {
- $this->setBlockSize($block_size);
- }
-
- if (!is_null($work_level)) {
- $this->setWorkLevel($work_level);
- }
-
- if (!is_null($min_length)) {
- $this->setMinLength($min_length);
- }
- }
-
- /**
- */
- function write($data, $key) {
- if (strlen($data) < $this->_min_length) {
- return $data;
- }
-
- if (!is_null($this->_block_size)) {
- if (!is_null($this->_work_level)) {
- return bzcompress($data, $this->_block_size, $this->_work_level);
- } else {
- return bzcompress($data, $this->_block_size);
- }
- }
-
- return bzcompress($data);
- }
-
- /**
- */
- function read($data, $key) {
- return $data ? bzdecompress($data) : $data;
- }
-
-}
-
-return 1;
-
-?>
diff --git a/lib/adodb/session/adodb-compress-gzip.php b/lib/adodb/session/adodb-compress-gzip.php
deleted file mode 100644
index da8d3d4..0000000
--- a/lib/adodb/session/adodb-compress-gzip.php
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-
-*/
-
-if (!function_exists('gzcompress')) {
- trigger_error('gzip functions are not available', E_USER_ERROR);
- return 0;
-}
-
-/*
-*/
-class ADODB_Compress_Gzip {
- /**
- */
- var $_level = null;
-
- /**
- */
- var $_min_length = 1;
-
- /**
- */
- function getLevel() {
- return $this->_level;
- }
-
- /**
- */
- function setLevel($level) {
- assert('$level >= 0');
- assert('$level <= 9');
- $this->_level = (int) $level;
- }
-
- /**
- */
- function getMinLength() {
- return $this->_min_length;
- }
-
- /**
- */
- function setMinLength($min_length) {
- assert('$min_length >= 0');
- $this->_min_length = (int) $min_length;
- }
-
- /**
- */
- function ADODB_Compress_Gzip($level = null, $min_length = null) {
- if (!is_null($level)) {
- $this->setLevel($level);
- }
-
- if (!is_null($min_length)) {
- $this->setMinLength($min_length);
- }
- }
-
- /**
- */
- function write($data, $key) {
- if (strlen($data) < $this->_min_length) {
- return $data;
- }
-
- if (!is_null($this->_level)) {
- return gzcompress($data, $this->_level);
- } else {
- return gzcompress($data);
- }
- }
-
- /**
- */
- function read($data, $key) {
- return $data ? gzuncompress($data) : $data;
- }
-
-}
-
-return 1;
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-cryptsession.php b/lib/adodb/session/adodb-cryptsession.php
deleted file mode 100644
index ddf619d..0000000
--- a/lib/adodb/session/adodb-cryptsession.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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 file is provided for backwards compatibility purposes
-
-*/
-
-if (!defined('ADODB_SESSION')) {
- require_once dirname(__FILE__) . '/adodb-session.php';
-}
-
-require_once ADODB_SESSION . '/adodb-encrypt-md5.php';
-
-ADODB_Session::filter(new ADODB_Encrypt_MD5());
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-cryptsession2.php b/lib/adodb/session/adodb-cryptsession2.php
deleted file mode 100644
index 6334eaf..0000000
--- a/lib/adodb/session/adodb-cryptsession2.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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 file is provided for backwards compatibility purposes
-
-*/
-
-if (!defined('ADODB_SESSION')) {
- require_once dirname(__FILE__) . '/adodb-session2.php';
-}
-
-require_once ADODB_SESSION . '/adodb-encrypt-md5.php';
-
-ADODB_Session::filter(new ADODB_Encrypt_MD5());
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-encrypt-mcrypt.php b/lib/adodb/session/adodb-encrypt-mcrypt.php
deleted file mode 100644
index a047579..0000000
--- a/lib/adodb/session/adodb-encrypt-mcrypt.php
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-
-*/
-
-if (!function_exists('mcrypt_encrypt')) {
- trigger_error('Mcrypt functions are not available', E_USER_ERROR);
- return 0;
-}
-
-/**
- */
-class ADODB_Encrypt_MCrypt {
- /**
- */
- var $_cipher;
-
- /**
- */
- var $_mode;
-
- /**
- */
- var $_source;
-
- /**
- */
- function getCipher() {
- return $this->_cipher;
- }
-
- /**
- */
- function setCipher($cipher) {
- $this->_cipher = $cipher;
- }
-
- /**
- */
- function getMode() {
- return $this->_mode;
- }
-
- /**
- */
- function setMode($mode) {
- $this->_mode = $mode;
- }
-
- /**
- */
- function getSource() {
- return $this->_source;
- }
-
- /**
- */
- function setSource($source) {
- $this->_source = $source;
- }
-
- /**
- */
- function ADODB_Encrypt_MCrypt($cipher = null, $mode = null, $source = null) {
- if (!$cipher) {
- $cipher = MCRYPT_RIJNDAEL_256;
- }
- if (!$mode) {
- $mode = MCRYPT_MODE_ECB;
- }
- if (!$source) {
- $source = MCRYPT_RAND;
- }
-
- $this->_cipher = $cipher;
- $this->_mode = $mode;
- $this->_source = $source;
- }
-
- /**
- */
- function write($data, $key) {
- $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
- $iv = mcrypt_create_iv($iv_size, $this->_source);
- return mcrypt_encrypt($this->_cipher, $key, $data, $this->_mode, $iv);
- }
-
- /**
- */
- function read($data, $key) {
- $iv_size = mcrypt_get_iv_size($this->_cipher, $this->_mode);
- $iv = mcrypt_create_iv($iv_size, $this->_source);
- $rv = mcrypt_decrypt($this->_cipher, $key, $data, $this->_mode, $iv);
- return rtrim($rv, "\0");
- }
-
-}
-
-return 1;
-
-?>
diff --git a/lib/adodb/session/adodb-encrypt-md5.php b/lib/adodb/session/adodb-encrypt-md5.php
deleted file mode 100644
index 24caa66..0000000
--- a/lib/adodb/session/adodb-encrypt-md5.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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_SESSION')) die();
-
-include_once ADODB_SESSION . '/crypt.inc.php';
-
-/**
- */
-class ADODB_Encrypt_MD5 {
- /**
- */
- function write($data, $key) {
- $md5crypt =& new MD5Crypt();
- return $md5crypt->encrypt($data, $key);
- }
-
- /**
- */
- function read($data, $key) {
- $md5crypt =& new MD5Crypt();
- return $md5crypt->decrypt($data, $key);
- }
-
-}
-
-return 1;
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-encrypt-secret.php b/lib/adodb/session/adodb-encrypt-secret.php
deleted file mode 100644
index cc7e2fb..0000000
--- a/lib/adodb/session/adodb-encrypt-secret.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-
-*/
-
-@define('HORDE_BASE', dirname(dirname(dirname(__FILE__))) . '/horde');
-
-if (!is_dir(HORDE_BASE)) {
- trigger_error(sprintf('Directory not found: \'%s\'', HORDE_BASE), E_USER_ERROR);
- return 0;
-}
-
-include_once HORDE_BASE . '/lib/Horde.php';
-include_once HORDE_BASE . '/lib/Secret.php';
-
-/**
-
-NOTE: On Windows 2000 SP4 with PHP 4.3.1, MCrypt 2.4.x, and Apache 1.3.28,
-the session didn't work properly.
-
-This may be resolved with 4.3.3.
-
- */
-class ADODB_Encrypt_Secret {
- /**
- */
- function write($data, $key) {
- return Secret::write($key, $data);
- }
-
- /**
- */
- function read($data, $key) {
- return Secret::read($key, $data);
- }
-
-}
-
-return 1;
-
-?>
diff --git a/lib/adodb/session/adodb-encrypt-sha1.php b/lib/adodb/session/adodb-encrypt-sha1.php
deleted file mode 100644
index c876002..0000000
--- a/lib/adodb/session/adodb-encrypt-sha1.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-if (!defined('ADODB_SESSION')) die();
-
-include_once ADODB_SESSION . '/crypt.inc.php';
-
-
-/**
-
- */
-
-class ADODB_Encrypt_SHA1 {
-
- function write($data, $key)
- {
- $sha1crypt =& new SHA1Crypt();
- return $sha1crypt->encrypt($data, $key);
-
- }
-
-
- function read($data, $key)
- {
- $sha1crypt =& new SHA1Crypt();
- return $sha1crypt->decrypt($data, $key);
-
- }
-}
-
-
-
-return 1;
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-session-clob.php b/lib/adodb/session/adodb-session-clob.php
deleted file mode 100644
index a2cd480..0000000
--- a/lib/adodb/session/adodb-session-clob.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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 file is provided for backwards compatibility purposes
-
-*/
-
-if (!defined('ADODB_SESSION')) {
- require_once dirname(__FILE__) . '/adodb-session.php';
-}
-ADODB_Session::clob('CLOB');
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-session-clob2.php b/lib/adodb/session/adodb-session-clob2.php
deleted file mode 100644
index 54b8043..0000000
--- a/lib/adodb/session/adodb-session-clob2.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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 file is provided for backwards compatibility purposes
-
-*/
-
-if (!defined('ADODB_SESSION')) {
- require_once dirname(__FILE__) . '/adodb-session2.php';
-}
-ADODB_Session::clob('CLOB');
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-session.php b/lib/adodb/session/adodb-session.php
deleted file mode 100644
index f0054ef..0000000
--- a/lib/adodb/session/adodb-session.php
+++ /dev/null
@@ -1,934 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-*/
-
-/*
- You may want to rename the 'data' field to 'session_data' as
- 'data' appears to be a reserved word for one or more of the following:
- ANSI SQL
- IBM DB2
- MS SQL Server
- Postgres
- SAP
-
- If you do, then execute:
-
- ADODB_Session::dataFieldName('session_data');
-
-*/
-
-if (!defined('_ADODB_LAYER')) {
- require realpath(dirname(__FILE__) . '/../adodb.inc.php');
-}
-
-if (defined('ADODB_SESSION')) return 1;
-
-define('ADODB_SESSION', dirname(__FILE__));
-
-
-/*
- Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821
-
- From Kerr Schere, to unserialize session data stored via ADOdb.
- 1. Pull the session data from the db and loop through it.
- 2. Inside the loop, you will need to urldecode the data column.
- 3. After urldecode, run the serialized string through this function:
-
-*/
-function adodb_unserialize( $serialized_string )
-{
- $variables = array( );
- $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
- for( $i = 0; $i < count( $a ); $i = $i+2 ) {
- $variables[$a[$i]] = unserialize( $a[$i+1] );
- }
- return( $variables );
-}
-
-/*
- Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
- Since adodb 4.61.
-*/
-function adodb_session_regenerate_id()
-{
- $conn =& ADODB_Session::_conn();
- if (!$conn) return false;
-
- $old_id = session_id();
- if (function_exists('session_regenerate_id')) {
- session_regenerate_id();
- } else {
- session_id(md5(uniqid(rand(), true)));
- $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- //@session_start();
- }
- $new_id = session_id();
- $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
-
- /* it is possible that the update statement fails due to a collision */
- if (!$ok) {
- session_id($old_id);
- if (empty($ck)) $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- return false;
- }
-
- return true;
-}
-
-/*
- Generate database table for session data
- @see http://phplens.com/lens/lensforum/msgs.php?id=12280
- @return 0 if failure, 1 if errors, 2 if successful.
- @author Markus Staab http://www.public-4u.de
-*/
-function adodb_session_create_table($schemaFile=null,$conn = null)
-{
- // set default values
- if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema.xml';
- if ($conn===null) $conn =& ADODB_Session::_conn();
-
- if (!$conn) return 0;
-
- $schema = new adoSchema($conn);
- $schema->ParseSchema($schemaFile);
- return $schema->ExecuteSchema();
-}
-
-/*!
- \static
-*/
-class ADODB_Session {
- /////////////////////
- // getter/setter methods
- /////////////////////
-
- /*
-
- function Lock($lock=null)
- {
- static $_lock = false;
-
- if (!is_null($lock)) $_lock = $lock;
- return $lock;
- }
- */
- /*!
- */
- function driver($driver = null) {
- static $_driver = 'mysql';
- static $set = false;
-
- if (!is_null($driver)) {
- $_driver = trim($driver);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
- return $GLOBALS['ADODB_SESSION_DRIVER'];
- }
- }
-
- return $_driver;
- }
-
- /*!
- */
- function host($host = null) {
- static $_host = 'localhost';
- static $set = false;
-
- if (!is_null($host)) {
- $_host = trim($host);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
- return $GLOBALS['ADODB_SESSION_CONNECT'];
- }
- }
-
- return $_host;
- }
-
- /*!
- */
- function user($user = null) {
- static $_user = 'root';
- static $set = false;
-
- if (!is_null($user)) {
- $_user = trim($user);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_USER'])) {
- return $GLOBALS['ADODB_SESSION_USER'];
- }
- }
-
- return $_user;
- }
-
- /*!
- */
- function password($password = null) {
- static $_password = '';
- static $set = false;
-
- if (!is_null($password)) {
- $_password = $password;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
- return $GLOBALS['ADODB_SESSION_PWD'];
- }
- }
-
- return $_password;
- }
-
- /*!
- */
- function database($database = null) {
- static $_database = 'xphplens_2';
- static $set = false;
-
- if (!is_null($database)) {
- $_database = trim($database);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_DB'])) {
- return $GLOBALS['ADODB_SESSION_DB'];
- }
- }
-
- return $_database;
- }
-
- /*!
- */
- function persist($persist = null)
- {
- static $_persist = true;
-
- if (!is_null($persist)) {
- $_persist = trim($persist);
- }
-
- return $_persist;
- }
-
- /*!
- */
- function lifetime($lifetime = null) {
- static $_lifetime;
- static $set = false;
-
- if (!is_null($lifetime)) {
- $_lifetime = (int) $lifetime;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
- return $GLOBALS['ADODB_SESS_LIFE'];
- }
- }
- if (!$_lifetime) {
- $_lifetime = ini_get('session.gc_maxlifetime');
- if ($_lifetime <= 1) {
- // bug in PHP 4.0.3 pl 1 -- how about other versions?
- //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
- $_lifetime = 1440;
- }
- }
-
- return $_lifetime;
- }
-
- /*!
- */
- function debug($debug = null) {
- static $_debug = false;
- static $set = false;
-
- if (!is_null($debug)) {
- $_debug = (bool) $debug;
-
- $conn = ADODB_Session::_conn();
- if ($conn) {
- $conn->debug = $_debug;
- }
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
- return $GLOBALS['ADODB_SESS_DEBUG'];
- }
- }
-
- return $_debug;
- }
-
- /*!
- */
- function expireNotify($expire_notify = null) {
- static $_expire_notify;
- static $set = false;
-
- if (!is_null($expire_notify)) {
- $_expire_notify = $expire_notify;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
- return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
- }
- }
-
- return $_expire_notify;
- }
-
- /*!
- */
- function table($table = null) {
- static $_table = 'sessions';
- static $set = false;
-
- if (!is_null($table)) {
- $_table = trim($table);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
- return $GLOBALS['ADODB_SESSION_TBL'];
- }
- }
-
- return $_table;
- }
-
- /*!
- */
- function optimize($optimize = null) {
- static $_optimize = false;
- static $set = false;
-
- if (!is_null($optimize)) {
- $_optimize = (bool) $optimize;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (defined('ADODB_SESSION_OPTIMIZE')) {
- return true;
- }
- }
-
- return $_optimize;
- }
-
- /*!
- */
- function syncSeconds($sync_seconds = null) {
- static $_sync_seconds = 60;
- static $set = false;
-
- if (!is_null($sync_seconds)) {
- $_sync_seconds = (int) $sync_seconds;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (defined('ADODB_SESSION_SYNCH_SECS')) {
- return ADODB_SESSION_SYNCH_SECS;
- }
- }
-
- return $_sync_seconds;
- }
-
- /*!
- */
- function clob($clob = null) {
- static $_clob = false;
- static $set = false;
-
- if (!is_null($clob)) {
- $_clob = strtolower(trim($clob));
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
- return $GLOBALS['ADODB_SESSION_USE_LOBS'];
- }
- }
-
- return $_clob;
- }
-
- /*!
- */
- function dataFieldName($data_field_name = null) {
- static $_data_field_name = 'data';
-
- if (!is_null($data_field_name)) {
- $_data_field_name = trim($data_field_name);
- }
-
- return $_data_field_name;
- }
-
- /*!
- */
- function filter($filter = null) {
- static $_filter = array();
-
- if (!is_null($filter)) {
- if (!is_array($filter)) {
- $filter = array($filter);
- }
- $_filter = $filter;
- }
-
- return $_filter;
- }
-
- /*!
- */
- function encryptionKey($encryption_key = null) {
- static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
-
- if (!is_null($encryption_key)) {
- $_encryption_key = $encryption_key;
- }
-
- return $_encryption_key;
- }
-
- /////////////////////
- // private methods
- /////////////////////
-
- /*!
- */
- function &_conn($conn=null) {
- return $GLOBALS['ADODB_SESS_CONN'];
- }
-
- /*!
- */
- function _crc($crc = null) {
- static $_crc = false;
-
- if (!is_null($crc)) {
- $_crc = $crc;
- }
-
- return $_crc;
- }
-
- /*!
- */
- function _init() {
- session_module_name('user');
- session_set_save_handler(
- array('ADODB_Session', 'open'),
- array('ADODB_Session', 'close'),
- array('ADODB_Session', 'read'),
- array('ADODB_Session', 'write'),
- array('ADODB_Session', 'destroy'),
- array('ADODB_Session', 'gc')
- );
- }
-
-
- /*!
- */
- function _sessionKey() {
- // use this function to create the encryption key for crypted sessions
- // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
- return crypt(ADODB_Session::encryptionKey(), session_id());
- }
-
- /*!
- */
- function _dumprs($rs) {
- $conn =& ADODB_Session::_conn();
- $debug = ADODB_Session::debug();
-
- if (!$conn) {
- return;
- }
-
- if (!$debug) {
- return;
- }
-
- if (!$rs) {
- echo "<br />\$rs is null or false<br />\n";
- return;
- }
-
- //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
-
- if (!is_object($rs)) {
- return;
- }
-
- require_once ADODB_SESSION.'/../tohtml.inc.php';
- rs2html($rs);
- }
-
- /////////////////////
- // public methods
- /////////////////////
-
- function config($driver, $host, $user, $password, $database=false,$options=false)
- {
- ADODB_Session::driver($driver);
- ADODB_Session::host($host);
- ADODB_Session::user($user);
- ADODB_Session::password($password);
- ADODB_Session::database($database);
-
- if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
-
- if (isset($options['table'])) ADODB_Session::table($options['table']);
- if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
- if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
- }
-
- /*!
- Create the connection to the database.
-
- If $conn already exists, reuse that connection
- */
- function open($save_path, $session_name, $persist = null)
- {
- $conn =& ADODB_Session::_conn();
-
- if ($conn) {
- return true;
- }
-
- $database = ADODB_Session::database();
- $debug = ADODB_Session::debug();
- $driver = ADODB_Session::driver();
- $host = ADODB_Session::host();
- $password = ADODB_Session::password();
- $user = ADODB_Session::user();
-
- if (!is_null($persist)) {
- ADODB_Session::persist($persist);
- } else {
- $persist = ADODB_Session::persist();
- }
-
-# these can all be defaulted to in php.ini
-# assert('$database');
-# assert('$driver');
-# assert('$host');
-
- $conn =& ADONewConnection($driver);
-
- if ($debug) {
- $conn->debug = true;
-// ADOConnection::outp( " driver=$driver user=$user pwd=$password db=$database ");
- }
-
- if ($persist) {
- switch($persist) {
- default:
- case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
- case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
- case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
- }
- } else {
- $ok = $conn->Connect($host, $user, $password, $database);
- }
-
- if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
- else
- ADOConnection::outp('<p>Session: connection failed</p>', false);
-
-
- return $ok;
- }
-
- /*!
- Close the connection
- */
- function close()
- {
-/*
- $conn =& ADODB_Session::_conn();
- if ($conn) $conn->Close();
-*/
- return true;
- }
-
- /*
- Slurp in the session variables and return the serialized string
- */
- function read($key)
- {
- $conn =& ADODB_Session::_conn();
- $data = ADODB_Session::dataFieldName();
- $filter = ADODB_Session::filter();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return '';
- }
-
- //assert('$table');
-
- $qkey = $conn->quote($key);
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- $sql = "SELECT $data FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . time();
- /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if
- developer has commited elsewhere... :(
- */
- #if (ADODB_Session::Lock())
- # $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), $data);
- #else
-
- $rs =& $conn->Execute($sql);
- //ADODB_Session::_dumprs($rs);
- if ($rs) {
- if ($rs->EOF) {
- $v = '';
- } else {
- $v = reset($rs->fields);
- $filter = array_reverse($filter);
- foreach ($filter as $f) {
- if (is_object($f)) {
- $v = $f->read($v, ADODB_Session::_sessionKey());
- }
- }
- $v = rawurldecode($v);
- }
-
- $rs->Close();
-
- ADODB_Session::_crc(strlen($v) . crc32($v));
- return $v;
- }
-
- return '';
- }
-
- /*!
- Write the serialized data to a database.
-
- If the data has not been modified since the last read(), we do not write.
- */
- function write($key, $val)
- {
- global $ADODB_SESSION_READONLY;
-
- if (!empty($ADODB_SESSION_READONLY)) return;
-
- $clob = ADODB_Session::clob();
- $conn =& ADODB_Session::_conn();
- $crc = ADODB_Session::_crc();
- $data = ADODB_Session::dataFieldName();
- $debug = ADODB_Session::debug();
- $driver = ADODB_Session::driver();
- $expire_notify = ADODB_Session::expireNotify();
- $filter = ADODB_Session::filter();
- $lifetime = ADODB_Session::lifetime();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return false;
- }
- $qkey = $conn->qstr($key);
-
- //assert('$table');
-
- $expiry = time() + $lifetime;
-
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- // crc32 optimization since adodb 2.1
- // now we only update expiry date, thx to sebastian thom in adodb 2.32
- if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
- if ($debug) {
- echo '<p>Session: Only updating date - crc32 not changed</p>';
- }
-
- $expirevar = '';
- if ($expire_notify) {
- $var = reset($expire_notify);
- global $$var;
- if (isset($$var)) {
- $expirevar = $$var;
- }
- }
-
-
- $sql = "UPDATE $table SET expiry = ".$conn->Param('0').",expireref=".$conn->Param('1')." WHERE $binary sesskey = ".$conn->Param('2')." AND expiry >= ".$conn->Param('3');
- $rs =& $conn->Execute($sql,array($expiry,$expirevar,$key,time()));
- return true;
- }
- $val = rawurlencode($val);
- foreach ($filter as $f) {
- if (is_object($f)) {
- $val = $f->write($val, ADODB_Session::_sessionKey());
- }
- }
-
- $arr = array('sesskey' => $key, 'expiry' => $expiry, $data => $val, 'expireref' => '');
- if ($expire_notify) {
- $var = reset($expire_notify);
- global $$var;
- if (isset($$var)) {
- $arr['expireref'] = $$var;
- }
- }
-
- if (!$clob) { // no lobs, simply use replace()
- $arr[$data] = $conn->qstr($val);
- $rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true);
-
- } else {
- // what value shall we insert/update for lob row?
- switch ($driver) {
- // empty_clob or empty_lob for oracle dbs
- case 'oracle':
- case 'oci8':
- case 'oci8po':
- case 'oci805':
- $lob_value = sprintf('empty_%s()', strtolower($clob));
- break;
-
- // null for all other
- default:
- $lob_value = 'null';
- break;
- }
-
- $conn->StartTrans();
- $expiryref = $conn->qstr($arr['expireref']);
- // do we insert or update? => as for sesskey
- $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey");
- if ($rs && reset($rs->fields) > 0) {
- $sql = "UPDATE $table SET expiry = $expiry, $data = $lob_value, expireref=$expiryref WHERE sesskey = $qkey";
- } else {
- $sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)";
- }
- if ($rs)$rs->Close();
-
-
- $err = '';
- $rs1 =& $conn->Execute($sql);
- if (!$rs1) $err = $conn->ErrorMsg()."\n";
-
- $rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob));
- if (!$rs2) $err .= $conn->ErrorMsg()."\n";
-
- $rs = ($rs && $rs2) ? true : false;
- $conn->CompleteTrans();
- }
-
- if (!$rs) {
- ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
- return false;
- } else {
- // bug in access driver (could be odbc?) means that info is not committed
- // properly unless select statement executed in Win2000
- if ($conn->databaseType == 'access') {
- $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- if ($rs) {
- $rs->Close();
- }
- }
- }/*
- if (ADODB_Session::Lock()) {
- $conn->CommitTrans();
- }*/
- return $rs ? true : false;
- }
-
- /*!
- */
- function destroy($key) {
- $conn =& ADODB_Session::_conn();
- $table = ADODB_Session::table();
- $expire_notify = ADODB_Session::expireNotify();
-
- if (!$conn) {
- return false;
- }
-
- //assert('$table');
-
- $qkey = $conn->quote($key);
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- if ($expire_notify) {
- reset($expire_notify);
- $fn = next($expire_notify);
- $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
- $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- $conn->SetFetchMode($savem);
- if (!$rs) {
- return false;
- }
- if (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- //assert('$ref');
- //assert('$key');
- $fn($ref, $key);
- }
- $rs->Close();
- }
-
- $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
-
- return $rs ? true : false;
- }
-
- /*!
- */
- function gc($maxlifetime)
- {
- $conn =& ADODB_Session::_conn();
- $debug = ADODB_Session::debug();
- $expire_notify = ADODB_Session::expireNotify();
- $optimize = ADODB_Session::optimize();
- $sync_seconds = ADODB_Session::syncSeconds();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return false;
- }
-
-
- $time = time();
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- if ($expire_notify) {
- reset($expire_notify);
- $fn = next($expire_notify);
- $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
- $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- $conn->SetFetchMode($savem);
- if ($rs) {
- $conn->StartTrans();
- $keys = array();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref, $key);
- $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
- $rs->MoveNext();
- }
- $rs->Close();
-
- $conn->CompleteTrans();
- }
- } else {
-
- if (1) {
- $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
- $arr =& $conn->GetAll($sql);
- foreach ($arr as $row) {
- $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
- $conn->Execute($sql2,array($row[0]));
- }
- } else {
- $sql = "DELETE FROM $table WHERE expiry < $time";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- if ($rs) $rs->Close();
- }
- if ($debug) {
- ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
- }
- }
-
- // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
- if ($optimize) {
- $driver = ADODB_Session::driver();
-
- if (preg_match('/mysql/i', $driver)) {
- $sql = "OPTIMIZE TABLE $table";
- }
- if (preg_match('/postgres/i', $driver)) {
- $sql = "VACUUM $table";
- }
- if (!empty($sql)) {
- $conn->Execute($sql);
- }
- }
-
- if ($sync_seconds) {
- $sql = 'SELECT ';
- if ($conn->dataProvider === 'oci8') {
- $sql .= "TO_CHAR({$conn->sysTimeStamp}, 'RRRR-MM-DD HH24:MI:SS')";
- } else {
- $sql .= $conn->sysTimeStamp;
- }
- $sql .= " FROM $table";
-
- $rs =& $conn->SelectLimit($sql, 1);
- if ($rs && !$rs->EOF) {
- $dbts = reset($rs->fields);
- $rs->Close();
- $dbt = $conn->UnixTimeStamp($dbts);
- $t = time();
-
- if (abs($dbt - $t) >= $sync_seconds) {
- $msg = __FILE__ .
- ": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: " .
- " database=$dbt ($dbts), webserver=$t (diff=". (abs($dbt - $t) / 60) . ' minutes)';
- error_log($msg);
- if ($debug) {
- ADOConnection::outp("<p>$msg</p>");
- }
- }
- }
- }
-
- return true;
- }
-}
-
-ADODB_Session::_init();
-if (empty($ADODB_SESSION_READONLY))
- register_shutdown_function('session_write_close');
-
-// for backwards compatability only
-function adodb_sess_open($save_path, $session_name, $persist = true) {
- return ADODB_Session::open($save_path, $session_name, $persist);
-}
-
-// for backwards compatability only
-function adodb_sess_gc($t)
-{
- return ADODB_Session::gc($t);
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/adodb-session2.php b/lib/adodb/session/adodb-session2.php
deleted file mode 100644
index c5932b6..0000000
--- a/lib/adodb/session/adodb-session2.php
+++ /dev/null
@@ -1,941 +0,0 @@
-<?php
-
-
-/*
-V4.94 23 Jan 2007 (c) 2000-2007 John Lim (jlim#natsoft.com.my). All rights reserved.
- Contributed by Ross Smith (adodb@netebb.com).
- 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.
-
-
-*/
-
-/*
-
-CREATE Table SCripts
-
-Oracle
-======
-
-CREATE TABLE SESSIONS2
-(
- SESSKEY VARCHAR2(48 BYTE) NOT NULL,
- EXPIRY DATE NOT NULL,
- EXPIREREF VARCHAR2(200 BYTE),
- CREATED DATE NOT NULL,
- MODIFIED DATE NOT NULL,
- SESSDATA CLOB,
- PRIMARY KEY(SESSKEY)
-);
-
-
-CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
-CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY);
-CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF);
-
-
-
- MySQL
- =====
-
-CREATE TABLE sessions2(
- sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
- expiry TIMESTAMP NOT NULL ,
- expireref VARCHAR( 250 ) DEFAULT '',
- created TIMESTAMP NOT NULL ,
- modified TIMESTAMP NOT NULL ,
- sessdata LONGTEXT DEFAULT '',
- PRIMARY KEY ( sesskey ) ,
- INDEX sess2_expiry( expiry ),
- INDEX sess2_expireref( expireref )
-)
-
-
-*/
-
-if (!defined('_ADODB_LAYER')) {
- require realpath(dirname(__FILE__) . '/../adodb.inc.php');
-}
-
-if (defined('ADODB_SESSION')) return 1;
-
-define('ADODB_SESSION', dirname(__FILE__));
-define('ADODB_SESSION2', ADODB_SESSION);
-
-/*
- Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821
-
- From Kerr Schere, to unserialize session data stored via ADOdb.
- 1. Pull the session data from the db and loop through it.
- 2. Inside the loop, you will need to urldecode the data column.
- 3. After urldecode, run the serialized string through this function:
-
-*/
-function adodb_unserialize( $serialized_string )
-{
- $variables = array( );
- $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
- for( $i = 0; $i < count( $a ); $i = $i+2 ) {
- $variables[$a[$i]] = unserialize( $a[$i+1] );
- }
- return( $variables );
-}
-
-/*
- Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
- Since adodb 4.61.
-*/
-function adodb_session_regenerate_id()
-{
- $conn =& ADODB_Session::_conn();
- if (!$conn) return false;
-
- $old_id = session_id();
- if (function_exists('session_regenerate_id')) {
- session_regenerate_id();
- } else {
- session_id(md5(uniqid(rand(), true)));
- $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- //@session_start();
- }
- $new_id = session_id();
- $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
-
- /* it is possible that the update statement fails due to a collision */
- if (!$ok) {
- session_id($old_id);
- if (empty($ck)) $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- return false;
- }
-
- return true;
-}
-
-/*
- Generate database table for session data
- @see http://phplens.com/lens/lensforum/msgs.php?id=12280
- @return 0 if failure, 1 if errors, 2 if successful.
- @author Markus Staab http://www.public-4u.de
-*/
-function adodb_session_create_table($schemaFile=null,$conn = null)
-{
- // set default values
- if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml';
- if ($conn===null) $conn =& ADODB_Session::_conn();
-
- if (!$conn) return 0;
-
- $schema = new adoSchema($conn);
- $schema->ParseSchema($schemaFile);
- return $schema->ExecuteSchema();
-}
-
-/*!
- \static
-*/
-class ADODB_Session {
- /////////////////////
- // getter/setter methods
- /////////////////////
-
- /*
-
- function Lock($lock=null)
- {
- static $_lock = false;
-
- if (!is_null($lock)) $_lock = $lock;
- return $lock;
- }
- */
- /*!
- */
- function driver($driver = null)
- {
- static $_driver = 'mysql';
- static $set = false;
-
- if (!is_null($driver)) {
- $_driver = trim($driver);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
- return $GLOBALS['ADODB_SESSION_DRIVER'];
- }
- }
-
- return $_driver;
- }
-
- /*!
- */
- function host($host = null) {
- static $_host = 'localhost';
- static $set = false;
-
- if (!is_null($host)) {
- $_host = trim($host);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
- return $GLOBALS['ADODB_SESSION_CONNECT'];
- }
- }
-
- return $_host;
- }
-
- /*!
- */
- function user($user = null)
- {
- static $_user = 'root';
- static $set = false;
-
- if (!is_null($user)) {
- $_user = trim($user);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_USER'])) {
- return $GLOBALS['ADODB_SESSION_USER'];
- }
- }
-
- return $_user;
- }
-
- /*!
- */
- function password($password = null)
- {
- static $_password = '';
- static $set = false;
-
- if (!is_null($password)) {
- $_password = $password;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
- return $GLOBALS['ADODB_SESSION_PWD'];
- }
- }
-
- return $_password;
- }
-
- /*!
- */
- function database($database = null)
- {
- static $_database = '';
- static $set = false;
-
- if (!is_null($database)) {
- $_database = trim($database);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_DB'])) {
- return $GLOBALS['ADODB_SESSION_DB'];
- }
- }
- return $_database;
- }
-
- /*!
- */
- function persist($persist = null)
- {
- static $_persist = true;
-
- if (!is_null($persist)) {
- $_persist = trim($persist);
- }
-
- return $_persist;
- }
-
- /*!
- */
- function lifetime($lifetime = null)
- {
- static $_lifetime;
- static $set = false;
-
- if (!is_null($lifetime)) {
- $_lifetime = (int) $lifetime;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
- return $GLOBALS['ADODB_SESS_LIFE'];
- }
- }
- if (!$_lifetime) {
- $_lifetime = ini_get('session.gc_maxlifetime');
- if ($_lifetime <= 1) {
- // bug in PHP 4.0.3 pl 1 -- how about other versions?
- //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
- $_lifetime = 1440;
- }
- }
-
- return $_lifetime;
- }
-
- /*!
- */
- function debug($debug = null)
- {
- static $_debug = false;
- static $set = false;
-
- if (!is_null($debug)) {
- $_debug = (bool) $debug;
-
- $conn = ADODB_Session::_conn();
- if ($conn) {
- $conn->debug = $_debug;
- }
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
- return $GLOBALS['ADODB_SESS_DEBUG'];
- }
- }
-
- return $_debug;
- }
-
- /*!
- */
- function expireNotify($expire_notify = null)
- {
- static $_expire_notify;
- static $set = false;
-
- if (!is_null($expire_notify)) {
- $_expire_notify = $expire_notify;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
- return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
- }
- }
-
- return $_expire_notify;
- }
-
- /*!
- */
- function table($table = null)
- {
- static $_table = 'sessions2';
- static $set = false;
-
- if (!is_null($table)) {
- $_table = trim($table);
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
- return $GLOBALS['ADODB_SESSION_TBL'];
- }
- }
-
- return $_table;
- }
-
- /*!
- */
- function optimize($optimize = null)
- {
- static $_optimize = false;
- static $set = false;
-
- if (!is_null($optimize)) {
- $_optimize = (bool) $optimize;
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (defined('ADODB_SESSION_OPTIMIZE')) {
- return true;
- }
- }
-
- return $_optimize;
- }
-
- /*!
- */
- function syncSeconds($sync_seconds = null) {
- //echo ("<p>WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code</p>");
-
- return 0;
- }
-
- /*!
- */
- function clob($clob = null) {
- static $_clob = false;
- static $set = false;
-
- if (!is_null($clob)) {
- $_clob = strtolower(trim($clob));
- $set = true;
- } elseif (!$set) {
- // backwards compatibility
- if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
- return $GLOBALS['ADODB_SESSION_USE_LOBS'];
- }
- }
-
- return $_clob;
- }
-
- /*!
- */
- function dataFieldName($data_field_name = null) {
- //echo ("<p>WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code</p>");
- return '';
- }
-
- /*!
- */
- function filter($filter = null) {
- static $_filter = array();
-
- if (!is_null($filter)) {
- if (!is_array($filter)) {
- $filter = array($filter);
- }
- $_filter = $filter;
- }
-
- return $_filter;
- }
-
- /*!
- */
- function encryptionKey($encryption_key = null) {
- static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
-
- if (!is_null($encryption_key)) {
- $_encryption_key = $encryption_key;
- }
-
- return $_encryption_key;
- }
-
- /////////////////////
- // private methods
- /////////////////////
-
- /*!
- */
- function &_conn($conn=null) {
- return $GLOBALS['ADODB_SESS_CONN'];
- }
-
- /*!
- */
- function _crc($crc = null) {
- static $_crc = false;
-
- if (!is_null($crc)) {
- $_crc = $crc;
- }
-
- return $_crc;
- }
-
- /*!
- */
- function _init() {
- session_module_name('user');
- session_set_save_handler(
- array('ADODB_Session', 'open'),
- array('ADODB_Session', 'close'),
- array('ADODB_Session', 'read'),
- array('ADODB_Session', 'write'),
- array('ADODB_Session', 'destroy'),
- array('ADODB_Session', 'gc')
- );
- }
-
-
- /*!
- */
- function _sessionKey() {
- // use this function to create the encryption key for crypted sessions
- // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
- return crypt(ADODB_Session::encryptionKey(), session_id());
- }
-
- /*!
- */
- function _dumprs($rs) {
- $conn =& ADODB_Session::_conn();
- $debug = ADODB_Session::debug();
-
- if (!$conn) {
- return;
- }
-
- if (!$debug) {
- return;
- }
-
- if (!$rs) {
- echo "<br />\$rs is null or false<br />\n";
- return;
- }
-
- //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
-
- if (!is_object($rs)) {
- return;
- }
-
- require_once ADODB_SESSION.'/../tohtml.inc.php';
- rs2html($rs);
- }
-
- /////////////////////
- // public methods
- /////////////////////
-
- function config($driver, $host, $user, $password, $database=false,$options=false)
- {
- ADODB_Session::driver($driver);
- ADODB_Session::host($host);
- ADODB_Session::user($user);
- ADODB_Session::password($password);
- ADODB_Session::database($database);
-
- if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
-
- if (isset($options['table'])) ADODB_Session::table($options['table']);
- if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
- if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
- }
-
- /*!
- Create the connection to the database.
-
- If $conn already exists, reuse that connection
- */
- function open($save_path, $session_name, $persist = null)
- {
- $conn =& ADODB_Session::_conn();
-
- if ($conn) {
- return true;
- }
-
- $database = ADODB_Session::database();
- $debug = ADODB_Session::debug();
- $driver = ADODB_Session::driver();
- $host = ADODB_Session::host();
- $password = ADODB_Session::password();
- $user = ADODB_Session::user();
-
- if (!is_null($persist)) {
- ADODB_Session::persist($persist);
- } else {
- $persist = ADODB_Session::persist();
- }
-
-# these can all be defaulted to in php.ini
-# assert('$database');
-# assert('$driver');
-# assert('$host');
-
- $conn =& ADONewConnection($driver);
-
- if ($debug) {
- $conn->debug = true;
- ADOConnection::outp( " driver=$driver user=$user db=$database ");
- }
-
- if ($persist) {
- switch($persist) {
- default:
- case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
- case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
- case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
- }
- } else {
- $ok = $conn->Connect($host, $user, $password, $database);
- }
-
- if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
- else
- ADOConnection::outp('<p>Session: connection failed</p>', false);
-
-
- return $ok;
- }
-
- /*!
- Close the connection
- */
- function close()
- {
-/*
- $conn =& ADODB_Session::_conn();
- if ($conn) $conn->Close();
-*/
- return true;
- }
-
- /*
- Slurp in the session variables and return the serialized string
- */
- function read($key)
- {
- $conn =& ADODB_Session::_conn();
- $filter = ADODB_Session::filter();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return '';
- }
-
- //assert('$table');
-
- $qkey = $conn->quote($key);
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;
- /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if
- developer has commited elsewhere... :(
- */
- #if (ADODB_Session::Lock())
- # $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
- #else
-
- $rs =& $conn->Execute($sql);
- //ADODB_Session::_dumprs($rs);
- if ($rs) {
- if ($rs->EOF) {
- $v = '';
- } else {
- $v = reset($rs->fields);
- $filter = array_reverse($filter);
- foreach ($filter as $f) {
- if (is_object($f)) {
- $v = $f->read($v, ADODB_Session::_sessionKey());
- }
- }
- $v = rawurldecode($v);
- }
-
- $rs->Close();
-
- ADODB_Session::_crc(strlen($v) . crc32($v));
- return $v;
- }
-
- return '';
- }
-
- /*!
- Write the serialized data to a database.
-
- If the data has not been modified since the last read(), we do not write.
- */
- function write($key, $val)
- {
- global $ADODB_SESSION_READONLY;
-
- if (!empty($ADODB_SESSION_READONLY)) return;
-
- $clob = ADODB_Session::clob();
- $conn =& ADODB_Session::_conn();
- $crc = ADODB_Session::_crc();
- $debug = ADODB_Session::debug();
- $driver = ADODB_Session::driver();
- $expire_notify = ADODB_Session::expireNotify();
- $filter = ADODB_Session::filter();
- $lifetime = ADODB_Session::lifetime();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return false;
- }
-
- $sysTimeStamp = $conn->sysTimeStamp;
-
- //assert('$table');
-
- $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
-
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- // crc32 optimization since adodb 2.1
- // now we only update expiry date, thx to sebastian thom in adodb 2.32
- if ($crc !== false && $crc == (strlen($val) . crc32($val))) {
- if ($debug) {
- echo '<p>Session: Only updating date - crc32 not changed</p>';
- }
-
- $expirevar = '';
- if ($expire_notify) {
- $var = reset($expire_notify);
- global $$var;
- if (isset($$var)) {
- $expirevar = $$var;
- }
- }
-
-
- $sql = "UPDATE $table SET expiry = $expiry ,expireref=".$conn->Param('0').", modified = $sysTimeStamp WHERE $binary sesskey = ".$conn->Param('1')." AND expiry >= $sysTimeStamp";
- $rs =& $conn->Execute($sql,array($expirevar,$key));
- return true;
- }
- $val = rawurlencode($val);
- foreach ($filter as $f) {
- if (is_object($f)) {
- $val = $f->write($val, ADODB_Session::_sessionKey());
- }
- }
-
- $expireref = '';
- if ($expire_notify) {
- $var = reset($expire_notify);
- global $$var;
- if (isset($$var)) {
- $expireref = $$var;
- }
- }
-
- if (!$clob) { // no lobs, simply use replace()
- $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
- if ($rs) $rs->Close();
-
- if ($rs && reset($rs->fields) > 0) {
- $sql = "UPDATE $table SET expiry=$expiry, sessdata=".$conn->Param(0).", expireref= ".$conn->Param(1).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('2');
-
- } else {
- $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
- VALUES ($expiry,".$conn->Param('0').", ". $conn->Param('1').", ".$conn->Param('2').", $sysTimeStamp, $sysTimeStamp)";
- }
-
-
- $rs =& $conn->Execute($sql,array($val,$expireref,$key));
-
- } else {
- // what value shall we insert/update for lob row?
- switch ($driver) {
- // empty_clob or empty_lob for oracle dbs
- case 'oracle':
- case 'oci8':
- case 'oci8po':
- case 'oci805':
- $lob_value = sprintf('empty_%s()', strtolower($clob));
- break;
-
- // null for all other
- default:
- $lob_value = 'null';
- break;
- }
-
- $conn->StartTrans();
-
- $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = ".$conn->Param(0),array($key));
- if ($rs) $rs->Close();
-
- if ($rs && reset($rs->fields) > 0) {
- $sql = "UPDATE $table SET expiry=$expiry, sessdata=$lob_value, expireref= ".$conn->Param(0).",modified=$sysTimeStamp WHERE sesskey = ".$conn->Param('1');
-
- } else {
- $sql = "INSERT INTO $table (expiry, sessdata, expireref, sesskey, created, modified)
- VALUES ($expiry,$lob_value, ". $conn->Param('0').", ".$conn->Param('1').", $sysTimeStamp, $sysTimeStamp)";
- }
-
- $rs =& $conn->Execute($sql,array($expireref,$key));
-
- $qkey = $conn->qstr($key);
- $rs2 =& $conn->UpdateBlob($table, 'sessdata', $val, " sesskey=$qkey", strtoupper($clob));
- $rs = @$conn->CompleteTrans();
-
-
- }
-
- if (!$rs) {
- ADOConnection::outp('<p>Session Replace: ' . $conn->ErrorMsg() . '</p>', false);
- return false;
- } else {
- // bug in access driver (could be odbc?) means that info is not committed
- // properly unless select statement executed in Win2000
- if ($conn->databaseType == 'access') {
- $sql = "SELECT sesskey FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- if ($rs) {
- $rs->Close();
- }
- }
- }/*
- if (ADODB_Session::Lock()) {
- $conn->CommitTrans();
- }*/
- return $rs ? true : false;
- }
-
- /*!
- */
- function destroy($key) {
- $conn =& ADODB_Session::_conn();
- $table = ADODB_Session::table();
- $expire_notify = ADODB_Session::expireNotify();
-
- if (!$conn) {
- return false;
- }
-
- //assert('$table');
-
- $qkey = $conn->quote($key);
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- if ($expire_notify) {
- reset($expire_notify);
- $fn = next($expire_notify);
- $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
- $sql = "SELECT expireref, sesskey FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- $conn->SetFetchMode($savem);
- if (!$rs) {
- return false;
- }
- if (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- //assert('$ref');
- //assert('$key');
- $fn($ref, $key);
- }
- $rs->Close();
- }
-
- $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- if ($rs) {
- $rs->Close();
- }
-
- return $rs ? true : false;
- }
-
- /*!
- */
- function gc($maxlifetime)
- {
- $conn =& ADODB_Session::_conn();
- $debug = ADODB_Session::debug();
- $expire_notify = ADODB_Session::expireNotify();
- $optimize = ADODB_Session::optimize();
- $table = ADODB_Session::table();
-
- if (!$conn) {
- return false;
- }
-
- //assert('$table');
-
- $time = $conn->sysTimeStamp;
- $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
-
- if ($expire_notify) {
- reset($expire_notify);
- $fn = next($expire_notify);
- $savem = $conn->SetFetchMode(ADODB_FETCH_NUM);
- $sql = "SELECT expireref, sesskey FROM $table WHERE expiry < $time";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- $conn->SetFetchMode($savem);
- if ($rs) {
- $conn->StartTrans();
- $keys = array();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref, $key);
- $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
- $rs->MoveNext();
- }
- $rs->Close();
-
- $conn->CompleteTrans();
- }
- } else {
-
- if (0) {
- $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
- $arr =& $conn->GetAll($sql);
- foreach ($arr as $row) {
- $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
- $conn->Execute($sql2,array($row[0]));
- }
- } else {
- $sql = "DELETE FROM $table WHERE expiry < $time";
- $rs =& $conn->Execute($sql);
- ADODB_Session::_dumprs($rs);
- if ($rs) $rs->Close();
- }
- if ($debug) {
- ADOConnection::outp("<p><b>Garbage Collection</b>: $sql</p>");
- }
- }
-
- // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
- if ($optimize) {
- $driver = ADODB_Session::driver();
-
- if (preg_match('/mysql/i', $driver)) {
- $sql = "OPTIMIZE TABLE $table";
- }
- if (preg_match('/postgres/i', $driver)) {
- $sql = "VACUUM $table";
- }
- if (!empty($sql)) {
- $conn->Execute($sql);
- }
- }
-
-
- return true;
- }
-}
-
-ADODB_Session::_init();
-if (empty($ADODB_SESSION_READONLY))
- register_shutdown_function('session_write_close');
-
-// for backwards compatability only
-function adodb_sess_open($save_path, $session_name, $persist = true) {
- return ADODB_Session::open($save_path, $session_name, $persist);
-}
-
-// for backwards compatability only
-function adodb_sess_gc($t)
-{
- return ADODB_Session::gc($t);
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/crypt.inc.php b/lib/adodb/session/crypt.inc.php
deleted file mode 100644
index 41cb06a..0000000
--- a/lib/adodb/session/crypt.inc.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
-class MD5Crypt{
- function keyED($txt,$encrypt_key)
- {
- $encrypt_key = md5($encrypt_key);
- $ctr=0;
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++){
- if ($ctr==strlen($encrypt_key)) $ctr=0;
- $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
- $ctr++;
- }
- return $tmp;
- }
-
- function Encrypt($txt,$key)
- {
- srand((double)microtime()*1000000);
- $encrypt_key = md5(rand(0,32000));
- $ctr=0;
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++)
- {
- if ($ctr==strlen($encrypt_key)) $ctr=0;
- $tmp.= substr($encrypt_key,$ctr,1) .
- (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
- $ctr++;
- }
- return base64_encode($this->keyED($tmp,$key));
- }
-
- function Decrypt($txt,$key)
- {
- $txt = $this->keyED(base64_decode($txt),$key);
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++){
- $md5 = substr($txt,$i,1);
- $i++;
- $tmp.= (substr($txt,$i,1) ^ $md5);
- }
- return $tmp;
- }
-
- function RandPass()
- {
- $randomPassword = "";
- srand((double)microtime()*1000000);
- for($i=0;$i<8;$i++)
- {
- $randnumber = rand(48,120);
-
- while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
- {
- $randnumber = rand(48,120);
- }
-
- $randomPassword .= chr($randnumber);
- }
- return $randomPassword;
- }
-
-}
-
-
-class SHA1Crypt{
-
- function keyED($txt,$encrypt_key)
- {
-
- $encrypt_key = sha1($encrypt_key);
- $ctr=0;
- $tmp = "";
-
- for ($i=0;$i<strlen($txt);$i++){
- if ($ctr==strlen($encrypt_key)) $ctr=0;
- $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
- $ctr++;
- }
- return $tmp;
-
- }
-
-
-
- function Encrypt($txt,$key)
- {
-
- srand((double)microtime()*1000000);
- $encrypt_key = sha1(rand(0,32000));
- $ctr=0;
- $tmp = "";
-
- for ($i=0;$i<strlen($txt);$i++)
-
- {
-
- if ($ctr==strlen($encrypt_key)) $ctr=0;
-
- $tmp.= substr($encrypt_key,$ctr,1) .
-
- (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
-
- $ctr++;
-
- }
-
- return base64_encode($this->keyED($tmp,$key));
-
- }
-
-
-
- function Decrypt($txt,$key)
- {
-
- $txt = $this->keyED(base64_decode($txt),$key);
-
- $tmp = "";
-
- for ($i=0;$i<strlen($txt);$i++){
-
- $sha1 = substr($txt,$i,1);
-
- $i++;
-
- $tmp.= (substr($txt,$i,1) ^ $sha1);
-
- }
-
- return $tmp;
- }
-
-
-
- function RandPass()
- {
- $randomPassword = "";
- srand((double)microtime()*1000000);
-
- for($i=0;$i<8;$i++)
- {
-
- $randnumber = rand(48,120);
-
- while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
- {
- $randnumber = rand(48,120);
- }
-
- $randomPassword .= chr($randnumber);
- }
-
- return $randomPassword;
-
- }
-
-
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/session/old/adodb-cryptsession.php b/lib/adodb/session/old/adodb-cryptsession.php
deleted file mode 100644
index 40ce283..0000000
--- a/lib/adodb/session/old/adodb-cryptsession.php
+++ /dev/null
@@ -1,324 +0,0 @@
-<?php
-/*
-V4.94 23 Jan 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.
- Made table name configurable - by David Johnson djohnson@inpro.net
- Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
-
- Set tabs to 4 for best viewing.
-
- Latest version of ADODB is available at http://php.weblogs.com/adodb
- ======================================================================
-
- This file provides PHP4 session management using the ADODB database
-wrapper library.
-
- Example
- =======
-
- include('adodb.inc.php');
- #---------------------------------#
- include('adodb-cryptsession.php');
- #---------------------------------#
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-
-
- Installation
- ============
- 1. Create a new database in MySQL or Access "sessions" like
-so:
-
- create table sessions (
- SESSKEY char(32) not null,
- EXPIRY int(11) unsigned not null,
- EXPIREREF varchar(64),
- DATA CLOB,
- primary key (sesskey)
- );
-
- 2. Then define the following parameters. You can either modify
- this file, or define them before this file is included:
-
- $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
- $ADODB_SESSION_CONNECT='server to connect to';
- $ADODB_SESSION_USER ='user';
- $ADODB_SESSION_PWD ='password';
- $ADODB_SESSION_DB ='database';
- $ADODB_SESSION_TBL = 'sessions'
-
- 3. Recommended is PHP 4.0.2 or later. There are documented
-session bugs in earlier versions of PHP.
-
-*/
-
-
-include_once('crypt.inc.php');
-
-if (!defined('_ADODB_LAYER')) {
- include (dirname(__FILE__).'/adodb.inc.php');
-}
-
- /* if database time and system time is difference is greater than this, then give warning */
- define('ADODB_SESSION_SYNCH_SECS',60);
-
-if (!defined('ADODB_SESSION')) {
-
- define('ADODB_SESSION',1);
-
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_CONN,
- $ADODB_SESS_LIFE,
- $ADODB_SESS_DEBUG,
- $ADODB_SESS_INSERT,
- $ADODB_SESSION_EXPIRE_NOTIFY,
- $ADODB_SESSION_TBL;
-
- //$ADODB_SESS_DEBUG = true;
-
- /* SET THE FOLLOWING PARAMETERS */
-if (empty($ADODB_SESSION_DRIVER)) {
- $ADODB_SESSION_DRIVER='mysql';
- $ADODB_SESSION_CONNECT='localhost';
- $ADODB_SESSION_USER ='root';
- $ADODB_SESSION_PWD ='';
- $ADODB_SESSION_DB ='xphplens_2';
-}
-
-if (empty($ADODB_SESSION_TBL)){
- $ADODB_SESSION_TBL = 'sessions';
-}
-
-if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
- $ADODB_SESSION_EXPIRE_NOTIFY = false;
-}
-
-function ADODB_Session_Key()
-{
-$ADODB_CRYPT_KEY = 'CRYPTED ADODB SESSIONS ROCK!';
-
- /* USE THIS FUNCTION TO CREATE THE ENCRYPTION KEY FOR CRYPTED SESSIONS */
- /* Crypt the used key, $ADODB_CRYPT_KEY as key and session_ID as SALT */
- return crypt($ADODB_CRYPT_KEY, session_ID());
-}
-
-$ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
-if ($ADODB_SESS_LIFE <= 1) {
- // bug in PHP 4.0.3 pl 1 -- how about other versions?
- //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
- $ADODB_SESS_LIFE=1440;
-}
-
-function adodb_sess_open($save_path, $session_name)
-{
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_CONN,
- $ADODB_SESS_DEBUG;
-
- $ADODB_SESS_INSERT = false;
-
- if (isset($ADODB_SESS_CONN)) return true;
-
- $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
- if (!empty($ADODB_SESS_DEBUG)) {
- $ADODB_SESS_CONN->debug = true;
- print" conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ";
- }
- return $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
- $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
-
-}
-
-function adodb_sess_close()
-{
-global $ADODB_SESS_CONN;
-
- if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
- return true;
-}
-
-function adodb_sess_read($key)
-{
-$Crypt = new MD5Crypt;
-global $ADODB_SESS_CONN,$ADODB_SESS_INSERT,$ADODB_SESSION_TBL;
- $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
- if ($rs) {
- if ($rs->EOF) {
- $ADODB_SESS_INSERT = true;
- $v = '';
- } else {
- // Decrypt session data
- $v = rawurldecode($Crypt->Decrypt(reset($rs->fields), ADODB_Session_Key()));
- }
- $rs->Close();
- return $v;
- }
- else $ADODB_SESS_INSERT = true;
-
- return '';
-}
-
-function adodb_sess_write($key, $val)
-{
-$Crypt = new MD5Crypt;
- global $ADODB_SESS_INSERT,$ADODB_SESS_CONN, $ADODB_SESS_LIFE, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- $expiry = time() + $ADODB_SESS_LIFE;
-
- // encrypt session data..
- $val = $Crypt->Encrypt(rawurlencode($val), ADODB_Session_Key());
-
- $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
- global $$var;
- $arr['expireref'] = $$var;
- }
- $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,
- $arr,
- 'sesskey',$autoQuote = true);
-
- if (!$rs) {
- ADOConnection::outp( '
--- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
- } else {
- // bug in access driver (could be odbc?) means that info is not commited
- // properly unless select statement executed in Win2000
-
- if ($ADODB_SESS_CONN->databaseType == 'access') $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
- }
- return isset($rs);
-}
-
-function adodb_sess_destroy($key)
-{
- global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $ADODB_SESS_CONN->CommitTrans();
- }
- } else {
- $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
- $rs = $ADODB_SESS_CONN->Execute($qry);
- }
- return $rs ? true : false;
-}
-
-
-function adodb_sess_gc($maxlifetime) {
- global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY,$ADODB_SESS_DEBUG;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $t = time();
- $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- //$del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $rs->Close();
-
- $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
- $ADODB_SESS_CONN->CommitTrans();
- }
- } else {
- $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
- $ADODB_SESS_CONN->Execute($qry);
- }
-
- // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
- if (defined('ADODB_SESSION_OPTIMIZE'))
- {
- global $ADODB_SESSION_DRIVER;
-
- switch( $ADODB_SESSION_DRIVER ) {
- case 'mysql':
- case 'mysqlt':
- $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
- break;
- case 'postgresql':
- case 'postgresql7':
- $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
- break;
- }
- }
-
- if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
- else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
-
- $rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
- if ($rs && !$rs->EOF) {
-
- $dbts = reset($rs->fields);
- $rs->Close();
- $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
- $t = time();
- if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
- $msg =
- __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
- error_log($msg);
- if ($ADODB_SESS_DEBUG) ADOConnection::outp("
--- $msg</p>");
- }
- }
-
- return true;
-}
-
-session_module_name('user');
-session_set_save_handler(
- "adodb_sess_open",
- "adodb_sess_close",
- "adodb_sess_read",
- "adodb_sess_write",
- "adodb_sess_destroy",
- "adodb_sess_gc");
-}
-
-/* TEST SCRIPT -- UNCOMMENT */
-/*
-if (0) {
-
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-}
-*/
-?>
diff --git a/lib/adodb/session/old/adodb-session-clob.php b/lib/adodb/session/old/adodb-session-clob.php
deleted file mode 100644
index 788e184..0000000
--- a/lib/adodb/session/old/adodb-session-clob.php
+++ /dev/null
@@ -1,448 +0,0 @@
-<?php
-/*
- V4.93 10 Oct 2006 (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.
-
- Latest version of ADODB is available at http://php.weblogs.com/adodb
- ======================================================================
-
- This file provides PHP4 session management using the ADODB database
- wrapper library, using Oracle CLOB's to store data. Contributed by achim.gosse@ddd.de.
-
- Example
- =======
-
- include('adodb.inc.php');
- include('adodb-session.php');
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-
-To force non-persistent connections, call adodb_session_open first before session_start():
-
- include('adodb.inc.php');
- include('adodb-session.php');
- adodb_session_open(false,false,false);
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-
-
- Installation
- ============
- 1. Create this table in your database (syntax might vary depending on your db):
-
- create table sessions (
- SESSKEY char(32) not null,
- EXPIRY int(11) unsigned not null,
- EXPIREREF varchar(64),
- DATA CLOB,
- primary key (sesskey)
- );
-
-
- 2. Then define the following parameters in this file:
- $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
- $ADODB_SESSION_CONNECT='server to connect to';
- $ADODB_SESSION_USER ='user';
- $ADODB_SESSION_PWD ='password';
- $ADODB_SESSION_DB ='database';
- $ADODB_SESSION_TBL = 'sessions'
- $ADODB_SESSION_USE_LOBS = false; (or, if you wanna use CLOBS (= 'CLOB') or ( = 'BLOB')
-
- 3. Recommended is PHP 4.1.0 or later. There are documented
- session bugs in earlier versions of PHP.
-
- 4. If you want to receive notifications when a session expires, then
- you can tag a session with an EXPIREREF, and before the session
- record is deleted, we can call a function that will pass the EXPIREREF
- as the first parameter, and the session key as the second parameter.
-
- To do this, define a notification function, say NotifyFn:
-
- function NotifyFn($expireref, $sesskey)
- {
- }
-
- Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY.
- This is an array with 2 elements, the first being the name of the variable
- you would like to store in the EXPIREREF field, and the 2nd is the
- notification function's name.
-
- In this example, we want to be notified when a user's session
- has expired, so we store the user id in the global variable $USERID,
- store this value in the EXPIREREF field:
-
- $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
-
- Then when the NotifyFn is called, we are passed the $USERID as the first
- parameter, eg. NotifyFn($userid, $sesskey).
-*/
-
-if (!defined('_ADODB_LAYER')) {
- include (dirname(__FILE__).'/adodb.inc.php');
-}
-
-if (!defined('ADODB_SESSION')) {
-
- define('ADODB_SESSION',1);
-
- /* if database time and system time is difference is greater than this, then give warning */
- define('ADODB_SESSION_SYNCH_SECS',60);
-
-/****************************************************************************************\
- Global definitions
-\****************************************************************************************/
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_CONN,
- $ADODB_SESS_LIFE,
- $ADODB_SESS_DEBUG,
- $ADODB_SESSION_EXPIRE_NOTIFY,
- $ADODB_SESSION_CRC,
- $ADODB_SESSION_USE_LOBS,
- $ADODB_SESSION_TBL;
-
- if (!isset($ADODB_SESSION_USE_LOBS)) $ADODB_SESSION_USE_LOBS = 'CLOB';
-
- $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
- if ($ADODB_SESS_LIFE <= 1) {
- // bug in PHP 4.0.3 pl 1 -- how about other versions?
- //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
- $ADODB_SESS_LIFE=1440;
- }
- $ADODB_SESSION_CRC = false;
- //$ADODB_SESS_DEBUG = true;
-
- //////////////////////////////////
- /* SET THE FOLLOWING PARAMETERS */
- //////////////////////////////////
-
- if (empty($ADODB_SESSION_DRIVER)) {
- $ADODB_SESSION_DRIVER='mysql';
- $ADODB_SESSION_CONNECT='localhost';
- $ADODB_SESSION_USER ='root';
- $ADODB_SESSION_PWD ='';
- $ADODB_SESSION_DB ='xphplens_2';
- }
-
- if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
- $ADODB_SESSION_EXPIRE_NOTIFY = false;
- }
- // Made table name configurable - by David Johnson djohnson@inpro.net
- if (empty($ADODB_SESSION_TBL)){
- $ADODB_SESSION_TBL = 'sessions';
- }
-
-
- // defaulting $ADODB_SESSION_USE_LOBS
- if (!isset($ADODB_SESSION_USE_LOBS) || empty($ADODB_SESSION_USE_LOBS)) {
- $ADODB_SESSION_USE_LOBS = false;
- }
-
- /*
- $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER;
- $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT;
- $ADODB_SESS['user'] = $ADODB_SESSION_USER;
- $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD;
- $ADODB_SESS['db'] = $ADODB_SESSION_DB;
- $ADODB_SESS['life'] = $ADODB_SESS_LIFE;
- $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
-
- $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
- $ADODB_SESS['table'] = $ADODB_SESS_TBL;
- */
-
-/****************************************************************************************\
- Create the connection to the database.
-
- If $ADODB_SESS_CONN already exists, reuse that connection
-\****************************************************************************************/
-function adodb_sess_open($save_path, $session_name,$persist=true)
-{
-GLOBAL $ADODB_SESS_CONN;
- if (isset($ADODB_SESS_CONN)) return true;
-
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_DEBUG;
-
- // cannot use & below - do not know why...
- $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
- if (!empty($ADODB_SESS_DEBUG)) {
- $ADODB_SESS_CONN->debug = true;
- ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
- }
- if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
- $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
- else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
- $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
-
- if (!$ok) ADOConnection::outp( "
--- Session: connection failed</p>",false);
-}
-
-/****************************************************************************************\
- Close the connection
-\****************************************************************************************/
-function adodb_sess_close()
-{
-global $ADODB_SESS_CONN;
-
- if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
- return true;
-}
-
-/****************************************************************************************\
- Slurp in the session variables and return the serialized string
-\****************************************************************************************/
-function adodb_sess_read($key)
-{
-global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
-
- $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
- if ($rs) {
- if ($rs->EOF) {
- $v = '';
- } else
- $v = rawurldecode(reset($rs->fields));
-
- $rs->Close();
-
- // new optimization adodb 2.1
- $ADODB_SESSION_CRC = strlen($v).crc32($v);
-
- return $v;
- }
-
- return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com
-}
-
-/****************************************************************************************\
- Write the serialized data to a database.
-
- If the data has not been modified since adodb_sess_read(), we do not write.
-\****************************************************************************************/
-function adodb_sess_write($key, $val)
-{
- global
- $ADODB_SESS_CONN,
- $ADODB_SESS_LIFE,
- $ADODB_SESSION_TBL,
- $ADODB_SESS_DEBUG,
- $ADODB_SESSION_CRC,
- $ADODB_SESSION_EXPIRE_NOTIFY,
- $ADODB_SESSION_DRIVER, // added
- $ADODB_SESSION_USE_LOBS; // added
-
- $expiry = time() + $ADODB_SESS_LIFE;
-
- // crc32 optimization since adodb 2.1
- // now we only update expiry date, thx to sebastian thom in adodb 2.32
- if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
- if ($ADODB_SESS_DEBUG) echo "
--- Session: Only updating date - crc32 not changed</p>";
- $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
- $rs = $ADODB_SESS_CONN->Execute($qry);
- return true;
- }
- $val = rawurlencode($val);
-
- $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
- global $$var;
- $arr['expireref'] = $$var;
- }
-
-
- if ($ADODB_SESSION_USE_LOBS === false) { // no lobs, simply use replace()
- $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr, 'sesskey',$autoQuote = true);
- if (!$rs) {
- $err = $ADODB_SESS_CONN->ErrorMsg();
- }
- } else {
- // what value shall we insert/update for lob row?
- switch ($ADODB_SESSION_DRIVER) {
- // empty_clob or empty_lob for oracle dbs
- case "oracle":
- case "oci8":
- case "oci8po":
- case "oci805":
- $lob_value = sprintf("empty_%s()", strtolower($ADODB_SESSION_USE_LOBS));
- break;
-
- // null for all other
- default:
- $lob_value = "null";
- break;
- }
-
- // do we insert or update? => as for sesskey
- $res = $ADODB_SESS_CONN->Execute("select count(*) as cnt from $ADODB_SESSION_TBL where sesskey = '$key'");
- if ($res && reset($res->fields) > 0) {
- $qry = sprintf("update %s set expiry = %d, data = %s where sesskey = '%s'", $ADODB_SESSION_TBL, $expiry, $lob_value, $key);
- } else {
- // insert
- $qry = sprintf("insert into %s (sesskey, expiry, data) values ('%s', %d, %s)", $ADODB_SESSION_TBL, $key, $expiry, $lob_value);
- }
-
- $err = "";
- $rs1 = $ADODB_SESS_CONN->Execute($qry);
- if (!$rs1) {
- $err .= $ADODB_SESS_CONN->ErrorMsg()."\n";
- }
- $rs2 = $ADODB_SESS_CONN->UpdateBlob($ADODB_SESSION_TBL, 'data', $val, "sesskey='$key'", strtoupper($ADODB_SESSION_USE_LOBS));
- if (!$rs2) {
- $err .= $ADODB_SESS_CONN->ErrorMsg()."\n";
- }
- $rs = ($rs1 && $rs2) ? true : false;
- }
-
- if (!$rs) {
- ADOConnection::outp( '
--- Session Replace: '.nl2br($err).'</p>',false);
- } else {
- // bug in access driver (could be odbc?) means that info is not commited
- // properly unless select statement executed in Win2000
- if ($ADODB_SESS_CONN->databaseType == 'access')
- $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
- }
- return !empty($rs);
-}
-
-function adodb_sess_destroy($key)
-{
- global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $ADODB_SESS_CONN->CommitTrans();
- }
- } else {
- $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
- $rs = $ADODB_SESS_CONN->Execute($qry);
- }
- return $rs ? true : false;
-}
-
-function adodb_sess_gc($maxlifetime)
-{
- global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $t = time();
- $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $rs->Close();
-
- //$ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < $t");
- $ADODB_SESS_CONN->CommitTrans();
-
- }
- } else {
- $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time());
-
- if ($ADODB_SESS_DEBUG) ADOConnection::outp("
--- <b>Garbage Collection</b>: $qry</p>");
- }
- // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
- if (defined('ADODB_SESSION_OPTIMIZE')) {
- global $ADODB_SESSION_DRIVER;
-
- switch( $ADODB_SESSION_DRIVER ) {
- case 'mysql':
- case 'mysqlt':
- $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
- break;
- case 'postgresql':
- case 'postgresql7':
- $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
- break;
- }
- if (!empty($opt_qry)) {
- $ADODB_SESS_CONN->Execute($opt_qry);
- }
- }
- if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
- else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
-
- $rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
- if ($rs && !$rs->EOF) {
-
- $dbts = reset($rs->fields);
- $rs->Close();
- $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
- $t = time();
- if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
- $msg =
- __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
- error_log($msg);
- if ($ADODB_SESS_DEBUG) ADOConnection::outp("
--- $msg</p>");
- }
- }
-
- return true;
-}
-
-session_module_name('user');
-session_set_save_handler(
- "adodb_sess_open",
- "adodb_sess_close",
- "adodb_sess_read",
- "adodb_sess_write",
- "adodb_sess_destroy",
- "adodb_sess_gc");
-}
-
-/* TEST SCRIPT -- UNCOMMENT */
-
-if (0) {
-
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- ADOConnection::outp( "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
-}
-
-?>
diff --git a/lib/adodb/session/old/adodb-session.php b/lib/adodb/session/old/adodb-session.php
deleted file mode 100644
index 6fc9b2f..0000000
--- a/lib/adodb/session/old/adodb-session.php
+++ /dev/null
@@ -1,439 +0,0 @@
-<?php
-/*
-V4.93 10 Oct 2006 (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.
-
- Latest version of ADODB is available at http://php.weblogs.com/adodb
- ======================================================================
-
- This file provides PHP4 session management using the ADODB database
-wrapper library.
-
- Example
- =======
-
- include('adodb.inc.php');
- include('adodb-session.php');
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-
-To force non-persistent connections, call adodb_session_open first before session_start():
-
- include('adodb.inc.php');
- include('adodb-session.php');
- adodb_sess_open(false,false,false);
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- print "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";
-
-
- Installation
- ============
- 1. Create this table in your database (syntax might vary depending on your db):
-
- create table sessions (
- SESSKEY char(32) not null,
- EXPIRY int(11) unsigned not null,
- EXPIREREF varchar(64),
- DATA text not null,
- primary key (sesskey)
- );
-
- For oracle:
- create table sessions (
- SESSKEY char(32) not null,
- EXPIRY DECIMAL(16) not null,
- EXPIREREF varchar(64),
- DATA varchar(4000) not null,
- primary key (sesskey)
- );
-
-
- 2. Then define the following parameters. You can either modify
- this file, or define them before this file is included:
-
- $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';
- $ADODB_SESSION_CONNECT='server to connect to';
- $ADODB_SESSION_USER ='user';
- $ADODB_SESSION_PWD ='password';
- $ADODB_SESSION_DB ='database';
- $ADODB_SESSION_TBL = 'sessions'
-
- 3. Recommended is PHP 4.1.0 or later. There are documented
- session bugs in earlier versions of PHP.
-
- 4. If you want to receive notifications when a session expires, then
- you can tag a session with an EXPIREREF, and before the session
- record is deleted, we can call a function that will pass the EXPIREREF
- as the first parameter, and the session key as the second parameter.
-
- To do this, define a notification function, say NotifyFn:
-
- function NotifyFn($expireref, $sesskey)
- {
- }
-
- Then you need to define a global variable $ADODB_SESSION_EXPIRE_NOTIFY.
- This is an array with 2 elements, the first being the name of the variable
- you would like to store in the EXPIREREF field, and the 2nd is the
- notification function's name.
-
- In this example, we want to be notified when a user's session
- has expired, so we store the user id in the global variable $USERID,
- store this value in the EXPIREREF field:
-
- $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
-
- Then when the NotifyFn is called, we are passed the $USERID as the first
- parameter, eg. NotifyFn($userid, $sesskey).
-*/
-
-if (!defined('_ADODB_LAYER')) {
- include (dirname(__FILE__).'/adodb.inc.php');
-}
-
-if (!defined('ADODB_SESSION')) {
-
- define('ADODB_SESSION',1);
-
- /* if database time and system time is difference is greater than this, then give warning */
- define('ADODB_SESSION_SYNCH_SECS',60);
-
- /*
- Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
-*/
-function adodb_session_regenerate_id()
-{
- $conn =& ADODB_Session::_conn();
- if (!$conn) return false;
-
- $old_id = session_id();
- if (function_exists('session_regenerate_id')) {
- session_regenerate_id();
- } else {
- session_id(md5(uniqid(rand(), true)));
- $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- //@session_start();
- }
- $new_id = session_id();
- $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
-
- /* it is possible that the update statement fails due to a collision */
- if (!$ok) {
- session_id($old_id);
- if (empty($ck)) $ck = session_get_cookie_params();
- setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
- return false;
- }
-
- return true;
-}
-
-/****************************************************************************************\
- Global definitions
-\****************************************************************************************/
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_CONN,
- $ADODB_SESS_LIFE,
- $ADODB_SESS_DEBUG,
- $ADODB_SESSION_EXPIRE_NOTIFY,
- $ADODB_SESSION_CRC,
- $ADODB_SESSION_TBL;
-
-
- $ADODB_SESS_LIFE = ini_get('session.gc_maxlifetime');
- if ($ADODB_SESS_LIFE <= 1) {
- // bug in PHP 4.0.3 pl 1 -- how about other versions?
- //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $ADODB_SESS_LIFE</h3>";
- $ADODB_SESS_LIFE=1440;
- }
- $ADODB_SESSION_CRC = false;
- //$ADODB_SESS_DEBUG = true;
-
- //////////////////////////////////
- /* SET THE FOLLOWING PARAMETERS */
- //////////////////////////////////
-
- if (empty($ADODB_SESSION_DRIVER)) {
- $ADODB_SESSION_DRIVER='mysql';
- $ADODB_SESSION_CONNECT='localhost';
- $ADODB_SESSION_USER ='root';
- $ADODB_SESSION_PWD ='';
- $ADODB_SESSION_DB ='xphplens_2';
- }
-
- if (empty($ADODB_SESSION_EXPIRE_NOTIFY)) {
- $ADODB_SESSION_EXPIRE_NOTIFY = false;
- }
- // Made table name configurable - by David Johnson djohnson@inpro.net
- if (empty($ADODB_SESSION_TBL)){
- $ADODB_SESSION_TBL = 'sessions';
- }
-
- /*
- $ADODB_SESS['driver'] = $ADODB_SESSION_DRIVER;
- $ADODB_SESS['connect'] = $ADODB_SESSION_CONNECT;
- $ADODB_SESS['user'] = $ADODB_SESSION_USER;
- $ADODB_SESS['pwd'] = $ADODB_SESSION_PWD;
- $ADODB_SESS['db'] = $ADODB_SESSION_DB;
- $ADODB_SESS['life'] = $ADODB_SESS_LIFE;
- $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
-
- $ADODB_SESS['debug'] = $ADODB_SESS_DEBUG;
- $ADODB_SESS['table'] = $ADODB_SESS_TBL;
- */
-
-/****************************************************************************************\
- Create the connection to the database.
-
- If $ADODB_SESS_CONN already exists, reuse that connection
-\****************************************************************************************/
-function adodb_sess_open($save_path, $session_name,$persist=true)
-{
-GLOBAL $ADODB_SESS_CONN;
- if (isset($ADODB_SESS_CONN)) return true;
-
-GLOBAL $ADODB_SESSION_CONNECT,
- $ADODB_SESSION_DRIVER,
- $ADODB_SESSION_USER,
- $ADODB_SESSION_PWD,
- $ADODB_SESSION_DB,
- $ADODB_SESS_DEBUG;
-
- // cannot use & below - do not know why...
- $ADODB_SESS_CONN = ADONewConnection($ADODB_SESSION_DRIVER);
- if (!empty($ADODB_SESS_DEBUG)) {
- $ADODB_SESS_CONN->debug = true;
- ADOConnection::outp( " conn=$ADODB_SESSION_CONNECT user=$ADODB_SESSION_USER pwd=$ADODB_SESSION_PWD db=$ADODB_SESSION_DB ");
- }
- if ($persist) $ok = $ADODB_SESS_CONN->PConnect($ADODB_SESSION_CONNECT,
- $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
- else $ok = $ADODB_SESS_CONN->Connect($ADODB_SESSION_CONNECT,
- $ADODB_SESSION_USER,$ADODB_SESSION_PWD,$ADODB_SESSION_DB);
-
- if (!$ok) ADOConnection::outp( "
--- Session: connection failed</p>",false);
-}
-
-/****************************************************************************************\
- Close the connection
-\****************************************************************************************/
-function adodb_sess_close()
-{
-global $ADODB_SESS_CONN;
-
- if ($ADODB_SESS_CONN) $ADODB_SESS_CONN->Close();
- return true;
-}
-
-/****************************************************************************************\
- Slurp in the session variables and return the serialized string
-\****************************************************************************************/
-function adodb_sess_read($key)
-{
-global $ADODB_SESS_CONN,$ADODB_SESSION_TBL,$ADODB_SESSION_CRC;
-
- $rs = $ADODB_SESS_CONN->Execute("SELECT data FROM $ADODB_SESSION_TBL WHERE sesskey = '$key' AND expiry >= " . time());
- if ($rs) {
- if ($rs->EOF) {
- $v = '';
- } else
- $v = rawurldecode(reset($rs->fields));
-
- $rs->Close();
-
- // new optimization adodb 2.1
- $ADODB_SESSION_CRC = strlen($v).crc32($v);
-
- return $v;
- }
-
- return ''; // thx to Jorma Tuomainen, webmaster#wizactive.com
-}
-
-/****************************************************************************************\
- Write the serialized data to a database.
-
- If the data has not been modified since adodb_sess_read(), we do not write.
-\****************************************************************************************/
-function adodb_sess_write($key, $val)
-{
- global
- $ADODB_SESS_CONN,
- $ADODB_SESS_LIFE,
- $ADODB_SESSION_TBL,
- $ADODB_SESS_DEBUG,
- $ADODB_SESSION_CRC,
- $ADODB_SESSION_EXPIRE_NOTIFY;
-
- $expiry = time() + $ADODB_SESS_LIFE;
-
- // crc32 optimization since adodb 2.1
- // now we only update expiry date, thx to sebastian thom in adodb 2.32
- if ($ADODB_SESSION_CRC !== false && $ADODB_SESSION_CRC == strlen($val).crc32($val)) {
- if ($ADODB_SESS_DEBUG) echo "
--- Session: Only updating date - crc32 not changed</p>";
- $qry = "UPDATE $ADODB_SESSION_TBL SET expiry=$expiry WHERE sesskey='$key' AND expiry >= " . time();
- $rs = $ADODB_SESS_CONN->Execute($qry);
- return true;
- }
- $val = rawurlencode($val);
-
- $arr = array('sesskey' => $key, 'expiry' => $expiry, 'data' => $val);
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- $var = reset($ADODB_SESSION_EXPIRE_NOTIFY);
- global $$var;
- $arr['expireref'] = $$var;
- }
- $rs = $ADODB_SESS_CONN->Replace($ADODB_SESSION_TBL,$arr,
- 'sesskey',$autoQuote = true);
-
- if (!$rs) {
- ADOConnection::outp( '
--- Session Replace: '.$ADODB_SESS_CONN->ErrorMsg().'</p>',false);
- } else {
- // bug in access driver (could be odbc?) means that info is not commited
- // properly unless select statement executed in Win2000
- if ($ADODB_SESS_CONN->databaseType == 'access')
- $rs = $ADODB_SESS_CONN->Execute("select sesskey from $ADODB_SESSION_TBL WHERE sesskey='$key'");
- }
- return !empty($rs);
-}
-
-function adodb_sess_destroy($key)
-{
- global $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $rs = $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $ADODB_SESS_CONN->CommitTrans();
- }
- } else {
- $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE sesskey = '$key'";
- $rs = $ADODB_SESS_CONN->Execute($qry);
- }
- return $rs ? true : false;
-}
-
-function adodb_sess_gc($maxlifetime)
-{
- global $ADODB_SESS_DEBUG, $ADODB_SESS_CONN, $ADODB_SESSION_TBL,$ADODB_SESSION_EXPIRE_NOTIFY;
-
- if ($ADODB_SESSION_EXPIRE_NOTIFY) {
- reset($ADODB_SESSION_EXPIRE_NOTIFY);
- $fn = next($ADODB_SESSION_EXPIRE_NOTIFY);
- $savem = $ADODB_SESS_CONN->SetFetchMode(ADODB_FETCH_NUM);
- $t = time();
- $rs =& $ADODB_SESS_CONN->Execute("SELECT expireref,sesskey FROM $ADODB_SESSION_TBL WHERE expiry < $t");
- $ADODB_SESS_CONN->SetFetchMode($savem);
- if ($rs) {
- $ADODB_SESS_CONN->BeginTrans();
- while (!$rs->EOF) {
- $ref = $rs->fields[0];
- $key = $rs->fields[1];
- $fn($ref,$key);
- $del = $ADODB_SESS_CONN->Execute("DELETE FROM $ADODB_SESSION_TBL WHERE sesskey='$key'");
- $rs->MoveNext();
- }
- $rs->Close();
-
- $ADODB_SESS_CONN->CommitTrans();
-
- }
- } else {
- $qry = "DELETE FROM $ADODB_SESSION_TBL WHERE expiry < " . time();
- $ADODB_SESS_CONN->Execute($qry);
-
- if ($ADODB_SESS_DEBUG) ADOConnection::outp("
--- <b>Garbage Collection</b>: $qry</p>");
- }
- // suggested by Cameron, "GaM3R" <gamr@outworld.cx>
- if (defined('ADODB_SESSION_OPTIMIZE')) {
- global $ADODB_SESSION_DRIVER;
-
- switch( $ADODB_SESSION_DRIVER ) {
- case 'mysql':
- case 'mysqlt':
- $opt_qry = 'OPTIMIZE TABLE '.$ADODB_SESSION_TBL;
- break;
- case 'postgresql':
- case 'postgresql7':
- $opt_qry = 'VACUUM '.$ADODB_SESSION_TBL;
- break;
- }
- if (!empty($opt_qry)) {
- $ADODB_SESS_CONN->Execute($opt_qry);
- }
- }
- if ($ADODB_SESS_CONN->dataProvider === 'oci8') $sql = 'select TO_CHAR('.($ADODB_SESS_CONN->sysTimeStamp).', \'RRRR-MM-DD HH24:MI:SS\') from '. $ADODB_SESSION_TBL;
- else $sql = 'select '.$ADODB_SESS_CONN->sysTimeStamp.' from '. $ADODB_SESSION_TBL;
-
- $rs =& $ADODB_SESS_CONN->SelectLimit($sql,1);
- if ($rs && !$rs->EOF) {
-
- $dbts = reset($rs->fields);
- $rs->Close();
- $dbt = $ADODB_SESS_CONN->UnixTimeStamp($dbts);
- $t = time();
-
- if (abs($dbt - $t) >= ADODB_SESSION_SYNCH_SECS) {
-
- $msg =
- __FILE__.": Server time for webserver {$_SERVER['HTTP_HOST']} not in synch with database: database=$dbt ($dbts), webserver=$t (diff=".(abs($dbt-$t)/3600)." hrs)";
- error_log($msg);
- if ($ADODB_SESS_DEBUG) ADOConnection::outp("
--- $msg</p>");
- }
- }
-
- return true;
-}
-
-session_module_name('user');
-session_set_save_handler(
- "adodb_sess_open",
- "adodb_sess_close",
- "adodb_sess_read",
- "adodb_sess_write",
- "adodb_sess_destroy",
- "adodb_sess_gc");
-}
-
-/* TEST SCRIPT -- UNCOMMENT */
-
-if (0) {
-
- session_start();
- session_register('AVAR');
- $_SESSION['AVAR'] += 1;
- ADOConnection::outp( "
--- \$_SESSION['AVAR']={$_SESSION['AVAR']}</p>",false);
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/session/old/crypt.inc.php b/lib/adodb/session/old/crypt.inc.php
deleted file mode 100644
index b99bbba..0000000
--- a/lib/adodb/session/old/crypt.inc.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-// Session Encryption by Ari Kuorikoski <ari.kuorikoski@finebyte.com>
-class MD5Crypt{
- function keyED($txt,$encrypt_key)
- {
- $encrypt_key = md5($encrypt_key);
- $ctr=0;
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++){
- if ($ctr==strlen($encrypt_key)) $ctr=0;
- $tmp.= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1);
- $ctr++;
- }
- return $tmp;
- }
-
- function Encrypt($txt,$key)
- {
- srand((double)microtime()*1000000);
- $encrypt_key = md5(rand(0,32000));
- $ctr=0;
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++)
- {
- if ($ctr==strlen($encrypt_key)) $ctr=0;
- $tmp.= substr($encrypt_key,$ctr,1) .
- (substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1));
- $ctr++;
- }
- return base64_encode($this->keyED($tmp,$key));
- }
-
- function Decrypt($txt,$key)
- {
- $txt = $this->keyED(base64_decode($txt),$key);
- $tmp = "";
- for ($i=0;$i<strlen($txt);$i++){
- $md5 = substr($txt,$i,1);
- $i++;
- $tmp.= (substr($txt,$i,1) ^ $md5);
- }
- return $tmp;
- }
-
- function RandPass()
- {
- $randomPassword = "";
- srand((double)microtime()*1000000);
- for($i=0;$i<8;$i++)
- {
- $randnumber = rand(48,120);
-
- while (($randnumber >= 58 && $randnumber <= 64) || ($randnumber >= 91 && $randnumber <= 96))
- {
- $randnumber = rand(48,120);
- }
-
- $randomPassword .= chr($randnumber);
- }
- return $randomPassword;
- }
-
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/session/session_schema.xml b/lib/adodb/session/session_schema.xml
deleted file mode 100644
index 3c61ff6..0000000
--- a/lib/adodb/session/session_schema.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<schema version="0.2">
- <table name="sessions">
- <desc>table for ADOdb session-management</desc>
-
- <field name="SESSKEY" type="C" size="32">
- <descr>session key</descr>
- <KEY/>
- <NOTNULL/>
- </field>
-
- <field name="EXPIRY" type="I" size="11">
- <descr></descr>
- <NOTNULL/>
- </field>
-
- <field name="EXPIREREF" type="C" size="64">
- <descr></descr>
- </field>
-
- <field name="DATA" type="XL">
- <descr></descr>
- <NOTNULL/>
- </field>
- </table>
-</schema>
diff --git a/lib/adodb/session/session_schema2.xml b/lib/adodb/session/session_schema2.xml
deleted file mode 100644
index 22f8daf..0000000
--- a/lib/adodb/session/session_schema2.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<schema version="0.3">
- <table name="sessions2">
- <desc>table for ADOdb session-management</desc>
-
- <field name="SESSKEY" type="C" size="64">
- <descr>session key</descr>
- <KEY/>
- <NOTNULL/>
- </field>
-
-
-
- <field name="EXPIRY" type="T">
- <descr></descr>
- <NOTNULL/>
- </field>
-
- <field name="CREATED" type="T">
- <descr></descr>
- <NOTNULL/>
- </field>
-
- <field name="MODIFIED" type="T">
- <descr></descr>
- <NOTNULL/>
- </field>
-
- <field name="EXPIREREF" type="C" size="250">
- <descr></descr>
- </field>
-
- <field name="SESSDATA" type="XL">
- <descr></descr>
- <NOTNULL/>
- </field>
- </table>
-</schema>
diff --git a/lib/adodb/toexport.inc.php b/lib/adodb/toexport.inc.php
deleted file mode 100644
index ba3f37a..0000000
--- a/lib/adodb/toexport.inc.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-
-/**
- * @version V4.93 10 Oct 2006 (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.
- *
- * Code to export recordsets in several formats:
- *
- * AS VARIABLE
- * $s = rs2csv($rs); # comma-separated values
- * $s = rs2tab($rs); # tab delimited
- *
- * TO A FILE
- * $f = fopen($path,'w');
- * rs2csvfile($rs,$f);
- * fclose($f);
- *
- * TO STDOUT
- * rs2csvout($rs);
- */
-
-// returns a recordset as a csv string
-function rs2csv(&$rs,$addtitles=true)
-{
- return _adodb_export($rs,',',',',false,$addtitles);
-}
-
-// writes recordset to csv file
-function rs2csvfile(&$rs,$fp,$addtitles=true)
-{
- _adodb_export($rs,',',',',$fp,$addtitles);
-}
-
-// write recordset as csv string to stdout
-function rs2csvout(&$rs,$addtitles=true)
-{
- $fp = fopen('php://stdout','wb');
- _adodb_export($rs,',',',',true,$addtitles);
- fclose($fp);
-}
-
-function rs2tab(&$rs,$addtitles=true)
-{
- return _adodb_export($rs,"\t",',',false,$addtitles);
-}
-
-// to file pointer
-function rs2tabfile(&$rs,$fp,$addtitles=true)
-{
- _adodb_export($rs,"\t",',',$fp,$addtitles);
-}
-
-// to stdout
-function rs2tabout(&$rs,$addtitles=true)
-{
- $fp = fopen('php://stdout','wb');
- _adodb_export($rs,"\t",' ',true,$addtitles);
- if ($fp) fclose($fp);
-}
-
-function _adodb_export(&$rs,$sep,$sepreplace,$fp=false,$addtitles=true,$quote = '"',$escquote = '"',$replaceNewLine = ' ')
-{
- if (!$rs) return '';
- //----------
- // CONSTANTS
- $NEWLINE = "\r\n";
- $BUFLINES = 100;
- $escquotequote = $escquote.$quote;
- $s = '';
-
- if ($addtitles) {
- $fieldTypes = $rs->FieldTypesArray();
- reset($fieldTypes);
- while(list(,$o) = each($fieldTypes)) {
-
- $v = $o->name;
- if ($escquote) $v = str_replace($quote,$escquotequote,$v);
- $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
- $elements[] = $v;
-
- }
- $s .= implode($sep, $elements).$NEWLINE;
- }
- $hasNumIndex = isset($rs->fields[0]);
-
- $line = 0;
- $max = $rs->FieldCount();
-
- while (!$rs->EOF) {
- $elements = array();
- $i = 0;
-
- if ($hasNumIndex) {
- for ($j=0; $j < $max; $j++) {
- $v = $rs->fields[$j];
- if (!is_object($v)) $v = trim($v);
- else $v = 'Object';
- if ($escquote) $v = str_replace($quote,$escquotequote,$v);
- $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
-
- if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
- else $elements[] = $v;
- }
- } else { // ASSOCIATIVE ARRAY
- foreach($rs->fields as $v) {
- if ($escquote) $v = str_replace($quote,$escquotequote,trim($v));
- $v = strip_tags(str_replace("\n", $replaceNewLine, str_replace("\r\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))));
-
- if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote";
- else $elements[] = $v;
- }
- }
- $s .= implode($sep, $elements).$NEWLINE;
- $rs->MoveNext();
- $line += 1;
- if ($fp && ($line % $BUFLINES) == 0) {
- if ($fp === true) echo $s;
- else fwrite($fp,$s);
- $s = '';
- }
- }
-
- if ($fp) {
- if ($fp === true) echo $s;
- else fwrite($fp,$s);
- $s = '';
- }
-
- return $s;
-}
-?> \ No newline at end of file
diff --git a/lib/adodb/tohtml.inc.php b/lib/adodb/tohtml.inc.php
deleted file mode 100644
index b9bef03..0000000
--- a/lib/adodb/tohtml.inc.php
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-/*
- V4.93 10 Oct 2006 (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.
-
- Some pretty-printing by Chris Oxenreider <oxenreid@state.net>
-*/
-
-// specific code for tohtml
-GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
-
-$ADODB_ROUND=4; // rounding
-$gSQLMaxRows = 1000; // max no of rows to download
-$gSQLBlockRows=20; // max no of rows per table block
-
-// RecordSet to HTML Table
-//------------------------------------------------------------
-// Convert a recordset to a html table. Multiple tables are generated
-// if the number of rows is > $gSQLBlockRows. This is because
-// web browsers normally require the whole table to be downloaded
-// before it can be rendered, so we break the output into several
-// smaller faster rendering tables.
-//
-// $rs: the recordset
-// $ztabhtml: the table tag attributes (optional)
-// $zheaderarray: contains the replacement strings for the headers (optional)
-//
-// USAGE:
-// include('adodb.inc.php');
-// $db = ADONewConnection('mysql');
-// $db->Connect('mysql','userid','password','database');
-// $rs = $db->Execute('select col1,col2,col3 from table');
-// rs2html($rs, 'BORDER=2', array('Title1', 'Title2', 'Title3'));
-// $rs->Close();
-//
-// RETURNS: number of rows displayed
-
-
-function rs2html(&$rs,$ztabhtml=false,$zheaderarray=false,$htmlspecialchars=true,$echo = true)
-{
-$s ='';$rows=0;$docnt = false;
-GLOBAL $gSQLMaxRows,$gSQLBlockRows,$ADODB_ROUND;
-
- if (!$rs) {
- printf(ADODB_BAD_RS,'rs2html');
- return false;
- }
-
- if (! $ztabhtml) $ztabhtml = "BORDER='1' WIDTH='98%'";
- //else $docnt = true;
- $typearr = array();
- $ncols = $rs->FieldCount();
- $hdr = "<TABLE COLS=$ncols $ztabhtml><tr>\n\n";
- for ($i=0; $i < $ncols; $i++) {
- $field = $rs->FetchField($i);
- if ($field) {
- if ($zheaderarray) $fname = $zheaderarray[$i];
- else $fname = htmlspecialchars($field->name);
- $typearr[$i] = $rs->MetaType($field->type,$field->max_length);
- //print " $field->name $field->type $typearr[$i] ";
- } else {
- $fname = 'Field '.($i+1);
- $typearr[$i] = 'C';
- }
- if (strlen($fname)==0) $fname = '&nbsp;';
- $hdr .= "<TH>$fname</TH>";
- }
- $hdr .= "\n</tr>";
- if ($echo) print $hdr."\n\n";
- else $html = $hdr;
-
- // smart algorithm - handles ADODB_FETCH_MODE's correctly by probing...
- $numoffset = isset($rs->fields[0]) ||isset($rs->fields[1]) || isset($rs->fields[2]);
- while (!$rs->EOF) {
-
- $s .= "<TR valign=top>\n";
-
- for ($i=0; $i < $ncols; $i++) {
- if ($i===0) $v=($numoffset) ? $rs->fields[0] : reset($rs->fields);
- else $v = ($numoffset) ? $rs->fields[$i] : next($rs->fields);
-
- $type = $typearr[$i];
- switch($type) {
- case 'D':
- if (empty($v)) $s .= "<TD> &nbsp; </TD>\n";
- else if (!strpos($v,':')) {
- $s .= " <TD>".$rs->UserDate($v,"D d, M Y") ."&nbsp;</TD>\n";
- }
- break;
- case 'T':
- if (empty($v)) $s .= "<TD> &nbsp; </TD>\n";
- else $s .= " <TD>".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ."&nbsp;</TD>\n";
- break;
-
- case 'N':
- if (abs(abs($v) - round($v,0)) < 0.00000001)
- $v = round($v);
- else
- $v = round($v,$ADODB_ROUND);
- case 'I':
- $s .= " <TD align=right>".stripslashes((trim($v))) ."&nbsp;</TD>\n";
-
- break;
- /*
- case 'B':
- if (substr($v,8,2)=="BM" ) $v = substr($v,8);
- $mtime = substr(str_replace(' ','_',microtime()),2);
- $tmpname = "tmp/".uniqid($mtime).getmypid();
- $fd = @fopen($tmpname,'a');
- @ftruncate($fd,0);
- @fwrite($fd,$v);
- @fclose($fd);
- if (!function_exists ("mime_content_type")) {
- function mime_content_type ($file) {
- return exec("file -bi ".escapeshellarg($file));
- }
- }
- $t = mime_content_type($tmpname);
- $s .= (substr($t,0,5)=="image") ? " <td><img src='$tmpname' alt='$t'></td>\\n" : " <td><a
- href='$tmpname'>$t</a></td>\\n";
- break;
- */
-
- default:
- if ($htmlspecialchars) $v = htmlspecialchars(trim($v));
- $v = trim($v);
- if (strlen($v) == 0) $v = '&nbsp;';
- $s .= " <TD>". str_replace("\n",'<br>',stripslashes($v)) ."</TD>\n";
-
- }
- } // for
- $s .= "</TR>\n\n";
-
- $rows += 1;
- if ($rows >= $gSQLMaxRows) {
- $rows = "<p>Truncated at $gSQLMaxRows</p>";
- break;
- } // switch
-
- $rs->MoveNext();
-
- // additional EOF check to prevent a widow header
- if (!$rs->EOF && $rows % $gSQLBlockRows == 0) {
-
- //if (connection_aborted()) break;// not needed as PHP aborts script, unlike ASP
- if ($echo) print $s . "</TABLE>\n\n";
- else $html .= $s ."</TABLE>\n\n";
- $s = $hdr;
- }
- } // while
-
- if ($echo) print $s."</TABLE>\n\n";
- else $html .= $s."</TABLE>\n\n";
-
- if ($docnt) if ($echo) print "<H2>".$rows." Rows</H2>";
-
- return ($echo) ? $rows : $html;
- }
-
-// pass in 2 dimensional array
-function arr2html(&$arr,$ztabhtml='',$zheaderarray='')
-{
- if (!$ztabhtml) $ztabhtml = 'BORDER=1';
-
- $s = "<TABLE $ztabhtml>";//';print_r($arr);
-
- if ($zheaderarray) {
- $s .= '<TR>';
- for ($i=0; $i<sizeof($zheaderarray); $i++) {
- $s .= " <TH>{$zheaderarray[$i]}</TH>\n";
- }
- $s .= "\n</TR>";
- }
-
- for ($i=0; $i<sizeof($arr); $i++) {
- $s .= '<TR>';
- $a = &$arr[$i];
- if (is_array($a))
- for ($j=0; $j<sizeof($a); $j++) {
- $val = $a[$j];
- if (empty($val)) $val = '&nbsp;';
- $s .= " <TD>$val</TD>\n";
- }
- else if ($a) {
- $s .= ' <TD>'.$a."</TD>\n";
- } else $s .= " <TD>&nbsp;</TD>\n";
- $s .= "\n</TR>\n";
- }
- $s .= '</TABLE>';
- print $s;
-}
-
-?> \ No newline at end of file
diff --git a/lib/adodb/xmlschema.dtd b/lib/adodb/xmlschema.dtd
deleted file mode 100644
index 4a055da..0000000
--- a/lib/adodb/xmlschema.dtd
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE adodb_schema [
-<!ELEMENT schema (table*, sql*)>
-<!ATTLIST schema version CDATA #REQUIRED>
-<!ELEMENT table ((field+|DROP), CONSTRAINT*, descr?, index*, data*)>
-<!ELEMENT field ((NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?,
-NOQUOTE?, CONSTRAINT*, descr?)>
-<!ELEMENT data (row+)>
-<!ELEMENT row (f+)>
-<!ELEMENT f (#CDATA)>
-<!ELEMENT descr (#CDATA)>
-<!ELEMENT NOTNULL EMPTY>
-<!ELEMENT KEY EMPTY>
-<!ELEMENT PRIMARY EMPTY>
-<!ELEMENT AUTO EMPTY>
-<!ELEMENT AUTOINCREMENT EMPTY>
-<!ELEMENT DEFAULT EMPTY>
-<!ELEMENT DEFDATE EMPTY>
-<!ELEMENT DEFTIMESTAMP EMPTY>
-<!ELEMENT NOQUOTE EMPTY>
-<!ELEMENT DROP EMPTY>
-<!ELEMENT CONSTRAINT (#CDATA)>
-<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED>
-<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED>
-<!ATTLIST data platform CDATA #IMPLIED>
-<!ATTLIST f name CDATA #IMPLIED>
-<!ATTLIST DEFAULT VALUE CDATA #REQUIRED>
-<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)>
-<!ELEMENT col (#CDATA)>
-<!ELEMENT CLUSTERED EMPTY>
-<!ELEMENT BITMAP EMPTY>
-<!ELEMENT UNIQUE EMPTY>
-<!ELEMENT FULLTEXT EMPTY>
-<!ELEMENT HASH EMPTY>
-<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED>
-<!ELEMENT sql (query+, descr?)>
-<!ELEMENT query (#CDATA)>
-<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE) >
-] > \ No newline at end of file
diff --git a/lib/adodb/xmlschema03.dtd b/lib/adodb/xmlschema03.dtd
deleted file mode 100644
index a7c8864..0000000
--- a/lib/adodb/xmlschema03.dtd
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE adodb_schema [
-<!ELEMENT schema (table*, sql*)>
-<!ATTLIST schema version CDATA #REQUIRED>
-<!ELEMENT table (descr?, (field+|DROP), constraint*, opt*, index*, data*)>
-<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED>
-<!ELEMENT field (descr?, (NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE?, UNSIGNED?, constraint*, opt*)>
-<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED opts CDATA #IMPLIED>
-<!ELEMENT data (descr?, row+)>
-<!ATTLIST data platform CDATA #IMPLIED>
-<!ELEMENT row (f+)>
-<!ELEMENT f (#CDATA)>
-<!ATTLIST f name CDATA #IMPLIED>
-<!ELEMENT descr (#CDATA)>
-<!ELEMENT NOTNULL EMPTY>
-<!ELEMENT KEY EMPTY>
-<!ELEMENT PRIMARY EMPTY>
-<!ELEMENT AUTO EMPTY>
-<!ELEMENT AUTOINCREMENT EMPTY>
-<!ELEMENT DEFAULT EMPTY>
-<!ATTLIST DEFAULT value CDATA #REQUIRED>
-<!ELEMENT DEFDATE EMPTY>
-<!ELEMENT DEFTIMESTAMP EMPTY>
-<!ELEMENT NOQUOTE EMPTY>
-<!ELEMENT UNSIGNED EMPTY>
-<!ELEMENT DROP EMPTY>
-<!ELEMENT constraint (#CDATA)>
-<!ATTLIST constraint platform CDATA #IMPLIED>
-<!ELEMENT opt (#CDATA)>
-<!ATTLIST opt platform CDATA #IMPLIED>
-<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)>
-<!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED>
-<!ELEMENT col (#CDATA)>
-<!ELEMENT CLUSTERED EMPTY>
-<!ELEMENT BITMAP EMPTY>
-<!ELEMENT UNIQUE EMPTY>
-<!ELEMENT FULLTEXT EMPTY>
-<!ELEMENT HASH EMPTY>
-<!ELEMENT sql (query+, descr?)>
-<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE)>
-<!ELEMENT query (#CDATA)>
-<!ATTLIST query platform CDATA #IMPLIED>
-]> \ No newline at end of file
diff --git a/lib/adodb/xsl/convert-0.1-0.2.xsl b/lib/adodb/xsl/convert-0.1-0.2.xsl
deleted file mode 100644
index 6cd9e5b..0000000
--- a/lib/adodb/xsl/convert-0.1-0.2.xsl
+++ /dev/null
@@ -1,205 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.2</xsl:attribute>
-
- <xsl:apply-templates select="schema/table|schema/sql"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:variable name="table_name" select="@name"/>
-
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="field"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:apply-templates select="constraint"/>
-
- <xsl:apply-templates select="../index[@table=$table_name]"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Field -->
- <xsl:template match="field">
- <xsl:element name="field">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
-
- <xsl:if test="string-length(@size) > 0">
- <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(PRIMARY) > 0">
- <xsl:element name="PRIMARY"/>
- </xsl:when>
- <xsl:when test="count(KEY) > 0">
- <xsl:element name="KEY"/>
- </xsl:when>
- <xsl:when test="count(NOTNULL) > 0">
- <xsl:element name="NOTNULL"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(AUTO) > 0">
- <xsl:element name="AUTO"/>
- </xsl:when>
- <xsl:when test="count(AUTOINCREMENT) > 0">
- <xsl:element name="AUTOINCREMENT"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(DEFAULT) > 0">
- <xsl:element name="DEFAULT">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFAULT[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFDATE) > 0">
- <xsl:element name="DEFDATE">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFDATE[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFTIMESTAMP) > 0">
- <xsl:element name="DEFTIMESTAMP">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="count(NOQUOTE) > 0">
- <xsl:element name="NOQUOTE"/>
- </xsl:if>
-
- <xsl:apply-templates select="constraint"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Constraint -->
- <xsl:template match="constraint">
- <xsl:element name="constraint">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Index -->
- <xsl:template match="index">
- <xsl:element name="index">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:if test="count(CLUSTERED) > 0">
- <xsl:element name="CLUSTERED"/>
- </xsl:if>
-
- <xsl:if test="count(BITMAP) > 0">
- <xsl:element name="BITMAP"/>
- </xsl:if>
-
- <xsl:if test="count(UNIQUE) > 0">
- <xsl:element name="UNIQUE"/>
- </xsl:if>
-
- <xsl:if test="count(FULLTEXT) > 0">
- <xsl:element name="FULLTEXT"/>
- </xsl:if>
-
- <xsl:if test="count(HASH) > 0">
- <xsl:element name="HASH"/>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="col"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
- <!-- Index Column -->
- <xsl:template match="col">
- <xsl:element name="col">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- SQL QuerySet -->
- <xsl:template match="sql">
- <xsl:element name="sql">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@key) > 0">
- <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@prefixmethod) > 0">
- <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
- <xsl:apply-templates select="query"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Query -->
- <xsl:template match="query">
- <xsl:element name="query">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/adodb/xsl/convert-0.1-0.3.xsl b/lib/adodb/xsl/convert-0.1-0.3.xsl
deleted file mode 100644
index 381aa4f..0000000
--- a/lib/adodb/xsl/convert-0.1-0.3.xsl
+++ /dev/null
@@ -1,221 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.3</xsl:attribute>
-
- <xsl:apply-templates select="schema/table|schema/sql"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:variable name="table_name" select="@name"/>
-
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="field"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:apply-templates select="constraint"/>
-
- <xsl:apply-templates select="../index[@table=$table_name]"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Field -->
- <xsl:template match="field">
- <xsl:element name="field">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
-
- <xsl:if test="string-length(@size) > 0">
- <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="string-length(@opts) = 0"/>
- <xsl:when test="@opts = 'UNSIGNED'">
- <xsl:element name="UNSIGNED"/>
- </xsl:when>
- <xsl:when test="contains(@opts,'UNSIGNED')">
- <xsl:attribute name="opts">
- <xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/>
- </xsl:attribute>
- <xsl:element name="UNSIGNED"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(PRIMARY) > 0">
- <xsl:element name="PRIMARY"/>
- </xsl:when>
- <xsl:when test="count(KEY) > 0">
- <xsl:element name="KEY"/>
- </xsl:when>
- <xsl:when test="count(NOTNULL) > 0">
- <xsl:element name="NOTNULL"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(AUTO) > 0">
- <xsl:element name="AUTO"/>
- </xsl:when>
- <xsl:when test="count(AUTOINCREMENT) > 0">
- <xsl:element name="AUTOINCREMENT"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(DEFAULT) > 0">
- <xsl:element name="DEFAULT">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFAULT[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFDATE) > 0">
- <xsl:element name="DEFDATE">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFDATE[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFTIMESTAMP) > 0">
- <xsl:element name="DEFTIMESTAMP">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="count(NOQUOTE) > 0">
- <xsl:element name="NOQUOTE"/>
- </xsl:if>
-
- <xsl:apply-templates select="constraint"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Constraint -->
- <xsl:template match="constraint">
- <xsl:element name="constraint">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Index -->
- <xsl:template match="index">
- <xsl:element name="index">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:if test="count(CLUSTERED) > 0">
- <xsl:element name="CLUSTERED"/>
- </xsl:if>
-
- <xsl:if test="count(BITMAP) > 0">
- <xsl:element name="BITMAP"/>
- </xsl:if>
-
- <xsl:if test="count(UNIQUE) > 0">
- <xsl:element name="UNIQUE"/>
- </xsl:if>
-
- <xsl:if test="count(FULLTEXT) > 0">
- <xsl:element name="FULLTEXT"/>
- </xsl:if>
-
- <xsl:if test="count(HASH) > 0">
- <xsl:element name="HASH"/>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="col"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
- <!-- Index Column -->
- <xsl:template match="col">
- <xsl:element name="col">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- SQL QuerySet -->
- <xsl:template match="sql">
- <xsl:element name="sql">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@key) > 0">
- <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@prefixmethod) > 0">
- <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
- <xsl:apply-templates select="query"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Query -->
- <xsl:template match="query">
- <xsl:element name="query">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/adodb/xsl/convert-0.2-0.1.xsl b/lib/adodb/xsl/convert-0.2-0.1.xsl
deleted file mode 100644
index 61841b4..0000000
--- a/lib/adodb/xsl/convert-0.2-0.1.xsl
+++ /dev/null
@@ -1,207 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.1</xsl:attribute>
-
- <xsl:apply-templates select="schema/table|schema/sql"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:variable name="table_name" select="@name"/>
-
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="$table_name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="field"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:apply-templates select="constraint"/>
-
- </xsl:element>
-
- <xsl:apply-templates select="index"/>
- </xsl:template>
-
- <!-- Field -->
- <xsl:template match="field">
- <xsl:element name="field">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
-
- <xsl:if test="string-length(@size) > 0">
- <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(PRIMARY) > 0">
- <xsl:element name="PRIMARY"/>
- </xsl:when>
- <xsl:when test="count(KEY) > 0">
- <xsl:element name="KEY"/>
- </xsl:when>
- <xsl:when test="count(NOTNULL) > 0">
- <xsl:element name="NOTNULL"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(AUTO) > 0">
- <xsl:element name="AUTO"/>
- </xsl:when>
- <xsl:when test="count(AUTOINCREMENT) > 0">
- <xsl:element name="AUTOINCREMENT"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(DEFAULT) > 0">
- <xsl:element name="DEFAULT">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFAULT[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFDATE) > 0">
- <xsl:element name="DEFDATE">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFDATE[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFTIMESTAMP) > 0">
- <xsl:element name="DEFDTIMESTAMP">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="count(NOQUOTE) > 0">
- <xsl:element name="NOQUOTE"/>
- </xsl:if>
-
- <xsl:apply-templates select="constraint"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Constraint -->
- <xsl:template match="constraint">
- <xsl:element name="constraint">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Index -->
- <xsl:template match="index">
- <xsl:element name="index">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- <xsl:attribute name="table"><xsl:value-of select="../@name"/></xsl:attribute>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:if test="count(CLUSTERED) > 0">
- <xsl:element name="CLUSTERED"/>
- </xsl:if>
-
- <xsl:if test="count(BITMAP) > 0">
- <xsl:element name="BITMAP"/>
- </xsl:if>
-
- <xsl:if test="count(UNIQUE) > 0">
- <xsl:element name="UNIQUE"/>
- </xsl:if>
-
- <xsl:if test="count(FULLTEXT) > 0">
- <xsl:element name="FULLTEXT"/>
- </xsl:if>
-
- <xsl:if test="count(HASH) > 0">
- <xsl:element name="HASH"/>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="col"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
- <!-- Index Column -->
- <xsl:template match="col">
- <xsl:element name="col">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- SQL QuerySet -->
- <xsl:template match="sql">
- <xsl:element name="sql">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@key) > 0">
- <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@prefixmethod) > 0">
- <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
- <xsl:apply-templates select="query"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Query -->
- <xsl:template match="query">
- <xsl:element name="query">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/adodb/xsl/convert-0.2-0.3.xsl b/lib/adodb/xsl/convert-0.2-0.3.xsl
deleted file mode 100644
index 26bd9e9..0000000
--- a/lib/adodb/xsl/convert-0.2-0.3.xsl
+++ /dev/null
@@ -1,281 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.3</xsl:attribute>
-
- <xsl:apply-templates select="schema/table|schema/sql"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="field"/>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:apply-templates select="constraint"/>
-
- <xsl:apply-templates select="opt"/>
-
- <xsl:apply-templates select="index"/>
-
- <xsl:apply-templates select="data"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Field -->
- <xsl:template match="field">
- <xsl:element name="field">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
-
- <xsl:if test="string-length(@size) > 0">
- <xsl:attribute name="size"><xsl:value-of select="@size"/></xsl:attribute>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="string-length(@opts) = 0">
- <xsl:if test="count(UNSIGNED) > 0">
- <xsl:element name="UNSIGNED"/>
- </xsl:if>
- </xsl:when>
- <xsl:when test="@opts = 'UNSIGNED'">
- <xsl:element name="UNSIGNED"/>
- </xsl:when>
- <xsl:when test="contains(@opts,'UNSIGNED')">
- <xsl:attribute name="opts">
- <xsl:value-of select="concat(substring-before(@opts,'UNSIGNED'),substring-after(@opts,'UNSIGNED'))"/>
- </xsl:attribute>
- <xsl:element name="UNSIGNED"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:attribute name="opts"><xsl:value-of select="@opts"/></xsl:attribute>
- <xsl:if test="count(UNSIGNED) > 0">
- <xsl:element name="UNSIGNED"/>
- </xsl:if>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:choose>
- <xsl:when test="count(PRIMARY) > 0">
- <xsl:element name="PRIMARY"/>
- </xsl:when>
- <xsl:when test="count(KEY) > 0">
- <xsl:element name="KEY"/>
- </xsl:when>
- <xsl:when test="count(NOTNULL) > 0">
- <xsl:element name="NOTNULL"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(AUTO) > 0">
- <xsl:element name="AUTO"/>
- </xsl:when>
- <xsl:when test="count(AUTOINCREMENT) > 0">
- <xsl:element name="AUTOINCREMENT"/>
- </xsl:when>
- </xsl:choose>
-
- <xsl:choose>
- <xsl:when test="count(DEFAULT) > 0">
- <xsl:element name="DEFAULT">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFAULT[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFDATE) > 0">
- <xsl:element name="DEFDATE">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFDATE[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- <xsl:when test="count(DEFTIMESTAMP) > 0">
- <xsl:element name="DEFTIMESTAMP">
- <xsl:attribute name="value">
- <xsl:value-of select="DEFTIMESTAMP[1]/@value"/>
- </xsl:attribute>
- </xsl:element>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="count(NOQUOTE) > 0">
- <xsl:element name="NOQUOTE"/>
- </xsl:if>
-
- <xsl:apply-templates select="constraint"/>
-
- <xsl:apply-templates select="opt"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Constraint -->
- <xsl:template match="constraint">
- <xsl:element name="constraint">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Opt -->
- <xsl:template match="opt">
- <xsl:element name="opt">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Index -->
- <xsl:template match="index">
- <xsl:element name="index">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:if test="count(CLUSTERED) > 0">
- <xsl:element name="CLUSTERED"/>
- </xsl:if>
-
- <xsl:if test="count(BITMAP) > 0">
- <xsl:element name="BITMAP"/>
- </xsl:if>
-
- <xsl:if test="count(UNIQUE) > 0">
- <xsl:element name="UNIQUE"/>
- </xsl:if>
-
- <xsl:if test="count(FULLTEXT) > 0">
- <xsl:element name="FULLTEXT"/>
- </xsl:if>
-
- <xsl:if test="count(HASH) > 0">
- <xsl:element name="HASH"/>
- </xsl:if>
-
- <xsl:choose>
- <xsl:when test="count(DROP) > 0">
- <xsl:element name="DROP"/>
- </xsl:when>
- <xsl:otherwise>
- <xsl:apply-templates select="col"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:element>
- </xsl:template>
-
- <!-- Index Column -->
- <xsl:template match="col">
- <xsl:element name="col">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- SQL QuerySet -->
- <xsl:template match="sql">
- <xsl:element name="sql">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@key) > 0">
- <xsl:attribute name="key"><xsl:value-of select="@key"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@prefixmethod) > 0">
- <xsl:attribute name="prefixmethod"><xsl:value-of select="@prefixmethod"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:apply-templates select="query"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Query -->
- <xsl:template match="query">
- <xsl:element name="query">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Data -->
- <xsl:template match="data">
- <xsl:element name="data">
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:apply-templates select="row"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Data Row -->
- <xsl:template match="row">
- <xsl:element name="row">
- <xsl:apply-templates select="f"/>
- </xsl:element>
- </xsl:template>
-
- <!-- Data Field -->
- <xsl:template match="f">
- <xsl:element name="f">
- <xsl:if test="string-length(@name) > 0">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
- </xsl:if>
-
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/adodb/xsl/remove-0.2.xsl b/lib/adodb/xsl/remove-0.2.xsl
deleted file mode 100644
index 9b10a52..0000000
--- a/lib/adodb/xsl/remove-0.2.xsl
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:comment>
-Uninstallation Schema
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.2</xsl:attribute>
-
- <xsl:apply-templates select="schema/table">
- <xsl:sort select="position()" data-type="number" order="descending"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:if test="count(DROP) = 0">
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:element name="DROP"/>
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/adodb/xsl/remove-0.3.xsl b/lib/adodb/xsl/remove-0.3.xsl
deleted file mode 100644
index 768e092..0000000
--- a/lib/adodb/xsl/remove-0.3.xsl
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
- <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
-
- <!-- Schema -->
- <xsl:template match="/">
- <xsl:comment>
-ADODB XMLSchema
-http://adodb-xmlschema.sourceforge.net
-</xsl:comment>
-
- <xsl:comment>
-Uninstallation Schema
-</xsl:comment>
-
- <xsl:element name="schema">
- <xsl:attribute name="version">0.3</xsl:attribute>
-
- <xsl:apply-templates select="schema/table">
- <xsl:sort select="position()" data-type="number" order="descending"/>
- </xsl:apply-templates>
- </xsl:element>
- </xsl:template>
-
- <!-- Table -->
- <xsl:template match="table">
- <xsl:if test="count(DROP) = 0">
- <xsl:element name="table">
- <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
-
- <xsl:if test="string-length(@platform) > 0">
- <xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
- </xsl:if>
-
- <xsl:if test="string-length(@version) > 0">
- <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
- </xsl:if>
-
- <xsl:apply-templates select="descr[1]"/>
-
- <xsl:element name="DROP"/>
- </xsl:element>
- </xsl:if>
- </xsl:template>
-
- <!-- Description -->
- <xsl:template match="descr">
- <xsl:element name="descr">
- <xsl:value-of select="normalize-space(text())"/>
- </xsl:element>
- </xsl:template>
-</xsl:stylesheet> \ No newline at end of file
diff --git a/lib/config.class.php b/lib/config.class.php
index 7a2782d..67095ee 100644
--- a/lib/config.class.php
+++ b/lib/config.class.php
@@ -12,7 +12,6 @@ class siteConfig {
public $_rootDir; # root of the site from the perspective of the filesystem
public $_rootURL; # root URL of the site
- public $_adodbDir; # where the ADOBD libraries live - adodb.sourceforge.net
var $_imgDir; # images directory
var $_cssDir; # css files directory
var $_jsDir; # javascript files directory
diff --git a/lib/database.class.php b/lib/database.class.php
index f72bdab..5733c99 100644
--- a/lib/database.class.php
+++ b/lib/database.class.php
@@ -1,8 +1,5 @@
<?php
-# include the ADODB library for abstracting the underlying database
-require(ADODBDIR . "/adodb.inc.php");
-
# define a class for connecting to, extracting and modifying data from a database
class Database {
@@ -36,21 +33,12 @@ class Database {
# connect to the database
function Connect($dbHost, $dbUser, $dbPass, $dbName) {
- $this->_dbConn = &ADONewConnection($this->_dbType);
- if (
- $this->_dbConn->Connect
- (
- $dbHost,
- $dbUser,
- $dbPass,
- $dbName
- )
- )
- {
+ try {
+ $this->_dbConn = new PDO($this->_dbType . ':host=localhost;charset=utf8;dbname=' . $dbName, $dbUser, $dbPass);
return true;
- } else {
+ } catch (PDOException $e) {
# grab error if the connection fails
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $e->getMessage();
if ( DBDEBUG == "true" ) {
$this->PrintError();
}
@@ -65,16 +53,8 @@ class Database {
function Close() {
if ( isset($this->_dbConn) ) {
- if ( $this->_dbConn->Close() ) {
- return true;
- } else {
- # grab error if the connection fails
- $this->_error = $this->_dbConn->ErrorMsg();
- if ( DBDEBUG == "true" ) {
- $this->PrintError();
- }
- return false;
- }
+ $this->_dbConn = null;
+ return true;
}
}
@@ -84,15 +64,15 @@ class Database {
# handles select queries where multiple rows are expected
function Select($sql) {
- $this->_result = $this->_dbConn->Execute($sql);
+ $this->_result = $this->_dbConn->query($sql);
if ( $this->_result ) {
- $this->_rowCount = $this->_result->RecordCount();
- $this->_fieldCount = $this->_result->FieldCount();
- $this->_rows = $this->_result->GetRows();
+ $this->_rowCount = $this->_result->rowCount();
+ $this->_fieldCount = $this->_result->columnCount();
+ $this->_rows = $this->_result->fetchAll();
return true;
} else {
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $this->_dbConn->errorInfo()[2];
if ( DBDEBUG == "true" ) {
$this->PrintError($sql);
}
@@ -106,15 +86,15 @@ class Database {
# handles select queries where only one record is expected
function SelectOne($sql) {
- $this->_result = $this->_dbConn->Execute($sql);
+ $this->_result = $this->_dbConn->query($sql);
if ( $this->_result ) {
- $this->_fieldCount = $this->_result->FieldCount();
- $this->_rowCount = $this->_result->RecordCount();
- $this->_row = $this->_result->FetchRow();
+ $this->_rowCount = $this->_result->rowCount();
+ $this->_fieldCount = $this->_result->columnCount();
+ $this->_row = $this->_result->fetch();
return true;
} else {
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $this->_dbConn->errorInfo()[2];
if ( DBDEBUG == "true" ) {
$this->PrintError($sql);
}
@@ -128,15 +108,16 @@ class Database {
# handles select queries that need to return a restricted record set
function SelectLimit($sql, $rows, $offset) {
- $this->_result = $this->_dbConn->SelectLimit($sql, $rows, $offset);
+ $sql .= ' LIMIT ' . $rows . ' OFFSET ' . $offset;
+ $this->_result = $this->_dbConn->query($sql);
if ( $this->_result ) {
- $this->_rowCount = $this->_result->RecordCount();
- $this->_fieldCount = $this->_result->FieldCount();
- $this->_rows = $this->_result->GetRows();
+ $this->_rowCount = $this->_result->rowCount();
+ $this->_fieldCount = $this->_result->columnCount();
+ $this->_rows = $this->_result->fetchAll();
return true;
} else {
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $this->_dbConn->errorInfo()[2];
if ( DBDEBUG == "true" ) {
$this->PrintError($sql);
}
@@ -150,19 +131,19 @@ class Database {
# handles queries that will alter data
function Modify($sql) {
- $this->_result = $this->_dbConn->Execute($sql);
+ $this->_result = $this->_dbConn->query($sql);
if ( $this->_result ) {
- $this->_affectedRows = $this->_dbConn->Affected_Rows();
+ $this->_affectedRows = $this->_result->rowCount();
return true;
} else {
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $this->_dbConn->errorInfo()[2];
if ( DBDEBUG == "true" ) {
$this->PrintError($sql);
}
return false;
}
-
+
}
##------------------------------------------------------------------##
@@ -170,13 +151,13 @@ class Database {
# get auto_incremented ID of last insert statement
function InsertId() {
- $this->_result = $this->_dbConn->Insert_ID();
+ $this->_result = $this->_dbConn->lastInsertId();
if ( $this->_result ) {
$this->_insertId = $this->_result;
return $this->_insertId;
} else {
- $this->_error = $this->_dbConn->ErrorMsg();
+ $this->_error = $this->_dbConn->errorInfo()[2];
if ( DBDEBUG == "true" ) {
$this->PrintError();
}
@@ -193,12 +174,12 @@ class Database {
$string = trim($string);
if ( ! is_numeric($string) ) {
- $string = $this->_dbConn->qstr( $string, get_magic_quotes_gpc() );
+ $string = $this->_dbConn->quote($string);
}
- # the ADODB function above seems to add single quotes around the
- # submitted string. i like to add those myself at the time of
- # the query, so strip them off here
+ # the quote() function adds single quotes around the submitted string.
+ # i like to add those myself at the time of the query, so strip them
+ # off here
$string = trim($string, "'");
return $string;
diff --git a/nutrient_search.php b/nutrient_search.php
index 21531b4..64ddb2d 100644
--- a/nutrient_search.php
+++ b/nutrient_search.php
@@ -38,7 +38,8 @@ $smarty->assign("count", $_GET['count']);
# execute query
$sql = sprintf ("
- SELECT foodDescs.ndb_no, foodDescs.long_desc, foodDescs.comname, %s AS foodDesc,
+ SELECT foodDescs.ndb_no, foodDescs.long_desc, foodDescs.comname,
+ CONCAT(foodDescs.long_desc, foodDescs.comname) AS foodDesc,
nutrientData.nutr_val, nutrientDefs.nutrdesc, nutrientDefs.units
FROM foodDescs LEFT JOIN nutrientData
ON foodDescs.ndb_no = nutrientData.ndb_no
@@ -47,7 +48,6 @@ $sql = sprintf ("
WHERE nutrientDefs.nutr_no = '%s'
ORDER BY nutrientData.nutr_val DESC
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$_GET['nutrient']
);
diff --git a/view_food.php b/view_food.php
index b927459..956480f 100644
--- a/view_food.php
+++ b/view_food.php
@@ -91,7 +91,8 @@ if ( isLoggedIn() ) {
if ( isset($_GET['showall']) ) {
$smarty->assign("showAllNutrients", true);
$sql = sprintf ("
- SELECT foodDescs.long_desc, foodDescs.comname, %s AS foodDesc, foodDescs.sciname,
+ SELECT foodDescs.long_desc, foodDescs.comname, CONCAT(foodDescs.long_desc,
+ foodDescs.comname) AS foodDesc, foodDescs.sciname,
weights.gm_wgt, weights.amount, weights.msre_desc,
nutrientDefs.nutrdesc, nutrientDefs.units,
nutrientData.nutr_no, nutrientData.nutr_val, dris.dri
@@ -111,7 +112,6 @@ if ( isLoggedIn() ) {
AND ((dris.gender = '%s') OR dris.id IS NULL)
ORDER BY nutrientDefs.sr_order
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$_GET['food'],
$_GET['food'],
$_GET['weight'],
@@ -121,7 +121,8 @@ if ( isLoggedIn() ) {
);
} else {
$sql = sprintf ("
- SELECT foodDescs.long_desc, foodDescs.comname, %s AS foodDesc, foodDescs.sciname,
+ SELECT foodDescs.long_desc, foodDescs.comname, CONCAT(foodDescs.long_desc,
+ foodDescs.comname) AS foodDesc, foodDescs.sciname,
weights.gm_wgt, weights.amount, weights.msre_desc,
nutrientDefs.nutrdesc, nutrientDefs.units,
nutrientData.nutr_no, nutrientData.nutr_val, dris.dri
@@ -144,7 +145,6 @@ if ( isLoggedIn() ) {
AND ((dris.gender = '%s') OR dris.id IS NULL)
ORDER BY nutrientDefs.sr_order
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$_GET['food'],
$_GET['food'],
$_GET['weight'],
@@ -166,7 +166,8 @@ if ( isLoggedIn() ) {
if ( isset($_GET['showall']) ) {
$smarty->assign("showAllNutrients", true);
$sql = sprintf ("
- SELECT foodDescs.long_desc, foodDescs.comname, %s AS foodDesc, foodDescs.sciname,
+ SELECT foodDescs.long_desc, foodDescs.comname, CONCAT(foodDescs.long_desc,
+ foodDescs.comname) AS foodDesc, foodDescs.sciname,
weights.gm_wgt, weights.amount, weights.msre_desc,
nutrientDefs.nutrdesc, nutrientDefs.units,
nutrientData.nutr_no, nutrientData.nutr_val, dris.dri
@@ -186,7 +187,6 @@ if ( isLoggedIn() ) {
AND ((dris.gender = 'male') OR dris.id IS NULL)
ORDER BY nutrientDefs.sr_order
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$_GET['food'],
$_GET['food'],
$_GET['weight']
@@ -194,7 +194,8 @@ if ( isLoggedIn() ) {
} else {
# show the user the default nutrients
$sql = sprintf ("
- SELECT foodDescs.long_desc, foodDescs.comname, %s AS foodDesc, foodDescs.sciname,
+ SELECT foodDescs.long_desc, foodDescs.comname, CONCAT(foodDescs.long_desc,
+ foodDescs.comname) AS foodDesc, foodDescs.sciname,
weights.gm_wgt, weights.amount, weights.msre_desc,
nutrientDefs.nutrdesc, nutrientDefs.units,
nutrientData.nutr_no, nutrientData.nutr_val, dris.dri
@@ -215,7 +216,6 @@ if ( isLoggedIn() ) {
AND ((dris.gender = 'male') OR dris.id IS NULL)
ORDER BY nutrientDefs.sr_order
",
- $db->_dbConn->Concat("foodDescs.long_desc", "', '", "foodDescs.comname"),
$_GET['food'],
$_GET['food'],
$_GET['weight']