1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-05 23:25:30 +02:00

[ticket/12710] Prepare get_existing_indexes() for other DBMS

PHPBB3-12710
This commit is contained in:
Joas Schilling 2014-08-07 18:43:48 +02:00
parent 9b36b5283c
commit 339bf90ec2

View File

@ -2289,12 +2289,14 @@ class tools
$old_return_statements = $this->return_statements; $old_return_statements = $this->return_statements;
$this->return_statements = true; $this->return_statements = true;
$indexes = $this->mssql_get_existing_indexes($table_name, $column_name); $indexes = $this->get_existing_indexes($table_name, $column_name);
$unique_indexes = $this->get_existing_indexes($table_name, $column_name, true);
// Drop any indexes // Drop any indexes
if (!empty($indexes)) if (!empty($indexes) || !empty($unique_indexes))
{ {
foreach ($indexes as $index_name => $index_data) $drop_indexes = array_merge(array_keys($indexes), array_keys($unique_indexes));
foreach ($drop_indexes as $index_name)
{ {
$result = $this->sql_index_drop($table_name, $index_name); $result = $this->sql_index_drop($table_name, $index_name);
$statements = array_merge($statements, $result); $statements = array_merge($statements, $result);
@ -2324,6 +2326,16 @@ class tools
} }
} }
if (!empty($unique_indexes))
{
// Recreate unique indexes after we changed the column
foreach ($unique_indexes as $index_name => $index_data)
{
$result = $this->sql_create_unique_index($table_name, $index_name, $index_data);
$statements = array_merge($statements, $result);
}
}
$this->return_statements = $old_return_statements; $this->return_statements = $old_return_statements;
break; break;
@ -2517,87 +2529,114 @@ class tools
* *
* @param string $table_name * @param string $table_name
* @param string $column_name * @param string $column_name
* @param bool $unique Should we get unique indexes or normal ones
* @return array Array with Index name => columns * @return array Array with Index name => columns
*/ */
protected function mssql_get_existing_indexes($table_name, $column_name) public function get_existing_indexes($table_name, $column_name, $unique = false)
{ {
$existing_indexes = array(); $existing_indexes = array();
if ($this->mssql_is_sql_server_2000())
{
// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
// Deprecated in SQL Server 2005
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
FROM sysindexes ix
INNER JOIN sysindexkeys ixc
ON ixc.id = ix.id
AND ixc.indid = ix.indid
INNER JOIN syscolumns cols
ON cols.colid = ixc.colid
AND cols.id = ix.id
WHERE ix.id = object_id('{$table_name}')
AND cols.name = '{$column_name}'";
}
else
{
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
FROM sys.indexes ix
INNER JOIN sys.index_columns ixc
ON ixc.object_id = ix.object_id
AND ixc.index_id = ix.index_id
INNER JOIN sys.columns cols
ON cols.column_id = ixc.column_id
AND cols.object_id = ix.object_id
WHERE ix.object_id = object_id('{$table_name}')
AND cols.name = '{$column_name}'";
}
$result = $this->db->sql_query($sql); switch ($this->sql_layer)
$existing_indexes = array();
while ($row = $this->db->sql_fetchrow($result))
{ {
$existing_indexes[$row['phpbb_index_name']] = array(); case 'mssql':
} case 'mssqlnative':
$this->db->sql_freeresult($result); if ($unique)
{
// TODO fix me
throw new \Exception('FIX ME mssql treats unique and normal indexes the same');
}
if (empty($existing_indexes)) if ($this->mssql_is_sql_server_2000())
{ {
return array(); // http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
} // Deprecated in SQL Server 2005
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
FROM sysindexes ix
INNER JOIN sysindexkeys ixc
ON ixc.id = ix.id
AND ixc.indid = ix.indid
INNER JOIN syscolumns cols
ON cols.colid = ixc.colid
AND cols.id = ix.id
WHERE ix.id = object_id('{$table_name}')
AND cols.name = '{$column_name}'";
}
else
{
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name
FROM sys.indexes ix
INNER JOIN sys.index_columns ixc
ON ixc.object_id = ix.object_id
AND ixc.index_id = ix.index_id
INNER JOIN sys.columns cols
ON cols.column_id = ixc.column_id
AND cols.object_id = ix.object_id
WHERE ix.object_id = object_id('{$table_name}')
AND cols.name = '{$column_name}'";
}
if ($this->mssql_is_sql_server_2000()) $result = $this->db->sql_query($sql);
{ $existing_indexes = array();
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name while ($row = $this->db->sql_fetchrow($result))
FROM sysindexes ix {
INNER JOIN sysindexkeys ixc $existing_indexes[$row['phpbb_index_name']] = array();
ON ixc.id = ix.id }
AND ixc.indid = ix.indid $this->db->sql_freeresult($result);
INNER JOIN syscolumns cols
ON cols.colid = ixc.colid
AND cols.id = ix.id
WHERE ix.id = object_id('{$table_name}')
AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
}
else
{
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name
FROM sys.indexes ix
INNER JOIN sys.index_columns ixc
ON ixc.object_id = ix.object_id
AND ixc.index_id = ix.index_id
INNER JOIN sys.columns cols
ON cols.column_id = ixc.column_id
AND cols.object_id = ix.object_id
WHERE ix.object_id = object_id('{$table_name}')
AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
}
$result = $this->db->sql_query($sql); if (empty($existing_indexes))
{
return array();
}
while ($row = $this->db->sql_fetchrow($result)) if ($this->mssql_is_sql_server_2000())
{ {
$existing_indexes[$row['phpbb_index_name']][] = $row['phpbb_column_name']; $sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name
FROM sysindexes ix
INNER JOIN sysindexkeys ixc
ON ixc.id = ix.id
AND ixc.indid = ix.indid
INNER JOIN syscolumns cols
ON cols.colid = ixc.colid
AND cols.id = ix.id
WHERE ix.id = object_id('{$table_name}')
AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
}
else
{
$sql = "SELECT DISTINCT ix.name AS phpbb_index_name, cols.name AS phpbb_column_name
FROM sys.indexes ix
INNER JOIN sys.index_columns ixc
ON ixc.object_id = ix.object_id
AND ixc.index_id = ix.index_id
INNER JOIN sys.columns cols
ON cols.column_id = ixc.column_id
AND cols.object_id = ix.object_id
WHERE ix.object_id = object_id('{$table_name}')
AND " . $this->db->sql_in_set('ix.name', array_keys($existing_indexes));
}
$result = $this->db->sql_query($sql);
while ($row = $this->db->sql_fetchrow($result))
{
$existing_indexes[$row['phpbb_index_name']][] = $row['phpbb_column_name'];
}
$this->db->sql_freeresult($result);
break;
case 'oracle':
throw new \Exception('Needs implementing');
break;
case 'mysql_40':
case 'mysql_41':
case 'postgres':
case 'sqlite':
case 'sqlite3':
// Not supported
throw new \Exception('DBMS is not supported');
break;
} }
$this->db->sql_freeresult($result);
return $existing_indexes; return $existing_indexes;
} }