Commit 7529c4d9 authored by zYne's avatar zYne

added new import driver functionality

parent a6a0427b
...@@ -64,7 +64,22 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -64,7 +64,22 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @return array * @return array
*/ */
public function listSequences($database = null) { public function listSequences($database = null) {
$query = "SHOW TABLES";
if (!is_null($database)) {
$query .= " FROM $database";
}
$tableNames = $db->queryCol($query);
$result = array();
foreach ($tableNames as $tableName) {
if ($sqn = $this->_fixSequenceName($tableName, true)) {
$result[] = $sqn;
}
}
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists table constraints * lists table constraints
...@@ -73,9 +88,48 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -73,9 +88,48 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @return array * @return array
*/ */
public function listTableConstraints($table) { public function listTableConstraints($table) {
$sql = 'select KCU.COLUMN_NAME as referencingColumn, TC.CONSTRAINT_NAME as constraintName, KCU.REFERENCED_TABLE_SCHEMA as referencedTableSchema, KCU.REFERENCED_TABLE_NAME as referencedTable, KCU.REFERENCED_COLUMN_NAME as referencedColumn from INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC inner JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU on TC.CONSTRAINT_NAME=KCU.CONSTRAINT_NAME and TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA and TC.TABLE_NAME=KCU.TABLE_NAME WHERE TC.TABLE_SCHEMA=database() AND TC.TABLE_NAME="'.$table.'" AND CONSTRAINT_TYPE="FOREIGN KEY"'; $db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$key_name = 'Key_name';
$non_unique = 'Non_unique';
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
if ($db->options['field_case'] == CASE_LOWER) {
$key_name = strtolower($key_name);
$non_unique = strtolower($non_unique);
} else {
$key_name = strtoupper($key_name);
$non_unique = strtoupper($non_unique);
}
}
$table = $db->quoteIdentifier($table, true);
$query = "SHOW INDEX FROM $table";
$indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
if (PEAR::isError($indexes)) {
return $indexes;
}
$result = array();
foreach ($indexes as $index_data) {
if (!$index_data[$non_unique]) {
if ($index_data[$key_name] !== 'PRIMARY') {
$index = $this->_fixIndexName($index_data[$key_name]);
} else {
$index = 'PRIMARY';
}
if (!empty($index)) {
$result[$index] = true;
}
}
}
return $this->dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_change_key_case($result, $db->options['field_case']);
}
return array_keys($result);
} }
/** /**
* lists table constraints * lists table constraints
...@@ -112,8 +166,36 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -112,8 +166,36 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableIndexes($table) { public function listTableIndexes($table)
{
$key_name = 'Key_name';
$non_unique = 'Non_unique';
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
if ($db->options['field_case'] == CASE_LOWER) {
$key_name = strtolower($key_name);
$non_unique = strtolower($non_unique);
} else {
$key_name = strtoupper($key_name);
$non_unique = strtoupper($non_unique);
}
}
$table = $db->quoteIdentifier($table, true);
$query = "SHOW INDEX FROM $table";
$indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
$result = array();
foreach ($indexes as $index_data) {
if ($index_data[$non_unique] && ($index = $this->_fixIndexName($index_data[$key_name]))) {
$result[$index] = true;
}
}
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_change_key_case($result, $db->options['field_case']);
}
return array_keys($result);
} }
/** /**
* lists tables * lists tables
...@@ -121,7 +203,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -121,7 +203,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listTables($database = null) { public function listTables($database = null)
{
$sql = 'SHOW TABLES'; $sql = 'SHOW TABLES';
return $this->dbh->query($sql)->fetchAll(PDO::FETCH_COLUMN); return $this->dbh->query($sql)->fetchAll(PDO::FETCH_COLUMN);
...@@ -132,7 +215,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -132,7 +215,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableTriggers($table) { public function listTableTriggers($table)
{
} }
/** /**
...@@ -141,7 +225,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -141,7 +225,8 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableViews($table) { public function listTableViews($table)
{
} }
/** /**
...@@ -149,8 +234,9 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -149,8 +234,9 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* *
* @return array * @return array
*/ */
public function listUsers() { public function listUsers()
{
return $db->queryCol('SELECT DISTINCT USER FROM USER');
} }
/** /**
* lists database views * lists database views
...@@ -158,7 +244,19 @@ class Doctrine_Import_Mysql extends Doctrine_Import { ...@@ -158,7 +244,19 @@ class Doctrine_Import_Mysql extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listViews($database = null) { public function listViews($database = null)
{
$query = 'SHOW FULL TABLES';
if (!is_null($database)) {
$query.= ' FROM ' . $database;
}
$query.= " WHERE Table_type = 'VIEW'";
$result = $db->queryCol($query);
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
} }
...@@ -34,16 +34,48 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -34,16 +34,48 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* *
* @return array * @return array
*/ */
public function listDatabases() { public function listDatabases()
{
if ( ! $this->conn->options['emulate_database']) {
return $this->conn->raiseError(Doctrine::ERROR_UNSUPPORTED, null, null,
'database listing is only supported if the "emulate_database" option is enabled', __FUNCTION__);
}
if ($this->conn->options['database_name_prefix']) {
$query = 'SELECT SUBSTR(username, ';
$query.= (strlen($this->conn->options['database_name_prefix'])+1);
$query.= ") FROM sys.dba_users WHERE username LIKE '";
$query.= $this->conn->options['database_name_prefix']."%'";
} else {
$query = 'SELECT username FROM sys.dba_users';
}
$result2 = $this->conn->standaloneQuery($query, array('text'), false);
$result = $result2->fetchCol();
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
$result2->free();
return $result;
} }
/** /**
* lists all availible database functions * lists all availible database functions
* *
* @return array * @return array
*/ */
public function listFunctions() { public function listFunctions()
{
$query = "SELECT name FROM sys.user_source WHERE line = 1 AND type = 'FUNCTION'";
$result = $this->conn->queryCol($query);
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists all database triggers * lists all database triggers
...@@ -51,7 +83,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -51,7 +83,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listTriggers($database = null) { public function listTriggers($database = null)
{
} }
/** /**
...@@ -60,8 +93,19 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -60,8 +93,19 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listSequences($database = null) { public function listSequences($database = null)
{
$query = "SELECT sequence_name FROM sys.user_sequences";
$tableNames = $this->conn->queryCol($query);
$result = array();
foreach ($tableNames as $tableName) {
$result[] = $this->_fixSequenceName($tableName);
}
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists table constraints * lists table constraints
...@@ -69,8 +113,28 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -69,8 +113,28 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableConstraints($table) { public function listTableConstraints($table)
{
$table = $this->conn->quote($table, 'text');
$query = 'SELECT index_name name FROM user_constraints';
$query.= ' WHERE table_name='.$table.' OR table_name='.strtoupper($table);
$constraints = $this->conn->queryCol($query);
$result = array();
foreach ($constraints as $constraint) {
$constraint = $this->_fixIndexName($constraint);
if (!empty($constraint)) {
$result[$constraint] = true;
}
}
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_change_key_case($result, $this->conn->options['field_case']);
}
return array_keys($result);
} }
/** /**
* lists table constraints * lists table constraints
...@@ -78,20 +142,20 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -78,20 +142,20 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableColumns($table) { public function listTableColumns($table)
$sql = "DESCRIBE $table"; {
$result = $this->dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$columns = array();
foreach ($result as $key => $val) {
$description = array(
'name' => $val['Field'],
'notnull' => (bool) ($val['Null'] === ''),
'type' => $val['Type'],
);
$columns[$val['Field']] = new Doctrine_Schema_Column($description);
}
return $columns; $table = $this->conn->quote($table, 'text');
$query = 'SELECT column_name FROM user_tab_columns';
$query.= ' WHERE table_name='.$table.' OR table_name='.strtoupper($table).' ORDER BY column_id';
$result = $this->conn->queryCol($query);
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists table constraints * lists table constraints
...@@ -101,6 +165,26 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -101,6 +165,26 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
*/ */
public function listTableIndexes($table) { public function listTableIndexes($table) {
$table = $this->conn->quote($table, 'text');
$query = 'SELECT index_name name FROM user_indexes';
$query.= ' WHERE table_name='.$table.' OR table_name='.strtoupper($table);
$query.= ' AND generated=' .$this->conn->quote('N', 'text');
$indexes = $this->conn->queryCol($query, 'text');
$result = array();
foreach ($indexes as $index) {
$index = $this->_fixIndexName($index);
if (!empty($index)) {
$result[$index] = true;
}
}
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_change_key_case($result, $this->conn->options['field_case']);
}
return array_keys($result);
} }
/** /**
* lists tables * lists tables
...@@ -108,8 +192,18 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -108,8 +192,18 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listTables($database = null) { public function listTables($database = null)
return $this->dbh->fetchCol('SELECT table_name FROM all_tables ORDER BY table_name'); {
$query = 'SELECT table_name FROM sys.user_tables';
$result = $this->conn->queryCol($query);
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists table triggers * lists table triggers
...@@ -117,7 +211,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -117,7 +211,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableTriggers($table) { public function listTableTriggers($table)
{
} }
/** /**
...@@ -126,7 +221,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -126,7 +221,8 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string $table database table name * @param string $table database table name
* @return array * @return array
*/ */
public function listTableViews($table) { public function listTableViews($table)
{
} }
/** /**
...@@ -134,8 +230,18 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -134,8 +230,18 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* *
* @return array * @return array
*/ */
public function listUsers() { public function listUsers()
{
if ($this->conn->options['emulate_database'] && $this->conn->options['database_name_prefix']) {
$query = 'SELECT SUBSTR(username, ';
$query.= (strlen($this->conn->options['database_name_prefix'])+1);
$query.= ") FROM sys.dba_users WHERE username NOT LIKE '";
$query.= $this->conn->options['database_name_prefix']."%'";
} else {
$query = 'SELECT username FROM sys.dba_users';
}
return $this->conn->queryCol($query);
} }
/** /**
* lists database views * lists database views
...@@ -143,7 +249,16 @@ class Doctrine_Import_Oracle extends Doctrine_Import { ...@@ -143,7 +249,16 @@ class Doctrine_Import_Oracle extends Doctrine_Import {
* @param string|null $database * @param string|null $database
* @return array * @return array
*/ */
public function listViews($database = null) { public function listViews($database = null)
{
$query = 'SELECT view_name FROM sys.user_views';
$result = $this->conn->queryCol($query);
if ($this->conn->options['portability'] & Doctrine::PORTABILITY_FIX_CASE
&& $this->conn->options['field_case'] == CASE_LOWER
) {
$result = array_map(($this->conn->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
} }
...@@ -62,7 +62,26 @@ class Doctrine_Import_Sqlite extends Doctrine_Import { ...@@ -62,7 +62,26 @@ class Doctrine_Import_Sqlite extends Doctrine_Import {
* @return array * @return array
*/ */
public function listSequences($database = null) { public function listSequences($database = null) {
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name";
$table_names = $db->queryCol($query);
if (PEAR::isError($table_names)) {
return $table_names;
}
$result = array();
foreach ($table_names as $table_name) {
if ($sqn = $this->_fixSequenceName($table_name, true)) {
$result[] = $sqn;
}
}
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
}
return $result;
} }
/** /**
* lists table constraints * lists table constraints
...@@ -71,7 +90,38 @@ class Doctrine_Import_Sqlite extends Doctrine_Import { ...@@ -71,7 +90,38 @@ class Doctrine_Import_Sqlite extends Doctrine_Import {
* @return array * @return array
*/ */
public function listTableConstraints($table) { public function listTableConstraints($table) {
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$table = $db->quote($table, 'text');
$query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$query.= 'LOWER(tbl_name)='.strtolower($table);
} else {
$query.= "tbl_name=$table";
}
$query.= " AND sql NOT NULL ORDER BY name";
$indexes = $db->queryCol($query, 'text');
if (PEAR::isError($indexes)) {
return $indexes;
}
$result = array();
foreach ($indexes as $sql) {
if (preg_match("/^create unique index ([^ ]+) on /i", $sql, $tmp)) {
$index = $this->_fixIndexName($tmp[1]);
if (!empty($index)) {
$result[$index] = true;
}
}
}
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$result = array_change_key_case($result, $db->options['field_case']);
}
return array_keys($result);
} }
/** /**
* lists table constraints * lists table constraints
......
...@@ -1100,6 +1100,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable { ...@@ -1100,6 +1100,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable {
public function getColumnNames() { public function getColumnNames() {
return array_keys($this->columns); return array_keys($this->columns);
} }
/** /**
* getDefinitionOf * getDefinitionOf
* *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment