git-svn-id: file:///svn/phpbb/trunk@6793 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
David M 2006-12-23 17:50:48 +00:00
parent 9b6e76a808
commit 6d0a00a446
9 changed files with 166 additions and 25 deletions

View file

@ -1934,10 +1934,7 @@ function get_schema_struct()
'friend' => array('BOOL', 0),
'foe' => array('BOOL', 0),
),
'KEYS' => array(
'user_id' => array('INDEX', 'user_id'),
'zebra_id' => array('INDEX', 'zebra_id'),
),
'PRIMARY_KEY' => array('user_id', 'zebra_id'),
);
return $schema_data;

View file

@ -321,6 +321,23 @@ $database_update_info = array(
),
),
),
// Latest version
'3.0.b5' => array(
// Remove the following keys
'drop_keys' => array(
ZEBRA_TABLE => array(
'user_id',
'zebra_id',
),
),
// Add the following primary keys
'add_primary_keys' => array(
ZEBRA_TABLE => array(
'user_id',
'zebra_id',
),
),
),
);
// Determine mapping database type
@ -472,6 +489,27 @@ foreach ($database_update_info as $version => $schema_changes)
}
}
}
// Remove keys?
if (!empty($schema_changes['drop_keys']))
{
foreach ($schema_changes['drop_keys'] as $table => $indexes)
{
foreach ($indexes as $index_name)
{
sql_index_drop($map_dbms, $index_name, $table);
}
}
}
// Add primary keys?
if (!empty($schema_changes['add_primary_keys']))
{
foreach ($schema_changes['add_primary_keys'] as $table => $columns)
{
sql_create_primary_key($map_dbms, $table, $columns);
}
}
}
_write_result($no_updates, $errored, $error_ary);
@ -968,6 +1006,117 @@ function sql_column_add($dbms, $table_name, $column_name, $column_data)
}
}
function sql_index_drop($dbms, $index_name, $table_name)
{
global $dbms_type_map, $db;
global $errored, $error_ary;
switch ($dbms)
{
case 'mssql':
$sql = 'DROP INDEX ' . $table_name . '\.' . $index_name . ' ON ' . $table_name;
_sql($sql, $errored, $error_ary);
break;
case 'mysql_40':
case 'mysql_41':
$sql = 'DROP INDEX ' . $index_name . ' ON ' . $table_name;
_sql($sql, $errored, $error_ary);
break;
case 'firebird':
case 'oracle':
case 'postgres':
case 'sqlite':
$sql = 'DROP INDEX ' . $table_name . '_' . $index_name;
_sql($sql, $errored, $error_ary);
break;
}
}
function sql_create_primary_key($dbms, $table_name, $column)
{
global $dbms_type_map, $db;
global $errored, $error_ary;
switch ($dbms)
{
case 'firebird':
case 'postgres':
$sql = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')';
_sql($sql, $errored, $error_ary);
break;
case 'mssql':
$sql = "ALTER TABLE [{$table_name}] WITH NOCHECK ADD ";
$sql .= "CONSTRAINT [PK_{$table_name}] PRIMARY KEY CLUSTERED (";
$sql .= '[' . implode("],\n\t\t[", $column) . ']';
$sql .= ') ON [PRIMARY]';
_sql($sql, $errored, $error_ary);
break;
case 'mysql_40':
case 'mysql_41':
$sql = 'ALTER TABLE ' . $table_name . ' ADD PRIMARY KEY (' . implode(', ', $column) . ')';
_sql($sql, $errored, $error_ary);
break;
case 'oracle':
$sql = 'ALTER TABLE ' . $table_name . 'add CONSTRAINT pk_' . $table_name . ' PRIMARY KEY (' . implode(', ', $column) . ')';
_sql($sql, $errored, $error_ary);
break;
case 'sqlite':
$sql = "SELECT sql
FROM sqlite_master
WHERE type = 'table'
AND name = '{$table_name}'
ORDER BY type DESC, name;";
$result = _sql($sql, $errored, $error_ary);
if (!$result)
{
break;
}
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$db->sql_transaction('begin');
// Create a backup table and populate it, destroy the existing one
$db->sql_query(preg_replace('#CREATE\s+TABLE\s+"?' . $table_name . '"?#i', 'CREATE TEMPORARY TABLE ' . $table_name . '_temp', $row['sql']));
$db->sql_query('INSERT INTO ' . $table_name . '_temp SELECT * FROM ' . $table_name);
$db->sql_query('DROP TABLE ' . $table_name);
preg_match('#\((.*)\)#s', $row['sql'], $matches);
$new_table_cols = trim($matches[1]);
$old_table_cols = preg_split('/,(?=[\\sa-z])/im', $new_table_cols);
$column_list = array();
foreach ($old_table_cols as $declaration)
{
$entities = preg_split('#\s+#', trim($declaration));
if ($entities == 'PRIMARY')
{
continue;
}
$column_list[] = $entities[0];
}
$columns = implode(',', $column_list);
// create a new table and fill it up. destroy the temp one
$db->sql_query('CREATE TABLE ' . $table_name . ' (' . $new_table_cols . ', PRIMARY KEY (' . implode(', ', $column) . '));');
$db->sql_query('INSERT INTO ' . $table_name . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . $table_name . '_temp;');
$db->sql_query('DROP TABLE ' . $table_name . '_temp');
$db->sql_transaction('commit');
break;
}
}
/**
* Change column type (not name!)
*/

View file

@ -1502,6 +1502,6 @@ CREATE TABLE phpbb_zebra (
foe INTEGER DEFAULT 0 NOT NULL
);;
CREATE INDEX phpbb_zebra_user_id ON phpbb_zebra(user_id);;
CREATE INDEX phpbb_zebra_zebra_id ON phpbb_zebra(zebra_id);;
ALTER TABLE phpbb_zebra ADD PRIMARY KEY (user_id, zebra_id);;

View file

@ -1744,10 +1744,12 @@ CREATE TABLE [phpbb_zebra] (
) ON [PRIMARY]
GO
CREATE INDEX [user_id] ON [phpbb_zebra]([user_id]) ON [PRIMARY]
GO
CREATE INDEX [zebra_id] ON [phpbb_zebra]([zebra_id]) ON [PRIMARY]
ALTER TABLE [phpbb_zebra] WITH NOCHECK ADD
CONSTRAINT [PK_phpbb_zebra] PRIMARY KEY CLUSTERED
(
[user_id],
[zebra_id]
) ON [PRIMARY]
GO

View file

@ -1066,8 +1066,7 @@ CREATE TABLE phpbb_zebra (
zebra_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
friend tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
foe tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
KEY user_id (user_id),
KEY zebra_id (zebra_id)
PRIMARY KEY (user_id, zebra_id)
);

View file

@ -1066,8 +1066,7 @@ CREATE TABLE phpbb_zebra (
zebra_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
friend tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
foe tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
KEY user_id (user_id),
KEY zebra_id (zebra_id)
PRIMARY KEY (user_id, zebra_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;

View file

@ -1935,12 +1935,9 @@ CREATE TABLE phpbb_zebra (
user_id number(8) DEFAULT '0' NOT NULL,
zebra_id number(8) DEFAULT '0' NOT NULL,
friend number(1) DEFAULT '0' NOT NULL,
foe number(1) DEFAULT '0' NOT NULL
foe number(1) DEFAULT '0' NOT NULL,
CONSTRAINT pk_phpbb_zebra PRIMARY KEY (user_id, zebra_id)
)
/
CREATE INDEX phpbb_zebra_user_id ON phpbb_zebra (user_id)
/
CREATE INDEX phpbb_zebra_zebra_id ON phpbb_zebra (zebra_id)
/

View file

@ -1335,11 +1335,10 @@ CREATE TABLE phpbb_zebra (
user_id INT4 DEFAULT '0' NOT NULL CHECK (user_id >= 0),
zebra_id INT4 DEFAULT '0' NOT NULL CHECK (zebra_id >= 0),
friend INT2 DEFAULT '0' NOT NULL CHECK (friend >= 0),
foe INT2 DEFAULT '0' NOT NULL CHECK (foe >= 0)
foe INT2 DEFAULT '0' NOT NULL CHECK (foe >= 0),
PRIMARY KEY (user_id, zebra_id)
);
CREATE INDEX phpbb_zebra_user_id ON phpbb_zebra (user_id);
CREATE INDEX phpbb_zebra_zebra_id ON phpbb_zebra (zebra_id);
COMMIT;

View file

@ -1033,11 +1033,10 @@ CREATE TABLE phpbb_zebra (
user_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
zebra_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
friend INTEGER UNSIGNED NOT NULL DEFAULT '0',
foe INTEGER UNSIGNED NOT NULL DEFAULT '0'
foe INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (user_id, zebra_id)
);
CREATE INDEX phpbb_zebra_user_id ON phpbb_zebra (user_id);
CREATE INDEX phpbb_zebra_zebra_id ON phpbb_zebra (zebra_id);
COMMIT;