| // +----------------------------------------------------------------------+ // // $Id$ // require_once 'MDB2/Driver/Datatype/Common.php'; /** * MDB2 MySQL driver * * @package MDB2 * @category Database * @author Lukas Smith */ class MDB2_Driver_Datatype_mysqli extends MDB2_Driver_Datatype_Common { // }}} // {{{ _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 string $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 */ function _getIntegerDeclaration($name, $field) { if (array_key_exists('autoincrement', $field) && $field['autoincrement']) { $autoinc = ' AUTO_INCREMENT PRIMARY KEY'; $default = ''; } else { $autoinc = ''; $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'integer') : ''; } $unsigned = (array_key_exists('unsigned', $field) && $field['unsigned']) ? ' UNSIGNED' : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' INT'.$unsigned.$default.$notnull.$autoinc; } // }}} // {{{ _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 string $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 large object field. If this argument is * missing the field should be declared to have the * longest length allowed by the DBMS. * * 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 */ function _getCLOBDeclaration($name, $field) { if (array_key_exists('length', $field)) { $length = $field['length']; if ($length <= 255) { $type = 'TINYTEXT'; } else { if ($length <= 65535) { $type = 'TEXT'; } else { if ($length <= 16777215) { $type = 'MEDIUMTEXT'; } else { $type = 'LONGTEXT'; } } } } else { $type = 'LONGTEXT'; } $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' '.$type.$notnull; } // }}} // {{{ _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 string $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 large object field. If this argument is * missing the field should be declared to have the * longest length allowed by the DBMS. * * 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 */ function _getBLOBDeclaration($name, $field) { if (array_key_exists('length', $field)) { $length = $field['length']; if ($length <= 255) { $type = 'TINYBLOB'; } else { if ($length <= 65535) { $type = 'BLOB'; } else { if ($length <= 16777215) { $type = 'MEDIUMBLOB'; } else { $type = 'LONGBLOB'; } } } } else { $type = 'LONGBLOB'; } $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' '.$type.$notnull; } // }}} // {{{ _getDateDeclaration() /** * Obtain DBMS specific SQL code portion needed to declare an date type * field to be used in statements like CREATE TABLE. * * @param string $name name the field to be declared. * @param string $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: * * default * Date 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 */ function _getDateDeclaration($name, $field) { $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'date') : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' DATE'.$default.$notnull; } // }}} // {{{ _getTimestampDeclaration() /** * Obtain DBMS specific SQL code portion needed to declare an timestamp * type field to be used in statements like CREATE TABLE. * * @param string $name name the field to be declared. * @param string $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: * * default * Time stamp 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 */ function _getTimestampDeclaration($name, $field) { $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'timestamp') : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' DATETIME'.$default.$notnull; } // }}} // {{{ _getTimeDeclaration() /** * Obtain DBMS specific SQL code portion needed to declare an time type * field to be used in statements like CREATE TABLE. * * @param string $name name the field to be declared. * @param string $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: * * default * Time 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 */ function _getTimeDeclaration($name, $field) { $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'time') : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' TIME'.$default.$notnull; } // }}} // {{{ _getFloatDeclaration() /** * Obtain DBMS specific SQL code portion needed to declare an float type * field to be used in statements like CREATE TABLE. * * @param string $name name the field to be declared. * @param string $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: * * 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 */ function _getFloatDeclaration($name, $field) { $type = 'DOUBLE'; $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'float') : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' '.$type.$default.$notnull; } // }}} // {{{ _getDecimalDeclaration() /** * Obtain DBMS specific SQL code portion needed to declare an decimal type * field to be used in statements like CREATE TABLE. * * @param string $name name the field to be declared. * @param string $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: * * 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 */ function _getDecimalDeclaration($name, $field) { $db =& $this->getDBInstance(); if (PEAR::isError($db)) { return $db; } $type = 'DECIMAL(18,'.$db->options['decimal_places'].')'; $default = array_key_exists('default', $field) ? ' DEFAULT '. $this->quote($field['default'], 'decimal') : ''; $notnull = (array_key_exists('notnull', $field) && $field['notnull']) ? ' NOT NULL' : ''; return $name.' '.$type.$default.$notnull; } // }}} // {{{ _quoteBLOB() /** * Convert a text value into a DBMS specific format that is suitable to * compose query statements. * * @param $value * @return string text string that represents the given argument value in * a DBMS specific format. * @access protected */ function _quoteBLOB($value) { $value = $this->_readFile($value); return "'".addslashes($value)."'"; } // }}} // {{{ _quoteFloat() /** * 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. * @access protected */ function _quoteFloat($value) { return (float)$value; } // }}} // {{{ _quoteDecimal() /** * 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. * @access protected */ function _quoteDecimal($value) { $db =& $this->getDBInstance(); if (PEAR::isError($db)) { return $db; } return $db->escape($value); } // }}} // {{{ 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 and the length * @access public */ function mapNativeDatatype($field) { $db_type = strtolower($field['type']); $db_type = strtok($db_type, '(), '); if ($db_type == 'national') { $db_type = strtok('(), '); } $length = strtok('(), '); $decimal = strtok('(), '); $type = array(); switch ($db_type) { case 'tinyint': case 'smallint': case 'mediumint': case 'int': case 'integer': case 'bigint': $type[] = 'integer'; if ($length == '1') { $type[] = 'boolean'; if (preg_match('/^[is|has]/', $field['field'])) { $type = array_reverse($type); } } break; case 'char': case 'varchar': $type[] = 'text'; if ($length == '1') { $type[] = 'boolean'; if (preg_match('/[is|has]/', $field['field'])) { $type = array_reverse($type); } } break; case 'enum': preg_match_all('/\'.+\'/U', $field['type'], $matches); $length = 0; if (is_array($matches)) { foreach ($matches[0] as $value) { $length = max($length, strlen($value)-2); } } case 'set': $type[] = 'text'; $type[] = 'integer'; 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 'numeric': $type[] = 'decimal'; break; case 'tinytext': case 'mediumtext': case 'longtext': case 'text': if ($decimal == 'binary') { $type[] = 'blob'; } $type[] = 'clob'; $type[] = 'text'; break; case 'tinyblob': case 'mediumblob': case 'longblob': case 'blob': $type[] = 'blob'; $type[] = 'text'; $length = null; break; case 'year': $type[] = 'integer'; $type[] = 'date'; $length = null; break; default: $db =& $this->getDBInstance(); if (PEAR::isError($db)) { return $db; } return $db->raiseError(MDB2_ERROR, null, null, 'getTableFieldDefinition: unknown database attribute type'); } return array($type, $length); } // }}} // {{{ mapPrepareDatatype() /** * Maps an mdb2 datatype to mysqli prepare type * * @param string $type * @return string * @access public */ function mapPrepareDatatype($type) { switch($type) { case 'integer': return 'i'; case 'float': return 'd'; case 'blob': return 'b'; default: break; } return 's'; } } ?>