Index: includes/database/schema.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database/schema.inc,v retrieving revision 1.5 diff -u -p -r1.5 schema.inc --- includes/database/schema.inc 3 Dec 2008 16:32:21 -0000 1.5 +++ includes/database/schema.inc 7 Dec 2008 23:02:23 -0000 @@ -415,14 +415,47 @@ abstract class DatabaseSchema { * Array, both the keys and the values are the matching tables. */ public function findTables($table_expression) { - global $db_prefix; - $info = Database::getConnectionInfo(); $result = db_query("SELECT table_name FROM information_schema.tables WHERE table_schema = :database AND table_name LIKE :table_name", array( - ':database' => $info['default']['database'], - ':table_name' => $table_expression, + ':database' => $this->explodeTable($table_expression)->database, + ':table_name' => this->explodeTable($table_expression)->table, )); return $result->fetchAllKeyed(0, 0); } + + /** + * breaks information about a table up into better peices + * + * @param table name to get specific infomation about + * + * @return + * object ( + * schema => //schema within database + * database => //database table exists in + * table => //table name including prefix + * ) + */ + protected function explodeTable($table) { + global $db_prefix; + + //initializing + $info = Database::getConnection(); + $prefix = $db_prefix; + $schema = "pubic"; + + if (is_array($db_prefix)) + { + $prefix = isset($db_prefix[$table]) ? $db_prefix[$table] : $db_prefix['default']; + } + if (strpos('.', $prefix)) + { + list($schema, $prefix) = explode('.', $prefix); + } + return (object) array( + "schema" => $schema, + "database" => $info['default']['database'], + "table" => $prefix . $table, + ); + } } /** Index: includes/database/mysql/schema.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database/mysql/schema.inc,v retrieving revision 1.7 diff -u -p -r1.7 schema.inc --- includes/database/mysql/schema.inc 2 Dec 2008 19:45:01 -0000 1.7 +++ includes/database/mysql/schema.inc 7 Dec 2008 23:02:23 -0000 @@ -15,14 +15,20 @@ class DatabaseSchema_mysql extends DatabaseSchema { public function tableExists($table) { - return (bool) $this->connection->query("SHOW TABLES LIKE '{" . $table . "}'", array(), array())->fetchField(); - } - + return (bool) db_result(db_query("SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema = :database AND table_name = :table", array( + ':database' => $this->explodeTable($table)->database, + ':table' => $this->explodeTable($table)->table, + ))); + } + public function columnExists($table, $column) { - return (bool) $this->connection->query("SHOW COLUMNS FROM {" . $this->connection->escapeTable($table) . "} LIKE '" . $this->connection->escapeTable($column) . "'", array(), array())->fetchField(); + return (bool) db_result(db_query("SELECT COUNT(column_name) FROM information_schema.columns WHERE table_schema = :database AND table_name = :table AND column_name = :column", array( + ':database' => $this->explodeTable($table)->database, + ':table' => $this->explodeTable($table)->table, + ':column' => $column, + ))); } - /** * Generate SQL to create a new table from a Drupal schema definition. * Index: includes/database/pgsql/schema.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database/pgsql/schema.inc,v retrieving revision 1.3 diff -u -p -r1.3 schema.inc --- includes/database/pgsql/schema.inc 26 Nov 2008 13:42:25 -0000 1.3 +++ includes/database/pgsql/schema.inc 7 Dec 2008 23:02:23 -0000 @@ -14,11 +14,20 @@ class DatabaseSchema_pgsql extends DatabaseSchema { public function tableExists($table) { - return (bool) db_result(db_query("SELECT COUNT(*) FROM pg_class WHERE relname = '{" . db_escape_table($table) . "}'")); + return (bool) db_result(db_query("SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema = :schema AND table_catalog = :database AND table_name = :table", array( + ':schema' => $this->explodeTable($table)->schema,// will return 'public' in most cases + ':database' => $this->explodeTable($table)->database, + ':table' => $this->explodeTable($table)->table, + ))); } public function columnExists($table, $column) { - return (bool) db_result(db_query("SELECT COUNT(pg_attribute.attname) FROM pg_class, pg_attribute WHERE pg_attribute.attrelid = pg_class.oid AND pg_class.relname = '{" . db_escape_table($table) . "}' AND attname = '" . db_escape_table($column) . "'")); + return (bool) db_result(db_query("SELECT COUNT(column_name) FROM information_schema.columns WHERE table_schema = :schema AND table_catalog = :database AND table_name = :table AND column_name = :column", array( + ':schema' => $this->explodeTable($table)->schema,// will return 'public' in most cases + ':database' => $this->explodeTable($table)->database, + ':table' => $this->explodeTable($table)->table, + ':column' => $column, + ))); } /** @@ -506,4 +515,23 @@ class DatabaseSchema_pgsql extends Datab } } } + + /** + * Find all tables that are like the specified base table name. + * + * @param $table_expression + * An SQL expression, for example "simpletest%" (without the quotes). + * BEWARE: this is not prefixed, the caller should take care of that. + * @return + * Array, both the keys and the values are the matching tables. + */ + public function findTables($table_expression) { + $result = db_query("SELECT table_name FROM information_schema.tables WHERE table_schema = :schema AND table_catalog = :database AND table_name LIKE :table_name", array( + ':schema' => $this->explodeTable($table_expression)->schema, + ':database' => $this->explodeTable($table_expression)->database, + ':table_name' => $this->explodeTable($table_expression)->table, + )); + return $result->fetchAllKeyed(0, 0); + } + }