Source for file Common.php
Documentation is available at Common.php
// +----------------------------------------------------------------------+
// | PHP versions 4 and 5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1998-2006 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.68 2006/05/14 05:48:16 lsmith Exp $
require_once 'MDB2/LOB.php';
* @author Lukas Smith <smith@pooteeweet.org>
* MDB2_Driver_Common: Base class that is extended by each MDB2 driver
* @author Lukas Smith <smith@pooteeweet.org>
'timestamp' => '1970-01-01 00:00:00',
* contains all LOB objects created with this MDB2 instance
// {{{ 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 string $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)) {
'checkResultTypes: ' . $type . ' for '. $key . ' is not a supported column type');
// {{{ _baseConvertResult()
* general type conversion method
* @param mixed $value refernce to a value to be converted
* @param int $type constant that specifies which type to convert to
* @return object a 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);
* convert a value to a RDBMS indepdenant MDB2 type
* @param mixed $value value to be converted
* @param int $type constant that specifies which type to convert to
* @return mixed converted value or a MDB2 error on failure
// {{{ convertResultRow()
* @param resource $result result identifier
* @param array $row array with data
* @return mixed MDB2_OK on success, a MDB2 error on failure
foreach ($row as $key => $column) {
if (isset ($types[$current_column])) {
$type = $types[$current_column];
} elseif (isset ($types[$key])) {
if (PEAR ::isError ($value)) {
* 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)) {
'type not defined: '. $type);
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']) {
? $field['length'] : $db->options ['default_text_field_length'];
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
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
if (PEAR ::isError ($db)) {
if ($field['default'] === '') {
if ($field['default'] === ''
$default = ' DEFAULT '. $this->quote($field['default'], $field['type']);
$notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : '';
$name = $db->quoteIdentifier ($name, true );
// {{{ _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.
* 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)) {
$db->warnings [] = " unsigned integer field \"$name\" is being declared as signed integer";
// {{{ _getTextDeclaration()
* Obtain DBMS specific SQL code portion needed to declare an text 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
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
// {{{ _getCLOBDeclaration()
* Obtain DBMS specific SQL code portion needed to declare an character
* large object 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 large
* object field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
* 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)) {
$notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : '';
$name = $db->quoteIdentifier ($name, true );
// {{{ _getBLOBDeclaration()
* Obtain DBMS specific SQL code portion needed to declare an binary large
* object 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 large
* object field. If this argument is missing the field should be
* declared to have the longest length allowed by the DBMS.
* 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)) {
$notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : '';
$name = $db->quoteIdentifier ($name, true );
// {{{ _getBooleanDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a boolean 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 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.
// {{{ _getDateDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a date 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:
* Date 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.
// {{{ _getTimestampDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a timestamp
* 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:
* Timestamp 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.
// {{{ _getTimeDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a time
* 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:
* Time 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.
// {{{ _getFloatDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a float 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:
* Float 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.
// {{{ _getDecimalDeclaration()
* Obtain DBMS specific SQL code portion needed to declare a decimal 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:
* Decimal 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.
// {{{ compareDefinition()
* 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
if (PEAR ::isError ($db)) {
'type "'. $current['type']. '" is not yet supported');
$change = $this->{" _compare{$type}Definition" }($current, $previous);
if ($previous['type'] != $type) {
$previous_notnull = array_key_exists('notnull', $previous) ? $previous['notnull'] : false;
if ($previous_notnull != $notnull) {
$change['notnull'] = true;
$previous_default = array_key_exists('default', $previous) ? $previous['default'] :
($previous_notnull ? '' : null );
if ($previous_default !== $default) {
$change['default'] = true;
// {{{ _compareIntegerDefinition()
* Obtain an array of changes that may need to applied to an integer field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
$previous_unsigned = array_key_exists('unsigned', $previous) ? $previous['unsigned'] : false;
$unsigned = array_key_exists('unsigned', $current) ? $current['unsigned'] : false;
if ($previous_unsigned != $unsigned) {
$change['unsigned'] = true;
$previous_autoincrement = array_key_exists('autoincrement', $previous) ? $previous['autoincrement'] : false;
$autoincrement = array_key_exists('autoincrement', $current) ? $current['autoincrement'] : false;
if ($previous_autoincrement != $autoincrement) {
$change['autoincrement'] = true;
// {{{ _compareTextDefinition()
* Obtain an array of changes that may need to applied to an text field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
$previous_length = array_key_exists('length', $previous) ? $previous['length'] : 0;
if ($previous_length != $length) {
$change['length'] = true;
$previous_fixed = array_key_exists('fixed', $previous) ? $previous['fixed'] : 0;
if ($previous_fixed != $fixed) {
// {{{ _compareCLOBDefinition()
* Obtain an array of changes that may need to applied to an CLOB field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareBLOBDefinition()
* Obtain an array of changes that may need to applied to an BLOB field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareDateDefinition()
* Obtain an array of changes that may need to applied to an date field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareTimeDefinition()
* Obtain an array of changes that may need to applied to an time field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareTimestampDefinition()
* Obtain an array of changes that may need to applied to an timestamp field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareBooleanDefinition()
* Obtain an array of changes that may need to applied to an boolean field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareFloatDefinition()
* Obtain an array of changes that may need to applied to an float field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
// {{{ _compareDecimalDefinition()
* Obtain an array of changes that may need to applied to an decimal field
* @param array $current new definition
* @param array $previous old definition
* @return array containing all changes that will need to be applied
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param string $type type to which the value should be converted to
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
function quote($value, $type = null , $quote = true )
if (PEAR ::isError ($db)) {
if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $value)) {
} elseif (preg_match('/^\d{2}:\d{2}$/', $value)) {
} elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) {
return $db->raiseError ('type not defined: '. $type);
$value = $this->{" _quote{$type}" }($value, $quote);
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that already contains any DBMS specific
* escaped character sequences.
if (PEAR ::isError ($db)) {
return "'". $db->escape ($value). "'";
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @return string text string that represents the given argument value in
* a DBMS specific format.
if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
if ($match[1 ] == 'file://') {
$value = @fopen($value, 'r');
if (PEAR ::isError ($db)) {
$value.= @fread($fp, $db->options ['lob_buffer_length']);
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
if ($value === 'CURRENT_DATE') {
if (PEAR ::isError ($db)) {
if (isset ($db->function ) && is_a($db->function , 'MDB2_Driver_Function_Common')) {
return $db->function ->now ('date');
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
if ($value === 'CURRENT_TIMESTAMP') {
if (PEAR ::isError ($db)) {
if (isset ($db->function ) && is_a($db->function , 'MDB2_Driver_Function_Common')) {
return $db->function ->now ('timestamp');
return 'CURRENT_TIMESTAMP';
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
if ($value === 'CURRENT_TIME') {
if (PEAR ::isError ($db)) {
if (isset ($db->function ) && is_a($db->function , 'MDB2_Driver_Function_Common')) {
return $db->function ->now ('time');
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
if (PEAR ::isError ($db)) {
return $db->escape ($value);
* Convert a text value into a DBMS specific format that is suitable to
* compose query statements.
* @param string $value text string value that is intended to be converted.
* @param bool $quote determines if the value should be quoted and escaped
* @return string text string that represents the given argument value in
* a DBMS specific format.
if (PEAR ::isError ($db)) {
return $db->escape ($value);
* retrieve LOB from the database
* @param resource $lob stream handle
* @param string $file name of the file into which the LOb should be fetched
* @return mixed MDB2_OK on success, a MDB2 error on failure
if (PEAR ::isError ($db)) {
if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) {
if ($match[1 ] == 'file://') {
$fp = @fopen($file, 'wb');
$result = @fread($lob, $db->options ['lob_buffer_length']);
if (@fwrite($fp, $result, $read) != $read) {
'writeLOBToFile: could not write to the output file');
* retrieve LOB from the database
* @param array $lob array
* @return mixed MDB2_OK on success, a MDB2 error on failure
$lob['value'] = $lob['resource'];
* Read data from large object input stream.
* @param resource $lob stream handle
* @param string $data reference to a variable that will hold data
* to be read from the large object input stream
* @param integer $length value that indicates the largest ammount ofdata
* to be read from the large object input stream.
* @return mixed the effective number of bytes read from the large object
* input stream on sucess or an MDB2 error object.
return substr($lob['value'], $lob['position'], $length);
* Determine whether it was reached the end of the large object and
* therefore there is no more data to be read for the its input stream.
* @param array $lob array
* @return mixed true or false on success, a MDB2 error on failure
* Free any resources allocated during the lifetime of the large object
* @param resource $lob stream handle
$lob_index = $lob_data['wrapper_data']->lob_index;
if (isset ($this->lobs[$lob_index])) {
$this->_destroyLOB ($this->lobs[$lob_index]);
unset ($this->lobs[$lob_index]);
* Free any resources allocated during the lifetime of the large object
* @param array $lob array
function _destroyLOB (&$lob)
* apply a type to all values of an array and return as a comma seperated string
* useful for generating IN statements
* @param array $array data array
* @param string $type determines type of the field
* @return string comma seperated values
if (!is_array($array) || empty ($array)) {
foreach ($array as $value) {
$return[] = $this->quote($value, $type);
// {{{ mapNativeDatatype()
* 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
if (PEAR ::isError ($db)) {
'mapNativeDatatype: method not implemented');
Documentation generated on Mon, 11 Mar 2019 14:39:47 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|