Removed adodb-hack, replaced by new export/datadict drivers
This commit is contained in:
parent
8779a38332
commit
97604279bf
@ -116,7 +116,7 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
*/
|
*/
|
||||||
private static $null;
|
private static $null;
|
||||||
/**
|
/**
|
||||||
* @var integer $oid object identifier
|
* @var integer $oid object identifier, each Record object has a unique object identifier
|
||||||
*/
|
*/
|
||||||
private $oid;
|
private $oid;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,50 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ADOdb Lite is a PHP class to encapsulate multiple database APIs and is compatible with
|
|
||||||
* a subset of the ADODB Command Syntax.
|
|
||||||
* Currently supports Frontbase, MaxDB, miniSQL, MSSQL, MSSQL Pro, MySQLi, MySQLt, MySQL, PostgresSQL,
|
|
||||||
* PostgresSQL64, PostgresSQL7, PostgresSQL8, SqLite, SqLite Pro, Sybase and Sybase ASE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('_ADODB_LAYER'))
|
|
||||||
define('_ADODB_LAYER',1);
|
|
||||||
|
|
||||||
if (!defined('ADODB_DIR'))
|
|
||||||
define('ADODB_DIR', dirname(__FILE__));
|
|
||||||
|
|
||||||
$ADODB_vers = 'V1.15 ADOdb Lite 25 March 2006 (c) 2005, 2006 Mark Dickenson. All rights reserved. Released LGPL.';
|
|
||||||
|
|
||||||
define('ADODB_FETCH_DEFAULT',0);
|
|
||||||
define('ADODB_FETCH_NUM',1);
|
|
||||||
define('ADODB_FETCH_ASSOC',2);
|
|
||||||
define('ADODB_FETCH_BOTH',3);
|
|
||||||
|
|
||||||
GLOBAL $ADODB_FETCH_MODE;
|
|
||||||
$ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT; // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default...
|
|
||||||
|
|
||||||
|
|
||||||
function NewDataDictionary($conn) {
|
|
||||||
|
|
||||||
$dbtype = $conn->getAttribute(PDO::ATTR_DRIVER_NAME);
|
|
||||||
|
|
||||||
include_once ADODB_DIR . '/adodb-datadict.inc.php';
|
|
||||||
include_once ADODB_DIR . '/drivers/datadict-' . $dbtype . '.inc.php';
|
|
||||||
|
|
||||||
$class = "ADODB2_$dbtype";
|
|
||||||
$dict = new $class();
|
|
||||||
$dict->connection = $conn;
|
|
||||||
$dict->upperName = strtoupper($dbtype);
|
|
||||||
//$dict->quote = $conn->nameQuote;
|
|
||||||
//$dict->debug_echo = $conn->debug_echo;
|
|
||||||
|
|
||||||
return $dict;
|
|
||||||
}
|
|
||||||
class ADOFieldObject {
|
|
||||||
public $name = '';
|
|
||||||
public $max_length=0;
|
|
||||||
public $type="";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,142 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,150 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,124 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
@ -1,66 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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';
|
|
||||||
|
|
||||||
case 'L': return 'SMALLINT';
|
|
||||||
case 'I': return 'INTEGER';
|
|
||||||
case 'I1': return 'SMALLINT';
|
|
||||||
case 'I2': return 'SMALLINT';
|
|
||||||
case 'I4': return 'INTEGER';
|
|
||||||
case 'I8': return 'DECIMAL(20)';
|
|
||||||
|
|
||||||
case 'F': return 'FLOAT';
|
|
||||||
case 'N': return 'DECIMAL';
|
|
||||||
default:
|
|
||||||
return $meta;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function AlterColumnSQL($tabname, $flds)
|
|
||||||
{
|
|
||||||
if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function DropColumnSQL($tabname, $flds)
|
|
||||||
{
|
|
||||||
if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// return string must begin with space
|
|
||||||
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
|
|
||||||
{
|
|
||||||
if ($fautoinc) {
|
|
||||||
$ftype = 'SERIAL';
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
$suffix = '';
|
|
||||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
|
||||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
|
||||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
|
||||||
return $suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,281 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,319 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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!
|
|
||||||
var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
|
|
||||||
|
|
||||||
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 = null)
|
|
||||||
{
|
|
||||||
$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;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
$save = $this->metaTablesSQL;
|
|
||||||
if ($showSchema && is_string($showSchema)) {
|
|
||||||
$this->metaTablesSQL .= " from $showSchema";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($mask) {
|
|
||||||
$mask = $this->connection->qstr($mask);
|
|
||||||
$this->metaTablesSQL .= " like $mask";
|
|
||||||
}
|
|
||||||
$ret =& $this->_MetaTables($ttype,$showSchema);
|
|
||||||
|
|
||||||
$this->metaTablesSQL = $save;
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function &_MetaTables($ttype=false,$showSchema=false,$mask=false)
|
|
||||||
{
|
|
||||||
$false = false;
|
|
||||||
if ($mask) {
|
|
||||||
return $false;
|
|
||||||
}
|
|
||||||
if ($this->metaTablesSQL) {
|
|
||||||
|
|
||||||
$rs = $this->connection->query($this->metaTablesSQL);
|
|
||||||
|
|
||||||
$arr =& $rs->fetchAll(PDO::FETCH_NUM);
|
|
||||||
$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->closeCursor();
|
|
||||||
return $arr2;
|
|
||||||
}
|
|
||||||
return $false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 upper uppercase table name (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, $upper = true, $schema = false)
|
|
||||||
{
|
|
||||||
$this->_findschema($table,$schema);
|
|
||||||
if ($schema) {
|
|
||||||
$dbName = $this->database;
|
|
||||||
$this->connection->SelectDB($schema);
|
|
||||||
}
|
|
||||||
|
|
||||||
$stmt = $this->connection->query(sprintf($this->metaColumnsSQL,$table));
|
|
||||||
|
|
||||||
if ($schema) {
|
|
||||||
$this->connection->SelectDB($dbName);
|
|
||||||
}
|
|
||||||
|
|
||||||
$retarr = array();
|
|
||||||
while ($rs = $stmt->fetch(PDO::FETCH_NUM)){
|
|
||||||
print_r($rs);
|
|
||||||
$fld = new ADOFieldObject();
|
|
||||||
$fld->name = $rs[0];
|
|
||||||
$type = $rs[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[2] != 'YES');
|
|
||||||
$fld->primary_key = ($rs[3] == 'PRI');
|
|
||||||
$fld->auto_increment = (strpos($rs[5], 'auto_increment') !== false);
|
|
||||||
$fld->binary = (strpos($type,'blob') !== false);
|
|
||||||
$fld->unsigned = (strpos($type,'unsigned') !== false);
|
|
||||||
|
|
||||||
if (!$fld->binary) {
|
|
||||||
$d = $rs[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$stmt->closeCursor();
|
|
||||||
return $retarr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,281 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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 'NVARCHAR';
|
|
||||||
case 'X2': return 'NVARCHAR(2000)';
|
|
||||||
|
|
||||||
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 (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
|
|
||||||
$seqCache = '';
|
|
||||||
if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
|
|
||||||
$seqIncr = '';
|
|
||||||
if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
|
|
||||||
$seqStart = '';
|
|
||||||
if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
|
|
||||||
$sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
|
|
||||||
$sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
|
|
||||||
|
|
||||||
$this->seqField = false;
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
|
||||||
[table_options] [select_statement]
|
|
||||||
create_definition:
|
|
||||||
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
|
|
||||||
[PRIMARY KEY] [reference_definition]
|
|
||||||
or PRIMARY KEY (index_col_name,...)
|
|
||||||
or KEY [index_name] (index_col_name,...)
|
|
||||||
or INDEX [index_name] (index_col_name,...)
|
|
||||||
or UNIQUE [INDEX] [index_name] (index_col_name,...)
|
|
||||||
or FULLTEXT [INDEX] [index_name] (index_col_name,...)
|
|
||||||
or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
|
|
||||||
[reference_definition]
|
|
||||||
or CHECK (expr)
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
|
|
||||||
{
|
|
||||||
$sql = array();
|
|
||||||
|
|
||||||
if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
|
|
||||||
$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
|
|
||||||
if ( isset($idxoptions['DROP']) )
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( empty ($flds) ) {
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($idxoptions['BITMAP'])) {
|
|
||||||
$unique = ' BITMAP';
|
|
||||||
} elseif (isset($idxoptions['UNIQUE'])) {
|
|
||||||
$unique = ' UNIQUE';
|
|
||||||
} else {
|
|
||||||
$unique = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_array($flds) )
|
|
||||||
$flds = implode(', ',$flds);
|
|
||||||
$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
|
|
||||||
|
|
||||||
if ( isset($idxoptions[$this->upperName]) )
|
|
||||||
$s .= $idxoptions[$this->upperName];
|
|
||||||
|
|
||||||
if (isset($idxoptions['oci8']))
|
|
||||||
$s .= $idxoptions['oci8'];
|
|
||||||
|
|
||||||
|
|
||||||
$sql[] = $s;
|
|
||||||
|
|
||||||
return $sql;
|
|
||||||
}
|
|
||||||
|
|
||||||
function GetCommentSQL($table,$col)
|
|
||||||
{
|
|
||||||
$table = $this->connection->qstr($table);
|
|
||||||
$col = $this->connection->qstr($col);
|
|
||||||
return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
|
|
||||||
}
|
|
||||||
|
|
||||||
function SetCommentSQL($table,$col,$cmt)
|
|
||||||
{
|
|
||||||
$cmt = $this->connection->qstr($cmt);
|
|
||||||
return "COMMENT ON COLUMN $table.$col IS $cmt";
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,371 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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_pgsql 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.50 6 July 2004 (c) 2000-2006 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) . ')' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,138 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
V4.65 22 July 2005 (c) 2000-2005 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 28 August, 2005 for use with ADOdb Lite by Mark Dickenson
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
// security - hide paths
|
|
||||||
if (!defined('ADODB_DIR')) die();
|
|
||||||
|
|
||||||
class ADODB2_sqlite extends ADODB_DataDict {
|
|
||||||
|
|
||||||
var $dbtype = 'sqlite';
|
|
||||||
var $seqField = false;
|
|
||||||
|
|
||||||
var $metaTablesSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
|
|
||||||
|
|
||||||
function ActualType($meta)
|
|
||||||
{
|
|
||||||
switch($meta) {
|
|
||||||
case 'C': return 'TEXT';
|
|
||||||
case 'XL':
|
|
||||||
case 'X': return 'TEXT';
|
|
||||||
|
|
||||||
case 'C2': return 'TEXT';
|
|
||||||
case 'X2': return 'TEXT';
|
|
||||||
|
|
||||||
case 'B': return 'BLOB';
|
|
||||||
|
|
||||||
case 'D': return 'DATE';
|
|
||||||
case 'T': return 'DATE';
|
|
||||||
|
|
||||||
case 'L': return 'INTEGER';
|
|
||||||
case 'I': return 'INTEGER';
|
|
||||||
case 'I1': return 'INTEGER';
|
|
||||||
case 'I2': return 'INTEGER';
|
|
||||||
case 'I4': return 'INTEGER';
|
|
||||||
case 'I8': return 'INTEGER';
|
|
||||||
|
|
||||||
case 'F': return 'REAL';
|
|
||||||
case 'N': return 'DECIMAL';
|
|
||||||
default:
|
|
||||||
return $meta;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// return string must begin with space
|
|
||||||
|
|
||||||
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned = null)
|
|
||||||
{
|
|
||||||
$suffix = '';
|
|
||||||
if ($funsigned) $suffix .= ' UNSIGNED';
|
|
||||||
if ($fnotnull) $suffix .= ' NOT NULL';
|
|
||||||
if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
|
|
||||||
|
|
||||||
if ($fautoinc) $suffix .= ' PRIMARY KEY AUTOINCREMENT';
|
|
||||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
|
||||||
return $suffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
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 && ! $this->autoIncrement) {
|
|
||||||
$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;
|
|
||||||
}
|
|
||||||
|
|
||||||
function AlterColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
|
||||||
{
|
|
||||||
if ($this->debug) $this->outp("AlterColumnSQL not supported");
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function DropColumnSQL($tabname, $flds, $tableflds='',$tableoptions='')
|
|
||||||
{
|
|
||||||
if ($this->debug) $this->outp("DropColumnSQL not supported");
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
// function MetaType($t,$len=-1,$fieldobj=false)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function &MetaTables($ttype=false,$showSchema=false,$mask=false)
|
|
||||||
// {
|
|
||||||
// global $ADODB_FETCH_MODE;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function &MetaColumns($table,$upper=true)
|
|
||||||
// {
|
|
||||||
// global $ADODB_FETCH_MODE;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function MetaPrimaryKeys($table, $owner=false)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function &MetaIndexes($table, $primary = false, $owner = false)
|
|
||||||
// {
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,227 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
V4.80 8 Mar 2006 (c) 2000-2006 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;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user