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
c8812542
Commit
c8812542
authored
Oct 16, 2007
by
samw3
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed newlines (I had my editor in windoze mode)
parent
d522ba73
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2640 additions
and
2640 deletions
+2640
-2640
Firebird.php
lib/Doctrine/Export/Firebird.php
+539
-539
Frontbase.php
lib/Doctrine/Export/Frontbase.php
+309
-309
Mssql.php
lib/Doctrine/Export/Mssql.php
+252
-252
Mysql.php
lib/Doctrine/Export/Mysql.php
+638
-638
Oracle.php
lib/Doctrine/Export/Oracle.php
+492
-492
Sqlite.php
lib/Doctrine/Export/Sqlite.php
+410
-410
No files found.
lib/Doctrine/Export/Firebird.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Sqlite
* Doctrine_Export_Sqlite
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lorenzo Alberton <l.alberton@quipo.it> (PEAR MDB2 Interbase driver)
* @author Lorenzo Alberton <l.alberton@quipo.it> (PEAR MDB2 Interbase driver)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Firebird
extends
Doctrine_Export
class
Doctrine_Export_Firebird
extends
Doctrine_Export
{
{
/**
/**
* create a new database
* create a new database
*
*
* @param string $name name of the database that should be created
* @param string $name name of the database that should be created
* @return void
* @return void
*/
*/
public
function
createDatabase
(
$name
)
public
function
createDatabase
(
$name
)
{
{
throw
new
Doctrine_Export_Exception
(
throw
new
Doctrine_Export_Exception
(
'PHP Interbase API does not support direct queries. You have to '
.
'PHP Interbase API does not support direct queries. You have to '
.
'create the db manually by using isql command or a similar program'
);
'create the db manually by using isql command or a similar program'
);
}
}
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return void
* @return void
*/
*/
public
function
dropDatabase
(
$name
)
public
function
dropDatabase
(
$name
)
{
{
throw
new
Doctrine_Export_Exception
(
throw
new
Doctrine_Export_Exception
(
'PHP Interbase API does not support direct queries. You have '
.
'PHP Interbase API does not support direct queries. You have '
.
'to drop the db manually by using isql command or a similar program'
);
'to drop the db manually by using isql command or a similar program'
);
}
}
/**
/**
* add an autoincrement sequence + trigger
* add an autoincrement sequence + trigger
*
*
* @param string $name name of the PK field
* @param string $name name of the PK field
* @param string $table name of the table
* @param string $table name of the table
* @param string $start start value for the sequence
* @param string $start start value for the sequence
* @return void
* @return void
*/
*/
public
function
_makeAutoincrement
(
$name
,
$table
,
$start
=
null
)
public
function
_makeAutoincrement
(
$name
,
$table
,
$start
=
null
)
{
{
if
(
is_null
(
$start
))
{
if
(
is_null
(
$start
))
{
$this
->
conn
->
beginTransaction
();
$this
->
conn
->
beginTransaction
();
$query
=
'SELECT MAX('
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
') FROM '
.
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$query
=
'SELECT MAX('
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
') FROM '
.
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$start
=
$this
->
conn
->
fetchOne
(
$query
,
'integer'
);
$start
=
$this
->
conn
->
fetchOne
(
$query
,
'integer'
);
++
$start
;
++
$start
;
$result
=
$this
->
createSequence
(
$table
,
$start
);
$result
=
$this
->
createSequence
(
$table
,
$start
);
$this
->
conn
->
commit
();
$this
->
conn
->
commit
();
}
else
{
}
else
{
$result
=
$this
->
createSequence
(
$table
,
$start
);
$result
=
$this
->
createSequence
(
$table
,
$start
);
}
}
$sequence_name
=
$this
->
conn
->
formatter
->
getSequenceName
(
$table
);
$sequence_name
=
$this
->
conn
->
formatter
->
getSequenceName
(
$table
);
$trigger_name
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AUTOINCREMENT_PK'
,
true
);
$trigger_name
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AUTOINCREMENT_PK'
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$triggerSql
=
'CREATE TRIGGER '
.
$trigger_name
.
' FOR '
.
$table
.
'
$triggerSql
=
'CREATE TRIGGER '
.
$trigger_name
.
' FOR '
.
$table
.
'
ACTIVE BEFORE INSERT POSITION 0
ACTIVE BEFORE INSERT POSITION 0
AS
AS
BEGIN
BEGIN
IF (NEW.'
.
$name
.
' IS NULL OR NEW.'
.
$name
.
' = 0) THEN
IF (NEW.'
.
$name
.
' IS NULL OR NEW.'
.
$name
.
' = 0) THEN
NEW.'
.
$name
.
' = GEN_ID('
.
$sequence_name
.
', 1);
NEW.'
.
$name
.
' = GEN_ID('
.
$sequence_name
.
', 1);
END'
;
END'
;
$result
=
$this
->
conn
->
exec
(
$triggerSql
);
$result
=
$this
->
conn
->
exec
(
$triggerSql
);
// TODO ? $this->_silentCommit();
// TODO ? $this->_silentCommit();
return
$result
;
return
$result
;
}
}
/**
/**
* drop an existing autoincrement sequence + trigger
* drop an existing autoincrement sequence + trigger
*
*
* @param string $table name of the table
* @param string $table name of the table
* @return void
* @return void
*/
*/
public
function
_dropAutoincrement
(
$table
)
public
function
_dropAutoincrement
(
$table
)
{
{
$result
=
$this
->
dropSequence
(
$table
);
$result
=
$this
->
dropSequence
(
$table
);
//remove autoincrement trigger associated with the table
//remove autoincrement trigger associated with the table
$table
=
$this
->
conn
->
quote
(
strtoupper
(
$table
));
$table
=
$this
->
conn
->
quote
(
strtoupper
(
$table
));
$triggerName
=
$this
->
conn
->
quote
(
strtoupper
(
$table
)
.
'_AUTOINCREMENT_PK'
);
$triggerName
=
$this
->
conn
->
quote
(
strtoupper
(
$table
)
.
'_AUTOINCREMENT_PK'
);
return
$this
->
conn
->
exec
(
"DELETE FROM RDB
\$
TRIGGERS WHERE UPPER(RDB
\$
RELATION_NAME)="
.
$table
.
" AND UPPER(RDB
\$
TRIGGER_NAME)="
.
$triggerName
);
return
$this
->
conn
->
exec
(
"DELETE FROM RDB
\$
TRIGGERS WHERE UPPER(RDB
\$
RELATION_NAME)="
.
$table
.
" AND UPPER(RDB
\$
TRIGGER_NAME)="
.
$triggerName
);
}
}
/**
/**
* create a new table
* create a new table
*
*
* @param string $name Name of the database that should be created
* @param string $name Name of the database that should be created
* @param array $fields Associative array that contains the definition of each field of the new table
* @param array $fields Associative array that contains the definition of each field of the new table
* The indexes of the array entries are the names of the fields of the table an
* The indexes of the array entries are the names of the fields of the table an
* the array entry values are associative arrays like those that are meant to be
* the array entry values are associative arrays like those that are meant to be
* passed with the field definitions to get[Type]Declaration() functions.
* passed with the field definitions to get[Type]Declaration() functions.
*
*
* Example
* Example
* array(
* array(
*
*
* 'id' => array(
* 'id' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1,
* 'unsigned' => 1,
* 'notnull' => 1,
* 'notnull' => 1,
* 'default' => 0,
* 'default' => 0,
* ),
* ),
* 'name' => array(
* 'name' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12,
* 'length' => 12,
* ),
* ),
* 'description' => array(
* 'description' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12,
* 'length' => 12,
* )
* )
* );
* );
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
*
*
* @return void
* @return void
*/
*/
public
function
createTable
(
$name
,
array
$fields
,
array
$options
=
array
())
{
public
function
createTable
(
$name
,
array
$fields
,
array
$options
=
array
())
{
parent
::
createTable
(
$name
,
$fields
,
$options
);
parent
::
createTable
(
$name
,
$fields
,
$options
);
// TODO ? $this->_silentCommit();
// TODO ? $this->_silentCommit();
foreach
(
$fields
as
$field_name
=>
$field
)
{
foreach
(
$fields
as
$field_name
=>
$field
)
{
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
//create PK constraint
//create PK constraint
$pk_definition
=
array
(
$pk_definition
=
array
(
'fields'
=>
array
(
$field_name
=>
array
()),
'fields'
=>
array
(
$field_name
=>
array
()),
'primary'
=>
true
,
'primary'
=>
true
,
);
);
//$pk_name = $name.'_PK';
//$pk_name = $name.'_PK';
$pk_name
=
null
;
$pk_name
=
null
;
$result
=
$this
->
createConstraint
(
$name
,
$pk_name
,
$pk_definition
);
$result
=
$this
->
createConstraint
(
$name
,
$pk_name
,
$pk_definition
);
//create autoincrement sequence + trigger
//create autoincrement sequence + trigger
return
$this
->
_makeAutoincrement
(
$field_name
,
$name
,
1
);
return
$this
->
_makeAutoincrement
(
$field_name
,
$name
,
1
);
}
}
}
}
}
}
/**
/**
* Check if planned changes are supported
* Check if planned changes are supported
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return void
* @return void
*/
*/
public
function
checkSupportedChanges
(
&
$changes
)
public
function
checkSupportedChanges
(
&
$changes
)
{
{
foreach
(
$changes
as
$change_name
=>
$change
)
{
foreach
(
$changes
as
$change_name
=>
$change
)
{
switch
(
$change_name
)
{
switch
(
$change_name
)
{
case
'notnull'
:
case
'notnull'
:
throw
new
Doctrine_DataDict_Exception
(
'it is not supported changes to field not null constraint'
);
throw
new
Doctrine_DataDict_Exception
(
'it is not supported changes to field not null constraint'
);
case
'default'
:
case
'default'
:
throw
new
Doctrine_DataDict_Exception
(
'it is not supported changes to field default value'
);
throw
new
Doctrine_DataDict_Exception
(
'it is not supported changes to field default value'
);
case
'length'
:
case
'length'
:
/*
/*
return throw new Doctrine_DataDict_Firebird_Exception('it is not supported changes to field default length');
return throw new Doctrine_DataDict_Firebird_Exception('it is not supported changes to field default length');
*/
*/
case
'unsigned'
:
case
'unsigned'
:
case
'type'
:
case
'type'
:
case
'declaration'
:
case
'declaration'
:
case
'definition'
:
case
'definition'
:
break
;
break
;
default
:
default
:
throw
new
Doctrine_DataDict_Exception
(
'it is not supported change of type'
.
$change_name
);
throw
new
Doctrine_DataDict_Exception
(
'it is not supported change of type'
.
$change_name
);
}
}
}
}
return
true
;
return
true
;
}
}
/**
/**
* drop an existing table
* drop an existing table
*
*
* @param string $name name of the table that should be dropped
* @param string $name name of the table that should be dropped
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
* @access public
*/
*/
public
function
dropTable
(
$name
)
public
function
dropTable
(
$name
)
{
{
$result
=
$this
->
_dropAutoincrement
(
$name
);
$result
=
$this
->
_dropAutoincrement
(
$name
);
$result
=
parent
::
dropTable
(
$name
);
$result
=
parent
::
dropTable
(
$name
);
//$this->_silentCommit();
//$this->_silentCommit();
return
$result
;
return
$result
;
}
}
/**
/**
* alter an existing table
* alter an existing table
*
*
* @param string $name name of the table that is intended to be changed.
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
* changes that are currently supported are defined as follows:
*
*
* name
* name
*
*
* New name for the table.
* New name for the table.
*
*
* add
* add
*
*
* Associative array with the names of fields to be added as
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* of the fields to be added. The properties of the fields should
* be the same as defined by the Metabase parser.
* be the same as defined by the Metabase parser.
*
*
*
*
* remove
* remove
*
*
* Associative array with the names of fields to be removed as indexes
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
* An empty array should be used for future compatibility.
*
*
* rename
* rename
*
*
* Associative array with the names of fields to be renamed as indexes
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
* as it is used in the CREATE TABLE statement.
*
*
* change
* change
*
*
* Associative array with the names of the fields to be changed as indexes
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
* should have the new names of the fields as array indexes.
*
*
* The value of each entry of the array should be set to another associative
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* respective properties. The properties of the fields should be the same
* as defined by the Metabase parser.
* as defined by the Metabase parser.
*
*
* Example
* Example
* array(
* array(
* 'name' => 'userlist',
* 'name' => 'userlist',
* 'add' => array(
* 'add' => array(
* 'quota' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* )
* )
* ),
* ),
* 'remove' => array(
* 'remove' => array(
* 'file_limit' => array(),
* 'file_limit' => array(),
* 'time_limit' => array()
* 'time_limit' => array()
* ),
* ),
* 'change' => array(
* 'change' => array(
* 'name' => array(
* 'name' => array(
* 'length' => '20',
* 'length' => '20',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 20,
* 'length' => 20,
* ),
* ),
* )
* )
* ),
* ),
* 'rename' => array(
* 'rename' => array(
* 'sex' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'name' => 'gender',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 1,
* 'length' => 1,
* 'default' => 'M',
* 'default' => 'M',
* ),
* ),
* )
* )
* )
* )
* )
* )
*
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* actually perform them otherwise.
* @return void
* @return void
*/
*/
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
{
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
case
'remove'
:
case
'remove'
:
case
'rename'
:
case
'rename'
:
break
;
break
;
case
'change'
:
case
'change'
:
foreach
(
$changes
[
'change'
]
as
$field
)
{
foreach
(
$changes
[
'change'
]
as
$field
)
{
$this
->
checkSupportedChanges
(
$field
);
$this
->
checkSupportedChanges
(
$field
);
}
}
break
;
break
;
default
:
default
:
throw
new
Doctrine_DataDict_Exception
(
'change type '
.
$changeName
.
' not yet supported'
);
throw
new
Doctrine_DataDict_Exception
(
'change type '
.
$changeName
.
' not yet supported'
);
}
}
}
}
if
(
$check
)
{
if
(
$check
)
{
return
true
;
return
true
;
}
}
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
}
}
}
}
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
foreach
(
$changes
[
'remove'
]
as
$field_name
=>
$field
)
{
foreach
(
$changes
[
'remove'
]
as
$field_name
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$field_name
,
true
);
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$field_name
,
true
);
$query
.=
'DROP '
.
$field_name
;
$query
.=
'DROP '
.
$field_name
;
}
}
}
}
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
foreach
(
$changes
[
'rename'
]
as
$field_name
=>
$field
)
{
foreach
(
$changes
[
'rename'
]
as
$field_name
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$field_name
,
true
);
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$field_name
,
true
);
$query
.=
'ALTER '
.
$field_name
.
' TO '
.
$this
->
conn
->
quoteIdentifier
(
$field
[
'name'
],
true
);
$query
.=
'ALTER '
.
$field_name
.
' TO '
.
$this
->
conn
->
quoteIdentifier
(
$field
[
'name'
],
true
);
}
}
}
}
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
// missing support to change DEFAULT and NULLability
// missing support to change DEFAULT and NULLability
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
$this
->
checkSupportedChanges
(
$field
);
$this
->
checkSupportedChanges
(
$field
);
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$this
->
conn
->
loadModule
(
'Datatype'
,
null
,
true
);
$this
->
conn
->
loadModule
(
'Datatype'
,
null
,
true
);
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$query
.=
'ALTER '
.
$field_name
.
' TYPE '
.
$this
->
getTypeDeclaration
(
$field
[
'definition'
]);
$query
.=
'ALTER '
.
$field_name
.
' TYPE '
.
$this
->
getTypeDeclaration
(
$field
[
'definition'
]);
}
}
}
}
if
(
!
strlen
(
$query
))
{
if
(
!
strlen
(
$query
))
{
return
false
;
return
false
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
$this
->
_silentCommit
();
$this
->
_silentCommit
();
return
$result
;
return
$result
;
}
}
/**
/**
* Get the stucture of a field into an array
* Get the stucture of a field into an array
*
*
* @param string $table name of the table on which the index is to be created
* @param string $table name of the table on which the index is to be created
* @param string $name name of the index to be created
* @param string $name name of the index to be created
* @param array $definition associative array that defines properties of the index to be created.
* @param array $definition associative array that defines properties of the index to be created.
* Currently, only one property named FIELDS is supported. This property
* Currently, only one property named FIELDS is supported. This property
* is also an associative with the names of the index fields as array
* is also an associative with the names of the index fields as array
* indexes. Each entry of this array is set to another type of associative
* indexes. Each entry of this array is set to another type of associative
* array that specifies properties of the index that are specific to
* array that specifies properties of the index that are specific to
* each field.
* each field.
*
*
* Currently, only the sorting property is supported. It should be used
* Currently, only the sorting property is supported. It should be used
* to define the sorting direction of the index. It may be set to either
* to define the sorting direction of the index. It may be set to either
* ascending or descending.
* ascending or descending.
*
*
* Not all DBMS support index sorting direction configuration. The DBMS
* Not all DBMS support index sorting direction configuration. The DBMS
* drivers of those that do not support it ignore this property. Use the
* drivers of those that do not support it ignore this property. Use the
* function support() to determine whether the DBMS driver can manage indexes.
* function support() to determine whether the DBMS driver can manage indexes.
* Example
* Example
* array(
* array(
* 'fields' => array(
* 'fields' => array(
* 'user_name' => array(
* 'user_name' => array(
* 'sorting' => 'ascending'
* 'sorting' => 'ascending'
* ),
* ),
* 'last_login' => array()
* 'last_login' => array()
* )
* )
* )
* )
* @return void
* @return void
*/
*/
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
{
{
$query
=
'CREATE'
;
$query
=
'CREATE'
;
$query_sort
=
''
;
$query_sort
=
''
;
foreach
(
$definition
[
'fields'
]
as
$field
)
{
foreach
(
$definition
[
'fields'
]
as
$field
)
{
if
(
!
strcmp
(
$query_sort
,
''
)
&&
isset
(
$field
[
'sorting'
]))
{
if
(
!
strcmp
(
$query_sort
,
''
)
&&
isset
(
$field
[
'sorting'
]))
{
switch
(
$field
[
'sorting'
])
{
switch
(
$field
[
'sorting'
])
{
case
'ascending'
:
case
'ascending'
:
$query_sort
=
' ASC'
;
$query_sort
=
' ASC'
;
break
;
break
;
case
'descending'
:
case
'descending'
:
$query_sort
=
' DESC'
;
$query_sort
=
' DESC'
;
break
;
break
;
}
}
}
}
}
}
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
$query
.=
$query_sort
.
' INDEX '
.
$name
.
' ON '
.
$table
;
$query
.=
$query_sort
.
' INDEX '
.
$name
.
' ON '
.
$table
;
$fields
=
array
();
$fields
=
array
();
foreach
(
array_keys
(
$definition
[
'fields'
])
as
$field
)
{
foreach
(
array_keys
(
$definition
[
'fields'
])
as
$field
)
{
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$field
,
true
);
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$field
,
true
);
}
}
$query
.=
' ('
.
implode
(
', '
,
$fields
)
.
')'
;
$query
.=
' ('
.
implode
(
', '
,
$fields
)
.
')'
;
return
$query
;
return
$query
;
}
}
/**
/**
* create a constraint on a table
* create a constraint on a table
*
*
* @param string $table name of the table on which the constraint is to be created
* @param string $table name of the table on which the constraint is to be created
* @param string $name name of the constraint to be created
* @param string $name name of the constraint to be created
* @param array $definition associative array that defines properties of the constraint to be created.
* @param array $definition associative array that defines properties of the constraint to be created.
* Currently, only one property named FIELDS is supported. This property
* Currently, only one property named FIELDS is supported. This property
* is also an associative with the names of the constraint fields as array
* is also an associative with the names of the constraint fields as array
* constraints. Each entry of this array is set to another type of associative
* constraints. Each entry of this array is set to another type of associative
* array that specifies properties of the constraint that are specific to
* array that specifies properties of the constraint that are specific to
* each field.
* each field.
*
*
* Example
* Example
* array(
* array(
* 'fields' => array(
* 'fields' => array(
* 'user_name' => array(),
* 'user_name' => array(),
* 'last_login' => array(),
* 'last_login' => array(),
* )
* )
* )
* )
* @return void
* @return void
*/
*/
public
function
createConstraint
(
$table
,
$name
,
$definition
)
public
function
createConstraint
(
$table
,
$name
,
$definition
)
{
{
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
if
(
!
empty
(
$name
))
{
if
(
!
empty
(
$name
))
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
}
}
$query
=
"ALTER TABLE
$table
ADD"
;
$query
=
"ALTER TABLE
$table
ADD"
;
if
(
!
empty
(
$definition
[
'primary'
]))
{
if
(
!
empty
(
$definition
[
'primary'
]))
{
if
(
!
empty
(
$name
))
{
if
(
!
empty
(
$name
))
{
$query
.=
' CONSTRAINT '
.
$name
;
$query
.=
' CONSTRAINT '
.
$name
;
}
}
$query
.=
' PRIMARY KEY'
;
$query
.=
' PRIMARY KEY'
;
}
else
{
}
else
{
$query
.=
' CONSTRAINT '
.
$name
;
$query
.=
' CONSTRAINT '
.
$name
;
if
(
!
empty
(
$definition
[
'unique'
]))
{
if
(
!
empty
(
$definition
[
'unique'
]))
{
$query
.=
' UNIQUE'
;
$query
.=
' UNIQUE'
;
}
}
}
}
$fields
=
array
();
$fields
=
array
();
foreach
(
array_keys
(
$definition
[
'fields'
])
as
$field
)
{
foreach
(
array_keys
(
$definition
[
'fields'
])
as
$field
)
{
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$field
,
true
);
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$field
,
true
);
}
}
$query
.=
' ('
.
implode
(
', '
,
$fields
)
.
')'
;
$query
.=
' ('
.
implode
(
', '
,
$fields
)
.
')'
;
$result
=
$this
->
conn
->
exec
(
$query
);
$result
=
$this
->
conn
->
exec
(
$query
);
// TODO ? $this->_silentCommit();
// TODO ? $this->_silentCommit();
return
$result
;
return
$result
;
}
}
/**
/**
* A method to return the required SQL string that fits between CREATE ... TABLE
* A method to return the required SQL string that fits between CREATE ... TABLE
* to create the table as a temporary table.
* to create the table as a temporary table.
*
*
* @return string The string required to be placed between "CREATE" and "TABLE"
* @return string The string required to be placed between "CREATE" and "TABLE"
* to generate a temporary table, if possible.
* to generate a temporary table, if possible.
*/
*/
public
function
getTemporaryTableQuery
()
public
function
getTemporaryTableQuery
()
{
{
return
'GLOBAL TEMPORARY'
;
return
'GLOBAL TEMPORARY'
;
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $seqName name of the sequence to be created
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* );
* );
* @return boolean
* @return boolean
*/
*/
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
);
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
);
$this
->
conn
->
exec
(
'CREATE GENERATOR '
.
$sequenceName
);
$this
->
conn
->
exec
(
'CREATE GENERATOR '
.
$sequenceName
);
try
{
try
{
$this
->
conn
->
exec
(
'SET GENERATOR '
.
$sequenceName
.
' TO '
.
(
$start
-
1
));
$this
->
conn
->
exec
(
'SET GENERATOR '
.
$sequenceName
.
' TO '
.
(
$start
-
1
));
return
true
;
return
true
;
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
try
{
try
{
$this
->
dropSequence
(
$seqName
);
$this
->
dropSequence
(
$seqName
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
throw
new
Doctrine_Export_Exception
(
'Could not drop inconsistent sequence table'
);
throw
new
Doctrine_Export_Exception
(
'Could not drop inconsistent sequence table'
);
}
}
}
}
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
}
}
/**
/**
* drop existing sequence
* drop existing sequence
*
*
* @param string $seqName name of the sequence to be dropped
* @param string $seqName name of the sequence to be dropped
* @return void
* @return void
*/
*/
public
function
dropSequenceSql
(
$seqName
)
public
function
dropSequenceSql
(
$seqName
)
{
{
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
);
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
);
$sequenceName
=
$this
->
conn
->
quote
(
$sequenceName
);
$sequenceName
=
$this
->
conn
->
quote
(
$sequenceName
);
$query
=
"DELETE FROM RDB
\$
GENERATORS WHERE UPPER(RDB
\$
GENERATOR_NAME)="
.
$sequenceName
;
$query
=
"DELETE FROM RDB
\$
GENERATORS WHERE UPPER(RDB
\$
GENERATOR_NAME)="
.
$sequenceName
;
return
$query
;
return
$query
;
}
}
}
}
\ No newline at end of file
lib/Doctrine/Export/Frontbase.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Frontbase
* Doctrine_Export_Frontbase
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Frontbase
extends
Doctrine_Export
class
Doctrine_Export_Frontbase
extends
Doctrine_Export
{
{
/**
/**
* create a new database
* create a new database
*
*
* @param string $name name of the database that should be created
* @param string $name name of the database that should be created
* @return string
* @return string
*/
*/
public
function
createDatabaseSql
(
$name
)
public
function
createDatabaseSql
(
$name
)
{
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'CREATE DATABASE '
.
$name
;
return
'CREATE DATABASE '
.
$name
;
}
}
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return string
* @return string
*/
*/
public
function
dropDatabaseSql
(
$name
)
public
function
dropDatabaseSql
(
$name
)
{
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'DELETE DATABASE '
.
$name
;
return
'DELETE DATABASE '
.
$name
;
}
}
/**
/**
* drop an existing table
* drop an existing table
*
*
* @param object $this->conns database object that is extended by this class
* @param object $this->conns database object that is extended by this class
* @param string $name name of the table that should be dropped
* @param string $name name of the table that should be dropped
* @return string
* @return string
*/
*/
public
function
dropTableSql
(
$name
)
public
function
dropTableSql
(
$name
)
{
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'DROP TABLE '
.
$name
.
' CASCADE'
;
return
'DROP TABLE '
.
$name
.
' CASCADE'
;
}
}
/**
/**
* alter an existing table
* alter an existing table
*
*
* @param string $name name of the table that is intended to be changed.
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
* changes that are currently supported are defined as follows:
*
*
* name
* name
*
*
* New name for the table.
* New name for the table.
*
*
* add
* add
*
*
* Associative array with the names of fields to be added as
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* of the fields to be added. The properties of the fields should
* be the same as defined by the MDB2 parser.
* be the same as defined by the MDB2 parser.
*
*
*
*
* remove
* remove
*
*
* Associative array with the names of fields to be removed as indexes
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
* An empty array should be used for future compatibility.
*
*
* rename
* rename
*
*
* Associative array with the names of fields to be renamed as indexes
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
* as it is used in the CREATE TABLE statement.
*
*
* change
* change
*
*
* Associative array with the names of the fields to be changed as indexes
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
* should have the new names of the fields as array indexes.
*
*
* The value of each entry of the array should be set to another associative
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* respective properties. The properties of the fields should be the same
* as defined by the MDB2 parser.
* as defined by the MDB2 parser.
*
*
* Example
* Example
* array(
* array(
* 'name' => 'userlist',
* 'name' => 'userlist',
* 'add' => array(
* 'add' => array(
* 'quota' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* )
* )
* ),
* ),
* 'remove' => array(
* 'remove' => array(
* 'file_limit' => array(),
* 'file_limit' => array(),
* 'time_limit' => array()
* 'time_limit' => array()
* ),
* ),
* 'change' => array(
* 'change' => array(
* 'name' => array(
* 'name' => array(
* 'length' => '20',
* 'length' => '20',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 20,
* 'length' => 20,
* ),
* ),
* )
* )
* ),
* ),
* 'rename' => array(
* 'rename' => array(
* 'sex' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'name' => 'gender',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 1,
* 'length' => 1,
* 'default' => 'M',
* 'default' => 'M',
* ),
* ),
* )
* )
* )
* )
* )
* )
*
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* actually perform them otherwise.
* @access public
* @access public
*
*
* @return boolean
* @return boolean
*/
*/
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
{
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
case
'remove'
:
case
'remove'
:
case
'change'
:
case
'change'
:
case
'rename'
:
case
'rename'
:
case
'name'
:
case
'name'
:
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
}
}
}
}
if
(
$check
)
{
if
(
$check
)
{
return
true
;
return
true
;
}
}
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$changes
[
'name'
]))
{
if
(
!
empty
(
$changes
[
'name'
]))
{
$changeName
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
],
true
);
$changeName
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
],
true
);
$query
.=
'RENAME TO '
.
$changeName
;
$query
.=
'RENAME TO '
.
$changeName
;
}
}
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$query
.=
'ADD '
.
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
$query
.=
'ADD '
.
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
}
}
}
}
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$fieldName
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$fieldName
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$query
.=
'DROP '
.
$fieldName
;
$query
.=
'DROP '
.
$fieldName
;
}
}
}
}
$rename
=
array
();
$rename
=
array
();
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
$rename
[
$field
[
'name'
]]
=
$fieldName
;
$rename
[
$field
[
'name'
]]
=
$fieldName
;
}
}
}
}
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
if
(
isset
(
$rename
[
$fieldName
]))
{
if
(
isset
(
$rename
[
$fieldName
]))
{
$oldFieldName
=
$rename
[
$fieldName
];
$oldFieldName
=
$rename
[
$fieldName
];
unset
(
$rename
[
$fieldName
]);
unset
(
$rename
[
$fieldName
]);
}
else
{
}
else
{
$oldFieldName
=
$fieldName
;
$oldFieldName
=
$fieldName
;
}
}
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
.
$this
->
conn
->
getDeclaration
(
$oldFieldName
,
$field
[
'definition'
]);
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
.
$this
->
conn
->
getDeclaration
(
$oldFieldName
,
$field
[
'definition'
]);
}
}
}
}
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
foreach
(
$rename
as
$renamedFieldName
=>
$renamed_field
)
{
foreach
(
$rename
as
$renamedFieldName
=>
$renamed_field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$oldFieldName
=
$rename
[
$renamedFieldName
];
$oldFieldName
=
$rename
[
$renamedFieldName
];
$field
=
$changes
[
'rename'
][
$oldFieldName
];
$field
=
$changes
[
'rename'
][
$oldFieldName
];
$query
.=
'CHANGE '
.
$this
->
conn
->
getDeclaration
(
$oldFieldName
,
$field
[
'definition'
]);
$query
.=
'CHANGE '
.
$this
->
conn
->
getDeclaration
(
$oldFieldName
,
$field
[
'definition'
]);
}
}
}
}
if
(
!
$query
)
{
if
(
!
$query
)
{
return
true
;
return
true
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
return
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $seqName name of the sequence to be created
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* );
* );
* @return void
* @return void
*/
*/
public
function
createSequence
(
$sequenceName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequence
(
$sequenceName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INTEGER DEFAULT UNIQUE, PRIMARY KEY('
.
$seqcolName
.
'))'
;
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INTEGER DEFAULT UNIQUE, PRIMARY KEY('
.
$seqcolName
.
'))'
;
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
'SET UNIQUE = 1 FOR '
.
$sequenceName
);
$res
=
$this
->
conn
->
exec
(
'SET UNIQUE = 1 FOR '
.
$sequenceName
);
if
(
$start
==
1
)
{
if
(
$start
==
1
)
{
return
true
;
return
true
;
}
}
try
{
try
{
$this
->
conn
->
exec
(
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
);
$this
->
conn
->
exec
(
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
// Handle error
// Handle error
try
{
try
{
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
}
}
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
}
}
}
}
/**
/**
* drop existing sequence
* drop existing sequence
*
*
* @param string $seqName name of the sequence to be dropped
* @param string $seqName name of the sequence to be dropped
* @return string
* @return string
*/
*/
public
function
dropSequenceSql
(
$seqName
)
public
function
dropSequenceSql
(
$seqName
)
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
return
'DROP TABLE '
.
$sequenceName
.
' CASCADE'
;
return
'DROP TABLE '
.
$sequenceName
.
' CASCADE'
;
}
}
/**
/**
* drop existing index
* drop existing index
*
*
* @param string $table name of table that should be used in method
* @param string $table name of table that should be used in method
* @param string $name name of the index to be dropped
* @param string $name name of the index to be dropped
* @return boolean
* @return boolean
*/
*/
public
function
dropIndexSql
(
$table
,
$name
)
public
function
dropIndexSql
(
$table
,
$name
)
{
{
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getIndexName
(
$name
),
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getIndexName
(
$name
),
true
);
return
'ALTER TABLE '
.
$table
.
' DROP INDEX '
.
$name
;
return
'ALTER TABLE '
.
$table
.
' DROP INDEX '
.
$name
;
}
}
}
}
\ No newline at end of file
lib/Doctrine/Export/Mssql.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Mssql
* Doctrine_Export_Mssql
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Frank M. Kromann <frank@kromann.info> (PEAR MDB2 Mssql driver)
* @author Frank M. Kromann <frank@kromann.info> (PEAR MDB2 Mssql driver)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Mssql
extends
Doctrine_Export
class
Doctrine_Export_Mssql
extends
Doctrine_Export
{
{
/**
/**
* create a new database
* create a new database
*
*
* @param string $name name of the database that should be created
* @param string $name name of the database that should be created
* @return void
* @return void
*/
*/
public
function
createDatabase
(
$name
)
public
function
createDatabase
(
$name
)
{
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$query
=
"CREATE DATABASE
$name
"
;
$query
=
"CREATE DATABASE
$name
"
;
if
(
$this
->
conn
->
options
[
'database_device'
])
{
if
(
$this
->
conn
->
options
[
'database_device'
])
{
$query
.=
' ON '
.
$this
->
conn
->
options
[
'database_device'
];
$query
.=
' ON '
.
$this
->
conn
->
options
[
'database_device'
];
$query
.=
$this
->
conn
->
options
[
'database_size'
]
?
'='
.
$query
.=
$this
->
conn
->
options
[
'database_size'
]
?
'='
.
$this
->
conn
->
options
[
'database_size'
]
:
''
;
$this
->
conn
->
options
[
'database_size'
]
:
''
;
}
}
return
$this
->
conn
->
standaloneQuery
(
$query
,
null
,
true
);
return
$this
->
conn
->
standaloneQuery
(
$query
,
null
,
true
);
}
}
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return void
* @return void
*/
*/
public
function
dropDatabase
(
$name
)
public
function
dropDatabase
(
$name
)
{
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$this
->
conn
->
standaloneQuery
(
'DROP DATABASE '
.
$name
,
null
,
true
);
return
$this
->
conn
->
standaloneQuery
(
'DROP DATABASE '
.
$name
,
null
,
true
);
}
}
/**
/**
* Override the parent method.
* Override the parent method.
*
*
* @return string The string required to be placed between "CREATE" and "TABLE"
* @return string The string required to be placed between "CREATE" and "TABLE"
* to generate a temporary table, if possible.
* to generate a temporary table, if possible.
*/
*/
public
function
getTemporaryTableQuery
()
public
function
getTemporaryTableQuery
()
{
{
return
''
;
return
''
;
}
}
/**
/**
* alter an existing table
* alter an existing table
*
*
* @param string $name name of the table that is intended to be changed.
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
* changes that are currently supported are defined as follows:
*
*
* name
* name
*
*
* New name for the table.
* New name for the table.
*
*
* add
* add
*
*
* Associative array with the names of fields to be added as
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* of the fields to be added. The properties of the fields should
* be the same as defined by the Metabase parser.
* be the same as defined by the Metabase parser.
*
*
*
*
* remove
* remove
*
*
* Associative array with the names of fields to be removed as indexes
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
* An empty array should be used for future compatibility.
*
*
* rename
* rename
*
*
* Associative array with the names of fields to be renamed as indexes
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
* as it is used in the CREATE TABLE statement.
*
*
* change
* change
*
*
* Associative array with the names of the fields to be changed as indexes
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
* should have the new names of the fields as array indexes.
*
*
* The value of each entry of the array should be set to another associative
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* respective properties. The properties of the fields should be the same
* as defined by the Metabase parser.
* as defined by the Metabase parser.
*
*
* Example
* Example
* array(
* array(
* 'name' => 'userlist',
* 'name' => 'userlist',
* 'add' => array(
* 'add' => array(
* 'quota' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* )
* )
* ),
* ),
* 'remove' => array(
* 'remove' => array(
* 'file_limit' => array(),
* 'file_limit' => array(),
* 'time_limit' => array()
* 'time_limit' => array()
* ),
* ),
* 'change' => array(
* 'change' => array(
* 'name' => array(
* 'name' => array(
* 'length' => '20',
* 'length' => '20',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 20,
* 'length' => 20,
* ),
* ),
* )
* )
* ),
* ),
* 'rename' => array(
* 'rename' => array(
* 'sex' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'name' => 'gender',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 1,
* 'length' => 1,
* 'default' => 'M',
* 'default' => 'M',
* ),
* ),
* )
* )
* )
* )
* )
* )
*
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* actually perform them otherwise.
* @return void
* @return void
*/
*/
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
{
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
break
;
break
;
case
'remove'
:
case
'remove'
:
break
;
break
;
case
'name'
:
case
'name'
:
case
'rename'
:
case
'rename'
:
case
'change'
:
case
'change'
:
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'alterTable: change type "'
.
$changeName
.
'" not yet supported'
);
throw
new
Doctrine_Export_Exception
(
'alterTable: change type "'
.
$changeName
.
'" not yet supported'
);
}
}
}
}
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$query
.=
'ADD '
.
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
$query
.=
'ADD '
.
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
}
}
}
}
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$field_name
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$query
.=
'DROP COLUMN '
.
$fieldName
;
$query
.=
'DROP COLUMN '
.
$fieldName
;
}
}
}
}
if
(
!
$query
)
{
if
(
!
$query
)
{
return
false
;
return
false
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
return
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' '
.
$query
);
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $seqName name of the sequence to be created
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* );
* );
* @return string
* @return string
*/
*/
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
options
[
'seqcol_name'
],
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
options
[
'seqcol_name'
],
true
);
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INT PRIMARY KEY CLUSTERED IDENTITY('
.
$start
.
', 1) NOT NULL)'
;
' INT PRIMARY KEY CLUSTERED IDENTITY('
.
$start
.
', 1) NOT NULL)'
;
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
$query
);
if
(
$start
==
1
)
{
if
(
$start
==
1
)
{
return
true
;
return
true
;
}
}
try
{
try
{
$query
=
'SET IDENTITY_INSERT '
.
$sequenceName
.
' ON '
.
$query
=
'SET IDENTITY_INSERT '
.
$sequenceName
.
' ON '
.
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ( '
.
$start
.
')'
;
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ( '
.
$start
.
')'
;
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
$query
);
}
catch
(
Exception
$e
)
{
}
catch
(
Exception
$e
)
{
$result
=
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
$result
=
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
}
}
return
true
;
return
true
;
}
}
/**
/**
* This function drops an existing sequence
* This function drops an existing sequence
*
*
* @param string $seqName name of the sequence to be dropped
* @param string $seqName name of the sequence to be dropped
* @return void
* @return void
*/
*/
public
function
dropSequenceSql
(
$seqName
)
public
function
dropSequenceSql
(
$seqName
)
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
return
'DROP TABLE '
.
$sequenceName
;
return
'DROP TABLE '
.
$sequenceName
;
}
}
}
}
\ No newline at end of file
lib/Doctrine/Export/Mysql.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Mysql
* Doctrine_Export_Mysql
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Mysql
extends
Doctrine_Export
class
Doctrine_Export_Mysql
extends
Doctrine_Export
{
{
/**
/**
* create a new database
* create a new database
*
*
* @param string $name name of the database that should be created
* @param string $name name of the database that should be created
* @return string
* @return string
*/
*/
public
function
createDatabaseSql
(
$name
)
public
function
createDatabaseSql
(
$name
)
{
{
return
'CREATE DATABASE '
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'CREATE DATABASE '
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
}
}
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return string
* @return string
*/
*/
public
function
dropDatabaseSql
(
$name
)
public
function
dropDatabaseSql
(
$name
)
{
{
return
'DROP DATABASE '
.
$this
->
conn
->
quoteIdentifier
(
$name
);
return
'DROP DATABASE '
.
$this
->
conn
->
quoteIdentifier
(
$name
);
}
}
/**
/**
* create a new table
* create a new table
*
*
* @param string $name Name of the database that should be created
* @param string $name Name of the database that should be created
* @param array $fields Associative array that contains the definition of each field of the new table
* @param array $fields Associative array that contains the definition of each field of the new table
* The indexes of the array entries are the names of the fields of the table an
* The indexes of the array entries are the names of the fields of the table an
* the array entry values are associative arrays like those that are meant to be
* the array entry values are associative arrays like those that are meant to be
* passed with the field definitions to get[Type]Declaration() functions.
* passed with the field definitions to get[Type]Declaration() functions.
* array(
* array(
* 'id' => array(
* 'id' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* 'notnull' => 1
* 'notnull' => 1
* 'default' => 0
* 'default' => 0
* ),
* ),
* 'name' => array(
* 'name' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* ),
* ),
* 'password' => array(
* 'password' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* )
* )
* );
* );
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* 'type' => 'innodb',
* 'type' => 'innodb',
* );
* );
*
*
* @return void
* @return void
*/
*/
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
{
{
if
(
!
$name
)
if
(
!
$name
)
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
if
(
empty
(
$fields
))
{
if
(
empty
(
$fields
))
{
throw
new
Doctrine_Export_Exception
(
'no fields specified for table "'
.
$name
.
'"'
);
throw
new
Doctrine_Export_Exception
(
'no fields specified for table "'
.
$name
.
'"'
);
}
}
$queryFields
=
$this
->
getFieldDeclarationList
(
$fields
);
$queryFields
=
$this
->
getFieldDeclarationList
(
$fields
);
// build indexes for all foreign key fields (needed in MySQL!!)
// build indexes for all foreign key fields (needed in MySQL!!)
if
(
isset
(
$options
[
'foreignKeys'
]))
{
if
(
isset
(
$options
[
'foreignKeys'
]))
{
foreach
(
$options
[
'foreignKeys'
]
as
$fk
)
{
foreach
(
$options
[
'foreignKeys'
]
as
$fk
)
{
$local
=
$fk
[
'local'
];
$local
=
$fk
[
'local'
];
$found
=
false
;
$found
=
false
;
if
(
isset
(
$options
[
'indexes'
]))
{
if
(
isset
(
$options
[
'indexes'
]))
{
foreach
(
$options
[
'indexes'
]
as
$definition
)
{
foreach
(
$options
[
'indexes'
]
as
$definition
)
{
if
(
is_string
(
$definition
[
'fields'
]))
{
if
(
is_string
(
$definition
[
'fields'
]))
{
// Check if index already exists on the column
// Check if index already exists on the column
$found
=
(
$local
==
$definition
[
'fields'
]);
$found
=
(
$local
==
$definition
[
'fields'
]);
}
else
if
(
in_array
(
$local
,
$definition
[
'fields'
])
&&
count
(
$definition
[
'fields'
])
===
1
)
{
}
else
if
(
in_array
(
$local
,
$definition
[
'fields'
])
&&
count
(
$definition
[
'fields'
])
===
1
)
{
// Index already exists on the column
// Index already exists on the column
$found
=
true
;
$found
=
true
;
}
}
}
}
}
}
if
(
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
])
&&
if
(
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
])
&&
in_array
(
$local
,
$options
[
'primary'
]))
{
in_array
(
$local
,
$options
[
'primary'
]))
{
// field is part of the PK and therefore already indexed
// field is part of the PK and therefore already indexed
$found
=
true
;
$found
=
true
;
}
}
if
(
!
$found
)
{
if
(
!
$found
)
{
$options
[
'indexes'
][
$local
]
=
array
(
'fields'
=>
array
(
$local
=>
array
()));
$options
[
'indexes'
][
$local
]
=
array
(
'fields'
=>
array
(
$local
=>
array
()));
}
}
}
}
}
}
// add all indexes
// add all indexes
if
(
isset
(
$options
[
'indexes'
])
&&
!
empty
(
$options
[
'indexes'
]))
{
if
(
isset
(
$options
[
'indexes'
])
&&
!
empty
(
$options
[
'indexes'
]))
{
foreach
(
$options
[
'indexes'
]
as
$index
=>
$definition
)
{
foreach
(
$options
[
'indexes'
]
as
$index
=>
$definition
)
{
$queryFields
.=
', '
.
$this
->
getIndexDeclaration
(
$index
,
$definition
);
$queryFields
.=
', '
.
$this
->
getIndexDeclaration
(
$index
,
$definition
);
}
}
}
}
// attach all primary keys
// attach all primary keys
if
(
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
]))
{
if
(
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
]))
{
$keyColumns
=
array_values
(
$options
[
'primary'
]);
$keyColumns
=
array_values
(
$options
[
'primary'
]);
$keyColumns
=
array_map
(
array
(
$this
->
conn
,
'quoteIdentifier'
),
$keyColumns
);
$keyColumns
=
array_map
(
array
(
$this
->
conn
,
'quoteIdentifier'
),
$keyColumns
);
$queryFields
.=
', PRIMARY KEY('
.
implode
(
', '
,
$keyColumns
)
.
')'
;
$queryFields
.=
', PRIMARY KEY('
.
implode
(
', '
,
$keyColumns
)
.
')'
;
}
}
$query
=
'CREATE TABLE '
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
' ('
.
$queryFields
.
')'
;
$query
=
'CREATE TABLE '
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
' ('
.
$queryFields
.
')'
;
$optionStrings
=
array
();
$optionStrings
=
array
();
if
(
isset
(
$options
[
'comment'
]))
{
if
(
isset
(
$options
[
'comment'
]))
{
$optionStrings
[
'comment'
]
=
'COMMENT = '
.
$this
->
dbh
->
quote
(
$options
[
'comment'
],
'text'
);
$optionStrings
[
'comment'
]
=
'COMMENT = '
.
$this
->
dbh
->
quote
(
$options
[
'comment'
],
'text'
);
}
}
if
(
isset
(
$options
[
'charset'
]))
{
if
(
isset
(
$options
[
'charset'
]))
{
$optionStrings
[
'charset'
]
=
'DEFAULT CHARACTER SET '
.
$options
[
'charset'
];
$optionStrings
[
'charset'
]
=
'DEFAULT CHARACTER SET '
.
$options
[
'charset'
];
if
(
isset
(
$options
[
'collate'
]))
{
if
(
isset
(
$options
[
'collate'
]))
{
$optionStrings
[
'charset'
]
.=
' COLLATE '
.
$options
[
'collate'
];
$optionStrings
[
'charset'
]
.=
' COLLATE '
.
$options
[
'collate'
];
}
}
}
}
$type
=
false
;
$type
=
false
;
// get the type of the table
// get the type of the table
if
(
isset
(
$options
[
'type'
]))
{
if
(
isset
(
$options
[
'type'
]))
{
$type
=
$options
[
'type'
];
$type
=
$options
[
'type'
];
}
else
{
}
else
{
$type
=
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DEFAULT_TABLE_TYPE
);
$type
=
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DEFAULT_TABLE_TYPE
);
}
}
if
(
$type
)
{
if
(
$type
)
{
$optionStrings
[]
=
'ENGINE = '
.
$type
;
$optionStrings
[]
=
'ENGINE = '
.
$type
;
}
}
if
(
!
empty
(
$optionStrings
))
{
if
(
!
empty
(
$optionStrings
))
{
$query
.=
' '
.
implode
(
' '
,
$optionStrings
);
$query
.=
' '
.
implode
(
' '
,
$optionStrings
);
}
}
$sql
[]
=
$query
;
$sql
[]
=
$query
;
if
(
isset
(
$options
[
'foreignKeys'
]))
{
if
(
isset
(
$options
[
'foreignKeys'
]))
{
foreach
((
array
)
$options
[
'foreignKeys'
]
as
$k
=>
$definition
)
{
foreach
((
array
)
$options
[
'foreignKeys'
]
as
$k
=>
$definition
)
{
if
(
is_array
(
$definition
))
{
if
(
is_array
(
$definition
))
{
$sql
[]
=
$this
->
createForeignKeySql
(
$name
,
$definition
);
$sql
[]
=
$this
->
createForeignKeySql
(
$name
,
$definition
);
}
}
}
}
}
}
return
$sql
;
return
$sql
;
}
}
/**
/**
* alter an existing table
* alter an existing table
*
*
* @param string $name name of the table that is intended to be changed.
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
* changes that are currently supported are defined as follows:
*
*
* name
* name
*
*
* New name for the table.
* New name for the table.
*
*
* add
* add
*
*
* Associative array with the names of fields to be added as
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* of the fields to be added. The properties of the fields should
* be the same as defined by the Metabase parser.
* be the same as defined by the Metabase parser.
*
*
*
*
* remove
* remove
*
*
* Associative array with the names of fields to be removed as indexes
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
* An empty array should be used for future compatibility.
*
*
* rename
* rename
*
*
* Associative array with the names of fields to be renamed as indexes
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
* as it is used in the CREATE TABLE statement.
*
*
* change
* change
*
*
* Associative array with the names of the fields to be changed as indexes
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
* should have the new names of the fields as array indexes.
*
*
* The value of each entry of the array should be set to another associative
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* respective properties. The properties of the fields should be the same
* as defined by the Metabase parser.
* as defined by the Metabase parser.
*
*
* Example
* Example
* array(
* array(
* 'name' => 'userlist',
* 'name' => 'userlist',
* 'add' => array(
* 'add' => array(
* 'quota' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* )
* )
* ),
* ),
* 'remove' => array(
* 'remove' => array(
* 'file_limit' => array(),
* 'file_limit' => array(),
* 'time_limit' => array()
* 'time_limit' => array()
* ),
* ),
* 'change' => array(
* 'change' => array(
* 'name' => array(
* 'name' => array(
* 'length' => '20',
* 'length' => '20',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 20,
* 'length' => 20,
* ),
* ),
* )
* )
* ),
* ),
* 'rename' => array(
* 'rename' => array(
* 'sex' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'name' => 'gender',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 1,
* 'length' => 1,
* 'default' => 'M',
* 'default' => 'M',
* ),
* ),
* )
* )
* )
* )
* )
* )
*
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* actually perform them otherwise.
* @return boolean
* @return boolean
*/
*/
public
function
alterTableSql
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTableSql
(
$name
,
array
$changes
,
$check
=
false
)
{
{
if
(
!
$name
)
{
if
(
!
$name
)
{
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
}
}
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
case
'remove'
:
case
'remove'
:
case
'change'
:
case
'change'
:
case
'rename'
:
case
'rename'
:
case
'name'
:
case
'name'
:
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
}
}
}
}
if
(
$check
)
{
if
(
$check
)
{
return
true
;
return
true
;
}
}
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$changes
[
'name'
]))
{
if
(
!
empty
(
$changes
[
'name'
]))
{
$change_name
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
]);
$change_name
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
]);
$query
.=
'RENAME TO '
.
$change_name
;
$query
.=
'RENAME TO '
.
$change_name
;
}
}
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
}
}
}
}
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$fieldName
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
$fieldName
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
$query
.=
'DROP '
.
$fieldName
;
$query
.=
'DROP '
.
$fieldName
;
}
}
}
}
$rename
=
array
();
$rename
=
array
();
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
$rename
[
$field
[
'name'
]]
=
$fieldName
;
$rename
[
$field
[
'name'
]]
=
$fieldName
;
}
}
}
}
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
if
(
isset
(
$rename
[
$fieldName
]))
{
if
(
isset
(
$rename
[
$fieldName
]))
{
$oldFieldName
=
$rename
[
$fieldName
];
$oldFieldName
=
$rename
[
$fieldName
];
unset
(
$rename
[
$fieldName
]);
unset
(
$rename
[
$fieldName
]);
}
else
{
}
else
{
$oldFieldName
=
$fieldName
;
$oldFieldName
=
$fieldName
;
}
}
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
.
$this
->
getDeclaration
(
$fieldName
,
$field
[
'definition'
]);
.
$this
->
getDeclaration
(
$fieldName
,
$field
[
'definition'
]);
}
}
}
}
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
foreach
(
$rename
as
$renameName
=>
$renamedField
)
{
foreach
(
$rename
as
$renameName
=>
$renamedField
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$field
=
$changes
[
'rename'
][
$renamedField
];
$field
=
$changes
[
'rename'
][
$renamedField
];
$renamedField
=
$this
->
conn
->
quoteIdentifier
(
$renamedField
,
true
);
$renamedField
=
$this
->
conn
->
quoteIdentifier
(
$renamedField
,
true
);
$query
.=
'CHANGE '
.
$renamedField
.
' '
$query
.=
'CHANGE '
.
$renamedField
.
' '
.
$this
->
getDeclaration
(
$field
[
'name'
],
$field
[
'definition'
]);
.
$this
->
getDeclaration
(
$field
[
'name'
],
$field
[
'definition'
]);
}
}
}
}
if
(
!
$query
)
{
if
(
!
$query
)
{
return
false
;
return
false
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'ALTER TABLE '
.
$name
.
' '
.
$query
;
return
'ALTER TABLE '
.
$name
.
' '
.
$query
;
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $sequenceName name of the sequence to be created
* @param string $sequenceName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* 'type' => 'innodb',
* 'type' => 'innodb',
* );
* );
* @return boolean
* @return boolean
*/
*/
public
function
createSequence
(
$sequenceName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequence
(
$sequenceName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$optionsStrings
=
array
();
$optionsStrings
=
array
();
if
(
isset
(
$options
[
'comment'
])
&&
!
empty
(
$options
[
'comment'
]))
{
if
(
isset
(
$options
[
'comment'
])
&&
!
empty
(
$options
[
'comment'
]))
{
$optionsStrings
[
'comment'
]
=
'COMMENT = '
.
$this
->
conn
->
quote
(
$options
[
'comment'
],
'string'
);
$optionsStrings
[
'comment'
]
=
'COMMENT = '
.
$this
->
conn
->
quote
(
$options
[
'comment'
],
'string'
);
}
}
if
(
isset
(
$options
[
'charset'
])
&&
!
empty
(
$options
[
'charset'
]))
{
if
(
isset
(
$options
[
'charset'
])
&&
!
empty
(
$options
[
'charset'
]))
{
$optionsStrings
[
'charset'
]
=
'DEFAULT CHARACTER SET '
.
$options
[
'charset'
];
$optionsStrings
[
'charset'
]
=
'DEFAULT CHARACTER SET '
.
$options
[
'charset'
];
if
(
isset
(
$options
[
'collate'
]))
{
if
(
isset
(
$options
[
'collate'
]))
{
$optionsStrings
[
'collate'
]
.=
' COLLATE '
.
$options
[
'collate'
];
$optionsStrings
[
'collate'
]
.=
' COLLATE '
.
$options
[
'collate'
];
}
}
}
}
$type
=
false
;
$type
=
false
;
if
(
isset
(
$options
[
'type'
]))
{
if
(
isset
(
$options
[
'type'
]))
{
$type
=
$options
[
'type'
];
$type
=
$options
[
'type'
];
}
else
{
}
else
{
$type
=
$this
->
conn
->
default_table_type
;
$type
=
$this
->
conn
->
default_table_type
;
}
}
if
(
$type
)
{
if
(
$type
)
{
$optionsStrings
[]
=
'ENGINE = '
.
$type
;
$optionsStrings
[]
=
'ENGINE = '
.
$type
;
}
}
try
{
try
{
$query
=
'CREATE TABLE '
.
$sequenceName
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ('
.
' ('
.
$seqcolName
.
' INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ('
.
$seqcolName
.
'))'
.
$seqcolName
.
'))'
.
strlen
(
$this
->
conn
->
default_table_type
)
?
' TYPE = '
.
strlen
(
$this
->
conn
->
default_table_type
)
?
' TYPE = '
.
$this
->
conn
->
default_table_type
:
''
;
.
$this
->
conn
->
default_table_type
:
''
;
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
$query
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
}
}
if
(
$start
==
1
)
if
(
$start
==
1
)
return
true
;
return
true
;
$query
=
'INSERT INTO '
.
$sequenceName
$query
=
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
;
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
;
$res
=
$this
->
conn
->
exec
(
$query
);
$res
=
$this
->
conn
->
exec
(
$query
);
// Handle error
// Handle error
try
{
try
{
$result
=
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
$result
=
$this
->
conn
->
exec
(
'DROP TABLE '
.
$sequenceName
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
}
}
}
}
/**
/**
* Get the stucture of a field into an array
* Get the stucture of a field into an array
*
*
* @author Leoncx
* @author Leoncx
* @param string $table name of the table on which the index is to be created
* @param string $table name of the table on which the index is to be created
* @param string $name name of the index to be created
* @param string $name name of the index to be created
* @param array $definition associative array that defines properties of the index to be created.
* @param array $definition associative array that defines properties of the index to be created.
* Currently, only one property named FIELDS is supported. This property
* Currently, only one property named FIELDS is supported. This property
* is also an associative with the names of the index fields as array
* is also an associative with the names of the index fields as array
* indexes. Each entry of this array is set to another type of associative
* indexes. Each entry of this array is set to another type of associative
* array that specifies properties of the index that are specific to
* array that specifies properties of the index that are specific to
* each field.
* each field.
*
*
* Currently, only the sorting property is supported. It should be used
* Currently, only the sorting property is supported. It should be used
* to define the sorting direction of the index. It may be set to either
* to define the sorting direction of the index. It may be set to either
* ascending or descending.
* ascending or descending.
*
*
* Not all DBMS support index sorting direction configuration. The DBMS
* Not all DBMS support index sorting direction configuration. The DBMS
* drivers of those that do not support it ignore this property. Use the
* drivers of those that do not support it ignore this property. Use the
* function supports() to determine whether the DBMS driver can manage indexes.
* function supports() to determine whether the DBMS driver can manage indexes.
*
*
* Example
* Example
* array(
* array(
* 'fields' => array(
* 'fields' => array(
* 'user_name' => array(
* 'user_name' => array(
* 'sorting' => 'ASC'
* 'sorting' => 'ASC'
* 'length' => 10
* 'length' => 10
* ),
* ),
* 'last_login' => array()
* 'last_login' => array()
* )
* )
* )
* )
* @throws PDOException
* @throws PDOException
* @return void
* @return void
*/
*/
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
{
{
$table
=
$table
;
$table
=
$table
;
$name
=
$this
->
conn
->
getIndexName
(
$name
);
$name
=
$this
->
conn
->
getIndexName
(
$name
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
);
$type
=
''
;
$type
=
''
;
if
(
isset
(
$definition
[
'type'
]))
{
if
(
isset
(
$definition
[
'type'
]))
{
switch
(
strtolower
(
$definition
[
'type'
]))
{
switch
(
strtolower
(
$definition
[
'type'
]))
{
case
'fulltext'
:
case
'fulltext'
:
case
'unique'
:
case
'unique'
:
$type
=
strtoupper
(
$definition
[
'type'
])
.
' '
;
$type
=
strtoupper
(
$definition
[
'type'
])
.
' '
;
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'Unknown index type '
.
$definition
[
'type'
]);
throw
new
Doctrine_Export_Exception
(
'Unknown index type '
.
$definition
[
'type'
]);
}
}
}
}
$query
=
'CREATE '
.
$type
.
'INDEX '
.
$name
.
' ON '
.
$table
;
$query
=
'CREATE '
.
$type
.
'INDEX '
.
$name
.
' ON '
.
$table
;
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
()
.
')'
;
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
()
.
')'
;
return
$query
;
return
$query
;
}
}
/**
/**
* getDefaultDeclaration
* getDefaultDeclaration
* Obtain DBMS specific SQL code portion needed to set a default value
* Obtain DBMS specific SQL code portion needed to set a default value
* declaration to be used in statements like CREATE TABLE.
* declaration to be used in statements like CREATE TABLE.
*
*
* @param array $field field definition array
* @param array $field field definition array
* @return string DBMS specific SQL code portion needed to set a default value
* @return string DBMS specific SQL code portion needed to set a default value
*/
*/
public
function
getDefaultFieldDeclaration
(
$field
)
public
function
getDefaultFieldDeclaration
(
$field
)
{
{
$default
=
''
;
$default
=
''
;
if
(
isset
(
$field
[
'default'
])
&&
$field
[
'length'
]
<=
255
)
{
if
(
isset
(
$field
[
'default'
])
&&
$field
[
'length'
]
<=
255
)
{
if
(
$field
[
'default'
]
===
''
)
{
if
(
$field
[
'default'
]
===
''
)
{
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
?
null
:
$this
->
valid_default_values
[
$field
[
'type'
]];
?
null
:
$this
->
valid_default_values
[
$field
[
'type'
]];
if
(
$field
[
'default'
]
===
''
if
(
$field
[
'default'
]
===
''
&&
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_PORTABILITY
)
&
Doctrine
::
PORTABILITY_EMPTY_TO_NULL
)
&&
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_PORTABILITY
)
&
Doctrine
::
PORTABILITY_EMPTY_TO_NULL
)
)
{
)
{
$field
[
'default'
]
=
' '
;
$field
[
'default'
]
=
' '
;
}
}
}
}
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
}
}
return
$default
;
return
$default
;
}
}
/**
/**
* Obtain DBMS specific SQL code portion needed to set an index
* Obtain DBMS specific SQL code portion needed to set an index
* declaration to be used in statements like CREATE TABLE.
* declaration to be used in statements like CREATE TABLE.
*
*
* @param string $charset name of the index
* @param string $charset name of the index
* @param array $definition index definition
* @param array $definition index definition
* @return string DBMS specific SQL code portion needed to set an index
* @return string DBMS specific SQL code portion needed to set an index
*/
*/
public
function
getIndexDeclaration
(
$name
,
array
$definition
)
public
function
getIndexDeclaration
(
$name
,
array
$definition
)
{
{
$name
=
$this
->
conn
->
formatter
->
getIndexName
(
$name
);
$name
=
$this
->
conn
->
formatter
->
getIndexName
(
$name
);
$type
=
''
;
$type
=
''
;
if
(
isset
(
$definition
[
'type'
]))
{
if
(
isset
(
$definition
[
'type'
]))
{
switch
(
strtolower
(
$definition
[
'type'
]))
{
switch
(
strtolower
(
$definition
[
'type'
]))
{
case
'fulltext'
:
case
'fulltext'
:
case
'unique'
:
case
'unique'
:
$type
=
strtoupper
(
$definition
[
'type'
])
.
' '
;
$type
=
strtoupper
(
$definition
[
'type'
])
.
' '
;
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'Unknown index type '
.
$definition
[
'type'
]);
throw
new
Doctrine_Export_Exception
(
'Unknown index type '
.
$definition
[
'type'
]);
}
}
}
}
if
(
!
isset
(
$definition
[
'fields'
]))
{
if
(
!
isset
(
$definition
[
'fields'
]))
{
throw
new
Doctrine_Export_Exception
(
'No index columns given.'
);
throw
new
Doctrine_Export_Exception
(
'No index columns given.'
);
}
}
if
(
!
is_array
(
$definition
[
'fields'
]))
{
if
(
!
is_array
(
$definition
[
'fields'
]))
{
$definition
[
'fields'
]
=
array
(
$definition
[
'fields'
]);
$definition
[
'fields'
]
=
array
(
$definition
[
'fields'
]);
}
}
$query
=
$type
.
'INDEX '
.
$this
->
conn
->
quoteIdentifier
(
$name
);
$query
=
$type
.
'INDEX '
.
$this
->
conn
->
quoteIdentifier
(
$name
);
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
(
$definition
[
'fields'
])
.
')'
;
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
(
$definition
[
'fields'
])
.
')'
;
return
$query
;
return
$query
;
}
}
/**
/**
* getIndexFieldDeclarationList
* getIndexFieldDeclarationList
* Obtain DBMS specific SQL code portion needed to set an index
* Obtain DBMS specific SQL code portion needed to set an index
* declaration to be used in statements like CREATE TABLE.
* declaration to be used in statements like CREATE TABLE.
*
*
* @return string
* @return string
*/
*/
public
function
getIndexFieldDeclarationList
(
array
$fields
)
public
function
getIndexFieldDeclarationList
(
array
$fields
)
{
{
$declFields
=
array
();
$declFields
=
array
();
foreach
(
$fields
as
$fieldName
=>
$field
)
{
foreach
(
$fields
as
$fieldName
=>
$field
)
{
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
if
(
is_array
(
$field
))
{
if
(
is_array
(
$field
))
{
if
(
isset
(
$field
[
'length'
]))
{
if
(
isset
(
$field
[
'length'
]))
{
$fieldString
.=
'('
.
$field
[
'length'
]
.
')'
;
$fieldString
.=
'('
.
$field
[
'length'
]
.
')'
;
}
}
if
(
isset
(
$field
[
'sorting'
]))
{
if
(
isset
(
$field
[
'sorting'
]))
{
$sort
=
strtoupper
(
$field
[
'sorting'
]);
$sort
=
strtoupper
(
$field
[
'sorting'
]);
switch
(
$sort
)
{
switch
(
$sort
)
{
case
'ASC'
:
case
'ASC'
:
case
'DESC'
:
case
'DESC'
:
$fieldString
.=
' '
.
$sort
;
$fieldString
.=
' '
.
$sort
;
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'Unknown index sorting option given.'
);
throw
new
Doctrine_Export_Exception
(
'Unknown index sorting option given.'
);
}
}
}
}
}
else
{
}
else
{
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$field
);
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$field
);
}
}
$declFields
[]
=
$fieldString
;
$declFields
[]
=
$fieldString
;
}
}
return
implode
(
', '
,
$declFields
);
return
implode
(
', '
,
$declFields
);
}
}
/**
/**
* getAdvancedForeignKeyOptions
* getAdvancedForeignKeyOptions
* Return the FOREIGN KEY query section dealing with non-standard options
* Return the FOREIGN KEY query section dealing with non-standard options
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
*
*
* @param array $definition
* @param array $definition
* @return string
* @return string
*/
*/
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
{
{
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$definition
[
'match'
]))
{
if
(
!
empty
(
$definition
[
'match'
]))
{
$query
.=
' MATCH '
.
$definition
[
'match'
];
$query
.=
' MATCH '
.
$definition
[
'match'
];
}
}
if
(
!
empty
(
$definition
[
'onUpdate'
]))
{
if
(
!
empty
(
$definition
[
'onUpdate'
]))
{
$query
.=
' ON UPDATE '
.
$this
->
getForeignKeyReferentialAction
(
$definition
[
'onUpdate'
]);
$query
.=
' ON UPDATE '
.
$this
->
getForeignKeyReferentialAction
(
$definition
[
'onUpdate'
]);
}
}
if
(
!
empty
(
$definition
[
'onDelete'
]))
{
if
(
!
empty
(
$definition
[
'onDelete'
]))
{
$query
.=
' ON DELETE '
.
$this
->
getForeignKeyReferentialAction
(
$definition
[
'onDelete'
]);
$query
.=
' ON DELETE '
.
$this
->
getForeignKeyReferentialAction
(
$definition
[
'onDelete'
]);
}
}
return
$query
;
return
$query
;
}
}
/**
/**
* drop existing index
* drop existing index
*
*
* @param string $table name of table that should be used in method
* @param string $table name of table that should be used in method
* @param string $name name of the index to be dropped
* @param string $name name of the index to be dropped
* @return void
* @return void
*/
*/
public
function
dropIndexSql
(
$table
,
$name
)
public
function
dropIndexSql
(
$table
,
$name
)
{
{
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getIndexName
(
$name
),
true
);
return
'DROP INDEX '
.
$name
.
' ON '
.
$table
;
return
'DROP INDEX '
.
$name
.
' ON '
.
$table
;
}
}
/**
/**
* dropTable
* dropTable
*
*
* @param string $table name of table that should be dropped from the database
* @param string $table name of table that should be dropped from the database
* @throws PDOException
* @throws PDOException
* @return void
* @return void
*/
*/
public
function
dropTableSql
(
$table
)
public
function
dropTableSql
(
$table
)
{
{
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
return
'DROP TABLE '
.
$table
;
return
'DROP TABLE '
.
$table
;
}
}
}
}
\ No newline at end of file
lib/Doctrine/Export/Oracle.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Oracle
* Doctrine_Export_Oracle
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Oracle
extends
Doctrine_Export
class
Doctrine_Export_Oracle
extends
Doctrine_Export
{
{
/**
/**
* create a new database
* create a new database
*
*
* @param object $db database object that is extended by this class
* @param object $db database object that is extended by this class
* @param string $name name of the database that should be created
* @param string $name name of the database that should be created
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
* @access public
*/
*/
public
function
createDatabase
(
$name
)
public
function
createDatabase
(
$name
)
{
{
if
(
!
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_EMULATE_DATABASE
))
if
(
!
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_EMULATE_DATABASE
))
throw
new
Doctrine_Export_Exception
(
'database creation is only supported if the "emulate_database" attribute is enabled'
);
throw
new
Doctrine_Export_Exception
(
'database creation is only supported if the "emulate_database" attribute is enabled'
);
$username
=
sprintf
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
),
$name
);
$username
=
sprintf
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
),
$name
);
$password
=
$this
->
conn
->
dsn
[
'password'
]
?
$this
->
conn
->
dsn
[
'password'
]
:
$name
;
$password
=
$this
->
conn
->
dsn
[
'password'
]
?
$this
->
conn
->
dsn
[
'password'
]
:
$name
;
$tablespace
=
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
)
$tablespace
=
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
)
?
' DEFAULT TABLESPACE '
.
$this
->
conn
->
options
[
'default_tablespace'
]
:
''
;
?
' DEFAULT TABLESPACE '
.
$this
->
conn
->
options
[
'default_tablespace'
]
:
''
;
$query
=
'CREATE USER '
.
$username
.
' IDENTIFIED BY '
.
$password
.
$tablespace
;
$query
=
'CREATE USER '
.
$username
.
' IDENTIFIED BY '
.
$password
.
$tablespace
;
$result
=
$this
->
conn
->
exec
(
$query
);
$result
=
$this
->
conn
->
exec
(
$query
);
try
{
try
{
$query
=
'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '
.
$username
;
$query
=
'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '
.
$username
;
$result
=
$this
->
conn
->
exec
(
$query
);
$result
=
$this
->
conn
->
exec
(
$query
);
}
catch
(
Exception
$e
)
{
}
catch
(
Exception
$e
)
{
$query
=
'DROP USER '
.
$username
.
' CASCADE'
;
$query
=
'DROP USER '
.
$username
.
' CASCADE'
;
$result2
=
$this
->
conn
->
exec
(
$query
);
$result2
=
$this
->
conn
->
exec
(
$query
);
}
}
return
true
;
return
true
;
}
}
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param object $this->conn database object that is extended by this class
* @param object $this->conn database object that is extended by this class
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
* @access public
*/
*/
public
function
dropDatabase
(
$name
)
public
function
dropDatabase
(
$name
)
{
{
if
(
!
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_EMULATE_DATABASE
))
if
(
!
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_EMULATE_DATABASE
))
throw
new
Doctrine_Export_Exception
(
'database dropping is only supported if the
throw
new
Doctrine_Export_Exception
(
'database dropping is only supported if the
"emulate_database" option is enabled'
);
"emulate_database" option is enabled'
);
$username
=
sprintf
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
),
$name
);
$username
=
sprintf
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DB_NAME_FORMAT
),
$name
);
return
$this
->
conn
->
exec
(
'DROP USER '
.
$username
.
' CASCADE'
);
return
$this
->
conn
->
exec
(
'DROP USER '
.
$username
.
' CASCADE'
);
}
}
/**
/**
* add an autoincrement sequence + trigger
* add an autoincrement sequence + trigger
*
*
* @param string $name name of the PK field
* @param string $name name of the PK field
* @param string $table name of the table
* @param string $table name of the table
* @param string $start start value for the sequence
* @param string $start start value for the sequence
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access private
* @access private
*/
*/
public
function
_makeAutoincrement
(
$name
,
$table
,
$start
=
1
)
public
function
_makeAutoincrement
(
$name
,
$table
,
$start
=
1
)
{
{
$sql
=
array
();
$sql
=
array
();
$table
=
strtoupper
(
$table
);
$table
=
strtoupper
(
$table
);
$indexName
=
$table
.
'_AI_PK'
;
$indexName
=
$table
.
'_AI_PK'
;
$definition
=
array
(
$definition
=
array
(
'primary'
=>
true
,
'primary'
=>
true
,
'fields'
=>
array
(
$name
=>
true
),
'fields'
=>
array
(
$name
=>
true
),
);
);
$sql
[]
=
$this
->
createConstraintSql
(
$table
,
$indexName
,
$definition
);
$sql
[]
=
$this
->
createConstraintSql
(
$table
,
$indexName
,
$definition
);
if
(
is_null
(
$start
))
{
if
(
is_null
(
$start
))
{
$query
=
'SELECT MAX('
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
') FROM '
.
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$query
=
'SELECT MAX('
.
$this
->
conn
->
quoteIdentifier
(
$name
,
true
)
.
') FROM '
.
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$start
=
$this
->
conn
->
fetchOne
(
$query
);
$start
=
$this
->
conn
->
fetchOne
(
$query
);
++
$start
;
++
$start
;
}
}
$sql
[]
=
$this
->
createSequenceSql
(
$table
,
$start
);
$sql
[]
=
$this
->
createSequenceSql
(
$table
,
$start
);
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$table
);
$sequenceName
=
$this
->
conn
->
formatter
->
getSequenceName
(
$table
);
$triggerName
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AI_PK'
,
true
);
$triggerName
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AI_PK'
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$table
=
$this
->
conn
->
quoteIdentifier
(
$table
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$sql
[]
=
'CREATE TRIGGER '
.
$triggerName
.
'
$sql
[]
=
'CREATE TRIGGER '
.
$triggerName
.
'
BEFORE INSERT
BEFORE INSERT
ON '
.
$table
.
'
ON '
.
$table
.
'
FOR EACH ROW
FOR EACH ROW
DECLARE
DECLARE
last_Sequence NUMBER;
last_Sequence NUMBER;
last_InsertID NUMBER;
last_InsertID NUMBER;
BEGIN
BEGIN
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO :NEW.'
.
$name
.
' FROM DUAL;
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO :NEW.'
.
$name
.
' FROM DUAL;
IF (:NEW.'
.
$name
.
' IS NULL OR :NEW.'
.
$name
.
' = 0) THEN
IF (:NEW.'
.
$name
.
' IS NULL OR :NEW.'
.
$name
.
' = 0) THEN
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO :NEW.'
.
$name
.
' FROM DUAL;
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO :NEW.'
.
$name
.
' FROM DUAL;
ELSE
ELSE
SELECT NVL(Last_Number, 0) INTO last_Sequence
SELECT NVL(Last_Number, 0) INTO last_Sequence
FROM User_Sequences
FROM User_Sequences
WHERE UPPER(Sequence_Name) = UPPER(\''
.
$sequenceName
.
'\');
WHERE UPPER(Sequence_Name) = UPPER(\''
.
$sequenceName
.
'\');
SELECT :NEW.id INTO last_InsertID FROM DUAL;
SELECT :NEW.id INTO last_InsertID FROM DUAL;
WHILE (last_InsertID > last_Sequence) LOOP
WHILE (last_InsertID > last_Sequence) LOOP
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO last_Sequence FROM DUAL;
SELECT '
.
$sequenceName
.
'.NEXTVAL INTO last_Sequence FROM DUAL;
END LOOP;
END LOOP;
END IF;
END IF;
END;
END;
'
;
'
;
return
$sql
;
return
$sql
;
}
}
/**
/**
* drop an existing autoincrement sequence + trigger
* drop an existing autoincrement sequence + trigger
*
*
* @param string $table name of the table
* @param string $table name of the table
* @return void
* @return void
*/
*/
public
function
dropAutoincrement
(
$table
)
public
function
dropAutoincrement
(
$table
)
{
{
$table
=
strtoupper
(
$table
);
$table
=
strtoupper
(
$table
);
$triggerName
=
$table
.
'_AI_PK'
;
$triggerName
=
$table
.
'_AI_PK'
;
$trigger_name_quoted
=
$this
->
conn
->
quote
(
$triggerName
);
$trigger_name_quoted
=
$this
->
conn
->
quote
(
$triggerName
);
$query
=
'SELECT trigger_name FROM user_triggers'
;
$query
=
'SELECT trigger_name FROM user_triggers'
;
$query
.=
' WHERE trigger_name='
.
$trigger_name_quoted
.
' OR trigger_name='
.
strtoupper
(
$trigger_name_quoted
);
$query
.=
' WHERE trigger_name='
.
$trigger_name_quoted
.
' OR trigger_name='
.
strtoupper
(
$trigger_name_quoted
);
$trigger
=
$this
->
conn
->
fetchOne
(
$query
);
$trigger
=
$this
->
conn
->
fetchOne
(
$query
);
if
(
$trigger
)
{
if
(
$trigger
)
{
$trigger_name
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AI_PK'
,
true
);
$trigger_name
=
$this
->
conn
->
quoteIdentifier
(
$table
.
'_AI_PK'
,
true
);
$trigger_sql
=
'DROP TRIGGER '
.
$trigger_name
;
$trigger_sql
=
'DROP TRIGGER '
.
$trigger_name
;
// if throws exception, trigger for autoincrement PK could not be dropped
// if throws exception, trigger for autoincrement PK could not be dropped
$this
->
conn
->
exec
(
$trigger_sql
);
$this
->
conn
->
exec
(
$trigger_sql
);
// if throws exception, sequence for autoincrement PK could not be dropped
// if throws exception, sequence for autoincrement PK could not be dropped
$this
->
dropSequence
(
$table
);
$this
->
dropSequence
(
$table
);
$indexName
=
$table
.
'_AI_PK'
;
$indexName
=
$table
.
'_AI_PK'
;
// if throws exception, primary key for autoincrement PK could not be dropped
// if throws exception, primary key for autoincrement PK could not be dropped
$this
->
dropConstraint
(
$table
,
$indexName
);
$this
->
dropConstraint
(
$table
,
$indexName
);
}
}
}
}
/**
/**
* A method to return the required SQL string that fits between CREATE ... TABLE
* A method to return the required SQL string that fits between CREATE ... TABLE
* to create the table as a temporary table.
* to create the table as a temporary table.
*
*
* @return string The string required to be placed between "CREATE" and "TABLE"
* @return string The string required to be placed between "CREATE" and "TABLE"
* to generate a temporary table, if possible.
* to generate a temporary table, if possible.
*/
*/
public
function
getTemporaryTableQuery
()
public
function
getTemporaryTableQuery
()
{
{
return
'GLOBAL TEMPORARY'
;
return
'GLOBAL TEMPORARY'
;
}
}
/**
/**
* getAdvancedForeignKeyOptions
* getAdvancedForeignKeyOptions
* Return the FOREIGN KEY query section dealing with non-standard options
* Return the FOREIGN KEY query section dealing with non-standard options
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
*
*
* @param array $definition foreign key definition
* @param array $definition foreign key definition
* @return string
* @return string
* @access protected
* @access protected
*/
*/
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
{
{
$query
=
''
;
$query
=
''
;
if
(
isset
(
$definition
[
'onDelete'
]))
{
if
(
isset
(
$definition
[
'onDelete'
]))
{
$query
.=
' ON DELETE '
.
$definition
[
'onDelete'
];
$query
.=
' ON DELETE '
.
$definition
[
'onDelete'
];
}
}
if
(
isset
(
$definition
[
'deferrable'
]))
{
if
(
isset
(
$definition
[
'deferrable'
]))
{
$query
.=
' DEFERRABLE'
;
$query
.=
' DEFERRABLE'
;
}
else
{
}
else
{
$query
.=
' NOT DEFERRABLE'
;
$query
.=
' NOT DEFERRABLE'
;
}
}
if
(
isset
(
$definition
[
'feferred'
]))
{
if
(
isset
(
$definition
[
'feferred'
]))
{
$query
.=
' INITIALLY DEFERRED'
;
$query
.=
' INITIALLY DEFERRED'
;
}
else
{
}
else
{
$query
.=
' INITIALLY IMMEDIATE'
;
$query
.=
' INITIALLY IMMEDIATE'
;
}
}
return
$query
;
return
$query
;
}
}
/**
/**
* create a new table
* create a new table
*
*
* @param string $name Name of the database that should be created
* @param string $name Name of the database that should be created
* @param array $fields Associative array that contains the definition of each field of the new table
* @param array $fields Associative array that contains the definition of each field of the new table
* The indexes of the array entries are the names of the fields of the table an
* The indexes of the array entries are the names of the fields of the table an
* the array entry values are associative arrays like those that are meant to be
* the array entry values are associative arrays like those that are meant to be
* passed with the field definitions to get[Type]Declaration() functions.
* passed with the field definitions to get[Type]Declaration() functions.
*
*
* Example
* Example
* array(
* array(
*
*
* 'id' => array(
* 'id' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* 'notnull' => 1
* 'notnull' => 1
* 'default' => 0
* 'default' => 0
* ),
* ),
* 'name' => array(
* 'name' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* ),
* ),
* 'password' => array(
* 'password' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* )
* )
* );
* );
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
*
*
* @return void
* @return void
*/
*/
public
function
createTable
(
$name
,
array
$fields
,
array
$options
=
array
())
public
function
createTable
(
$name
,
array
$fields
,
array
$options
=
array
())
{
{
$this
->
conn
->
beginTransaction
();
$this
->
conn
->
beginTransaction
();
foreach
(
$this
->
createTableSql
(
$name
,
$fields
,
$options
)
as
$sql
)
{
foreach
(
$this
->
createTableSql
(
$name
,
$fields
,
$options
)
as
$sql
)
{
$this
->
conn
->
exec
(
$sql
);
$this
->
conn
->
exec
(
$sql
);
}
}
$this
->
conn
->
commit
();
$this
->
conn
->
commit
();
}
}
/**
/**
* create a new table
* create a new table
*
*
* @param string $name Name of the database that should be created
* @param string $name Name of the database that should be created
* @param array $fields Associative array that contains the definition of each field of the new table
* @param array $fields Associative array that contains the definition of each field of the new table
* The indexes of the array entries are the names of the fields of the table an
* The indexes of the array entries are the names of the fields of the table an
* the array entry values are associative arrays like those that are meant to be
* the array entry values are associative arrays like those that are meant to be
* passed with the field definitions to get[Type]Declaration() functions.
* passed with the field definitions to get[Type]Declaration() functions.
*
*
* Example
* Example
* array(
* array(
*
*
* 'id' => array(
* 'id' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* 'notnull' => 1
* 'notnull' => 1
* 'default' => 0
* 'default' => 0
* ),
* ),
* 'name' => array(
* 'name' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* ),
* ),
* 'password' => array(
* 'password' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* )
* )
* );
* );
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
*
*
* @return void
* @return void
*/
*/
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
{
{
$sql
=
parent
::
createTableSql
(
$name
,
$fields
,
$options
);
$sql
=
parent
::
createTableSql
(
$name
,
$fields
,
$options
);
foreach
(
$fields
as
$fieldName
=>
$field
)
{
foreach
(
$fields
as
$fieldName
=>
$field
)
{
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
]
||
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
]
||
(
isset
(
$field
[
'autoinc'
])
&&
$fields
[
'autoinc'
]))
{
(
isset
(
$field
[
'autoinc'
])
&&
$fields
[
'autoinc'
]))
{
$sql
=
array_merge
(
$sql
,
$this
->
_makeAutoincrement
(
$fieldName
,
$name
));
$sql
=
array_merge
(
$sql
,
$this
->
_makeAutoincrement
(
$fieldName
,
$name
));
}
}
}
}
return
$sql
;
return
$sql
;
}
}
/**
/**
* drop an existing table
* drop an existing table
*
*
* @param string $name name of the table that should be dropped
* @param string $name name of the table that should be dropped
* @return void
* @return void
*/
*/
public
function
dropTable
(
$name
)
public
function
dropTable
(
$name
)
{
{
//$this->conn->beginNestedTransaction();
//$this->conn->beginNestedTransaction();
$result
=
$this
->
dropAutoincrement
(
$name
);
$result
=
$this
->
dropAutoincrement
(
$name
);
$result
=
parent
::
dropTable
(
$name
);
$result
=
parent
::
dropTable
(
$name
);
//$this->conn->completeNestedTransaction();
//$this->conn->completeNestedTransaction();
return
$result
;
return
$result
;
}
}
/**
/**
* alter an existing table
* alter an existing table
*
*
* @param string $name name of the table that is intended to be changed.
* @param string $name name of the table that is intended to be changed.
* @param array $changes associative array that contains the details of each type
* @param array $changes associative array that contains the details of each type
* of change that is intended to be performed. The types of
* of change that is intended to be performed. The types of
* changes that are currently supported are defined as follows:
* changes that are currently supported are defined as follows:
*
*
* name
* name
*
*
* New name for the table.
* New name for the table.
*
*
* add
* add
*
*
* Associative array with the names of fields to be added as
* Associative array with the names of fields to be added as
* indexes of the array. The value of each entry of the array
* indexes of the array. The value of each entry of the array
* should be set to another associative array with the properties
* should be set to another associative array with the properties
* of the fields to be added. The properties of the fields should
* of the fields to be added. The properties of the fields should
* be the same as defined by the MDB2 parser.
* be the same as defined by the MDB2 parser.
*
*
*
*
* remove
* remove
*
*
* Associative array with the names of fields to be removed as indexes
* Associative array with the names of fields to be removed as indexes
* of the array. Currently the values assigned to each entry are ignored.
* of the array. Currently the values assigned to each entry are ignored.
* An empty array should be used for future compatibility.
* An empty array should be used for future compatibility.
*
*
* rename
* rename
*
*
* Associative array with the names of fields to be renamed as indexes
* Associative array with the names of fields to be renamed as indexes
* of the array. The value of each entry of the array should be set to
* of the array. The value of each entry of the array should be set to
* another associative array with the entry named name with the new
* another associative array with the entry named name with the new
* field name and the entry named Declaration that is expected to contain
* field name and the entry named Declaration that is expected to contain
* the portion of the field declaration already in DBMS specific SQL code
* the portion of the field declaration already in DBMS specific SQL code
* as it is used in the CREATE TABLE statement.
* as it is used in the CREATE TABLE statement.
*
*
* change
* change
*
*
* Associative array with the names of the fields to be changed as indexes
* Associative array with the names of the fields to be changed as indexes
* of the array. Keep in mind that if it is intended to change either the
* of the array. Keep in mind that if it is intended to change either the
* name of a field and any other properties, the change array entries
* name of a field and any other properties, the change array entries
* should have the new names of the fields as array indexes.
* should have the new names of the fields as array indexes.
*
*
* The value of each entry of the array should be set to another associative
* The value of each entry of the array should be set to another associative
* array with the properties of the fields to that are meant to be changed as
* array with the properties of the fields to that are meant to be changed as
* array entries. These entries should be assigned to the new values of the
* array entries. These entries should be assigned to the new values of the
* respective properties. The properties of the fields should be the same
* respective properties. The properties of the fields should be the same
* as defined by the MDB2 parser.
* as defined by the MDB2 parser.
*
*
* Example
* Example
* array(
* array(
* 'name' => 'userlist',
* 'name' => 'userlist',
* 'add' => array(
* 'add' => array(
* 'quota' => array(
* 'quota' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* )
* )
* ),
* ),
* 'remove' => array(
* 'remove' => array(
* 'file_limit' => array(),
* 'file_limit' => array(),
* 'time_limit' => array()
* 'time_limit' => array()
* ),
* ),
* 'change' => array(
* 'change' => array(
* 'name' => array(
* 'name' => array(
* 'length' => '20',
* 'length' => '20',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 20,
* 'length' => 20,
* ),
* ),
* )
* )
* ),
* ),
* 'rename' => array(
* 'rename' => array(
* 'sex' => array(
* 'sex' => array(
* 'name' => 'gender',
* 'name' => 'gender',
* 'definition' => array(
* 'definition' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 1,
* 'length' => 1,
* 'default' => 'M',
* 'default' => 'M',
* ),
* ),
* )
* )
* )
* )
* )
* )
*
*
* @param boolean $check indicates whether the function should just check if the DBMS driver
* @param boolean $check indicates whether the function should just check if the DBMS driver
* can perform the requested table alterations if the value is true or
* can perform the requested table alterations if the value is true or
* actually perform them otherwise.
* actually perform them otherwise.
* @return void
* @return void
*/
*/
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTable
(
$name
,
array
$changes
,
$check
=
false
)
{
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
case
'remove'
:
case
'remove'
:
case
'change'
:
case
'change'
:
case
'name'
:
case
'name'
:
case
'rename'
:
case
'rename'
:
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
}
}
}
}
if
(
$check
)
{
if
(
$check
)
{
return
false
;
return
false
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
$fields
=
array
();
$fields
=
array
();
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
$fields
[]
=
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
$fields
[]
=
$this
->
conn
->
getDeclaration
(
$fieldName
,
$field
);
}
}
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' ADD ('
.
implode
(
', '
,
$fields
)
.
')'
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' ADD ('
.
implode
(
', '
,
$fields
)
.
')'
);
}
}
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
$fields
=
array
();
$fields
=
array
();
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
$fields
[]
=
$fieldName
.
' '
.
$this
->
conn
->
getDeclaration
(
''
,
$field
[
'definition'
]);
$fields
[]
=
$fieldName
.
' '
.
$this
->
conn
->
getDeclaration
(
''
,
$field
[
'definition'
]);
}
}
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' MODIFY ('
.
implode
(
', '
,
$fields
)
.
')'
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' MODIFY ('
.
implode
(
', '
,
$fields
)
.
')'
);
}
}
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
$query
=
'ALTER TABLE '
.
$name
.
' RENAME COLUMN '
.
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
)
$query
=
'ALTER TABLE '
.
$name
.
' RENAME COLUMN '
.
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
)
.
' TO '
.
$this
->
conn
->
quoteIdentifier
(
$field
[
'name'
]);
.
' TO '
.
$this
->
conn
->
quoteIdentifier
(
$field
[
'name'
]);
$result
=
$this
->
conn
->
exec
(
$query
);
$result
=
$this
->
conn
->
exec
(
$query
);
}
}
}
}
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
if
(
!
empty
(
$changes
[
'remove'
])
&&
is_array
(
$changes
[
'remove'
]))
{
$fields
=
array
();
$fields
=
array
();
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'remove'
]
as
$fieldName
=>
$field
)
{
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
$fields
[]
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
,
true
);
}
}
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' DROP COLUMN '
.
implode
(
', '
,
$fields
));
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' DROP COLUMN '
.
implode
(
', '
,
$fields
));
}
}
if
(
!
empty
(
$changes
[
'name'
]))
{
if
(
!
empty
(
$changes
[
'name'
]))
{
$changeName
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
],
true
);
$changeName
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
],
true
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' RENAME TO '
.
$changeName
);
$result
=
$this
->
conn
->
exec
(
'ALTER TABLE '
.
$name
.
' RENAME TO '
.
$changeName
);
}
}
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $seqName name of the sequence to be created
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* );
* );
* @return string
* @return string
*/
*/
public
function
createSequenceSql
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequenceSql
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
),
true
);
$query
=
'CREATE SEQUENCE '
.
$sequenceName
.
' START WITH '
.
$start
.
' INCREMENT BY 1 NOCACHE'
;
$query
=
'CREATE SEQUENCE '
.
$sequenceName
.
' START WITH '
.
$start
.
' INCREMENT BY 1 NOCACHE'
;
$query
.=
(
$start
<
1
?
' MINVALUE '
.
$start
:
''
);
$query
.=
(
$start
<
1
?
' MINVALUE '
.
$start
:
''
);
return
$query
;
return
$query
;
}
}
/**
/**
* drop existing sequence
* drop existing sequence
*
*
* @param object $this->conn database object that is extended by this class
* @param object $this->conn database object that is extended by this class
* @param string $seqName name of the sequence to be dropped
* @param string $seqName name of the sequence to be dropped
* @return string
* @return string
*/
*/
public
function
dropSequenceSql
(
$seqName
)
public
function
dropSequenceSql
(
$seqName
)
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
formatter
->
getSequenceName
(
$seqName
),
true
);
return
'DROP SEQUENCE '
.
$sequenceName
;
return
'DROP SEQUENCE '
.
$sequenceName
;
}
}
}
}
\ No newline at end of file
lib/Doctrine/Export/Sqlite.php
View file @
c8812542
<?php
<?php
/*
/*
* $Id$
* $Id$
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* This software consists of voluntary contributions made by many individuals
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
* <http://www.phpdoctrine.com>.
*/
*/
Doctrine
::
autoload
(
'Doctrine_Export'
);
Doctrine
::
autoload
(
'Doctrine_Export'
);
/**
/**
* Doctrine_Export_Sqlite
* Doctrine_Export_Sqlite
*
*
* @package Doctrine
* @package Doctrine
* @subpackage Export
* @subpackage Export
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link www.phpdoctrine.com
* @link www.phpdoctrine.com
* @since 1.0
* @since 1.0
* @version $Revision$
* @version $Revision$
*/
*/
class
Doctrine_Export_Sqlite
extends
Doctrine_Export
class
Doctrine_Export_Sqlite
extends
Doctrine_Export
{
{
/**
/**
* drop an existing database
* drop an existing database
*
*
* @param string $name name of the database that should be dropped
* @param string $name name of the database that should be dropped
* @throws Doctrine_Export_Exception if the database file does not exist
* @throws Doctrine_Export_Exception if the database file does not exist
* @throws Doctrine_Export_Exception if something failed during the removal of the database file
* @throws Doctrine_Export_Exception if something failed during the removal of the database file
* @return void
* @return void
*/
*/
public
function
dropDatabase
(
$name
)
public
function
dropDatabase
(
$name
)
{
{
$databaseFile
=
$this
->
conn
->
getDatabaseFile
(
$name
);
$databaseFile
=
$this
->
conn
->
getDatabaseFile
(
$name
);
if
(
!
@
file_exists
(
$databaseFile
))
{
if
(
!
@
file_exists
(
$databaseFile
))
{
throw
new
Doctrine_Export_Exception
(
'database does not exist'
);
throw
new
Doctrine_Export_Exception
(
'database does not exist'
);
}
}
$result
=
@
unlink
(
$databaseFile
);
$result
=
@
unlink
(
$databaseFile
);
if
(
!
$result
)
{
if
(
!
$result
)
{
throw
new
Doctrine_Export_Exception
(
'could not remove the database file'
);
throw
new
Doctrine_Export_Exception
(
'could not remove the database file'
);
}
}
}
}
/**
/**
* Get the stucture of a field into an array
* Get the stucture of a field into an array
*
*
* @param string $table name of the table on which the index is to be created
* @param string $table name of the table on which the index is to be created
* @param string $name name of the index to be created
* @param string $name name of the index to be created
* @param array $definition associative array that defines properties of the index to be created.
* @param array $definition associative array that defines properties of the index to be created.
* Currently, only one property named FIELDS is supported. This property
* Currently, only one property named FIELDS is supported. This property
* is also an associative with the names of the index fields as array
* is also an associative with the names of the index fields as array
* indexes. Each entry of this array is set to another type of associative
* indexes. Each entry of this array is set to another type of associative
* array that specifies properties of the index that are specific to
* array that specifies properties of the index that are specific to
* each field.
* each field.
*
*
* Currently, only the sorting property is supported. It should be used
* Currently, only the sorting property is supported. It should be used
* to define the sorting direction of the index. It may be set to either
* to define the sorting direction of the index. It may be set to either
* ascending or descending.
* ascending or descending.
*
*
* Not all DBMS support index sorting direction configuration. The DBMS
* Not all DBMS support index sorting direction configuration. The DBMS
* drivers of those that do not support it ignore this property. Use the
* drivers of those that do not support it ignore this property. Use the
* function support() to determine whether the DBMS driver can manage indexes.
* function support() to determine whether the DBMS driver can manage indexes.
* Example
* Example
* array(
* array(
* 'fields' => array(
* 'fields' => array(
* 'user_name' => array(
* 'user_name' => array(
* 'sorting' => 'ascending'
* 'sorting' => 'ascending'
* ),
* ),
* 'last_login' => array()
* 'last_login' => array()
* )
* )
* )
* )
* @throws PDOException
* @throws PDOException
* @return void
* @return void
*/
*/
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
public
function
createIndexSql
(
$table
,
$name
,
array
$definition
)
{
{
$name
=
$this
->
conn
->
formatter
->
getIndexName
(
$name
);
$name
=
$this
->
conn
->
formatter
->
getIndexName
(
$name
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
);
$query
=
'CREATE INDEX '
.
$name
.
' ON '
.
$table
;
$query
=
'CREATE INDEX '
.
$name
.
' ON '
.
$table
;
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
(
$definition
[
'fields'
])
.
')'
;
$query
.=
' ('
.
$this
->
getIndexFieldDeclarationList
(
$definition
[
'fields'
])
.
')'
;
return
$query
;
return
$query
;
}
}
/**
/**
* getIndexFieldDeclarationList
* getIndexFieldDeclarationList
* Obtain DBMS specific SQL code portion needed to set an index
* Obtain DBMS specific SQL code portion needed to set an index
* declaration to be used in statements like CREATE TABLE.
* declaration to be used in statements like CREATE TABLE.
*
*
* @return string
* @return string
*/
*/
public
function
getIndexFieldDeclarationList
(
array
$fields
)
public
function
getIndexFieldDeclarationList
(
array
$fields
)
{
{
$declFields
=
array
();
$declFields
=
array
();
foreach
(
$fields
as
$fieldName
=>
$field
)
{
foreach
(
$fields
as
$fieldName
=>
$field
)
{
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$fieldName
);
if
(
is_array
(
$field
))
{
if
(
is_array
(
$field
))
{
if
(
isset
(
$field
[
'sorting'
]))
{
if
(
isset
(
$field
[
'sorting'
]))
{
$sort
=
strtoupper
(
$field
[
'sorting'
]);
$sort
=
strtoupper
(
$field
[
'sorting'
]);
switch
(
$sort
)
{
switch
(
$sort
)
{
case
'ASC'
:
case
'ASC'
:
case
'DESC'
:
case
'DESC'
:
$fieldString
.=
' '
.
$sort
;
$fieldString
.=
' '
.
$sort
;
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'Unknown index sorting option given.'
);
throw
new
Doctrine_Export_Exception
(
'Unknown index sorting option given.'
);
}
}
}
}
}
else
{
}
else
{
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$field
);
$fieldString
=
$this
->
conn
->
quoteIdentifier
(
$field
);
}
}
$declFields
[]
=
$fieldString
;
$declFields
[]
=
$fieldString
;
}
}
return
implode
(
', '
,
$declFields
);
return
implode
(
', '
,
$declFields
);
}
}
/**
/**
* create a new table
* create a new table
*
*
* @param string $name Name of the database that should be created
* @param string $name Name of the database that should be created
* @param array $fields Associative array that contains the definition of each field of the new table
* @param array $fields Associative array that contains the definition of each field of the new table
* The indexes of the array entries are the names of the fields of the table an
* The indexes of the array entries are the names of the fields of the table an
* the array entry values are associative arrays like those that are meant to be
* the array entry values are associative arrays like those that are meant to be
* passed with the field definitions to get[Type]Declaration() functions.
* passed with the field definitions to get[Type]Declaration() functions.
* array(
* array(
* 'id' => array(
* 'id' => array(
* 'type' => 'integer',
* 'type' => 'integer',
* 'unsigned' => 1
* 'unsigned' => 1
* 'notnull' => 1
* 'notnull' => 1
* 'default' => 0
* 'default' => 0
* ),
* ),
* 'name' => array(
* 'name' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* ),
* ),
* 'password' => array(
* 'password' => array(
* 'type' => 'text',
* 'type' => 'text',
* 'length' => 12
* 'length' => 12
* )
* )
* );
* );
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
*
*
* @return void
* @return void
*/
*/
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
public
function
createTableSql
(
$name
,
array
$fields
,
array
$options
=
array
())
{
{
if
(
!
$name
)
{
if
(
!
$name
)
{
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
}
}
if
(
empty
(
$fields
))
{
if
(
empty
(
$fields
))
{
throw
new
Doctrine_Export_Exception
(
'no fields specified for table '
.
$name
);
throw
new
Doctrine_Export_Exception
(
'no fields specified for table '
.
$name
);
}
}
$queryFields
=
$this
->
getFieldDeclarationList
(
$fields
);
$queryFields
=
$this
->
getFieldDeclarationList
(
$fields
);
$autoinc
=
false
;
$autoinc
=
false
;
foreach
(
$fields
as
$field
)
{
foreach
(
$fields
as
$field
)
{
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
]
||
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
]
||
(
isset
(
$field
[
'autoinc'
])
&&
$field
[
'autoinc'
]))
{
(
isset
(
$field
[
'autoinc'
])
&&
$field
[
'autoinc'
]))
{
$autoinc
=
true
;
$autoinc
=
true
;
break
;
break
;
}
}
}
}
if
(
!
$autoinc
&&
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
]))
{
if
(
!
$autoinc
&&
isset
(
$options
[
'primary'
])
&&
!
empty
(
$options
[
'primary'
]))
{
$keyColumns
=
array_values
(
$options
[
'primary'
]);
$keyColumns
=
array_values
(
$options
[
'primary'
]);
$keyColumns
=
array_map
(
array
(
$this
->
conn
,
'quoteIdentifier'
),
$keyColumns
);
$keyColumns
=
array_map
(
array
(
$this
->
conn
,
'quoteIdentifier'
),
$keyColumns
);
$queryFields
.=
', PRIMARY KEY('
.
implode
(
', '
,
$keyColumns
)
.
')'
;
$queryFields
.=
', PRIMARY KEY('
.
implode
(
', '
,
$keyColumns
)
.
')'
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$sql
=
'CREATE TABLE '
.
$name
.
' ('
.
$queryFields
;
$sql
=
'CREATE TABLE '
.
$name
.
' ('
.
$queryFields
;
if
(
$check
=
$this
->
getCheckDeclaration
(
$fields
))
{
if
(
$check
=
$this
->
getCheckDeclaration
(
$fields
))
{
$sql
.=
', '
.
$check
;
$sql
.=
', '
.
$check
;
}
}
if
(
isset
(
$options
[
'checks'
])
&&
$check
=
$this
->
getCheckDeclaration
(
$options
[
'checks'
]))
{
if
(
isset
(
$options
[
'checks'
])
&&
$check
=
$this
->
getCheckDeclaration
(
$options
[
'checks'
]))
{
$sql
.=
', '
.
$check
;
$sql
.=
', '
.
$check
;
}
}
$sql
.=
')'
;
$sql
.=
')'
;
$query
[]
=
$sql
;
$query
[]
=
$sql
;
if
(
isset
(
$options
[
'indexes'
])
&&
!
empty
(
$options
[
'indexes'
]))
{
if
(
isset
(
$options
[
'indexes'
])
&&
!
empty
(
$options
[
'indexes'
]))
{
foreach
(
$options
[
'indexes'
]
as
$index
=>
$definition
)
{
foreach
(
$options
[
'indexes'
]
as
$index
=>
$definition
)
{
$query
[]
=
$this
->
createIndexSql
(
$name
,
$index
,
$definition
);
$query
[]
=
$this
->
createIndexSql
(
$name
,
$index
,
$definition
);
}
}
}
}
return
$query
;
return
$query
;
/**
/**
try {
try {
if ( ! empty($fk)) {
if ( ! empty($fk)) {
$this->conn->beginTransaction();
$this->conn->beginTransaction();
}
}
$ret = $this->conn->exec($query);
$ret = $this->conn->exec($query);
if ( ! empty($fk)) {
if ( ! empty($fk)) {
foreach ($fk as $definition) {
foreach ($fk as $definition) {
$query = 'CREATE TRIGGER doctrine_' . $name . '_cscd_delete '
$query = 'CREATE TRIGGER doctrine_' . $name . '_cscd_delete '
. 'AFTER DELETE ON ' . $name . ' FOR EACH ROW '
. 'AFTER DELETE ON ' . $name . ' FOR EACH ROW '
. 'BEGIN '
. 'BEGIN '
. 'DELETE FROM ' . $definition['foreignTable'] . ' WHERE ';
. 'DELETE FROM ' . $definition['foreignTable'] . ' WHERE ';
$local = (array) $definition['local'];
$local = (array) $definition['local'];
foreach((array) $definition['foreign'] as $k => $field) {
foreach((array) $definition['foreign'] as $k => $field) {
$query .= $field . ' = old.' . $local[$k] . ';';
$query .= $field . ' = old.' . $local[$k] . ';';
}
}
$query .= 'END;';
$query .= 'END;';
$this->conn->exec($query);
$this->conn->exec($query);
}
}
$this->conn->commit();
$this->conn->commit();
}
}
} catch(Doctrine_Exception $e) {
} catch(Doctrine_Exception $e) {
$this->conn->rollback();
$this->conn->rollback();
throw $e;
throw $e;
}
}
*/
*/
}
}
/**
/**
* getAdvancedForeignKeyOptions
* getAdvancedForeignKeyOptions
* Return the FOREIGN KEY query section dealing with non-standard options
* Return the FOREIGN KEY query section dealing with non-standard options
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
* as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
*
*
* @param array $definition foreign key definition
* @param array $definition foreign key definition
* @return string
* @return string
* @access protected
* @access protected
*/
*/
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
public
function
getAdvancedForeignKeyOptions
(
array
$definition
)
{
{
$query
=
''
;
$query
=
''
;
if
(
isset
(
$definition
[
'match'
]))
{
if
(
isset
(
$definition
[
'match'
]))
{
$query
.=
' MATCH '
.
$definition
[
'match'
];
$query
.=
' MATCH '
.
$definition
[
'match'
];
}
}
if
(
isset
(
$definition
[
'onUpdate'
]))
{
if
(
isset
(
$definition
[
'onUpdate'
]))
{
$query
.=
' ON UPDATE '
.
$definition
[
'onUpdate'
];
$query
.=
' ON UPDATE '
.
$definition
[
'onUpdate'
];
}
}
if
(
isset
(
$definition
[
'onDelete'
]))
{
if
(
isset
(
$definition
[
'onDelete'
]))
{
$query
.=
' ON DELETE '
.
$definition
[
'onDelete'
];
$query
.=
' ON DELETE '
.
$definition
[
'onDelete'
];
}
}
if
(
isset
(
$definition
[
'deferrable'
]))
{
if
(
isset
(
$definition
[
'deferrable'
]))
{
$query
.=
' DEFERRABLE'
;
$query
.=
' DEFERRABLE'
;
}
else
{
}
else
{
$query
.=
' NOT DEFERRABLE'
;
$query
.=
' NOT DEFERRABLE'
;
}
}
if
(
isset
(
$definition
[
'feferred'
]))
{
if
(
isset
(
$definition
[
'feferred'
]))
{
$query
.=
' INITIALLY DEFERRED'
;
$query
.=
' INITIALLY DEFERRED'
;
}
else
{
}
else
{
$query
.=
' INITIALLY IMMEDIATE'
;
$query
.=
' INITIALLY IMMEDIATE'
;
}
}
return
$query
;
return
$query
;
}
}
/**
/**
* create sequence
* create sequence
*
*
* @param string $seqName name of the sequence to be created
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @param string $start start value of the sequence; default is 1
* @param array $options An associative array of table options:
* @param array $options An associative array of table options:
* array(
* array(
* 'comment' => 'Foo',
* 'comment' => 'Foo',
* 'charset' => 'utf8',
* 'charset' => 'utf8',
* 'collate' => 'utf8_unicode_ci',
* 'collate' => 'utf8_unicode_ci',
* );
* );
* @return boolean
* @return boolean
*/
*/
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
public
function
createSequence
(
$seqName
,
$start
=
1
,
array
$options
=
array
())
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$seqName
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$seqcolName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_SEQCOL_NAME
),
true
);
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INTEGER PRIMARY KEY DEFAULT 0 NOT NULL)'
;
$query
=
'CREATE TABLE '
.
$sequenceName
.
' ('
.
$seqcolName
.
' INTEGER PRIMARY KEY DEFAULT 0 NOT NULL)'
;
$this
->
conn
->
exec
(
$query
);
$this
->
conn
->
exec
(
$query
);
if
(
$start
==
1
)
{
if
(
$start
==
1
)
{
return
true
;
return
true
;
}
}
try
{
try
{
$this
->
conn
->
exec
(
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
);
$this
->
conn
->
exec
(
'INSERT INTO '
.
$sequenceName
.
' ('
.
$seqcolName
.
') VALUES ('
.
(
$start
-
1
)
.
')'
);
return
true
;
return
true
;
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
// Handle error
// Handle error
try
{
try
{
$result
=
$db
->
exec
(
'DROP TABLE '
.
$sequenceName
);
$result
=
$db
->
exec
(
'DROP TABLE '
.
$sequenceName
);
}
catch
(
Doctrine_Connection_Exception
$e
)
{
}
catch
(
Doctrine_Connection_Exception
$e
)
{
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not drop inconsistent sequence table'
);
}
}
}
}
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
throw
new
Doctrine_Export_Exception
(
'could not create sequence table'
);
}
}
/**
/**
* drop existing sequence
* drop existing sequence
*
*
* @param string $sequenceName name of the sequence to be dropped
* @param string $sequenceName name of the sequence to be dropped
* @return string
* @return string
*/
*/
public
function
dropSequenceSql
(
$sequenceName
)
public
function
dropSequenceSql
(
$sequenceName
)
{
{
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
$sequenceName
=
$this
->
conn
->
quoteIdentifier
(
$this
->
conn
->
getSequenceName
(
$sequenceName
),
true
);
return
'DROP TABLE '
.
$sequenceName
;
return
'DROP TABLE '
.
$sequenceName
;
}
}
public
function
alterTableSql
(
$name
,
array
$changes
,
$check
=
false
)
public
function
alterTableSql
(
$name
,
array
$changes
,
$check
=
false
)
{
{
if
(
!
$name
)
{
if
(
!
$name
)
{
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
throw
new
Doctrine_Export_Exception
(
'no valid table name specified'
);
}
}
foreach
(
$changes
as
$changeName
=>
$change
)
{
foreach
(
$changes
as
$changeName
=>
$change
)
{
switch
(
$changeName
)
{
switch
(
$changeName
)
{
case
'add'
:
case
'add'
:
case
'change'
:
case
'change'
:
case
'rename'
:
case
'rename'
:
case
'name'
:
case
'name'
:
break
;
break
;
default
:
default
:
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
throw
new
Doctrine_Export_Exception
(
'change type "'
.
$changeName
.
'" not yet supported'
);
}
}
}
}
if
(
$check
)
{
if
(
$check
)
{
return
true
;
return
true
;
}
}
$query
=
''
;
$query
=
''
;
if
(
!
empty
(
$changes
[
'name'
]))
{
if
(
!
empty
(
$changes
[
'name'
]))
{
$change_name
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
]);
$change_name
=
$this
->
conn
->
quoteIdentifier
(
$changes
[
'name'
]);
$query
.=
'RENAME TO '
.
$change_name
;
$query
.=
'RENAME TO '
.
$change_name
;
}
}
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
if
(
!
empty
(
$changes
[
'add'
])
&&
is_array
(
$changes
[
'add'
]))
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'add'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
$query
.=
'ADD '
.
$this
->
getDeclaration
(
$fieldName
,
$field
);
}
}
}
}
$rename
=
array
();
$rename
=
array
();
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
if
(
!
empty
(
$changes
[
'rename'
])
&&
is_array
(
$changes
[
'rename'
]))
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'rename'
]
as
$fieldName
=>
$field
)
{
$rename
[
$field
[
'name'
]]
=
$fieldName
;
$rename
[
$field
[
'name'
]]
=
$fieldName
;
}
}
}
}
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
if
(
!
empty
(
$changes
[
'change'
])
&&
is_array
(
$changes
[
'change'
]))
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
foreach
(
$changes
[
'change'
]
as
$fieldName
=>
$field
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
if
(
isset
(
$rename
[
$fieldName
]))
{
if
(
isset
(
$rename
[
$fieldName
]))
{
$oldFieldName
=
$rename
[
$fieldName
];
$oldFieldName
=
$rename
[
$fieldName
];
unset
(
$rename
[
$fieldName
]);
unset
(
$rename
[
$fieldName
]);
}
else
{
}
else
{
$oldFieldName
=
$fieldName
;
$oldFieldName
=
$fieldName
;
}
}
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$oldFieldName
=
$this
->
conn
->
quoteIdentifier
(
$oldFieldName
,
true
);
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
$query
.=
'CHANGE '
.
$oldFieldName
.
' '
.
$this
->
getDeclaration
(
$fieldName
,
$field
[
'definition'
]);
.
$this
->
getDeclaration
(
$fieldName
,
$field
[
'definition'
]);
}
}
}
}
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
if
(
!
empty
(
$rename
)
&&
is_array
(
$rename
))
{
foreach
(
$rename
as
$renameName
=>
$renamedField
)
{
foreach
(
$rename
as
$renameName
=>
$renamedField
)
{
if
(
$query
)
{
if
(
$query
)
{
$query
.=
', '
;
$query
.=
', '
;
}
}
$field
=
$changes
[
'rename'
][
$renamedField
];
$field
=
$changes
[
'rename'
][
$renamedField
];
$renamedField
=
$this
->
conn
->
quoteIdentifier
(
$renamedField
,
true
);
$renamedField
=
$this
->
conn
->
quoteIdentifier
(
$renamedField
,
true
);
$query
.=
'CHANGE '
.
$renamedField
.
' '
$query
.=
'CHANGE '
.
$renamedField
.
' '
.
$this
->
getDeclaration
(
$field
[
'name'
],
$field
[
'definition'
]);
.
$this
->
getDeclaration
(
$field
[
'name'
],
$field
[
'definition'
]);
}
}
}
}
if
(
!
$query
)
{
if
(
!
$query
)
{
return
false
;
return
false
;
}
}
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
'ALTER TABLE '
.
$name
.
' '
.
$query
;
return
'ALTER TABLE '
.
$name
.
' '
.
$query
;
}
}
}
}
\ No newline at end of file
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