From c9462d0c1e2493a7399b1dbd21e23b215e97f808 Mon Sep 17 00:00:00 2001 From: svncommit Date: Thu, 27 Oct 2005 13:40:37 +0000 Subject: added all mdb2 drivers --- program/lib/MDB2/Driver/Reverse/sqlite.php | 308 +++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100755 program/lib/MDB2/Driver/Reverse/sqlite.php (limited to 'program/lib/MDB2/Driver/Reverse/sqlite.php') diff --git a/program/lib/MDB2/Driver/Reverse/sqlite.php b/program/lib/MDB2/Driver/Reverse/sqlite.php new file mode 100755 index 000000000..dd56853cc --- /dev/null +++ b/program/lib/MDB2/Driver/Reverse/sqlite.php @@ -0,0 +1,308 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id$ +// + +require_once 'MDB2/Driver/Reverse/Common.php'; + +/** + * MDB2 SQlite driver for the schema reverse engineering module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common +{ + + function _getTableColumns($query) + { + $start_pos = strpos($query, '('); + $end_pos = strrpos($query, ')'); + $column_def = substr($query, $start_pos+1, $end_pos-$start_pos-1); + $column_sql = split(',', $column_def); + $columns = array(); + $count = count($column_sql); + if ($count == 0) { + return $db->raiseError('unexpected empty table column definition list'); + } + $regexp = '/^([^ ]+) (CHAR|VARCHAR|VARCHAR2|TEXT|INT|INTEGER|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( PRIMARY)?( \(([1-9][0-9]*)(,([1-9][0-9]*))?\))?( DEFAULT (\'[^\']*\'|[^ ]+))?( NOT NULL)?$/i'; + for ($i=0, $j=0; $i<$count; ++$i) { + if (!preg_match($regexp, $column_sql[$i], $matches)) { + return $db->raiseError('unexpected table column SQL definition'); + } + $columns[$j]['name'] = $matches[1]; + $columns[$j]['type'] = strtolower($matches[2]); + if (isset($matches[5]) && strlen($matches[5])) { + $columns[$j]['length'] = $matches[5]; + } + if (isset($matches[7]) && strlen($matches[7])) { + $columns[$j]['decimal'] = $matches[7]; + } + if (isset($matches[9]) && strlen($matches[9])) { + $default = $matches[9]; + if (strlen($default) && $default[0]=="'") { + $default = str_replace("''", "'", substr($default, 1, strlen($default)-2)); + } + $columns[$j]['default'] = $default; + } + if (isset($matches[10]) && strlen($matches[10])) { + $columns[$j]['notnull'] = true; + } + ++$j; + } + return $columns; + } + + // {{{ getTableFieldDefinition() + + /** + * get the stucture of a field into an array + * + * @param string $table name of table that should be used in method + * @param string $field_name name of field that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableFieldDefinition($table, $field_name) + { + $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; + $result = $db->loadModule('Datatype'); + if (PEAR::isError($result)) { + return $result; + } + $query = "SELECT sql FROM sqlite_master WHERE type='table' AND name='$table'"; + $query = $db->queryOne($query); + if (PEAR::isError($query)) { + return $query; + } + if (PEAR::isError($columns = $this->_getTableColumns($query))) { + return $columns; + } + foreach ($columns as $column) { + if ($db->options['portability'] & MDB2_PORTABILITY_LOWERCASE) { + $column['name'] = strtolower($column['name']); + } else { + $column = array_change_key_case($column, CASE_LOWER); + } + if ($field_name == $column['name']) { + list($types, $length) = $db->datatype->mapNativeDatatype($column); + unset($notnull); + if (isset($column['null']) && $column['null'] != 'YES') { + $notnull = true; + } + unset($default); + if (isset($column['default'])) { + $default = $column['default']; + } + $definition = array(); + foreach ($types as $key => $type) { + $definition[0][$key] = array('type' => $type); + if (isset($notnull)) { + $definition[0][$key]['notnull'] = true; + } + if (isset($default)) { + $definition[0][$key]['default'] = $default; + } + if (isset($length)) { + $definition[0][$key]['length'] = $length; + } + } + // todo .. handle auto_inrement and primary keys + return $definition; + } + } + + return $db->raiseError(MDB2_ERROR, null, null, + 'getTableFieldDefinition: it was not specified an existing table column'); + } + + // }}} + // {{{ getTableIndexDefinition() + + /** + * get the stucture of an index into an array + * + * @param string $table name of table that should be used in method + * @param string $index_name name of index that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableIndexDefinition($table, $index_name) + { + $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; + if ($index_name == 'PRIMARY') { + return $db->raiseError(MDB2_ERROR, null, null, + 'getTableIndexDefinition: PRIMARY is an hidden index'); + } + $query = "SELECT sql FROM sqlite_master WHERE type='index' AND name='$index_name' AND tbl_name='$table' AND sql NOT NULL ORDER BY name"; + $result = $db->query($query); + if (PEAR::isError($result)) { + return $result; + } + $columns = $result->getColumnNames(); + $column = 'sql'; + if (!isset($columns[$column])) { + $result->free(); + return $db->raiseError('getTableIndexDefinition: show index does not return the table creation sql'); + } + + $query = strtolower($result->fetchOne()); + $unique = strstr($query, ' unique '); + $key_name = $index_name; + $start_pos = strpos($query, '('); + $end_pos = strrpos($query, ')'); + $column_names = substr($query, $start_pos+1, $end_pos-$start_pos-1); + $column_names = split(',', $column_names); + + $definition = array(); + if ($unique) { + $definition['unique'] = true; + } + $count = count($column_names); + for ($i=0; $i<$count; ++$i) { + $column_name = strtok($column_names[$i]," "); + $collation = strtok(" "); + $definition['fields'][$column_name] = array(); + if (!empty($collation)) { + $definition['fields'][$column_name]['sorting'] = ($collation=='ASC' ? 'ascending' : 'descending'); + } + } + + $result->free(); + if (!isset($definition['fields'])) { + return $db->raiseError(MDB2_ERROR, null, null, + 'getTableIndexDefinition: it was not specified an existing table index'); + } + return $definition; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table + * + * @param string $result a string containing the name of a table + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A MDB2_Error object on failure. + * + * @see MDB2_common::tableInfo() + * @since Method available since Release 1.7.0 + */ + function tableInfo($result, $mode = null) + { + $db =& $GLOBALS['_MDB2_databases'][$this->db_index]; + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = $db->queryAll("PRAGMA table_info('$result');", null, MDB2_FETCHMODE_ASSOC); + $got_string = true; + } else { + return $db->raiseError(MDB2_ERROR_NOT_CAPABLE, null, null, + 'This DBMS can not obtain tableInfo' . + ' from result sets'); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = count($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + if (strpos($id[$i]['type'], '(') !== false) { + $bits = explode('(', $id[$i]['type']); + $type = $bits[0]; + $len = rtrim($bits[1],')'); + } else { + $type = $id[$i]['type']; + $len = 0; + } + + $flags = ''; + if ($id[$i]['pk']) { + $flags .= 'primary_key '; + } + if ($id[$i]['notnull']) { + $flags .= 'not_null '; + } + if ($id[$i]['dflt_value'] !== null) { + $flags .= 'default_' . rawurlencode($id[$i]['dflt_value']); + } + $flags = trim($flags); + + $res[$i] = array( + 'table' => $case_func($result), + 'name' => $case_func($id[$i]['name']), + 'type' => $type, + 'len' => $len, + 'flags' => $flags, + ); + + if ($mode & MDB2_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & MDB2_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + return $res; + } +} + +?> \ No newline at end of file -- cgit v1.2.3