Source for file Common.php
Documentation is available at Common.php
// +----------------------------------------------------------------------+
// | PHP versions 4 and 5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox, |
// | Stig. S. Bakken, Lukas Smith |
// | All rights reserved. |
// +----------------------------------------------------------------------+
// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB |
// | API as well as database abstraction for PHP applications. |
// | This LICENSE is in the BSD license style. |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution. |
// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken, |
// | Lukas Smith nor the names of his contributors may be used to endorse |
// | or promote products derived from this software without specific prior|
// | written permission. |
// | 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 |
// | REGENTS 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. |
// +----------------------------------------------------------------------+
// | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+
// $Id: Common.php,v 1.137 2008/02/17 18:53:40 afz Exp $
require_once 'MDB2/LOB.php';
* @author Lukas Smith <smith@pooteeweet.org>
* MDB2_Driver_Common: Base class that is extended by each MDB2 driver
* To load this module in the MDB2 object:
* $mdb->loadModule('Datatype');
* @author Lukas Smith <smith@pooteeweet.org>
'timestamp' => '1970-01-01 00:00:00',
* contains all LOB objects created with this MDB2 instance
* Get the list of valid types
* This function returns an array of valid types as keys with the values
* being possible default values for all native datatypes and mapped types
* @return mixed array on success, a MDB2 error on failure
if (PEAR ::isError ($db)) {
if (!empty ($db->options ['datatype_map'])) {
foreach ($db->options ['datatype_map'] as $type => $mapped_type) {
$types[$type] = $types[$mapped_type];
} elseif (!empty ($db->options ['datatype_map_callback'][$type])) {
$parameter = array ('type' => $type, 'mapped_type' => $mapped_type);
$default = call_user_func_array($db->options ['datatype_map_callback'][$type], array (&$db, __FUNCTION__ , $parameter));
$types[$type] = $default;
// {{{ checkResultTypes()
* Define the list of types to be associated with the columns of a given
* This function may be called before invoking fetchRow(), fetchOne()
* fetchCole() and fetchAll() so that the necessary data type
* conversions are performed on the data to be retrieved by them. If this
* function is not called, the type of all result set columns is assumed
* to be text, thus leading to not perform any conversions.
* @param array $types array variable that lists the
* data types to be expected in the result set columns. If this array
* contains less types than the number of columns that are returned
* in the result set, the remaining columns are assumed to be of the
* type text. Currently, the types clob and blob are not fully
* @return mixed MDB2_OK on success, a MDB2 error on failure
$types = is_array($types) ? $types : array ($types);
foreach ($types as $key => $type) {
if (PEAR ::isError ($db)) {
if (empty ($db->options ['datatype_map'][$type])) {
$type. ' for '. $key. ' is not a supported column type', __FUNCTION__ );
// {{{ _baseConvertResult()
* General type conversion method
* @param mixed $value reference to a value to be converted
* @param string $type specifies which type to convert to
* @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
* @return object an MDB2 error on failure
$this->lobs[$lob_index]['lob_index'] = $lob_index;
if (PEAR ::isError ($db)) {
'attempt to convert result value to an unknown type :' . $type, __FUNCTION__ );
* Convert a value to a RDBMS indipendent MDB2 type
* @param mixed $value value to be converted
* @param string $type specifies which type to convert to
* @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
* @return mixed converted value
if (PEAR ::isError ($db)) {
if (!empty ($db->options ['datatype_map'][$type])) {
$type = $db->options ['datatype_map'][$type];
if (!empty ($db->options ['datatype_map_callback'][$type])) {
$parameter = array ('type' => $type, 'value' => $value, 'rtrim' => $rtrim);
return call_user_func_array($db->options ['datatype_map_callback'][$type], array (&$db, __FUNCTION__ , $parameter));
// {{{ convertResultRow()
* @param array $row specifies the types to convert to
* @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
* @return mixed MDB2_OK on success, an MDB2 error on failure
foreach ($row as $key => $value) {
if (empty ($types[$key])) {
if (PEAR ::isError ($value)) {
// {{{ _sortResultFieldTypes()
* @param array $row specifies the types to convert to
* @param bool $rtrim if to rtrim text values or not
* @return mixed MDB2_OK on success, a MDB2 error on failure
$n_cols = count($columns);
$n_types = count($types);
if ($n_cols > $n_types) {
for ($i= $n_cols - $n_types; $i >= 0; $i-- ) {
foreach ($columns as $col) {
$sorted_types[$col] = null;
foreach ($types as $name => $type) {
$sorted_types[$name] = $type;
// if there are left types in the array, fill the null values of the
// sorted array with them, in order.
$sorted_types[$k] = current($types);
* Obtain DBMS specific SQL code portion needed to declare
* @param string $type type to which the value should be converted to
* @param string $name name the field to be declared.
* @param string $field definition of the field
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
if (PEAR ::isError ($db)) {
if (!empty ($db->options ['datatype_map'][$type])) {
$type = $db->options ['datatype_map'][$type];
if (!empty ($db->options ['datatype_map_callback'][$type])) {
$parameter = array ('type' => $type, 'name' => $name, 'field' => $field);
return call_user_func_array($db->options ['datatype_map_callback'][$type], array (&$db, __FUNCTION__ , $parameter));
'type not defined: '. $type, __FUNCTION__ );
return $this->{" _get{$type}Declaration" }($name, $field);
// {{{ getTypeDeclaration()
* 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:
* 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.
* Text value to be used as default for this field.
* Boolean flag that indicates whether this field is constrained
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
if (PEAR ::isError ($db)) {
switch ($field['type']) {
$length = !empty ($field['length']) ? $field['length'] : $db->options ['default_text_field_length'];
$fixed = !empty ($field['fixed']) ? $field['fixed'] : false;
return $fixed ? ($length ? 'CHAR('. $length. ')' : 'CHAR('. $db->options ['default_text_field_length']. ')')
: ($length ? 'VARCHAR('. $length. ')' : 'TEXT');
return 'CHAR ('. strlen('YYYY-MM-DD'). ')';
return 'CHAR ('. strlen('HH:MM:SS'). ')';
return 'CHAR ('. strlen('YYYY-MM-DD HH:MM:SS'). ')';
* Obtain DBMS specific SQL code portion needed to declare a generic 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:
* 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.
* Text value to be used as default for this field.
* Boolean flag that indicates whether this field is constrained
* Text value with the default CHARACTER SET for this field.
* Text value with the default COLLATION for this field.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field, or a MDB2_Error on failure
if (PEAR ::isError ($db)) {
$name = $db->quoteIdentifier ($name, true );
if (PEAR ::isError ($declaration_options)) {
return $declaration_options;
// {{{ _getDeclarationOptions()
* Obtain DBMS specific SQL code portion needed to declare a generic type
* field to be used in statement like CREATE TABLE, without the field name
* and type values (ie. just the character set, default value, if the
* field is permitted to be NULL or not, and the collation options).
* @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:
* Text value to be used as default for this field.
* Boolean flag that indicates whether this field is constrained
* Text value with the default CHARACTER SET for this field.
* Text value with the default COLLATION for this field.
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field's options.
$charset = empty ($field['charset']) ? '' :
' '. $this->_getCharsetFieldDeclaration ($field['charset']);
$notnull = empty ($field['notnull']) ? '' : ' NOT NULL';
if ($field['default'] === '') {
if (PEAR ::isError ($db)) {
$field['default'] = $valid_default_values[$field['type']];
$default = ' DEFAULT ' . $this->quote($field['default'], $field['type']);
$collation = empty ($field['collation']) ? '' :
' '. $this->_getCollationFieldDeclaration ($field['collation']);
return $charset. $default. $notnull. $collation;
// {{{ _getCharsetFieldDeclaration()
* 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.
function _getCharsetFieldDeclaration ($charset)
// {{{ _getCollationFieldDeclaration()
* 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.
function _getCollationFieldDeclaration ($collation)
// {{{ _getIntegerDeclaration()
* 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:
* Boolean flag that indicates whether the field should be
* declared as unsigned integer if possible.
* Integer value to be used as default for this field.
|