From d34a4a5425f6769abc325b9cea791206699c4262 Mon Sep 17 00:00:00 2001 From: Greg Sabino Mullane Date: Mon, 20 Jul 2009 01:54:36 +0000 Subject: [PATCH] Full support for modified oldimage FK constraint to do ON UPDATE CASCASE as well as ON DELETE CASCADE. Thanks to Robert Fleming for reporting and supplying a patch in bug #19445. --- maintenance/postgres/tables.sql | 2 +- maintenance/updaters.inc | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql index 8c36f94aa4..87055f9ca0 100644 --- a/maintenance/postgres/tables.sql +++ b/maintenance/postgres/tables.sql @@ -288,7 +288,7 @@ CREATE TABLE oldimage ( oi_deleted SMALLINT NOT NULL DEFAULT 0, oi_sha1 TEXT NOT NULL DEFAULT '' ); -ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE; CREATE INDEX oi_name_timestamp ON oldimage (oi_name,oi_timestamp); CREATE INDEX oi_name_archive_name ON oldimage (oi_name,oi_archive_name); CREATE INDEX oi_sha1 ON oldimage (oi_sha1); diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc index c1db41c0bb..8304b25676 100644 --- a/maintenance/updaters.inc +++ b/maintenance/updaters.inc @@ -1739,14 +1739,20 @@ function do_postgres_updates() { dbsource(archive($nr[2])); } - if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey")) { - wfOut( "Making foreign key on table \"oldimage\" (to image) a cascade delete\n" ); - $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" ); - $wgDatabase->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascade ". - "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE" ); + if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey_cascaded")) { + wfOut( "... table \"oldimage\" has correct cascading delete/update foreign key to image\n" ); + } + else { + if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey")) { + $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey" ); + } + if ($wgDatabase->hasConstraint("oldimage_oi_name_fkey_cascade")) { + $wgDatabase->query( "ALTER TABLE oldimage DROP CONSTRAINT oldimage_oi_name_fkey_cascade" ); + } + wfOut( "Making foreign key on table \"oldimage\" (to image) a cascade delete/update\n" ); + $wgDatabase->query( "ALTER TABLE oldimage ADD CONSTRAINT oldimage_oi_name_fkey_cascaded ". + "FOREIGN KEY (oi_name) REFERENCES image(img_name) ON DELETE CASCADE ON UPDATE CASCADE" ); } - else - wfOut( "... table \"oldimage\" has correct cascade delete foreign key to image\n" ); if (!$wgDatabase->triggerExists("page", "page_deleted")) { wfOut( "Adding function and trigger \"page_deleted\" to table \"page\"\n" ); -- 2.20.1