diff --git a/APLSource/SQL.apln b/APLSource/SQL.apln index 214d81d..f873086 100644 --- a/APLSource/SQL.apln +++ b/APLSource/SQL.apln @@ -111,13 +111,16 @@ ';'(≠⊆⊢)sql ⍝ Split on semicolons } - ∇ msg←SetupSchema dum;create_migrations;folder;schema_definitions;sequence;latest;migrations;migration;batch;sql + ∇ msg←SetupSchema dum;batch;create_migrations;folder;latest;migration;migrations;order;schema_definitions;sequence;sql create_migrations←⊃⎕NGET ##.GLOBAL.app_dir,'/sql/migrations.sql' Do create_migrations folder←##.GetEnv'SCHEMA_DEFS' - schema_definitions←(⊂∘⍋⌷⊢)'.*\d+-.*.sql'⎕S'&'⊃0(⎕NINFO⍠'Wildcard' 1)folder + schema_definitions←'.*\d+-.*.sql'⎕S'&'⊃0(⎕NINFO⍠'Wildcard' 1)folder sequence←∊2⊃¨⎕VFI¨⊃¨'-'(≠⊆⊢)¨2⊃¨⎕NPARTS¨schema_definitions + order←⍋sequence + schema_definitions←schema_definitions[order] + sequence←sequence[order] :If 0=⊃latest←SQA.Do db'select max(batch) from migrations' (migrations sequence)←(schema_definitions sequence)↓⍨¨3 1⊃latest ⍝ Database exists, apply after most recent migration diff --git a/APLSource/Version.aplf b/APLSource/Version.aplf index be40cf2..f3a45b6 100644 --- a/APLSource/Version.aplf +++ b/APLSource/Version.aplf @@ -1,2 +1,2 @@ version←Version - version←'3.24.2' + version←'3.24.3' diff --git a/Admin/Tests/DummyData/Test_Fail_InsertDuplicatePresentationMedia.aplf b/Admin/Tests/DummyData/Test_Fail_InsertDuplicatePresentationMedia.aplf new file mode 100644 index 0000000..af96a8e --- /dev/null +++ b/Admin/Tests/DummyData/Test_Fail_InsertDuplicatePresentationMedia.aplf @@ -0,0 +1,12 @@ + r←Test_Fail_InsertDuplicatePresentationMedia url;dmx +⍝ Test that duplicate presentation media cannot be inserted + r←0 + + sql←'INSERT INTO presentation_media (`presentation_id`, `media_id`, `type`) VALUES (1, 1, "youtube_video")' + + :Trap 500 + #.DCMS.SQL.Do sql + :Else + dmx←⎕DMX ⍝ Save ⎕DMX for debugging + r←'Duplicate entry'(∨/⍷)dmx.EM + :EndTrap diff --git a/Admin/Tests/InsertDummyData.aplf b/Admin/Tests/InsertDummyData.aplf index 2130983..1b42afb 100644 --- a/Admin/Tests/InsertDummyData.aplf +++ b/Admin/Tests/InsertDummyData.aplf @@ -34,7 +34,7 @@ event.title←(vocab:thing_names ⋄ max:2)generator.Name⍣{∧/≠⍵}n event.(start end)←generator.DateTime¨2⍴n event.type←?n⍴n - event.url_slug←'-'@(' '∘=)¨¯1⎕C event.title + event.url_slug←'-'@(' '∘=)¨¯1 ⎕C event.title event.⎕DF'event' organisation←() @@ -93,7 +93,7 @@ WrapBackticks←(2↓∊)'`'∘(', ',⊣,⊣,⍨⊢)¨ WrapColons←(1↓∊)(',:',':',⍨⊢)¨ - :For table :In event_type event organisation person category presentation presentation_type presenter presentation_media youtube_video + :For table :In event_type event organisation person category presentation_type presentation presenter presentation_media youtube_video ⎕←name←⍕table table.id←⍳n tid←D.GLOBAL.tables⍳⊂name diff --git a/sql/10-presentation-event_id-foreign-key.sql b/sql/10-presentation-event_id-foreign-key.sql new file mode 100644 index 0000000..2f0e531 --- /dev/null +++ b/sql/10-presentation-event_id-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `presentation` ADD CONSTRAINT FOREIGN KEY (`event_id`) REFERENCES `event`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT diff --git a/sql/11-presentation-type_id-foreign-key.sql b/sql/11-presentation-type_id-foreign-key.sql new file mode 100644 index 0000000..aba71cc --- /dev/null +++ b/sql/11-presentation-type_id-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `presentation` ADD CONSTRAINT FOREIGN KEY (`type_id`) REFERENCES `presentation_type`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT diff --git a/sql/12-presenter-presentation_id-foreign-key.sql b/sql/12-presenter-presentation_id-foreign-key.sql new file mode 100644 index 0000000..0939068 --- /dev/null +++ b/sql/12-presenter-presentation_id-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `presenter` ADD CONSTRAINT FOREIGN KEY (`presentation_id`) REFERENCES `presentation`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT diff --git a/sql/13-presenter-person_id-foreign-key.sql b/sql/13-presenter-person_id-foreign-key.sql new file mode 100644 index 0000000..64799bc --- /dev/null +++ b/sql/13-presenter-person_id-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `presenter` ADD CONSTRAINT FOREIGN KEY (`person_id`) REFERENCES `person`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT diff --git a/sql/14-presentation_media-foreign-key.sql b/sql/14-presentation_media-foreign-key.sql new file mode 100644 index 0000000..30a7198 --- /dev/null +++ b/sql/14-presentation_media-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `presentation_media` ADD CONSTRAINT FOREIGN KEY (`presentation_id`) REFERENCES `presentation`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT diff --git a/sql/6-presentation_media-unique.sql b/sql/6-presentation_media-unique.sql new file mode 100644 index 0000000..6f46d88 --- /dev/null +++ b/sql/6-presentation_media-unique.sql @@ -0,0 +1 @@ +ALTER TABLE `presentation_media` ADD CONSTRAINT UNIQUE (`presentation_id`, `media_id`, `type`); diff --git a/sql/7-event-foreign-key-type.sql b/sql/7-event-foreign-key-type.sql new file mode 100644 index 0000000..0cc1a16 --- /dev/null +++ b/sql/7-event-foreign-key-type.sql @@ -0,0 +1 @@ +ALTER TABLE `event` MODIFY `type` int(10) unsigned diff --git a/sql/8-presentation-foreign-key-type.sql b/sql/8-presentation-foreign-key-type.sql new file mode 100644 index 0000000..9bd8b53 --- /dev/null +++ b/sql/8-presentation-foreign-key-type.sql @@ -0,0 +1 @@ +ALTER TABLE `presentation_media` MODIFY `presentation_id` int(10) unsigned NOT NULL diff --git a/sql/9-event-foreign-key.sql b/sql/9-event-foreign-key.sql new file mode 100644 index 0000000..985feda --- /dev/null +++ b/sql/9-event-foreign-key.sql @@ -0,0 +1,2 @@ +ALTER TABLE `event` ADD CONSTRAINT FOREIGN KEY (`type`) REFERENCES `event_type`(`id`) + ON DELETE CASCADE ON UPDATE RESTRICT