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
1a21a43e
Commit
1a21a43e
authored
Jan 05, 2007
by
lsmith
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- s/\$db/\$this->conn
- turned raiseError() calls into throw Exception
parent
260558e0
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
1527 additions
and
1528 deletions
+1527
-1528
DataDict.php
lib/Doctrine/DataDict.php
+76
-77
Firebird.php
lib/Doctrine/DataDict/Firebird.php
+205
-205
Mssql.php
lib/Doctrine/DataDict/Mssql.php
+180
-180
Oracle.php
lib/Doctrine/DataDict/Oracle.php
+182
-182
Pgsql.php
lib/Doctrine/DataDict/Pgsql.php
+598
-598
Sqlite.php
lib/Doctrine/DataDict/Sqlite.php
+286
-286
No files found.
lib/Doctrine/DataDict.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* Doctrine_DataDict
*
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
*/
class
Doctrine_DataDict
extends
Doctrine_Connection_Module
{
/**
* Obtain an array of changes that may need to applied
*
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
*/
public
function
compareDefinition
(
$current
,
$previous
)
{
$type
=
!
empty
(
$current
[
'type'
])
?
$current
[
'type'
]
:
null
;
if
(
!
method_exists
(
$this
,
"_compare
{
$type
}
Definition"
))
{
return
$db
->
raiseError
(
MDB2_ERROR_UNSUPPORTED
,
null
,
null
,
'type "'
.
$current
[
'type'
]
.
'" is not yet supported'
,
__FUNCTION__
);
}
if
(
empty
(
$previous
[
'type'
])
||
$previous
[
'type'
]
!=
$type
)
{
return
$current
;
}
$change
=
$this
->
{
"_compare
{
$type
}
Definition"
}(
$current
,
$previous
);
if
(
$previous
[
'type'
]
!=
$type
)
{
$change
[
'type'
]
=
true
;
}
$previous_notnull
=
!
empty
(
$previous
[
'notnull'
])
?
$previous
[
'notnull'
]
:
false
;
$notnull
=
!
empty
(
$current
[
'notnull'
])
?
$current
[
'notnull'
]
:
false
;
if
(
$previous_notnull
!=
$notnull
)
{
$change
[
'notnull'
]
=
true
;
}
$previous_default
=
array_key_exists
(
'default'
,
$previous
)
?
$previous
[
'default'
]
:
(
$previous_notnull
?
''
:
null
);
$default
=
array_key_exists
(
'default'
,
$current
)
?
$current
[
'default'
]
:
(
$notnull
?
''
:
null
);
if
(
$previous_default
!==
$default
)
{
$change
[
'default'
]
=
true
;
}
return
$change
;
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* Doctrine_DataDict
*
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
* @version $Revision$
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
*/
class
Doctrine_DataDict
extends
Doctrine_Connection_Module
{
/**
* Obtain an array of changes that may need to applied
*
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
*/
public
function
compareDefinition
(
$current
,
$previous
)
{
$type
=
!
empty
(
$current
[
'type'
])
?
$current
[
'type'
]
:
null
;
if
(
!
method_exists
(
$this
,
"_compare
{
$type
}
Definition"
))
{
throw
new
Doctrine_DataDict_Exception
(
'type "'
.
$current
[
'type'
]
.
'" is not yet supported'
);
}
if
(
empty
(
$previous
[
'type'
])
||
$previous
[
'type'
]
!=
$type
)
{
return
$current
;
}
$change
=
$this
->
{
"_compare
{
$type
}
Definition"
}(
$current
,
$previous
);
if
(
$previous
[
'type'
]
!=
$type
)
{
$change
[
'type'
]
=
true
;
}
$previous_notnull
=
!
empty
(
$previous
[
'notnull'
])
?
$previous
[
'notnull'
]
:
false
;
$notnull
=
!
empty
(
$current
[
'notnull'
])
?
$current
[
'notnull'
]
:
false
;
if
(
$previous_notnull
!=
$notnull
)
{
$change
[
'notnull'
]
=
true
;
}
$previous_default
=
array_key_exists
(
'default'
,
$previous
)
?
$previous
[
'default'
]
:
(
$previous_notnull
?
''
:
null
);
$default
=
array_key_exists
(
'default'
,
$current
)
?
$current
[
'default'
]
:
(
$notnull
?
''
:
null
);
if
(
$previous_default
!==
$default
)
{
$change
[
'default'
]
=
true
;
}
return
$change
;
}
}
lib/Doctrine/DataDict/Firebird.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lorenzo Alberton <l.alberton@quipo.it> (PEAR MDB2 Interbase driver)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Firebird
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
$field
)
{
switch
(
$field
[
'type'
])
{
case
'varchar'
:
case
'string'
:
case
'array'
:
case
'object'
:
case
'char'
:
case
'text'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
16777215
;
// TODO: $
db->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
'CHAR('
.
$length
.
')'
:
'VARCHAR('
.
$length
.
')'
;
case
'clob'
:
return
'BLOB SUB_TYPE 1'
;
case
'blob'
:
return
'BLOB SUB_TYPE 0'
;
case
'integer'
:
case
'enum'
:
return
'INT'
;
case
'boolean'
:
return
'SMALLINT'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME'
;
case
'timestamp'
:
return
'TIMESTAMP'
;
case
'float'
:
return
'DOUBLE PRECISION'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
db
->
options
[
'decimal_places'
]
.
')'
;
}
return
''
;
}
/**
* Maps a native array description of a field to a Doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
$field
)
{
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
]
>
0
)
?
$field
[
'length'
]
:
null
;
$type
=
array
();
$unsigned
=
$fixed
=
null
;
$dbType
=
strtolower
(
$field
[
'type'
]);
$field
[
'field_sub_type'
]
=
!
empty
(
$field
[
'field_sub_type'
])
?
strtolower
(
$field
[
'field_sub_type'
])
:
null
;
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$dbType
)
{
case
'smallint'
:
case
'integer'
:
case
'int64'
:
//these may be 'numeric' or 'decimal'
if
(
isset
(
$field
[
'field_sub_type'
]))
{
$field
[
'type'
]
=
$field
[
'field_sub_type'
];
return
$this
->
getPortableDeclaration
(
$field
);
}
case
'bigint'
:
case
'quad'
:
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'varchar'
:
$fixed
=
false
;
case
'char'
:
case
'cstring'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'double precision'
:
case
'd_float'
:
$type
[]
=
'float'
;
break
;
case
'decimal'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
break
;
case
'blob'
:
$type
[]
=
(
$field
[
'field_sub_type'
]
==
'text'
)
?
'clob'
:
'blob'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Firebird_Exception
(
'unknown database attribute type: '
.
$dbType
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
* of a field declaration to be used in statements like CREATE TABLE.
*
* @param string $charset name of the charset
* @return string DBMS specific SQL code portion needed to set the CHARACTER SET
* of a field declaration.
*/
public
function
getCharsetFieldDeclaration
(
$charset
)
{
return
'CHARACTER SET '
.
$charset
;
}
/**
* Obtain DBMS specific SQL code portion needed to set the COLLATION
* of a field declaration to be used in statements like CREATE TABLE.
*
* @param string $collation name of the collation
* @return string DBMS specific SQL code portion needed to set the COLLATION
* of a field declaration.
*/
public
function
getCollationFieldDeclaration
(
$collation
)
{
return
'COLLATE '
.
$collation
;
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lorenzo Alberton <l.alberton@quipo.it> (PEAR MDB2 Interbase driver)
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Firebird
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
$field
)
{
switch
(
$field
[
'type'
])
{
case
'varchar'
:
case
'string'
:
case
'array'
:
case
'object'
:
case
'char'
:
case
'text'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
16777215
;
// TODO: $
this->conn->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
'CHAR('
.
$length
.
')'
:
'VARCHAR('
.
$length
.
')'
;
case
'clob'
:
return
'BLOB SUB_TYPE 1'
;
case
'blob'
:
return
'BLOB SUB_TYPE 0'
;
case
'integer'
:
case
'enum'
:
return
'INT'
;
case
'boolean'
:
return
'SMALLINT'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME'
;
case
'timestamp'
:
return
'TIMESTAMP'
;
case
'float'
:
return
'DOUBLE PRECISION'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
this
->
conn
->
options
[
'decimal_places'
]
.
')'
;
}
return
''
;
}
/**
* Maps a native array description of a field to a Doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
$field
)
{
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
]
>
0
)
?
$field
[
'length'
]
:
null
;
$type
=
array
();
$unsigned
=
$fixed
=
null
;
$dbType
=
strtolower
(
$field
[
'type'
]);
$field
[
'field_sub_type'
]
=
!
empty
(
$field
[
'field_sub_type'
])
?
strtolower
(
$field
[
'field_sub_type'
])
:
null
;
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$dbType
)
{
case
'smallint'
:
case
'integer'
:
case
'int64'
:
//these may be 'numeric' or 'decimal'
if
(
isset
(
$field
[
'field_sub_type'
]))
{
$field
[
'type'
]
=
$field
[
'field_sub_type'
];
return
$this
->
getPortableDeclaration
(
$field
);
}
case
'bigint'
:
case
'quad'
:
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'varchar'
:
$fixed
=
false
;
case
'char'
:
case
'cstring'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'double precision'
:
case
'd_float'
:
$type
[]
=
'float'
;
break
;
case
'decimal'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
break
;
case
'blob'
:
$type
[]
=
(
$field
[
'field_sub_type'
]
==
'text'
)
?
'clob'
:
'blob'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Firebird_Exception
(
'unknown database attribute type: '
.
$dbType
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
* of a field declaration to be used in statements like CREATE TABLE.
*
* @param string $charset name of the charset
* @return string DBMS specific SQL code portion needed to set the CHARACTER SET
* of a field declaration.
*/
public
function
getCharsetFieldDeclaration
(
$charset
)
{
return
'CHARACTER SET '
.
$charset
;
}
/**
* Obtain DBMS specific SQL code portion needed to set the COLLATION
* of a field declaration to be used in statements like CREATE TABLE.
*
* @param string $collation name of the collation
* @return string DBMS specific SQL code portion needed to set the COLLATION
* of a field declaration.
*/
public
function
getCollationFieldDeclaration
(
$collation
)
{
return
'COLLATE '
.
$collation
;
}
}
lib/Doctrine/DataDict/Mssql.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Frank M. Kromann <frank@kromann.info> (PEAR MDB2 Mssql driver)
* @author David Coallier <davidc@php.net> (PEAR MDB2 Mssql driver)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Mssql
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
*
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
$field
)
{
switch
(
$field
[
'type'
])
{
case
'array'
:
case
'object'
:
case
'text'
:
case
'char'
:
case
'varchar'
:
case
'string'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
false
;
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$
db
->
options
[
'default_text_field_length'
]
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
8000
)
{
return
'VARCHAR('
.
$length
.
')'
;
}
}
return
'TEXT'
;
case
'blob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
8000
)
{
return
"VARBINARY(
$length
)"
;
}
}
return
'IMAGE'
;
case
'integer'
:
case
'enum'
:
return
'INT'
;
case
'boolean'
:
return
'BIT'
;
case
'date'
:
return
'CHAR('
.
strlen
(
'YYYY-MM-DD'
)
.
')'
;
case
'time'
:
return
'CHAR('
.
strlen
(
'HH:MM:SS'
)
.
')'
;
case
'timestamp'
:
return
'CHAR('
.
strlen
(
'YYYY-MM-DD HH:MM:SS'
)
.
')'
;
case
'float'
:
return
'FLOAT'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
db
->
options
[
'decimal_places'
]
.
')'
;
}
return
''
;
}
/**
* Maps a native array description of a field to a MDB2 datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
$field
)
{
$db_type
=
preg_replace
(
'/\d/'
,
''
,
strtolower
(
$field
[
'type'
])
);
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
]
>
0
)
?
$field
[
'length'
]
:
null
;
$type
=
array
();
// todo: unsigned handling seems to be missing
$unsigned
=
$fixed
=
null
;
if
(
!
isset
(
$field
[
'name'
]))
$field
[
'name'
]
=
''
;
switch
(
$db_type
)
{
case
'bit'
:
$type
[
0
]
=
'boolean'
;
break
;
case
'int'
:
$type
[
0
]
=
'integer'
;
if
(
$length
==
1
)
{
$type
[]
=
'boolean'
;
}
break
;
case
'datetime'
:
$type
[
0
]
=
'timestamp'
;
break
;
case
'float'
:
case
'real'
:
case
'numeric'
:
$type
[
0
]
=
'float'
;
break
;
case
'decimal'
:
case
'money'
:
$type
[
0
]
=
'decimal'
;
break
;
case
'text'
:
case
'varchar'
:
$fixed
=
false
;
case
'char'
:
$type
[
0
]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^[is|has]/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$db_type
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'image'
:
case
'varbinary'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Mssql_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @author Frank M. Kromann <frank@kromann.info> (PEAR MDB2 Mssql driver)
* @author David Coallier <davidc@php.net> (PEAR MDB2 Mssql driver)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Mssql
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
*
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
$field
)
{
switch
(
$field
[
'type'
])
{
case
'array'
:
case
'object'
:
case
'text'
:
case
'char'
:
case
'varchar'
:
case
'string'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
false
;
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$
this
->
conn
->
options
[
'default_text_field_length'
]
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
8000
)
{
return
'VARCHAR('
.
$length
.
')'
;
}
}
return
'TEXT'
;
case
'blob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
8000
)
{
return
"VARBINARY(
$length
)"
;
}
}
return
'IMAGE'
;
case
'integer'
:
case
'enum'
:
return
'INT'
;
case
'boolean'
:
return
'BIT'
;
case
'date'
:
return
'CHAR('
.
strlen
(
'YYYY-MM-DD'
)
.
')'
;
case
'time'
:
return
'CHAR('
.
strlen
(
'HH:MM:SS'
)
.
')'
;
case
'timestamp'
:
return
'CHAR('
.
strlen
(
'YYYY-MM-DD HH:MM:SS'
)
.
')'
;
case
'float'
:
return
'FLOAT'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
this
->
conn
->
options
[
'decimal_places'
]
.
')'
;
}
return
''
;
}
/**
* Maps a native array description of a field to a MDB2 datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
$field
)
{
$db_type
=
preg_replace
(
'/\d/'
,
''
,
strtolower
(
$field
[
'type'
])
);
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
]
>
0
)
?
$field
[
'length'
]
:
null
;
$type
=
array
();
// todo: unsigned handling seems to be missing
$unsigned
=
$fixed
=
null
;
if
(
!
isset
(
$field
[
'name'
]))
$field
[
'name'
]
=
''
;
switch
(
$db_type
)
{
case
'bit'
:
$type
[
0
]
=
'boolean'
;
break
;
case
'int'
:
$type
[
0
]
=
'integer'
;
if
(
$length
==
1
)
{
$type
[]
=
'boolean'
;
}
break
;
case
'datetime'
:
$type
[
0
]
=
'timestamp'
;
break
;
case
'float'
:
case
'real'
:
case
'numeric'
:
$type
[
0
]
=
'float'
;
break
;
case
'decimal'
:
case
'money'
:
$type
[
0
]
=
'decimal'
;
break
;
case
'text'
:
case
'varchar'
:
$fixed
=
false
;
case
'char'
:
$type
[
0
]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^[is|has]/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$db_type
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'image'
:
case
'varbinary'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Mssql_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
}
lib/Doctrine/DataDict/Oracle.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Oracle
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'string'
:
case
'array'
:
case
'object'
:
case
'gzip'
:
case
'char'
:
case
'varchar'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
16777215
;
// TODO: $
db->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
'CHAR('
.
$length
.
')'
:
'VARCHAR2('
.
$length
.
')'
;
case
'clob'
:
return
'CLOB'
;
case
'blob'
:
return
'BLOB'
;
case
'integer'
:
case
'enum'
:
if
(
!
empty
(
$field
[
'length'
]))
{
return
'NUMBER('
.
$field
[
'length'
]
.
')'
;
}
return
'INT'
;
case
'boolean'
:
return
'NUMBER(1)'
;
case
'date'
:
case
'time'
:
case
'timestamp'
:
return
'DATE'
;
case
'float'
:
return
'NUMBER'
;
case
'decimal'
:
return
'NUMBER(*,'
.
$
db
->
options
[
'decimal_places'
]
.
')'
;
}
}
/**
* Maps a native array description of a field to a doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
* @throws Doctrine_DataDict_Oracle_Exception
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$db_type
=
strtolower
(
$field
[
'type'
]);
$type
=
array
();
$length
=
$unsigned
=
$fixed
=
null
;
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
}
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$db_type
)
{
case
'integer'
:
case
'pls_integer'
:
case
'binary_integer'
:
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'varchar'
:
case
'varchar2'
:
case
'nvarchar2'
:
$fixed
=
false
;
case
'char'
:
case
'nchar'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'float'
:
$type
[]
=
'float'
;
break
;
case
'number'
:
if
(
!
empty
(
$field
[
'scale'
]))
{
$type
[]
=
'decimal'
;
}
else
{
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
}
break
;
case
'long'
:
$type
[]
=
'string'
;
case
'clob'
:
case
'nclob'
:
$type
[]
=
'clob'
;
break
;
case
'blob'
:
case
'raw'
:
case
'long raw'
:
case
'bfile'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'rowid'
:
case
'urowid'
:
default
:
throw
new
Doctrine_DataDict_Oracle_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Oracle
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'string'
:
case
'array'
:
case
'object'
:
case
'gzip'
:
case
'char'
:
case
'varchar'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
16777215
;
// TODO: $
this->conn->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
'CHAR('
.
$length
.
')'
:
'VARCHAR2('
.
$length
.
')'
;
case
'clob'
:
return
'CLOB'
;
case
'blob'
:
return
'BLOB'
;
case
'integer'
:
case
'enum'
:
if
(
!
empty
(
$field
[
'length'
]))
{
return
'NUMBER('
.
$field
[
'length'
]
.
')'
;
}
return
'INT'
;
case
'boolean'
:
return
'NUMBER(1)'
;
case
'date'
:
case
'time'
:
case
'timestamp'
:
return
'DATE'
;
case
'float'
:
return
'NUMBER'
;
case
'decimal'
:
return
'NUMBER(*,'
.
$
this
->
conn
->
options
[
'decimal_places'
]
.
')'
;
}
}
/**
* Maps a native array description of a field to a doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
* @throws Doctrine_DataDict_Oracle_Exception
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$db_type
=
strtolower
(
$field
[
'type'
]);
$type
=
array
();
$length
=
$unsigned
=
$fixed
=
null
;
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
}
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$db_type
)
{
case
'integer'
:
case
'pls_integer'
:
case
'binary_integer'
:
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'varchar'
:
case
'varchar2'
:
case
'nvarchar2'
:
$fixed
=
false
;
case
'char'
:
case
'nchar'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'float'
:
$type
[]
=
'float'
;
break
;
case
'number'
:
if
(
!
empty
(
$field
[
'scale'
]))
{
$type
[]
=
'decimal'
;
}
else
{
$type
[]
=
'integer'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
}
break
;
case
'long'
:
$type
[]
=
'string'
;
case
'clob'
:
case
'nclob'
:
$type
[]
=
'clob'
;
break
;
case
'blob'
:
case
'raw'
:
case
'long raw'
:
case
'bfile'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'rowid'
:
case
'urowid'
:
default
:
throw
new
Doctrine_DataDict_Oracle_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
}
lib/Doctrine/DataDict/Pgsql.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Paul Cooper <pgc@ucecom.com>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Pgsql
extends
Doctrine_DataDict
{
/**
* @param array $reservedKeyWords an array of reserved keywords by pgsql
*/
protected
static
$reservedKeyWords
=
array
(
'abort'
,
'absolute'
,
'access'
,
'action'
,
'add'
,
'after'
,
'aggregate'
,
'all'
,
'alter'
,
'analyse'
,
'analyze'
,
'and'
,
'any'
,
'as'
,
'asc'
,
'assertion'
,
'assignment'
,
'at'
,
'authorization'
,
'backward'
,
'before'
,
'begin'
,
'between'
,
'bigint'
,
'binary'
,
'bit'
,
'boolean'
,
'both'
,
'by'
,
'cache'
,
'called'
,
'cascade'
,
'case'
,
'cast'
,
'chain'
,
'char'
,
'character'
,
'characteristics'
,
'check'
,
'checkpoint'
,
'class'
,
'close'
,
'cluster'
,
'coalesce'
,
'collate'
,
'column'
,
'comment'
,
'commit'
,
'committed'
,
'constraint'
,
'constraints'
,
'conversion'
,
'convert'
,
'copy'
,
'create'
,
'createdb'
,
'createuser'
,
'cross'
,
'current_date'
,
'current_time'
,
'current_timestamp'
,
'current_user'
,
'cursor'
,
'cycle'
,
'database'
,
'day'
,
'deallocate'
,
'dec'
,
'decimal'
,
'declare'
,
'default'
,
'deferrable'
,
'deferred'
,
'definer'
,
'delete'
,
'delimiter'
,
'delimiters'
,
'desc'
,
'distinct'
,
'do'
,
'domain'
,
'double'
,
'drop'
,
'each'
,
'else'
,
'encoding'
,
'encrypted'
,
'end'
,
'escape'
,
'except'
,
'exclusive'
,
'execute'
,
'exists'
,
'explain'
,
'external'
,
'extract'
,
'false'
,
'fetch'
,
'float'
,
'for'
,
'force'
,
'foreign'
,
'forward'
,
'freeze'
,
'from'
,
'full'
,
'function'
,
'get'
,
'global'
,
'grant'
,
'group'
,
'handler'
,
'having'
,
'hour'
,
'ilike'
,
'immediate'
,
'immutable'
,
'implicit'
,
'in'
,
'increment'
,
'index'
,
'inherits'
,
'initially'
,
'inner'
,
'inout'
,
'input'
,
'insensitive'
,
'insert'
,
'instead'
,
'int'
,
'integer'
,
'intersect'
,
'interval'
,
'into'
,
'invoker'
,
'is'
,
'isnull'
,
'isolation'
,
'join'
,
'key'
,
'lancompiler'
,
'language'
,
'leading'
,
'left'
,
'level'
,
'like'
,
'limit'
,
'listen'
,
'load'
,
'local'
,
'localtime'
,
'localtimestamp'
,
'location'
,
'lock'
,
'match'
,
'maxvalue'
,
'minute'
,
'minvalue'
,
'mode'
,
'month'
,
'move'
,
'names'
,
'national'
,
'natural'
,
'nchar'
,
'new'
,
'next'
,
'no'
,
'nocreatedb'
,
'nocreateuser'
,
'none'
,
'not'
,
'nothing'
,
'notify'
,
'notnull'
,
'null'
,
'nullif'
,
'numeric'
,
'of'
,
'off'
,
'offset'
,
'oids'
,
'old'
,
'on'
,
'only'
,
'operator'
,
'option'
,
'or'
,
'order'
,
'out'
,
'outer'
,
'overlaps'
,
'overlay'
,
'owner'
,
'partial'
,
'password'
,
'path'
,
'pendant'
,
'placing'
,
'position'
,
'precision'
,
'prepare'
,
'primary'
,
'prior'
,
'privileges'
,
'procedural'
,
'procedure'
,
'read'
,
'real'
,
'recheck'
,
'references'
,
'reindex'
,
'relative'
,
'rename'
,
'replace'
,
'reset'
,
'restrict'
,
'returns'
,
'revoke'
,
'right'
,
'rollback'
,
'row'
,
'rule'
,
'schema'
,
'scroll'
,
'second'
,
'security'
,
'select'
,
'sequence'
,
'serializable'
,
'session'
,
'session_user'
,
'set'
,
'setof'
,
'share'
,
'show'
,
'similar'
,
'simple'
,
'smallint'
,
'some'
,
'stable'
,
'start'
,
'statement'
,
'statistics'
,
'stdin'
,
'stdout'
,
'storage'
,
'strict'
,
'substring'
,
'sysid'
,
'table'
,
'temp'
,
'template'
,
'temporary'
,
'then'
,
'time'
,
'timestamp'
,
'to'
,
'toast'
,
'trailing'
,
'transaction'
,
'treat'
,
'trigger'
,
'trim'
,
'true'
,
'truncate'
,
'trusted'
,
'type'
,
'unencrypted'
,
'union'
,
'unique'
,
'unknown'
,
'unlisten'
,
'until'
,
'update'
,
'usage'
,
'user'
,
'using'
,
'vacuum'
,
'valid'
,
'validator'
,
'values'
,
'varchar'
,
'varying'
,
'verbose'
,
'version'
,
'view'
,
'volatile'
,
'when'
,
'where'
,
'with'
,
'without'
,
'work'
,
'write'
,
'year'
,
'zone'
);
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
*
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'char'
:
case
'string'
:
case
'array'
:
case
'object'
:
case
'varchar'
:
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
])
?
$field
[
'length'
]
:
null
;
// TODO: $
db->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$
db
->
options
[
'default_text_field_length'
]
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
return
'TEXT'
;
case
'blob'
:
return
'BYTEA'
;
case
'enum'
:
case
'integer'
:
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
>
4
)
{
return
'BIGSERIAL PRIMARY KEY'
;
}
}
return
'SERIAL PRIMARY KEY'
;
}
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
2
)
{
return
'SMALLINT'
;
}
elseif
(
$length
==
3
||
$length
==
4
)
{
return
'INT'
;
}
elseif
(
$length
>
4
)
{
return
'BIGINT'
;
}
}
return
'INT'
;
case
'boolean'
:
return
'BOOLEAN'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME without time zone'
;
case
'timestamp'
:
return
'TIMESTAMP without time zone'
;
case
'float'
:
return
'FLOAT8'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'NUMERIC('
.
$length
.
','
.
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DECIMAL_PLACES
)
.
')'
;
default
:
throw
new
Doctrine_DataDict_Pgsql_Exception
(
'Unknown field type '
.
$field
[
'type'
]);
}
}
/**
* Maps a native array description of a field to a portable Doctrine datatype and length
*
* @param array $field native field description
*
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$length
=
(
isset
(
$field
[
'length'
]))
?
$field
[
'length'
]
:
null
;
if
(
$length
==
'-1'
&&
isset
(
$field
[
'atttypmod'
]))
{
$length
=
$field
[
'atttypmod'
]
-
4
;
}
if
((
int
)
$length
<=
0
)
{
$length
=
null
;
}
$type
=
array
();
$unsigned
=
$fixed
=
null
;
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
$db_type
=
strtolower
(
$field
[
'type'
]);
switch
(
$db_type
)
{
case
'smallint'
:
case
'int2'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
2
;
if
(
$length
==
'2'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'int'
:
case
'int4'
:
case
'integer'
:
case
'serial'
:
case
'serial4'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
4
;
break
;
case
'bigint'
:
case
'int8'
:
case
'bigserial'
:
case
'serial8'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
8
;
break
;
case
'bool'
:
case
'boolean'
:
$type
[]
=
'boolean'
;
$length
=
1
;
break
;
case
'text'
:
case
'varchar'
:
$fixed
=
false
;
case
'unknown'
:
case
'char'
:
case
'bpchar'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$db_type
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'datetime'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'real'
:
$type
[]
=
'float'
;
break
;
case
'decimal'
:
case
'money'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
break
;
case
'tinyblob'
:
case
'mediumblob'
:
case
'longblob'
:
case
'blob'
:
case
'bytea'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'oid'
:
$type
[]
=
'blob'
;
$type
[]
=
'clob'
;
$length
=
null
;
break
;
case
'year'
:
$type
[]
=
'integer'
;
$type
[]
=
'date'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Pgsql_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to declare an integer type
* field to be used in statements like CREATE TABLE.
*
* @param string $name name the field to be declared.
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* unsigned
* Boolean flag that indicates whether the field should be
* declared as unsigned integer if possible.
*
* default
* Integer value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getIntegerDeclaration
(
$name
,
$field
)
{
/**
if (!empty($field['unsigned'])) {
$
db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
}
*/
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$this
->
getNativeDeclaration
(
$field
);
}
$default
=
''
;
if
(
array_key_exists
(
'default'
,
$field
))
{
if
(
$field
[
'default'
]
===
''
)
{
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
?
null
:
0
;
}
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
}
/**
TODO: is this needed ?
elseif (empty($field['notnull'])) {
$default = ' DEFAULT NULL';
}
*/
$notnull
=
empty
(
$field
[
'notnull'
])
?
''
:
' NOT NULL'
;
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$this
->
getNativeDeclaration
(
$field
)
.
$default
.
$notnull
;
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Paul Cooper <pgc@ucecom.com>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Pgsql
extends
Doctrine_DataDict
{
/**
* @param array $reservedKeyWords an array of reserved keywords by pgsql
*/
protected
static
$reservedKeyWords
=
array
(
'abort'
,
'absolute'
,
'access'
,
'action'
,
'add'
,
'after'
,
'aggregate'
,
'all'
,
'alter'
,
'analyse'
,
'analyze'
,
'and'
,
'any'
,
'as'
,
'asc'
,
'assertion'
,
'assignment'
,
'at'
,
'authorization'
,
'backward'
,
'before'
,
'begin'
,
'between'
,
'bigint'
,
'binary'
,
'bit'
,
'boolean'
,
'both'
,
'by'
,
'cache'
,
'called'
,
'cascade'
,
'case'
,
'cast'
,
'chain'
,
'char'
,
'character'
,
'characteristics'
,
'check'
,
'checkpoint'
,
'class'
,
'close'
,
'cluster'
,
'coalesce'
,
'collate'
,
'column'
,
'comment'
,
'commit'
,
'committed'
,
'constraint'
,
'constraints'
,
'conversion'
,
'convert'
,
'copy'
,
'create'
,
'createdb'
,
'createuser'
,
'cross'
,
'current_date'
,
'current_time'
,
'current_timestamp'
,
'current_user'
,
'cursor'
,
'cycle'
,
'database'
,
'day'
,
'deallocate'
,
'dec'
,
'decimal'
,
'declare'
,
'default'
,
'deferrable'
,
'deferred'
,
'definer'
,
'delete'
,
'delimiter'
,
'delimiters'
,
'desc'
,
'distinct'
,
'do'
,
'domain'
,
'double'
,
'drop'
,
'each'
,
'else'
,
'encoding'
,
'encrypted'
,
'end'
,
'escape'
,
'except'
,
'exclusive'
,
'execute'
,
'exists'
,
'explain'
,
'external'
,
'extract'
,
'false'
,
'fetch'
,
'float'
,
'for'
,
'force'
,
'foreign'
,
'forward'
,
'freeze'
,
'from'
,
'full'
,
'function'
,
'get'
,
'global'
,
'grant'
,
'group'
,
'handler'
,
'having'
,
'hour'
,
'ilike'
,
'immediate'
,
'immutable'
,
'implicit'
,
'in'
,
'increment'
,
'index'
,
'inherits'
,
'initially'
,
'inner'
,
'inout'
,
'input'
,
'insensitive'
,
'insert'
,
'instead'
,
'int'
,
'integer'
,
'intersect'
,
'interval'
,
'into'
,
'invoker'
,
'is'
,
'isnull'
,
'isolation'
,
'join'
,
'key'
,
'lancompiler'
,
'language'
,
'leading'
,
'left'
,
'level'
,
'like'
,
'limit'
,
'listen'
,
'load'
,
'local'
,
'localtime'
,
'localtimestamp'
,
'location'
,
'lock'
,
'match'
,
'maxvalue'
,
'minute'
,
'minvalue'
,
'mode'
,
'month'
,
'move'
,
'names'
,
'national'
,
'natural'
,
'nchar'
,
'new'
,
'next'
,
'no'
,
'nocreatedb'
,
'nocreateuser'
,
'none'
,
'not'
,
'nothing'
,
'notify'
,
'notnull'
,
'null'
,
'nullif'
,
'numeric'
,
'of'
,
'off'
,
'offset'
,
'oids'
,
'old'
,
'on'
,
'only'
,
'operator'
,
'option'
,
'or'
,
'order'
,
'out'
,
'outer'
,
'overlaps'
,
'overlay'
,
'owner'
,
'partial'
,
'password'
,
'path'
,
'pendant'
,
'placing'
,
'position'
,
'precision'
,
'prepare'
,
'primary'
,
'prior'
,
'privileges'
,
'procedural'
,
'procedure'
,
'read'
,
'real'
,
'recheck'
,
'references'
,
'reindex'
,
'relative'
,
'rename'
,
'replace'
,
'reset'
,
'restrict'
,
'returns'
,
'revoke'
,
'right'
,
'rollback'
,
'row'
,
'rule'
,
'schema'
,
'scroll'
,
'second'
,
'security'
,
'select'
,
'sequence'
,
'serializable'
,
'session'
,
'session_user'
,
'set'
,
'setof'
,
'share'
,
'show'
,
'similar'
,
'simple'
,
'smallint'
,
'some'
,
'stable'
,
'start'
,
'statement'
,
'statistics'
,
'stdin'
,
'stdout'
,
'storage'
,
'strict'
,
'substring'
,
'sysid'
,
'table'
,
'temp'
,
'template'
,
'temporary'
,
'then'
,
'time'
,
'timestamp'
,
'to'
,
'toast'
,
'trailing'
,
'transaction'
,
'treat'
,
'trigger'
,
'trim'
,
'true'
,
'truncate'
,
'trusted'
,
'type'
,
'unencrypted'
,
'union'
,
'unique'
,
'unknown'
,
'unlisten'
,
'until'
,
'update'
,
'usage'
,
'user'
,
'using'
,
'vacuum'
,
'valid'
,
'validator'
,
'values'
,
'varchar'
,
'varying'
,
'verbose'
,
'version'
,
'view'
,
'volatile'
,
'when'
,
'where'
,
'with'
,
'without'
,
'work'
,
'write'
,
'year'
,
'zone'
);
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
*
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'char'
:
case
'string'
:
case
'array'
:
case
'object'
:
case
'varchar'
:
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
])
?
$field
[
'length'
]
:
null
;
// TODO: $
this->conn->options['default_text_field_length'];
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$
this
->
conn
->
options
[
'default_text_field_length'
]
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
return
'TEXT'
;
case
'blob'
:
return
'BYTEA'
;
case
'enum'
:
case
'integer'
:
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
>
4
)
{
return
'BIGSERIAL PRIMARY KEY'
;
}
}
return
'SERIAL PRIMARY KEY'
;
}
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
2
)
{
return
'SMALLINT'
;
}
elseif
(
$length
==
3
||
$length
==
4
)
{
return
'INT'
;
}
elseif
(
$length
>
4
)
{
return
'BIGINT'
;
}
}
return
'INT'
;
case
'boolean'
:
return
'BOOLEAN'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME without time zone'
;
case
'timestamp'
:
return
'TIMESTAMP without time zone'
;
case
'float'
:
return
'FLOAT8'
;
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'NUMERIC('
.
$length
.
','
.
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DECIMAL_PLACES
)
.
')'
;
default
:
throw
new
Doctrine_DataDict_Pgsql_Exception
(
'Unknown field type '
.
$field
[
'type'
]);
}
}
/**
* Maps a native array description of a field to a portable Doctrine datatype and length
*
* @param array $field native field description
*
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$length
=
(
isset
(
$field
[
'length'
]))
?
$field
[
'length'
]
:
null
;
if
(
$length
==
'-1'
&&
isset
(
$field
[
'atttypmod'
]))
{
$length
=
$field
[
'atttypmod'
]
-
4
;
}
if
((
int
)
$length
<=
0
)
{
$length
=
null
;
}
$type
=
array
();
$unsigned
=
$fixed
=
null
;
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
$db_type
=
strtolower
(
$field
[
'type'
]);
switch
(
$db_type
)
{
case
'smallint'
:
case
'int2'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
2
;
if
(
$length
==
'2'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
break
;
case
'int'
:
case
'int4'
:
case
'integer'
:
case
'serial'
:
case
'serial4'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
4
;
break
;
case
'bigint'
:
case
'int8'
:
case
'bigserial'
:
case
'serial8'
:
$type
[]
=
'integer'
;
$unsigned
=
false
;
$length
=
8
;
break
;
case
'bool'
:
case
'boolean'
:
$type
[]
=
'boolean'
;
$length
=
1
;
break
;
case
'text'
:
case
'varchar'
:
$fixed
=
false
;
case
'unknown'
:
case
'char'
:
case
'bpchar'
:
$type
[]
=
'string'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$db_type
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'datetime'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'real'
:
$type
[]
=
'float'
;
break
;
case
'decimal'
:
case
'money'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
break
;
case
'tinyblob'
:
case
'mediumblob'
:
case
'longblob'
:
case
'blob'
:
case
'bytea'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'oid'
:
$type
[]
=
'blob'
;
$type
[]
=
'clob'
;
$length
=
null
;
break
;
case
'year'
:
$type
[]
=
'integer'
;
$type
[]
=
'date'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Pgsql_Exception
(
'unknown database attribute type: '
.
$db_type
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to declare an integer type
* field to be used in statements like CREATE TABLE.
*
* @param string $name name the field to be declared.
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* unsigned
* Boolean flag that indicates whether the field should be
* declared as unsigned integer if possible.
*
* default
* Integer value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getIntegerDeclaration
(
$name
,
$field
)
{
/**
if (!empty($field['unsigned'])) {
$
this->conn->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
}
*/
if
(
!
empty
(
$field
[
'autoincrement'
]))
{
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$this
->
getNativeDeclaration
(
$field
);
}
$default
=
''
;
if
(
array_key_exists
(
'default'
,
$field
))
{
if
(
$field
[
'default'
]
===
''
)
{
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
?
null
:
0
;
}
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
}
/**
TODO: is this needed ?
elseif (empty($field['notnull'])) {
$default = ' DEFAULT NULL';
}
*/
$notnull
=
empty
(
$field
[
'notnull'
])
?
''
:
' NOT NULL'
;
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$this
->
getNativeDeclaration
(
$field
)
.
$default
.
$notnull
;
}
}
lib/Doctrine/DataDict/Sqlite.php
View file @
1a21a43e
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Sqlite
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @author Lukas Smith (PEAR MDB2 library)
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'text'
:
case
'object'
:
case
'array'
:
case
'string'
:
case
'char'
:
case
'gzip'
:
case
'varchar'
:
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
])
?
$field
[
'length'
]
:
null
;
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DEFAULT_TEXTFLD_LENGTH
)
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
255
)
{
return
'TINYTEXT'
;
}
elseif
(
$length
<=
65535
)
{
return
'TEXT'
;
}
elseif
(
$length
<=
16777215
)
{
return
'MEDIUMTEXT'
;
}
}
return
'LONGTEXT'
;
case
'blob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
255
)
{
return
'TINYBLOB'
;
}
elseif
(
$length
<=
65535
)
{
return
'BLOB'
;
}
elseif
(
$length
<=
16777215
)
{
return
'MEDIUMBLOB'
;
}
}
return
'LONGBLOB'
;
case
'enum'
:
case
'integer'
:
case
'boolean'
:
return
'INTEGER'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME'
;
case
'timestamp'
:
return
'DATETIME'
;
case
'float'
:
case
'double'
:
return
'DOUBLE'
;
//($
db->options['fixed_float'] ? '('.
//($
db->options['fixed_float']+2).','.$db->options['fixed_float'].')' : '');
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
db
->
options
[
'decimal_places'
]
.
')'
;
}
throw
new
Doctrine_DataDict_Sqlite_Exception
(
'Unknown datatype '
.
$field
[
'type'
]);
}
/**
* Maps a native array description of a field to Doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$dbType
=
strtolower
(
$field
[
'type'
]);
$length
=
(
isset
(
$field
[
'length'
]))
?
$field
[
'length'
]
:
null
;
$unsigned
=
(
isset
(
$field
[
'unsigned'
]))
?
$field
[
'unsigned'
]
:
null
;
$fixed
=
null
;
$type
=
array
();
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$dbType
)
{
case
'boolean'
:
$type
[]
=
'boolean'
;
break
;
case
'tinyint'
:
$type
[]
=
'integer'
;
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
1
;
break
;
case
'smallint'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
2
;
break
;
case
'mediumint'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
3
;
break
;
case
'int'
:
case
'integer'
:
case
'serial'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
4
;
break
;
case
'bigint'
:
case
'bigserial'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
8
;
break
;
case
'clob'
:
case
'tinytext'
:
case
'mediumtext'
:
case
'longtext'
:
case
'text'
:
case
'varchar'
:
case
'varchar2'
:
$fixed
=
false
;
case
'char'
:
$type
[]
=
'text'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$dbType
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'datetime'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'real'
:
$type
[]
=
'float'
;
$length
=
null
;
break
;
case
'decimal'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
$length
=
null
;
break
;
case
'tinyblob'
:
case
'mediumblob'
:
case
'longblob'
:
case
'blob'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'year'
:
$type
[]
=
'integer'
;
$type
[]
=
'date'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Sqlite_Exception
(
'unknown database attribute type: '
.
$dbType
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to declare an integer type
* field to be used in statements like CREATE TABLE.
*
* @param string $name name the field to be declared.
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes.
* Currently, the types of supported field
* properties are as follows:
*
* unsigned
* Boolean flag that indicates whether the field
* should be declared as unsigned integer if
* possible.
*
* default
* Integer value to be used as default for this
* field.
*
* notnull
* Boolean flag that indicates whether this field is
* constrained to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
* @access protected
*/
public
function
getIntegerDeclaration
(
$name
,
array
$field
)
{
$default
=
$autoinc
=
''
;
$type
=
$this
->
getNativeDeclaration
(
$field
);
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
])
{
$autoinc
=
' PRIMARY KEY AUTOINCREMENT'
;
$type
=
'INTEGER'
;
}
elseif
(
array_key_exists
(
'default'
,
$field
))
{
if
(
$field
[
'default'
]
===
''
)
{
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
?
null
:
0
;
}
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
}
/**
elseif (empty($field['notnull'])) {
$default = ' DEFAULT NULL';
}
*/
$notnull
=
(
isset
(
$field
[
'notnull'
])
&&
$field
[
'notnull'
])
?
' NOT NULL'
:
''
;
$unsigned
=
(
isset
(
$field
[
'unsigned'
])
&&
$field
[
'unsigned'
])
?
' UNSIGNED'
:
''
;
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$type
.
$unsigned
.
$default
.
$notnull
.
$autoinc
;
}
}
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.phpdoctrine.com>.
*/
Doctrine
::
autoload
(
'Doctrine_DataDict'
);
/**
* @package Doctrine
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @author Konsta Vesterinen <kvesteri@cc.hut.fi>
* @author Lukas Smith <smith@pooteeweet.org> (PEAR MDB2 library)
* @version $Revision$
* @category Object Relational Mapping
* @link www.phpdoctrine.com
* @since 1.0
*/
class
Doctrine_DataDict_Sqlite
extends
Doctrine_DataDict
{
/**
* Obtain DBMS specific SQL code portion needed to declare an text type
* field to be used in statements like CREATE TABLE.
*
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes. Currently, the types
* of supported field properties are as follows:
*
* length
* Integer value that determines the maximum length of the text
* field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
*
* default
* Text value to be used as default for this field.
*
* notnull
* Boolean flag that indicates whether this field is constrained
* to not be set to null.
* @author Lukas Smith (PEAR MDB2 library)
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public
function
getNativeDeclaration
(
array
$field
)
{
switch
(
$field
[
'type'
])
{
case
'text'
:
case
'object'
:
case
'array'
:
case
'string'
:
case
'char'
:
case
'gzip'
:
case
'varchar'
:
$length
=
(
isset
(
$field
[
'length'
])
&&
$field
[
'length'
])
?
$field
[
'length'
]
:
null
;
$fixed
=
((
isset
(
$field
[
'fixed'
])
&&
$field
[
'fixed'
])
||
$field
[
'type'
]
==
'char'
)
?
true
:
false
;
return
$fixed
?
(
$length
?
'CHAR('
.
$length
.
')'
:
'CHAR('
.
$this
->
conn
->
getAttribute
(
Doctrine
::
ATTR_DEFAULT_TEXTFLD_LENGTH
)
.
')'
)
:
(
$length
?
'VARCHAR('
.
$length
.
')'
:
'TEXT'
);
case
'clob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
255
)
{
return
'TINYTEXT'
;
}
elseif
(
$length
<=
65535
)
{
return
'TEXT'
;
}
elseif
(
$length
<=
16777215
)
{
return
'MEDIUMTEXT'
;
}
}
return
'LONGTEXT'
;
case
'blob'
:
if
(
!
empty
(
$field
[
'length'
]))
{
$length
=
$field
[
'length'
];
if
(
$length
<=
255
)
{
return
'TINYBLOB'
;
}
elseif
(
$length
<=
65535
)
{
return
'BLOB'
;
}
elseif
(
$length
<=
16777215
)
{
return
'MEDIUMBLOB'
;
}
}
return
'LONGBLOB'
;
case
'enum'
:
case
'integer'
:
case
'boolean'
:
return
'INTEGER'
;
case
'date'
:
return
'DATE'
;
case
'time'
:
return
'TIME'
;
case
'timestamp'
:
return
'DATETIME'
;
case
'float'
:
case
'double'
:
return
'DOUBLE'
;
//($
this->conn->options['fixed_float'] ? '('.
//($
this->conn->options['fixed_float']+2).','.$this->conn->options['fixed_float'].')' : '');
case
'decimal'
:
$length
=
!
empty
(
$field
[
'length'
])
?
$field
[
'length'
]
:
18
;
return
'DECIMAL('
.
$length
.
','
.
$
this
->
conn
->
options
[
'decimal_places'
]
.
')'
;
}
throw
new
Doctrine_DataDict_Sqlite_Exception
(
'Unknown datatype '
.
$field
[
'type'
]);
}
/**
* Maps a native array description of a field to Doctrine datatype and length
*
* @param array $field native field description
* @return array containing the various possible types, length, sign, fixed
*/
public
function
getPortableDeclaration
(
array
$field
)
{
$dbType
=
strtolower
(
$field
[
'type'
]);
$length
=
(
isset
(
$field
[
'length'
]))
?
$field
[
'length'
]
:
null
;
$unsigned
=
(
isset
(
$field
[
'unsigned'
]))
?
$field
[
'unsigned'
]
:
null
;
$fixed
=
null
;
$type
=
array
();
if
(
!
isset
(
$field
[
'name'
]))
{
$field
[
'name'
]
=
''
;
}
switch
(
$dbType
)
{
case
'boolean'
:
$type
[]
=
'boolean'
;
break
;
case
'tinyint'
:
$type
[]
=
'integer'
;
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
1
;
break
;
case
'smallint'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
2
;
break
;
case
'mediumint'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
3
;
break
;
case
'int'
:
case
'integer'
:
case
'serial'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
4
;
break
;
case
'bigint'
:
case
'bigserial'
:
$type
[]
=
'integer'
;
$unsigned
=
preg_match
(
'/ unsigned/i'
,
$field
[
'type'
]);
$length
=
8
;
break
;
case
'clob'
:
case
'tinytext'
:
case
'mediumtext'
:
case
'longtext'
:
case
'text'
:
case
'varchar'
:
case
'varchar2'
:
$fixed
=
false
;
case
'char'
:
$type
[]
=
'text'
;
if
(
$length
==
'1'
)
{
$type
[]
=
'boolean'
;
if
(
preg_match
(
'/^(is|has)/'
,
$field
[
'name'
]))
{
$type
=
array_reverse
(
$type
);
}
}
elseif
(
strstr
(
$dbType
,
'text'
))
{
$type
[]
=
'clob'
;
}
if
(
$fixed
!==
false
)
{
$fixed
=
true
;
}
break
;
case
'date'
:
$type
[]
=
'date'
;
$length
=
null
;
break
;
case
'datetime'
:
case
'timestamp'
:
$type
[]
=
'timestamp'
;
$length
=
null
;
break
;
case
'time'
:
$type
[]
=
'time'
;
$length
=
null
;
break
;
case
'float'
:
case
'double'
:
case
'real'
:
$type
[]
=
'float'
;
$length
=
null
;
break
;
case
'decimal'
:
case
'numeric'
:
$type
[]
=
'decimal'
;
$length
=
null
;
break
;
case
'tinyblob'
:
case
'mediumblob'
:
case
'longblob'
:
case
'blob'
:
$type
[]
=
'blob'
;
$length
=
null
;
break
;
case
'year'
:
$type
[]
=
'integer'
;
$type
[]
=
'date'
;
$length
=
null
;
break
;
default
:
throw
new
Doctrine_DataDict_Sqlite_Exception
(
'unknown database attribute type: '
.
$dbType
);
}
return
array
(
$type
,
$length
,
$unsigned
,
$fixed
);
}
/**
* Obtain DBMS specific SQL code portion needed to declare an integer type
* field to be used in statements like CREATE TABLE.
*
* @param string $name name the field to be declared.
* @param array $field associative array with the name of the properties
* of the field being declared as array indexes.
* Currently, the types of supported field
* properties are as follows:
*
* unsigned
* Boolean flag that indicates whether the field
* should be declared as unsigned integer if
* possible.
*
* default
* Integer value to be used as default for this
* field.
*
* notnull
* Boolean flag that indicates whether this field is
* constrained to not be set to null.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
* @access protected
*/
public
function
getIntegerDeclaration
(
$name
,
array
$field
)
{
$default
=
$autoinc
=
''
;
$type
=
$this
->
getNativeDeclaration
(
$field
);
if
(
isset
(
$field
[
'autoincrement'
])
&&
$field
[
'autoincrement'
])
{
$autoinc
=
' PRIMARY KEY AUTOINCREMENT'
;
$type
=
'INTEGER'
;
}
elseif
(
array_key_exists
(
'default'
,
$field
))
{
if
(
$field
[
'default'
]
===
''
)
{
$field
[
'default'
]
=
empty
(
$field
[
'notnull'
])
?
null
:
0
;
}
$default
=
' DEFAULT '
.
$this
->
conn
->
quote
(
$field
[
'default'
],
$field
[
'type'
]);
}
/**
elseif (empty($field['notnull'])) {
$default = ' DEFAULT NULL';
}
*/
$notnull
=
(
isset
(
$field
[
'notnull'
])
&&
$field
[
'notnull'
])
?
' NOT NULL'
:
''
;
$unsigned
=
(
isset
(
$field
[
'unsigned'
])
&&
$field
[
'unsigned'
])
?
' UNSIGNED'
:
''
;
$name
=
$this
->
conn
->
quoteIdentifier
(
$name
,
true
);
return
$name
.
' '
.
$type
.
$unsigned
.
$default
.
$notnull
.
$autoinc
;
}
}
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