mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-22 03:08:54 +00:00
Merge branch 'develop-ascraeus' into develop
* develop-ascraeus: [ticket/9725] Code sniffer fixes [ticket/9725] Do not use deprecated views to remove default constraints [ticket/9725] Move primary key creation to the correct location [ticket/9725] Remove trailing spaces from MSSQL schema [ticket/9725] Create MSSQL primary keys if none exist [ticket/9725] Remove explicit filegroup designations [ticket/9725] Fetch Azure db stats from proper table [ticket/9725] Add dummy indexes for Azure [ticket/9725] Create an Azure SQL compatible Schema
This commit is contained in:
commit
13d30b0b0e
4 changed files with 468 additions and 347 deletions
|
@ -20,7 +20,6 @@ if (!is_writable($schema_path))
|
||||||
|
|
||||||
define('IN_PHPBB', true);
|
define('IN_PHPBB', true);
|
||||||
|
|
||||||
require(dirname(__FILE__) . '/../includes/db/schema_data.php');
|
|
||||||
require(dirname(__FILE__) . '/../phpbb/db/tools.php');
|
require(dirname(__FILE__) . '/../phpbb/db/tools.php');
|
||||||
|
|
||||||
$dbms_type_map = phpbb\db\tools::get_dbms_type_map();
|
$dbms_type_map = phpbb\db\tools::get_dbms_type_map();
|
||||||
|
@ -31,6 +30,19 @@ $supported_dbms = array('firebird', 'mssql', 'mysql_40', 'mysql_41', 'oracle', '
|
||||||
|
|
||||||
foreach ($supported_dbms as $dbms)
|
foreach ($supported_dbms as $dbms)
|
||||||
{
|
{
|
||||||
|
include(dirname(__FILE__) . '/../includes/db/schema_data.php');
|
||||||
|
if ($dbms == 'mssql')
|
||||||
|
{
|
||||||
|
foreach ($schema_data as $table_name => $table_data)
|
||||||
|
{
|
||||||
|
if (!isset($table_data['PRIMARY_KEY']))
|
||||||
|
{
|
||||||
|
$schema_data[$table_name]['COLUMNS']['mssqlindex'] = array('UINT', NULL, 'auto_increment');
|
||||||
|
$schema_data[$table_name]['PRIMARY_KEY'] = 'mssqlindex';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$fp = fopen($schema_path . $dbms . '_schema.sql', 'wb');
|
$fp = fopen($schema_path . $dbms . '_schema.sql', 'wb');
|
||||||
|
|
||||||
$line = '';
|
$line = '';
|
||||||
|
@ -346,7 +358,7 @@ foreach ($supported_dbms as $dbms)
|
||||||
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
$line = substr($line, 0, -2);
|
$line = substr($line, 0, -2);
|
||||||
$line .= "\n) ON [PRIMARY]" . (($textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '') . "\n";
|
$line .= "\n)";// ON [PRIMARY]" . (($textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '') . "\n";
|
||||||
$line .= "GO\n\n";
|
$line .= "GO\n\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -383,7 +395,7 @@ foreach ($supported_dbms as $dbms)
|
||||||
$line .= "\tCONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED \n";
|
$line .= "\tCONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED \n";
|
||||||
$line .= "\t(\n";
|
$line .= "\t(\n";
|
||||||
$line .= "\t\t[" . implode("],\n\t\t[", $table_data['PRIMARY_KEY']) . "]\n";
|
$line .= "\t\t[" . implode("],\n\t\t[", $table_data['PRIMARY_KEY']) . "]\n";
|
||||||
$line .= "\t) ON [PRIMARY] \n";
|
$line .= "\t)\n";
|
||||||
$line .= "GO\n\n";
|
$line .= "GO\n\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -478,7 +490,7 @@ foreach ($supported_dbms as $dbms)
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
$line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
|
$line .= ($key_data[0] == 'INDEX') ? 'CREATE INDEX' : '';
|
||||||
$line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
|
$line .= ($key_data[0] == 'UNIQUE') ? 'CREATE UNIQUE INDEX' : '';
|
||||||
$line .= " [{$key_name}] ON [{$table_name}]([" . implode('], [', $key_data[1]) . "]) ON [PRIMARY]\n";
|
$line .= " [{$key_name}] ON [{$table_name}]([" . implode('], [', $key_data[1]) . "])\n";
|
||||||
$line .= "GO\n\n";
|
$line .= "GO\n\n";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -2920,8 +2920,24 @@ function get_database_size()
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'mssql_odbc':
|
case 'mssql_odbc':
|
||||||
case 'mssqlnative':
|
case 'mssqlnative':
|
||||||
|
$sql = 'SELECT @@VERSION AS mssql_version';
|
||||||
|
$result = $db->sql_query($sql);
|
||||||
|
$row = $db->sql_fetchrow($result);
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
$sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize
|
$sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize
|
||||||
FROM sysfiles';
|
FROM sysfiles';
|
||||||
|
|
||||||
|
if ($row)
|
||||||
|
{
|
||||||
|
// Azure stats are stored elsewhere
|
||||||
|
if (strpos($row['mssql_version'], 'SQL Azure') !== false)
|
||||||
|
{
|
||||||
|
$sql = 'SELECT ((SUM(reserved_page_count) * 8.0) * 1024.0) as dbsize
|
||||||
|
FROM sys.dm_db_partition_stats';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$result = $db->sql_query($sql, 7200);
|
$result = $db->sql_query($sql, 7200);
|
||||||
$database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;
|
$database_size = ($row = $db->sql_fetchrow($result)) ? $row['dbsize'] : false;
|
||||||
$db->sql_freeresult($result);
|
$db->sql_freeresult($result);
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -467,9 +467,6 @@ class tools
|
||||||
// Determine if we have created a PRIMARY KEY in the earliest
|
// Determine if we have created a PRIMARY KEY in the earliest
|
||||||
$primary_key_gen = false;
|
$primary_key_gen = false;
|
||||||
|
|
||||||
// Determine if the table must be created with TEXTIMAGE
|
|
||||||
$create_textimage = false;
|
|
||||||
|
|
||||||
// Determine if the table requires a sequence
|
// Determine if the table requires a sequence
|
||||||
$create_sequence = false;
|
$create_sequence = false;
|
||||||
|
|
||||||
|
@ -486,6 +483,15 @@ class tools
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($this->sql_layer == 'mssql' || $this->sql_layer == 'mssqlnative')
|
||||||
|
{
|
||||||
|
if (!isset($table_data['PRIMARY_KEY']))
|
||||||
|
{
|
||||||
|
$table_data['COLUMNS']['mssqlindex'] = array('UINT', null, 'auto_increment');
|
||||||
|
$table_data['PRIMARY_KEY'] = 'mssqlindex';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate through the columns to create a table
|
// Iterate through the columns to create a table
|
||||||
foreach ($table_data['COLUMNS'] as $column_name => $column_data)
|
foreach ($table_data['COLUMNS'] as $column_name => $column_data)
|
||||||
{
|
{
|
||||||
|
@ -516,12 +522,6 @@ class tools
|
||||||
$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
|
$primary_key_gen = isset($prepared_column['primary_key_set']) && $prepared_column['primary_key_set'];
|
||||||
}
|
}
|
||||||
|
|
||||||
// create textimage DDL based off of the existance of certain column types
|
|
||||||
if (!$create_textimage)
|
|
||||||
{
|
|
||||||
$create_textimage = isset($prepared_column['textimage']) && $prepared_column['textimage'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// create sequence DDL based off of the existance of auto incrementing columns
|
// create sequence DDL based off of the existance of auto incrementing columns
|
||||||
if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
|
if (!$create_sequence && isset($prepared_column['auto_increment']) && $prepared_column['auto_increment'])
|
||||||
{
|
{
|
||||||
|
@ -536,13 +536,9 @@ class tools
|
||||||
switch ($this->sql_layer)
|
switch ($this->sql_layer)
|
||||||
{
|
{
|
||||||
case 'firebird':
|
case 'firebird':
|
||||||
$table_sql .= "\n);";
|
|
||||||
$statements[] = $table_sql;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'mssqlnative':
|
case 'mssqlnative':
|
||||||
$table_sql .= "\n) ON [PRIMARY]" . (($create_textimage) ? ' TEXTIMAGE_ON [PRIMARY]' : '');
|
$table_sql .= "\n);";
|
||||||
$statements[] = $table_sql;
|
$statements[] = $table_sql;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1850,22 +1846,49 @@ class tools
|
||||||
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'mssqlnative':
|
case 'mssqlnative':
|
||||||
// remove default cosntraints first
|
$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
|
||||||
// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
|
$result = $this->db->sql_query($sql);
|
||||||
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
|
$row = $this->db->sql_fetchrow($result);
|
||||||
SET @drop_default_name =
|
$this->db->sql_freeresult($result);
|
||||||
(SELECT so.name FROM sysobjects so
|
|
||||||
JOIN sysconstraints sc ON so.id = sc.constid
|
// Remove default constraints
|
||||||
WHERE object_name(so.parent_obj) = '{$table_name}'
|
if ($row['mssql_version'][0] == '8') // SQL Server 2000
|
||||||
AND so.xtype = 'D'
|
{
|
||||||
AND sc.colid = (SELECT colid FROM syscolumns
|
// http://msdn.microsoft.com/en-us/library/aa175912%28v=sql.80%29.aspx
|
||||||
WHERE id = object_id('{$table_name}')
|
// Deprecated in SQL Server 2005
|
||||||
AND name = '{$column_name}'))
|
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
|
||||||
IF @drop_default_name <> ''
|
SET @drop_default_name =
|
||||||
BEGIN
|
(SELECT so.name FROM sysobjects so
|
||||||
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
|
JOIN sysconstraints sc ON so.id = sc.constid
|
||||||
EXEC(@cmd)
|
WHERE object_name(so.parent_obj) = '{$table_name}'
|
||||||
END";
|
AND so.xtype = 'D'
|
||||||
|
AND sc.colid = (SELECT colid FROM syscolumns
|
||||||
|
WHERE id = object_id('{$table_name}')
|
||||||
|
AND name = '{$column_name}'))
|
||||||
|
IF @drop_default_name <> ''
|
||||||
|
BEGIN
|
||||||
|
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
|
||||||
|
EXEC(@cmd)
|
||||||
|
END";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sql = "SELECT dobj.name AS def_name
|
||||||
|
FROM sys.columns col
|
||||||
|
LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
|
||||||
|
WHERE col.object_id = object_id('{$table_name}')
|
||||||
|
AND col.name = '{$column_name}'
|
||||||
|
AND dobj.name IS NOT NULL";
|
||||||
|
$result = $this->db->sql_query($sql);
|
||||||
|
$row = $this->db->sql_fetchrow($result);
|
||||||
|
$this->db->sql_freeresult($result);
|
||||||
|
|
||||||
|
if ($row)
|
||||||
|
{
|
||||||
|
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP CONSTRAINT [' . $row['def_name'] . ']';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
|
$statements[] = 'ALTER TABLE [' . $table_name . '] DROP COLUMN [' . $column_name . ']';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -2069,7 +2092,7 @@ class tools
|
||||||
$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
|
$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
|
||||||
$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED (";
|
$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED (";
|
||||||
$sql .= '[' . implode("],\n\t\t[", $column) . ']';
|
$sql .= '[' . implode("],\n\t\t[", $column) . ']';
|
||||||
$sql .= ') ON [PRIMARY]';
|
$sql .= ')';
|
||||||
|
|
||||||
$statements[] = $sql;
|
$statements[] = $sql;
|
||||||
break;
|
break;
|
||||||
|
@ -2167,7 +2190,7 @@ class tools
|
||||||
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'mssqlnative':
|
case 'mssqlnative':
|
||||||
$statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
|
$statements[] = 'CREATE UNIQUE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2220,7 +2243,7 @@ class tools
|
||||||
|
|
||||||
case 'mssql':
|
case 'mssql':
|
||||||
case 'mssqlnative':
|
case 'mssqlnative':
|
||||||
$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ') ON [PRIMARY]';
|
$statements[] = 'CREATE INDEX ' . $index_name . ' ON ' . $table_name . '(' . implode(', ', $column) . ')';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2352,23 +2375,48 @@ class tools
|
||||||
|
|
||||||
if (!empty($column_data['default']))
|
if (!empty($column_data['default']))
|
||||||
{
|
{
|
||||||
|
$sql = "SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(25)) AS mssql_version";
|
||||||
|
$result = $this->db->sql_query($sql);
|
||||||
|
$row = $this->db->sql_fetchrow($result);
|
||||||
|
$this->db->sql_freeresult($result);
|
||||||
|
|
||||||
// Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage
|
// Using TRANSACT-SQL for this statement because we do not want to have colliding data if statements are executed at a later stage
|
||||||
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
|
if ($row['mssql_version'][0] == '8') // SQL Server 2000
|
||||||
SET @drop_default_name =
|
{
|
||||||
(SELECT so.name FROM sysobjects so
|
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
|
||||||
JOIN sysconstraints sc ON so.id = sc.constid
|
SET @drop_default_name =
|
||||||
WHERE object_name(so.parent_obj) = '{$table_name}'
|
(SELECT so.name FROM sysobjects so
|
||||||
AND so.xtype = 'D'
|
JOIN sysconstraints sc ON so.id = sc.constid
|
||||||
AND sc.colid = (SELECT colid FROM syscolumns
|
WHERE object_name(so.parent_obj) = '{$table_name}'
|
||||||
WHERE id = object_id('{$table_name}')
|
AND so.xtype = 'D'
|
||||||
AND name = '{$column_name}'))
|
AND sc.colid = (SELECT colid FROM syscolumns
|
||||||
IF @drop_default_name <> ''
|
WHERE id = object_id('{$table_name}')
|
||||||
BEGIN
|
AND name = '{$column_name}'))
|
||||||
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
|
IF @drop_default_name <> ''
|
||||||
EXEC(@cmd)
|
BEGIN
|
||||||
END
|
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
|
||||||
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
|
EXEC(@cmd)
|
||||||
EXEC(@cmd)";
|
END
|
||||||
|
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
|
||||||
|
EXEC(@cmd)";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$statements[] = "DECLARE @drop_default_name VARCHAR(100), @cmd VARCHAR(1000)
|
||||||
|
SET @drop_default_name =
|
||||||
|
(SELECT dobj.name FROM sys.columns col
|
||||||
|
LEFT OUTER JOIN sys.objects dobj ON (dobj.object_id = col.default_object_id AND dobj.type = 'D')
|
||||||
|
WHERE col.object_id = object_id('{$table_name}')
|
||||||
|
AND col.name = '{$column_name}'
|
||||||
|
AND dobj.name IS NOT NULL)
|
||||||
|
IF @drop_default_name <> ''
|
||||||
|
BEGIN
|
||||||
|
SET @cmd = 'ALTER TABLE [{$table_name}] DROP CONSTRAINT [' + @drop_default_name + ']'
|
||||||
|
EXEC(@cmd)
|
||||||
|
END
|
||||||
|
SET @cmd = 'ALTER TABLE [{$table_name}] ADD CONSTRAINT [DF_{$table_name}_{$column_name}_1] {$column_data['default']} FOR [{$column_name}]'
|
||||||
|
EXEC(@cmd)";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue