[ticket/8240] Add ability to get a list of tables to db_tools.

PHPBB3-8240
This commit is contained in:
Andreas Fischer 2011-10-14 15:25:15 +02:00
parent 1657339e6d
commit 234edf674c
3 changed files with 75 additions and 49 deletions

View file

@ -347,6 +347,66 @@ class phpbb_db_tools
} }
} }
/**
* Gets a list of tables in the database.
*
* @return array Array of table names (all lower case)
*/
function sql_list_tables()
{
switch ($this->db->sql_layer)
{
case 'mysql':
case 'mysql4':
case 'mysqli':
$sql = 'SHOW TABLES';
break;
case 'sqlite':
$sql = 'SELECT name
FROM sqlite_master
WHERE type = "table"';
break;
case 'mssql':
case 'mssql_odbc':
case 'mssqlnative':
$sql = "SELECT name
FROM sysobjects
WHERE type='U'";
break;
case 'postgres':
$sql = 'SELECT relname
FROM pg_stat_user_tables';
break;
case 'firebird':
$sql = 'SELECT rdb$relation_name
FROM rdb$relations
WHERE rdb$view_source is null
AND rdb$system_flag = 0';
break;
case 'oracle':
$sql = 'SELECT table_name
FROM USER_TABLES';
break;
}
$result = $this->db->sql_query($sql);
$tables = array();
while ($row = $this->db->sql_fetchrow($result))
{
$name = current($row);
$tables[$name] = $name;
}
$this->db->sql_freeresult($result);
return $tables;
}
/** /**
* Check if table exists * Check if table exists
* *

View file

@ -211,61 +211,20 @@ function dbms_select($default = '', $only_20x_options = false)
/** /**
* Get tables of a database * Get tables of a database
*
* @deprecated
*/ */
function get_tables($db) function get_tables(&$db)
{ {
switch ($db->sql_layer) if (!class_exists('phpbb_db_tools'))
{ {
case 'mysql': global $phpbb_root_path, $phpEx;
case 'mysql4': require($phpbb_root_path . 'includes/db/db_tools.' . $phpEx);
case 'mysqli':
$sql = 'SHOW TABLES';
break;
case 'sqlite':
$sql = 'SELECT name
FROM sqlite_master
WHERE type = "table"';
break;
case 'mssql':
case 'mssql_odbc':
case 'mssqlnative':
$sql = "SELECT name
FROM sysobjects
WHERE type='U'";
break;
case 'postgres':
$sql = 'SELECT relname
FROM pg_stat_user_tables';
break;
case 'firebird':
$sql = 'SELECT rdb$relation_name
FROM rdb$relations
WHERE rdb$view_source is null
AND rdb$system_flag = 0';
break;
case 'oracle':
$sql = 'SELECT table_name
FROM USER_TABLES';
break;
} }
$result = $db->sql_query($sql); $db_tools = new phpbb_db_tools($db);
$tables = array(); return $db_tools->sql_list_tables();
while ($row = $db->sql_fetchrow($result))
{
$tables[] = current($row);
}
$db->sql_freeresult($result);
return $tables;
} }
/** /**

View file

@ -258,6 +258,13 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
$this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_id')); $this->assertFalse($this->tools->sql_column_exists('prefix_table_name', 'c_id'));
} }
public function test_list_tables()
{
$tables = $this->tools->sql_list_tables();
$this->assertTrue(isset($tables['prefix_table_name']));
$this->assertFalse(isset($tables['prefix_does_not_exist']));
}
public function test_table_exists() public function test_table_exists()
{ {
$this->assertTrue($this->tools->sql_table_exists('prefix_table_name')); $this->assertTrue($this->tools->sql_table_exists('prefix_table_name'));