Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
1ddb9159
Commit
1ddb9159
authored
May 30, 2006
by
doctrine
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added a folder remotely
parent
0042b669
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
1122 additions
and
0 deletions
+1122
-0
adodb-datadict.inc.php
Doctrine/adodb-hack/adodb-datadict.inc.php
+1072
-0
adodb.inc.php
Doctrine/adodb-hack/adodb.inc.php
+50
-0
No files found.
Doctrine/adodb-hack/adodb-datadict.inc.php
0 → 100644
View file @
1ddb9159
<?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.
DOCUMENTATION:
See adodb/tests/test-datadict.php for docs and examples.
Modified 3 October, 2005 for use with ADOdb Lite by Mark Dickenson
*/
/*
Test script for parser
*/
// security - hide paths
if
(
!
defined
(
'ADODB_DIR'
))
die
();
if
(
!
function_exists
(
'ctype_alnum'
))
{
function
ctype_alnum
(
$text
)
{
return
preg_match
(
'/^[a-z0-9]*$/i'
,
$text
);
}
}
function
_array_change_key_case
(
$an_array
)
{
if
(
is_array
(
$an_array
))
{
$new_array
=
array
();
foreach
(
$an_array
as
$key
=>
$value
)
$new_array
[
strtoupper
(
$key
)]
=
$value
;
return
$new_array
;
}
return
$an_array
;
}
/**
Parse arguments, treat "text" (text) and 'text' as quotation marks.
To escape, use "" or '' or ))
Will read in "abc def" sans quotes, as: abc def
Same with 'abc def'.
However if `abc def`, then will read in as `abc def`
@param endstmtchar Character that indicates end of statement
@param tokenchars Include the following characters in tokens apart from A-Z and 0-9
@returns 2 dimensional array containing parsed tokens.
*/
function
Lens_ParseArgs
(
$args
,
$endstmtchar
=
','
,
$tokenchars
=
'_.-'
)
{
$pos
=
0
;
$intoken
=
false
;
$stmtno
=
0
;
$endquote
=
false
;
$tokens
=
array
();
$tokens
[
$stmtno
]
=
array
();
$max
=
strlen
(
$args
);
$quoted
=
false
;
while
(
$pos
<
$max
)
{
$ch
=
substr
(
$args
,
$pos
,
1
);
switch
(
$ch
)
{
case
' '
:
case
"
\t
"
:
case
"
\n
"
:
case
"
\r
"
:
if
(
!
$quoted
)
{
if
(
$intoken
)
{
$intoken
=
false
;
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
}
break
;
}
$tokarr
[]
=
$ch
;
break
;
case
'`'
:
if
(
$intoken
)
$tokarr
[]
=
$ch
;
case
'('
:
case
')'
:
case
'"'
:
case
"'"
:
if
(
$intoken
)
{
if
(
empty
(
$endquote
))
{
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
if
(
$ch
==
'('
)
$endquote
=
')'
;
else
$endquote
=
$ch
;
$quoted
=
true
;
$intoken
=
true
;
$tokarr
=
array
();
}
else
if
(
$endquote
==
$ch
)
{
$ch2
=
substr
(
$args
,
$pos
+
1
,
1
);
if
(
$ch2
==
$endquote
)
{
$pos
+=
1
;
$tokarr
[]
=
$ch2
;
}
else
{
$quoted
=
false
;
$intoken
=
false
;
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
$endquote
=
''
;
}
}
else
$tokarr
[]
=
$ch
;
}
else
{
if
(
$ch
==
'('
)
$endquote
=
')'
;
else
$endquote
=
$ch
;
$quoted
=
true
;
$intoken
=
true
;
$tokarr
=
array
();
if
(
$ch
==
'`'
)
$tokarr
[]
=
'`'
;
}
break
;
default
:
if
(
!
$intoken
)
{
if
(
$ch
==
$endstmtchar
)
{
$stmtno
+=
1
;
$tokens
[
$stmtno
]
=
array
();
break
;
}
$intoken
=
true
;
$quoted
=
false
;
$endquote
=
false
;
$tokarr
=
array
();
}
if
(
$quoted
)
$tokarr
[]
=
$ch
;
else
if
(
ctype_alnum
(
$ch
)
||
strpos
(
$tokenchars
,
$ch
)
!==
false
)
$tokarr
[]
=
$ch
;
else
{
if
(
$ch
==
$endstmtchar
)
{
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
$stmtno
+=
1
;
$tokens
[
$stmtno
]
=
array
();
$intoken
=
false
;
$tokarr
=
array
();
break
;
}
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
$tokens
[
$stmtno
][]
=
$ch
;
$intoken
=
false
;
}
}
$pos
+=
1
;
}
if
(
$intoken
)
$tokens
[
$stmtno
][]
=
implode
(
''
,
$tokarr
);
return
$tokens
;
}
class
ADODB_DataDict
{
var
$connection
;
var
$debug
=
false
;
var
$dropTable
=
'DROP TABLE %s'
;
var
$renameTable
=
'RENAME TABLE %s TO %s'
;
var
$dropIndex
=
'DROP INDEX %s'
;
var
$addCol
=
' ADD'
;
var
$alterCol
=
' ALTER COLUMN'
;
var
$dropCol
=
' DROP COLUMN'
;
var
$renameColumn
=
'ALTER TABLE %s RENAME COLUMN %s TO %s'
;
// table, old-column, new-column, column-definitions (not used by default)
var
$nameRegex
=
'\w'
;
var
$nameRegexBrackets
=
'a-zA-Z0-9_\(\)'
;
var
$schema
=
false
;
var
$serverInfo
=
array
();
var
$autoIncrement
=
false
;
var
$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.
var
$metaTablesSQL
;
var
$metaColumnsSQL
;
var
$debug_echo
=
true
;
var
$fetchMode
;
var
$raiseErrorFn
;
function
SetFetchMode
(
$mode
)
{
GLOBAL
$ADODB_FETCH_MODE
;
$old
=
$ADODB_FETCH_MODE
;
$ADODB_FETCH_MODE
=
$mode
;
return
$old
;
}
function
outp
(
$text
)
{
$this
->
debug_output
=
"<br>
\n
("
.
$this
->
dbtype
.
"): "
.
htmlspecialchars
(
$text
)
.
"<br>
\n
"
;
if
(
$this
->
debug_echo
)
echo
$this
->
debug_output
;
}
function
GetCommentSQL
(
$table
,
$col
)
{
return
false
;
}
function
SetCommentSQL
(
$table
,
$col
,
$cmt
)
{
return
false
;
}
/**
* @param ttype can either be 'VIEW' or 'TABLE' or false.
* If false, both views and tables are returned.
* "VIEW" returns only views
* "TABLE" returns only tables
* @param showSchema returns the schema/user with the table name, eg. USER.TABLE
* @param mask is the input mask - only supported by oci8 and postgresql
*
* @return array of tables for current database.
*/
function
MetaTables
()
{
global
$ADODB_FETCH_MODE
;
$false
=
false
;
if
(
$mask
)
{
return
$false
;
}
if
(
$this
->
metaTablesSQL
)
{
$save
=
$ADODB_FETCH_MODE
;
$ADODB_FETCH_MODE
=
ADODB_FETCH_NUM
;
if
(
$this
->
fetchMode
!==
false
)
$savem
=
$this
->
SetFetchMode
(
false
);
$rs
=
$this
->
Execute
(
$this
->
metaTablesSQL
);
if
(
isset
(
$savem
))
$this
->
SetFetchMode
(
$savem
);
$ADODB_FETCH_MODE
=
$save
;
if
(
$rs
===
false
)
return
$false
;
$arr
=&
$rs
->
GetArray
();
$arr2
=
array
();
if
(
$hast
=
(
$ttype
&&
isset
(
$arr
[
0
][
1
])))
{
$showt
=
strncmp
(
$ttype
,
'T'
,
1
);
}
for
(
$i
=
0
;
$i
<
sizeof
(
$arr
);
$i
++
)
{
if
(
$hast
)
{
if
(
$showt
==
0
)
{
if
(
strncmp
(
$arr
[
$i
][
1
],
'T'
,
1
)
==
0
)
$arr2
[]
=
trim
(
$arr
[
$i
][
0
]);
}
else
{
if
(
strncmp
(
$arr
[
$i
][
1
],
'V'
,
1
)
==
0
)
$arr2
[]
=
trim
(
$arr
[
$i
][
0
]);
}
}
else
$arr2
[]
=
trim
(
$arr
[
$i
][
0
]);
}
$rs
->
Close
();
return
$arr2
;
}
return
$false
;
}
/**
* 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
)
{
global
$ADODB_FETCH_MODE
;
$false
=
false
;
if
(
!
empty
(
$this
->
metaColumnsSQL
))
{
$schema
=
false
;
$this
->
_findschema
(
$table
,
$schema
);
$save
=
$ADODB_FETCH_MODE
;
$ADODB_FETCH_MODE
=
ADODB_FETCH_NUM
;
if
(
$this
->
fetchMode
!==
false
)
$savem
=
$this
->
SetFetchMode
(
false
);
$stmt
=
$this
->
connection
->
query
(
sprintf
(
$this
->
metaColumnsSQL
,(
$upper
)
?
strtoupper
(
$table
)
:
$table
));
if
(
isset
(
$savem
))
$this
->
SetFetchMode
(
$savem
);
$ADODB_FETCH_MODE
=
$save
;
if
(
$stmt
===
false
)
return
$false
;
$retarr
=
array
();
while
(
$rs
=
$stmt
->
fetch
(
PDO
::
FETCH_NUM
))
{
$fld
=
new
ADOFieldObject
();
$fld
->
name
=
$rs
[
0
];
$fld
->
type
=
$rs
[
1
];
if
(
isset
(
$rs
[
3
])
&&
$rs
[
3
])
{
if
(
$rs
[
3
]
>
0
)
$fld
->
max_length
=
$rs
[
3
];
$fld
->
scale
=
$rs
[
4
];
if
(
$fld
->
scale
>
0
)
$fld
->
max_length
+=
1
;
}
else
$fld
->
max_length
=
$rs
[
2
];
if
(
$ADODB_FETCH_MODE
==
ADODB_FETCH_NUM
)
$retarr
[]
=
$fld
;
else
$retarr
[
strtoupper
(
$fld
->
name
)]
=
$fld
;
}
$stmt
->
closeCursor
();
return
$retarr
;
}
return
$false
;
}
function
_findschema
(
&
$table
,
&
$schema
)
{
if
(
!
$schema
&&
(
$at
=
strpos
(
$table
,
'.'
))
!==
false
)
{
$schema
=
substr
(
$table
,
0
,
$at
);
$table
=
substr
(
$table
,
$at
+
1
);
}
}
/**
* @returns an array with the primary key columns in it.
*/
function
MetaPrimaryKeys
(
$tab
,
$owner
=
false
,
$intkey
=
false
)
{
// owner not used in base class - see oci8
$p
=
array
();
$objs
=&
$this
->
MetaColumns
(
$table
);
if
(
$objs
)
{
foreach
(
$objs
as
$v
)
{
if
(
!
empty
(
$v
->
primary_key
))
$p
[]
=
$v
->
name
;
}
}
if
(
sizeof
(
$p
))
return
$p
;
if
(
function_exists
(
'ADODB_VIEW_PRIMARYKEYS'
))
return
ADODB_VIEW_PRIMARYKEYS
(
$this
->
databaseType
,
$this
->
database
,
$table
,
$owner
);
return
false
;
}
/**
* List indexes on a table as an array.
* @param table table name to query
* @param primary true to only show primary keys. Not actually used for most databases
*
* @return array of indexes on current table. Each element represents an index, and is itself an associative array.
Array (
[name_of_index] => Array
(
[unique] => true or false
[columns] => Array
(
[0] => firstname
[1] => lastname
)
)
*/
function
MetaIndexes
(
$table
,
$primary
=
false
,
$owner
=
false
)
{
$false
=
false
;
return
$false
;
}
function
MetaType
(
$t
,
$len
=-
1
,
$fieldobj
=
false
)
{
if
(
is_object
(
$t
))
{
$fieldobj
=
$t
;
$t
=
$fieldobj
->
type
;
$len
=
$fieldobj
->
max_length
;
}
// changed in 2.32 to hashing instead of switch stmt for speed...
static
$typeMap
=
array
(
'VARCHAR'
=>
'C'
,
'VARCHAR2'
=>
'C'
,
'CHAR'
=>
'C'
,
'C'
=>
'C'
,
'STRING'
=>
'C'
,
'NCHAR'
=>
'C'
,
'NVARCHAR'
=>
'C'
,
'VARYING'
=>
'C'
,
'BPCHAR'
=>
'C'
,
'CHARACTER'
=>
'C'
,
'INTERVAL'
=>
'C'
,
# Postgres
##
'LONGCHAR'
=>
'X'
,
'TEXT'
=>
'X'
,
'NTEXT'
=>
'X'
,
'M'
=>
'X'
,
'X'
=>
'X'
,
'CLOB'
=>
'X'
,
'NCLOB'
=>
'X'
,
'LVARCHAR'
=>
'X'
,
##
'BLOB'
=>
'B'
,
'IMAGE'
=>
'B'
,
'BINARY'
=>
'B'
,
'VARBINARY'
=>
'B'
,
'LONGBINARY'
=>
'B'
,
'B'
=>
'B'
,
##
'YEAR'
=>
'D'
,
// mysql
'DATE'
=>
'D'
,
'D'
=>
'D'
,
##
'TIME'
=>
'T'
,
'TIMESTAMP'
=>
'T'
,
'DATETIME'
=>
'T'
,
'TIMESTAMPTZ'
=>
'T'
,
'T'
=>
'T'
,
##
'BOOL'
=>
'L'
,
'BOOLEAN'
=>
'L'
,
'BIT'
=>
'L'
,
'L'
=>
'L'
,
##
'COUNTER'
=>
'R'
,
'R'
=>
'R'
,
'SERIAL'
=>
'R'
,
// ifx
'INT IDENTITY'
=>
'R'
,
##
'INT'
=>
'I'
,
'INT2'
=>
'I'
,
'INT4'
=>
'I'
,
'INT8'
=>
'I'
,
'INTEGER'
=>
'I'
,
'INTEGER UNSIGNED'
=>
'I'
,
'SHORT'
=>
'I'
,
'TINYINT'
=>
'I'
,
'SMALLINT'
=>
'I'
,
'I'
=>
'I'
,
##
'LONG'
=>
'N'
,
// interbase is numeric, oci8 is blob
'BIGINT'
=>
'N'
,
// this is bigger than PHP 32-bit integers
'DECIMAL'
=>
'N'
,
'DEC'
=>
'N'
,
'REAL'
=>
'N'
,
'DOUBLE'
=>
'N'
,
'DOUBLE PRECISION'
=>
'N'
,
'SMALLFLOAT'
=>
'N'
,
'FLOAT'
=>
'N'
,
'NUMBER'
=>
'N'
,
'NUM'
=>
'N'
,
'NUMERIC'
=>
'N'
,
'MONEY'
=>
'N'
,
## informix 9.2
'SQLINT'
=>
'I'
,
'SQLSERIAL'
=>
'I'
,
'SQLSMINT'
=>
'I'
,
'SQLSMFLOAT'
=>
'N'
,
'SQLFLOAT'
=>
'N'
,
'SQLMONEY'
=>
'N'
,
'SQLDECIMAL'
=>
'N'
,
'SQLDATE'
=>
'D'
,
'SQLVCHAR'
=>
'C'
,
'SQLCHAR'
=>
'C'
,
'SQLDTIME'
=>
'T'
,
'SQLINTERVAL'
=>
'N'
,
'SQLBYTES'
=>
'B'
,
'SQLTEXT'
=>
'X'
);
$tmap
=
false
;
$t
=
strtoupper
(
$t
);
$tmap
=
(
isset
(
$typeMap
[
$t
]))
?
$typeMap
[
$t
]
:
'N'
;
switch
(
$tmap
)
{
case
'C'
:
// is the char field is too long, return as text field...
if
(
$this
->
blobSize
>=
0
)
{
if
(
$len
>
$this
->
blobSize
)
return
'X'
;
}
else
if
(
$len
>
250
)
{
return
'X'
;
}
return
'C'
;
case
'I'
:
if
(
!
empty
(
$fieldobj
->
primary_key
))
return
'R'
;
return
'I'
;
case
false
:
return
'N'
;
case
'B'
:
if
(
isset
(
$fieldobj
->
binary
))
return
(
$fieldobj
->
binary
)
?
'B'
:
'X'
;
return
'B'
;
case
'D'
:
if
(
!
empty
(
$this
->
datetime
))
return
'T'
;
return
'D'
;
default
:
if
(
$t
==
'LONG'
&&
$this
->
dataProvider
==
'oci8'
)
return
'B'
;
return
$tmap
;
}
}
function
NameQuote
(
$name
=
NULL
,
$allowBrackets
=
false
)
{
if
(
!
is_string
(
$name
))
{
return
FALSE
;
}
$name
=
trim
(
$name
);
if
(
!
is_object
(
$this
->
connection
)
)
{
return
$name
;
}
$quote
=
"'"
;
// if name is of the form `name`, quote it
if
(
preg_match
(
'/^`(.+)`$/'
,
$name
,
$matches
)
)
{
return
$quote
.
$matches
[
1
]
.
$quote
;
}
// if name contains special characters, quote it
$regex
=
(
$allowBrackets
)
?
$this
->
nameRegexBrackets
:
$this
->
nameRegex
;
if
(
!
preg_match
(
'/^['
.
$regex
.
']+$/'
,
$name
)
)
{
return
$quote
.
$name
.
$quote
;
}
return
$name
;
}
function
TableName
(
$name
)
{
if
(
$this
->
schema
)
{
return
$this
->
NameQuote
(
$this
->
schema
)
.
'.'
.
$this
->
NameQuote
(
$name
);
}
return
$this
->
NameQuote
(
$name
);
}
// Executes the sql array returned by GetTableSQL and GetIndexSQL
function
ExecuteSQLArray
(
$sql
,
$continueOnError
=
true
)
{
$rez
=
2
;
$conn
=
&
$this
->
connection
;
$saved
=
$conn
->
debug
;
foreach
(
$sql
as
$line
)
{
if
(
$this
->
debug
)
$conn
->
debug
=
true
;
$ok
=
$conn
->
Execute
(
$line
);
$conn
->
debug
=
$saved
;
if
(
!
$ok
)
{
if
(
$this
->
debug
)
$this
->
outp
(
$conn
->
ErrorMsg
());
if
(
!
$continueOnError
)
return
0
;
$rez
=
1
;
}
}
return
$rez
;
}
/*
Returns the actual type given a character code.
C: varchar
X: CLOB (character large object) or largest varchar size if CLOB is not supported
C2: Multibyte varchar
X2: Multibyte CLOB
B: BLOB (binary large object)
D: Date
T: Date-time
L: Integer field suitable for storing booleans (0 or 1)
I: Integer
F: Floating point number
N: Numeric or decimal number
*/
function
ActualType
(
$meta
)
{
return
$meta
;
}
function
CreateDatabase
(
$dbname
,
$options
=
false
)
{
$options
=
$this
->
_Options
(
$options
);
$sql
=
array
();
$s
=
'CREATE DATABASE '
.
$this
->
NameQuote
(
$dbname
);
if
(
isset
(
$options
[
$this
->
upperName
]))
$s
.=
' '
.
$options
[
$this
->
upperName
];
$sql
[]
=
$s
;
return
$sql
;
}
/*
Generates the SQL to create index. Returns an array of sql strings.
*/
function
CreateIndexSQL
(
$idxname
,
$tabname
,
$flds
,
$idxoptions
=
false
)
{
if
(
!
is_array
(
$flds
))
{
$flds
=
explode
(
','
,
$flds
);
}
foreach
(
$flds
as
$key
=>
$fld
)
{
# some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32)
$flds
[
$key
]
=
$this
->
NameQuote
(
$fld
,
$allowBrackets
=
true
);
}
return
$this
->
_IndexSQL
(
$this
->
NameQuote
(
$idxname
),
$this
->
TableName
(
$tabname
),
$flds
,
$this
->
_Options
(
$idxoptions
));
}
function
DropIndexSQL
(
$idxname
,
$tabname
=
NULL
)
{
return
array
(
sprintf
(
$this
->
dropIndex
,
$this
->
NameQuote
(
$idxname
),
$this
->
TableName
(
$tabname
)));
}
function
SetSchema
(
$schema
)
{
$this
->
schema
=
$schema
;
}
function
AddColumnSQL
(
$tabname
,
$flds
)
{
$tabname
=
$this
->
TableName
(
$tabname
);
$sql
=
array
();
list
(
$lines
,
$pkey
)
=
$this
->
_GenFields
(
$flds
);
$alter
=
'ALTER TABLE '
.
$tabname
.
$this
->
addCol
.
' '
;
foreach
(
$lines
as
$v
)
{
$sql
[]
=
$alter
.
$v
;
}
return
$sql
;
}
/**
* Change the definition of one column
*
* As some DBM's can't do that on there own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds='' complete defintion of the new table, eg. for postgres, default ''
* @param array/string $tableoptions='' options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function
AlterColumnSQL
(
$tabname
,
$flds
,
$tableflds
=
''
,
$tableoptions
=
''
)
{
$tabname
=
$this
->
TableName
(
$tabname
);
$sql
=
array
();
list
(
$lines
,
$pkey
)
=
$this
->
_GenFields
(
$flds
);
$alter
=
'ALTER TABLE '
.
$tabname
.
$this
->
alterCol
.
' '
;
foreach
(
$lines
as
$v
)
{
$sql
[]
=
$alter
.
$v
;
}
return
$sql
;
}
/**
* Rename one column
*
* Some DBM's can only do this together with changeing the type of the column (even if that stays the same, eg. mysql)
* @param string $tabname table-name
* @param string $oldcolumn column-name to be renamed
* @param string $newcolumn new column-name
* @param string $flds='' complete column-defintion-string like for AddColumnSQL, only used by mysql atm., default=''
* @return array with SQL strings
*/
function
RenameColumnSQL
(
$tabname
,
$oldcolumn
,
$newcolumn
,
$flds
=
''
)
{
$tabname
=
$this
->
TableName
(
$tabname
);
if
(
$flds
)
{
list
(
$lines
,
$pkey
)
=
$this
->
_GenFields
(
$flds
);
list
(,
$first
)
=
each
(
$lines
);
list
(,
$column_def
)
=
split
(
"[
\t
]+"
,
$first
,
2
);
}
return
array
(
sprintf
(
$this
->
renameColumn
,
$tabname
,
$this
->
NameQuote
(
$oldcolumn
),
$this
->
NameQuote
(
$newcolumn
),
$column_def
));
}
/**
* Drop one column
*
* Some DBM's can't do that on there own, you need to supply the complete defintion of the new table,
* to allow, recreating the table and copying the content over to the new table
* @param string $tabname table-name
* @param string $flds column-name and type for the changed column
* @param string $tableflds='' complete defintion of the new table, eg. for postgres, default ''
* @param array/string $tableoptions='' options for the new table see CreateTableSQL, default ''
* @return array with SQL strings
*/
function
DropColumnSQL
(
$tabname
,
$flds
,
$tableflds
=
''
,
$tableoptions
=
''
)
{
$tabname
=
$this
->
TableName
(
$tabname
);
if
(
!
is_array
(
$flds
))
$flds
=
explode
(
','
,
$flds
);
$sql
=
array
();
$alter
=
'ALTER TABLE '
.
$tabname
.
$this
->
dropCol
.
' '
;
foreach
(
$flds
as
$v
)
{
$sql
[]
=
$alter
.
$this
->
NameQuote
(
$v
);
}
return
$sql
;
}
function
DropTableSQL
(
$tabname
)
{
return
array
(
sprintf
(
$this
->
dropTable
,
$this
->
TableName
(
$tabname
)));
}
function
RenameTableSQL
(
$tabname
,
$newname
)
{
return
array
(
sprintf
(
$this
->
renameTable
,
$this
->
TableName
(
$tabname
),
$this
->
TableName
(
$newname
)));
}
/*
Generate the SQL to create table. Returns an array of sql strings.
*/
function
CreateTableSQL
(
$tabname
,
$flds
,
$tableoptions
=
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
))
{
$padding
=
' '
;
$txt
=
$flds
.
$padding
;
$flds
=
array
();
$flds0
=
Lens_ParseArgs
(
$txt
,
','
);
$hasparam
=
false
;
foreach
(
$flds0
as
$f0
)
{
$f1
=
array
();
foreach
(
$f0
as
$token
)
{
switch
(
strtoupper
(
$token
))
{
case
'CONSTRAINT'
:
case
'DEFAULT'
:
$hasparam
=
$token
;
break
;
default
:
if
(
$hasparam
)
$f1
[
$hasparam
]
=
$token
;
else
$f1
[]
=
$token
;
$hasparam
=
false
;
break
;
}
}
$flds
[]
=
$f1
;
}
}
$this
->
autoIncrement
=
false
;
$lines
=
array
();
$pkey
=
array
();
foreach
(
$flds
as
$fld
)
{
$fld
=
_array_change_key_case
(
$fld
);
$fname
=
false
;
$fdefault
=
false
;
$fautoinc
=
false
;
$ftype
=
false
;
$fsize
=
false
;
$fprec
=
false
;
$fprimary
=
false
;
$fnoquote
=
false
;
$fdefts
=
false
;
$fdefdate
=
false
;
$fconstraint
=
false
;
$fnotnull
=
false
;
$funsigned
=
false
;
//-----------------
// Parse attributes
foreach
(
$fld
as
$attr
=>
$v
)
{
if
(
$attr
==
2
&&
is_numeric
(
$v
))
$attr
=
'SIZE'
;
else
if
(
is_numeric
(
$attr
)
&&
$attr
>
1
&&
!
is_numeric
(
$v
))
$attr
=
strtoupper
(
$v
);
switch
(
$attr
)
{
case
'0'
:
case
'NAME'
:
$fname
=
$v
;
break
;
case
'1'
:
case
'TYPE'
:
$ty
=
$v
;
$ftype
=
$this
->
ActualType
(
strtoupper
(
$v
));
break
;
case
'SIZE'
:
$dotat
=
strpos
(
$v
,
'.'
);
if
(
$dotat
===
false
)
$dotat
=
strpos
(
$v
,
','
);
if
(
$dotat
===
false
)
$fsize
=
$v
;
else
{
$fsize
=
substr
(
$v
,
0
,
$dotat
);
$fprec
=
substr
(
$v
,
$dotat
+
1
);
}
break
;
case
'UNSIGNED'
:
$funsigned
=
true
;
break
;
case
'AUTOINCREMENT'
:
case
'AUTO'
:
$fautoinc
=
true
;
$fnotnull
=
true
;
break
;
case
'KEY'
:
case
'PRIMARY'
:
$fprimary
=
$v
;
$fnotnull
=
true
;
break
;
case
'DEF'
:
case
'DEFAULT'
:
$fdefault
=
$v
;
break
;
case
'NOTNULL'
:
$fnotnull
=
$v
;
break
;
case
'NOQUOTE'
:
$fnoquote
=
$v
;
break
;
case
'DEFDATE'
:
$fdefdate
=
$v
;
break
;
case
'DEFTIMESTAMP'
:
$fdefts
=
$v
;
break
;
case
'CONSTRAINT'
:
$fconstraint
=
$v
;
break
;
}
}
//--------------------
// VALIDATE FIELD INFO
if
(
!
strlen
(
$fname
))
{
if
(
$this
->
debug
)
$this
->
outp
(
"Undefined NAME"
);
return
false
;
}
$fid
=
strtoupper
(
preg_replace
(
'/^`(.+)`$/'
,
'$1'
,
$fname
));
$fname
=
$this
->
NameQuote
(
$fname
);
if
(
!
strlen
(
$ftype
))
{
if
(
$this
->
debug
)
$this
->
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
)
{
if
(
substr
(
$this
->
dbtype
,
0
,
5
)
==
'mysql'
)
{
$ftype
=
'TIMESTAMP'
;
}
else
{
$fdefault
=
$this
->
connection
->
sysTimeStamp
;
}
}
else
if
(
$fdefdate
)
{
if
(
substr
(
$this
->
dbtype
,
0
,
5
)
==
'mysql'
)
{
$ftype
=
'TIMESTAMP'
;
}
else
{
$fdefault
=
$this
->
connection
->
sysDate
;
}
}
else
if
(
$fdefault
!==
false
&&
!
$fnoquote
)
if
(
$ty
==
'C'
or
$ty
==
'X'
or
(
substr
(
$fdefault
,
0
,
1
)
!=
"'"
&&
!
is_numeric
(
$fdefault
)))
if
(
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
);
}
/*
GENERATE THE SIZE PART OF THE DATATYPE
$ftype is the actual type
$ty is the type defined originally in the DDL
*/
function
_GetSize
(
$ftype
,
$ty
,
$fsize
,
$fprec
)
{
if
(
strlen
(
$fsize
)
&&
$ty
!=
'X'
&&
$ty
!=
'B'
&&
strpos
(
$ftype
,
'('
)
===
false
)
{
$ftype
.=
"("
.
$fsize
;
if
(
strlen
(
$fprec
))
$ftype
.=
","
.
$fprec
;
$ftype
.=
')'
;
}
return
$ftype
;
}
// return string must begin with space
function
_CreateSuffix
(
$fname
,
$ftype
,
$fnotnull
,
$fdefault
,
$fautoinc
,
$fconstraint
)
{
$suffix
=
''
;
if
(
strlen
(
$fdefault
))
$suffix
.=
" DEFAULT
$fdefault
"
;
if
(
$fnotnull
)
$suffix
.=
' NOT NULL'
;
if
(
$fconstraint
)
$suffix
.=
' '
.
$fconstraint
;
return
$suffix
;
}
function
_IndexSQL
(
$idxname
,
$tabname
,
$flds
,
$idxoptions
)
{
$sql
=
array
();
if
(
isset
(
$idxoptions
[
'REPLACE'
])
||
isset
(
$idxoptions
[
'DROP'
])
)
{
$sql
[]
=
sprintf
(
$this
->
dropIndex
,
$idxname
);
if
(
isset
(
$idxoptions
[
'DROP'
])
)
return
$sql
;
}
if
(
empty
(
$flds
)
)
{
return
$sql
;
}
$unique
=
isset
(
$idxoptions
[
'UNIQUE'
])
?
' UNIQUE'
:
''
;
$s
=
'CREATE'
.
$unique
.
' INDEX '
.
$idxname
.
' ON '
.
$tabname
.
' '
;
if
(
isset
(
$idxoptions
[
$this
->
upperName
])
)
$s
.=
$idxoptions
[
$this
->
upperName
];
if
(
is_array
(
$flds
)
)
$flds
=
implode
(
', '
,
$flds
);
$s
.=
'('
.
$flds
.
')'
;
$sql
[]
=
$s
;
return
$sql
;
}
function
_DropAutoIncrement
(
$tabname
)
{
return
false
;
}
function
_TableSQL
(
$tabname
,
$lines
,
$pkey
,
$tableoptions
)
{
$sql
=
array
();
if
(
isset
(
$tableoptions
[
'REPLACE'
])
||
isset
(
$tableoptions
[
'DROP'
]))
{
$sql
[]
=
sprintf
(
$this
->
dropTable
,
$tabname
);
if
(
$this
->
autoIncrement
)
{
$sInc
=
$this
->
_DropAutoIncrement
(
$tabname
);
if
(
$sInc
)
$sql
[]
=
$sInc
;
}
if
(
isset
(
$tableoptions
[
'DROP'
])
)
{
return
$sql
;
}
}
$s
=
"CREATE TABLE
$tabname
(
\n
"
;
$s
.=
implode
(
",
\n
"
,
$lines
);
if
(
sizeof
(
$pkey
)
>
0
)
{
$s
.=
",
\n
PRIMARY KEY ("
;
$s
.=
implode
(
", "
,
$pkey
)
.
")"
;
}
if
(
isset
(
$tableoptions
[
'CONSTRAINTS'
]))
$s
.=
"
\n
"
.
$tableoptions
[
'CONSTRAINTS'
];
if
(
isset
(
$tableoptions
[
$this
->
upperName
.
'_CONSTRAINTS'
]))
$s
.=
"
\n
"
.
$tableoptions
[
$this
->
upperName
.
'_CONSTRAINTS'
];
$s
.=
"
\n
)"
;
if
(
isset
(
$tableoptions
[
$this
->
upperName
]))
$s
.=
$tableoptions
[
$this
->
upperName
];
$sql
[]
=
$s
;
return
$sql
;
}
/*
GENERATE TRIGGERS IF NEEDED
used when table has auto-incrementing field that is emulated using triggers
*/
function
_Triggers
(
$tabname
,
$taboptions
)
{
return
array
();
}
/*
Sanitize options, so that array elements with no keys are promoted to keys
*/
function
_Options
(
$opts
)
{
if
(
!
is_array
(
$opts
))
return
array
();
$newopts
=
array
();
foreach
(
$opts
as
$k
=>
$v
)
{
if
(
is_numeric
(
$k
))
$newopts
[
strtoupper
(
$v
)]
=
$v
;
else
$newopts
[
strtoupper
(
$k
)]
=
$v
;
}
return
$newopts
;
}
/*
"Florian Buzin [ easywe ]" <florian.buzin#easywe.de>
This function changes/adds new fields to your table. You don't
have to know if the col is new or not. It will check on its own.
*/
function
ChangeTableSQL
(
$tablename
,
$flds
,
$tableoptions
=
false
)
{
global
$ADODB_FETCH_MODE
;
$save
=
$ADODB_FETCH_MODE
;
$ADODB_FETCH_MODE
=
ADODB_FETCH_ASSOC
;
if
(
$this
->
fetchMode
!==
false
)
$savem
=
$this
->
SetFetchMode
(
false
);
// check table exists
$save_handler
=
$this
->
raiseErrorFn
;
$this
->
raiseErrorFn
=
''
;
$cols
=
$this
->
MetaColumns
(
$tablename
);
$this
->
raiseErrorFn
=
$save_handler
;
if
(
isset
(
$savem
))
$this
->
SetFetchMode
(
$savem
);
$ADODB_FETCH_MODE
=
$save
;
if
(
empty
(
$cols
))
{
return
$this
->
CreateTableSQL
(
$tablename
,
$flds
,
$tableoptions
);
}
if
(
is_array
(
$flds
))
{
// Cycle through the update fields, comparing
// existing fields to fields to update.
// if the Metatype and size is exactly the
// same, ignore - by Mark Newham
$holdflds
=
array
();
foreach
(
$flds
as
$k
=>
$v
)
{
if
(
isset
(
$cols
[
$k
])
&&
is_object
(
$cols
[
$k
])
)
{
$c
=
$cols
[
$k
];
$ml
=
$c
->
max_length
;
$mt
=
&
$this
->
MetaType
(
$c
->
type
,
$ml
);
if
(
$ml
==
-
1
)
$ml
=
''
;
if
(
$mt
==
'X'
)
$ml
=
$v
[
'SIZE'
];
if
((
$mt
!=
$v
[
'TYPE'
])
||
$ml
!=
$v
[
'SIZE'
])
{
$holdflds
[
$k
]
=
$v
;
}
}
else
{
$holdflds
[
$k
]
=
$v
;
}
}
$flds
=
$holdflds
;
}
// already exists, alter table instead
list
(
$lines
,
$pkey
)
=
$this
->
_GenFields
(
$flds
);
$alter
=
'ALTER TABLE '
.
$this
->
TableName
(
$tablename
);
$sql
=
array
();
foreach
(
$lines
as
$id
=>
$v
)
{
if
(
isset
(
$cols
[
$id
])
&&
is_object
(
$cols
[
$id
])
)
{
$flds
=
Lens_ParseArgs
(
$v
,
','
);
// We are trying to change the size of the field, if not allowed, simply ignore the request.
if
(
$flds
&&
in_array
(
strtoupper
(
substr
(
$flds
[
0
][
1
],
0
,
4
)),
$this
->
invalidResizeTypes4
))
continue
;
$sql
[]
=
$alter
.
$this
->
alterCol
.
' '
.
$v
;
}
else
{
$sql
[]
=
$alter
.
$this
->
addCol
.
' '
.
$v
;
}
}
return
$sql
;
}
}
?>
Doctrine/adodb-hack/adodb.inc.php
0 → 100644
View file @
1ddb9159
<?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
(
PDO
$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
{
var
$name
=
''
;
var
$max_length
=
0
;
var
$type
=
""
;
}
?>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment