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), 'friend' => array('BOOL', 0),
'foe' => array('BOOL', 0), 'foe' => array('BOOL', 0),
), ),
'KEYS' => array( 'PRIMARY_KEY' => array('user_id', 'zebra_id'),
'user_id' => array('INDEX', 'user_id'),
'zebra_id' => array('INDEX', 'zebra_id'),
),
); );
return $schema_data; 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 // 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); _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!) * Change column type (not name!)
*/ */

View file

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

View file

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

View file

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

View file

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

View file

@ -1935,12 +1935,9 @@ CREATE TABLE phpbb_zebra (
user_id number(8) DEFAULT '0' NOT NULL, user_id number(8) DEFAULT '0' NOT NULL,
zebra_id number(8) DEFAULT '0' NOT NULL, zebra_id number(8) DEFAULT '0' NOT NULL,
friend number(1) 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), user_id INT4 DEFAULT '0' NOT NULL CHECK (user_id >= 0),
zebra_id INT4 DEFAULT '0' NOT NULL CHECK (zebra_id >= 0), zebra_id INT4 DEFAULT '0' NOT NULL CHECK (zebra_id >= 0),
friend INT2 DEFAULT '0' NOT NULL CHECK (friend >= 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; COMMIT;

View file

@ -1033,11 +1033,10 @@ CREATE TABLE phpbb_zebra (
user_id INTEGER UNSIGNED NOT NULL DEFAULT '0', user_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
zebra_id INTEGER UNSIGNED NOT NULL DEFAULT '0', zebra_id INTEGER UNSIGNED NOT NULL DEFAULT '0',
friend 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; COMMIT;