mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-24 23:58:54 +01:00
fix for 5.4 PHP Strict Standards: Declaration of ADODB2_mysql::_CreateSuffix() should be compatible with ADODB_DataDict::_CreateSuffix
This commit is contained in:
parent
3918f2606c
commit
13bcf73178
@ -2,14 +2,14 @@
|
||||
|
||||
/**
|
||||
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,
|
||||
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.
|
||||
*/
|
||||
|
||||
@ -42,13 +42,13 @@ if (!function_exists('ctype_alnum')) {
|
||||
/**
|
||||
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
|
||||
@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='_.-')
|
||||
@ -61,7 +61,7 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
|
||||
$tokens[$stmtno] = array();
|
||||
$max = strlen($args);
|
||||
$quoted = false;
|
||||
|
||||
|
||||
while ($pos < $max) {
|
||||
$ch = substr($args,$pos,1);
|
||||
switch($ch) {
|
||||
@ -76,17 +76,17 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
$tokarr[] = $ch;
|
||||
break;
|
||||
|
||||
|
||||
case '`':
|
||||
if ($intoken) $tokarr[] = $ch;
|
||||
case '(':
|
||||
case ')':
|
||||
case ')':
|
||||
case '"':
|
||||
case "'":
|
||||
|
||||
|
||||
if ($intoken) {
|
||||
if (empty($endquote)) {
|
||||
$tokens[$stmtno][] = implode('',$tokarr);
|
||||
@ -108,9 +108,9 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
|
||||
}
|
||||
} else
|
||||
$tokarr[] = $ch;
|
||||
|
||||
|
||||
}else {
|
||||
|
||||
|
||||
if ($ch == '(') $endquote = ')';
|
||||
else $endquote = $ch;
|
||||
$quoted = true;
|
||||
@ -119,27 +119,27 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
|
||||
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) {
|
||||
if ($ch == $endstmtchar) {
|
||||
$tokens[$stmtno][] = implode('',$tokarr);
|
||||
$stmtno += 1;
|
||||
$tokens[$stmtno] = array();
|
||||
@ -155,7 +155,7 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
|
||||
$pos += 1;
|
||||
}
|
||||
if ($intoken) $tokens[$stmtno][] = implode('',$tokarr);
|
||||
|
||||
|
||||
return $tokens;
|
||||
}
|
||||
|
||||
@ -164,7 +164,7 @@ class ADODB_DataDict {
|
||||
var $connection;
|
||||
var $debug = false;
|
||||
var $dropTable = 'DROP TABLE %s';
|
||||
var $renameTable = 'RENAME TABLE %s TO %s';
|
||||
var $renameTable = 'RENAME TABLE %s TO %s';
|
||||
var $dropIndex = 'DROP INDEX %s';
|
||||
var $addCol = ' ADD';
|
||||
var $alterCol = ' ALTER COLUMN';
|
||||
@ -179,66 +179,66 @@ class ADODB_DataDict {
|
||||
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 brackets are allowed, quote only the rest,
|
||||
|
||||
// if brackets are allowed, quote only the rest,
|
||||
// to allow to limit indexes on colums, eg "column(32)"
|
||||
if ($allowBrackets && preg_match('/^(.*) *(\(\d+\))$/',$name,$matches)) {
|
||||
return $quote . $matches[1] . $quote . ' '. $matches[2];
|
||||
@ -247,17 +247,17 @@ class ADODB_DataDict {
|
||||
|
||||
// not used stock ADOdb code, which only quotes names with special chars,
|
||||
// which does not help with column names using reserved words, eg. "timestamp" in phpfreechat
|
||||
|
||||
|
||||
// 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 ) {
|
||||
@ -265,7 +265,7 @@ class ADODB_DataDict {
|
||||
}
|
||||
return $this->NameQuote($name);
|
||||
}
|
||||
|
||||
|
||||
// Executes the sql array returned by GetTableSQL and GetIndexSQL
|
||||
function ExecuteSQLArray($sql, $continueOnError = true)
|
||||
{
|
||||
@ -273,7 +273,7 @@ class ADODB_DataDict {
|
||||
$conn = &$this->connection;
|
||||
$saved = $conn->debug;
|
||||
foreach($sql as $line) {
|
||||
|
||||
|
||||
if ($this->debug) $conn->debug = true;
|
||||
$ok = $conn->Execute($line);
|
||||
$conn->debug = $saved;
|
||||
@ -285,43 +285,43 @@ class ADODB_DataDict {
|
||||
}
|
||||
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
|
||||
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.
|
||||
*/
|
||||
@ -330,25 +330,25 @@ class ADODB_DataDict {
|
||||
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);
|
||||
@ -360,7 +360,7 @@ class ADODB_DataDict {
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Change the definition of one column
|
||||
*
|
||||
@ -383,7 +383,7 @@ class ADODB_DataDict {
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rename one column
|
||||
*
|
||||
@ -404,7 +404,7 @@ class ADODB_DataDict {
|
||||
}
|
||||
return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Drop one column
|
||||
*
|
||||
@ -427,36 +427,36 @@ class ADODB_DataDict {
|
||||
}
|
||||
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=false)
|
||||
{
|
||||
if (!$tableoptions) $tableoptions = array();
|
||||
|
||||
|
||||
list($lines,$pkey) = $this->_GenFields($flds, true);
|
||||
|
||||
|
||||
$taboptions = $this->_Options($tableoptions);
|
||||
$tabname = $this->TableName ($tabname);
|
||||
$sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions);
|
||||
|
||||
|
||||
$tsql = $this->_Triggers($tabname,$taboptions);
|
||||
foreach($tsql as $s) $sql[] = $s;
|
||||
|
||||
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
function _GenFields($flds,$widespacing=false)
|
||||
{
|
||||
if (is_string($flds)) {
|
||||
@ -470,7 +470,7 @@ class ADODB_DataDict {
|
||||
foreach($f0 as $token) {
|
||||
switch (strtoupper($token)) {
|
||||
case 'CONSTRAINT':
|
||||
case 'DEFAULT':
|
||||
case 'DEFAULT':
|
||||
$hasparam = $token;
|
||||
break;
|
||||
default:
|
||||
@ -481,7 +481,7 @@ class ADODB_DataDict {
|
||||
}
|
||||
}
|
||||
$flds[] = $f1;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
$this->autoIncrement = false;
|
||||
@ -489,7 +489,7 @@ class ADODB_DataDict {
|
||||
$pkey = array();
|
||||
foreach($flds as $fld) {
|
||||
$fld = _array_change_key_case($fld);
|
||||
|
||||
|
||||
$fname = false;
|
||||
$fdefault = false;
|
||||
$fautoinc = false;
|
||||
@ -503,20 +503,20 @@ class ADODB_DataDict {
|
||||
$fconstraint = false;
|
||||
$fnotnull = false;
|
||||
$funsigned = 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':
|
||||
|
||||
case 'SIZE':
|
||||
$dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,',');
|
||||
if ($dotat === false) $fsize = $v;
|
||||
else {
|
||||
@ -538,33 +538,33 @@ class ADODB_DataDict {
|
||||
case 'CONSTRAINT': $fconstraint = $v; 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;
|
||||
|
||||
|
||||
//--------------------
|
||||
// CONSTRUCT FIELD SQL
|
||||
if ($fdefts) {
|
||||
@ -580,20 +580,20 @@ class ADODB_DataDict {
|
||||
$fdefault = $this->connection->sysDate;
|
||||
}
|
||||
} else if ($fdefault !== false && !$fnoquote)
|
||||
if ($ty == 'C' or $ty == 'X' or
|
||||
if ($ty == 'C' or $ty == 'X' or
|
||||
( substr($fdefault,0,1) != "'" && !is_numeric($fdefault)))
|
||||
if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ')
|
||||
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);
|
||||
|
||||
|
||||
if ($widespacing) $fname = str_pad($fname,24);
|
||||
$lines[$fid] = $fname.' '.$ftype.$suffix;
|
||||
|
||||
|
||||
if ($fautoinc) $this->autoIncrement = true;
|
||||
} // foreach $flds
|
||||
|
||||
|
||||
return array($lines,$pkey);
|
||||
}
|
||||
/*
|
||||
@ -610,56 +610,56 @@ class ADODB_DataDict {
|
||||
}
|
||||
return $ftype;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// return string must begin with space
|
||||
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
|
||||
{
|
||||
function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
$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) {
|
||||
@ -676,19 +676,19 @@ class ADODB_DataDict {
|
||||
$s .= ",\n PRIMARY KEY (";
|
||||
$s .= implode(", ",$pkey).")";
|
||||
}
|
||||
if (isset($tableoptions['CONSTRAINTS']))
|
||||
if (isset($tableoptions['CONSTRAINTS']))
|
||||
$s .= "\n".$tableoptions['CONSTRAINTS'];
|
||||
|
||||
if (isset($tableoptions[$this->upperName.'_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
|
||||
@ -697,7 +697,7 @@ class ADODB_DataDict {
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Sanitize options, so that array elements with no keys are promoted to keys
|
||||
*/
|
||||
@ -711,34 +711,34 @@ class ADODB_DataDict {
|
||||
}
|
||||
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)) {
|
||||
|
||||
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.
|
||||
@ -757,11 +757,11 @@ class ADODB_DataDict {
|
||||
}
|
||||
} else {
|
||||
$holdflds[$k] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
$flds = $holdflds;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// already exists, alter table instead
|
||||
list($lines,$pkey) = $this->_GenFields($flds);
|
||||
@ -770,18 +770,18 @@ class ADODB_DataDict {
|
||||
|
||||
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)) continue;
|
||||
|
||||
if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue;
|
||||
|
||||
$sql[] = $alter . $this->alterCol . ' ' . $v;
|
||||
} else {
|
||||
$sql[] = $alter . $this->addCol . ' ' . $v;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $sql;
|
||||
}
|
||||
} // class
|
||||
|
@ -2,12 +2,12 @@
|
||||
|
||||
/**
|
||||
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,
|
||||
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
|
||||
@ -18,10 +18,10 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
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)) {
|
||||
@ -30,43 +30,43 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
$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 'STRING':
|
||||
case 'CHAR':
|
||||
case 'VARCHAR':
|
||||
case 'TINYBLOB':
|
||||
case 'TINYTEXT':
|
||||
case 'ENUM':
|
||||
case 'VARCHAR':
|
||||
case 'TINYBLOB':
|
||||
case 'TINYTEXT':
|
||||
case 'ENUM':
|
||||
case 'SET':
|
||||
if ($len <= $this->blobSize) return 'C';
|
||||
|
||||
|
||||
case 'TEXT':
|
||||
case 'LONGTEXT':
|
||||
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 '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 'INT':
|
||||
case 'INTEGER': return $is_serial ? 'R' : 'I';
|
||||
case 'TINYINT': return $is_serial ? 'R' : 'I1';
|
||||
case 'SMALLINT': return $is_serial ? 'R' : 'I2';
|
||||
@ -82,33 +82,33 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
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';
|
||||
@ -117,7 +117,7 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
if ($fconstraint) $suffix .= ' '.$fconstraint;
|
||||
return $suffix;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
|
||||
[table_options] [select_statement]
|
||||
@ -133,16 +133,16 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
[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);
|
||||
@ -150,11 +150,11 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
if ( isset($idxoptions['DROP']) )
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
if ( empty ($flds) ) {
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
if (isset($idxoptions['FULLTEXT'])) {
|
||||
$unique = ' FULLTEXT';
|
||||
} elseif (isset($idxoptions['UNIQUE'])) {
|
||||
@ -162,19 +162,19 @@ class ADODB2_mysql extends ADODB_DataDict {
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
|
@ -2,26 +2,26 @@
|
||||
|
||||
/**
|
||||
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,
|
||||
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
|
||||
|
||||
|
||||
function MetaType($t,$len=-1,$fieldobj=false)
|
||||
{
|
||||
if (is_object($t)) {
|
||||
@ -29,9 +29,9 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
$t = $fieldobj->type;
|
||||
$len = $fieldobj->max_length;
|
||||
}
|
||||
$is_serial = is_object($fieldobj) && $fieldobj->primary_key && $fieldobj->unique &&
|
||||
$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':
|
||||
@ -40,83 +40,83 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
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 'SMALLINT':
|
||||
case 'INT2': return !$is_serial ? 'I2' : 'R';
|
||||
case 'INT4': return !$is_serial ? 'I4' : 'R';
|
||||
case 'BIGINT':
|
||||
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
|
||||
* Adding a new Column
|
||||
*
|
||||
* reimplementation of the default function as postgres does NOT allow to set the default in the same statement
|
||||
*
|
||||
@ -139,7 +139,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
$sql[] = $alter . str_replace('DEFAULT '.$default,'',$v);
|
||||
$sql[] = 'UPDATE '.$tabname.' SET '.$colname.'='.$default;
|
||||
$sql[] = 'ALTER TABLE '.$tabname.' ALTER COLUMN '.$colname.' SET DEFAULT ' . $default;
|
||||
} else {
|
||||
} else {
|
||||
$sql[] = $alter . $v;
|
||||
}
|
||||
if ($not_null) {
|
||||
@ -149,7 +149,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
}
|
||||
return $sql;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Change the definition of one column
|
||||
*
|
||||
@ -169,7 +169,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
}
|
||||
return $this->_recreate_copy_table($tabname,False,$tableflds,$tableoptions);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Drop one column
|
||||
*
|
||||
@ -193,7 +193,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
}
|
||||
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
|
||||
*
|
||||
@ -213,7 +213,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
foreach(($meta=$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) &&
|
||||
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')";
|
||||
} elseif (preg_match('/'.$fld->name.' ([\w]+)/i',$tableflds,$matches) &&
|
||||
@ -229,7 +229,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
$copyflds[] = $fld->name;
|
||||
}
|
||||
// identify the sequence name and the fld its on
|
||||
if ($fld->primary_key && $fld->has_default &&
|
||||
if ($fld->primary_key && $fld->has_default &&
|
||||
preg_match("/nextval\('([^']+)'::(text|regclass)\)/",$fld->default_value,$matches)) {
|
||||
$seq_name = $matches[1];
|
||||
$seq_fld = $fld->name;
|
||||
@ -237,7 +237,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
}
|
||||
}
|
||||
$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";
|
||||
@ -260,19 +260,19 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
$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)
|
||||
function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
|
||||
{
|
||||
if ($fautoinc) {
|
||||
$ftype = 'SERIAL';
|
||||
@ -284,7 +284,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
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!!!
|
||||
@ -300,7 +300,7 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
}
|
||||
return "DROP SEQUENCE ".$seq;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
|
||||
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
|
||||
@ -324,8 +324,8 @@ class ADODB2_postgres extends ADODB_DataDict {
|
||||
[ 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 ] [, ...] )
|
||||
@ -337,32 +337,32 @@ CREATE [ UNIQUE ] INDEX index_name ON table
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user