liquid_feedback_core
diff core.sql @ 383:1c991490f075
Fixed an error, which occurred when deleting votes from voters, which lost their voting right during voting phase
author | jbe |
---|---|
date | Fri Mar 22 22:37:59 2013 +0100 (2013-03-22) |
parents | e88d0606891f |
children | e474e9e1240a |
line diff
1.1 --- a/core.sql Mon Mar 18 14:48:41 2013 +0100 1.2 +++ b/core.sql Fri Mar 22 22:37:59 2013 +0100 1.3 @@ -7,7 +7,7 @@ 1.4 BEGIN; 1.5 1.6 CREATE VIEW "liquid_feedback_version" AS 1.7 - SELECT * FROM (VALUES ('2.2.1', 2, 2, 1)) 1.8 + SELECT * FROM (VALUES ('2.2.2', 2, 2, 2)) 1.9 AS "subquery"("string", "major", "minor", "revision"); 1.10 1.11 1.12 @@ -54,6 +54,17 @@ 1.13 ------------------------- 1.14 1.15 1.16 +CREATE TABLE "internal_session_store" ( 1.17 + PRIMARY KEY ("backend_pid", "key"), 1.18 + "backend_pid" INT4, 1.19 + "key" TEXT, 1.20 + "value" TEXT NOT NULL ); 1.21 + 1.22 +COMMENT ON TABLE "internal_session_store" IS 'Table to store session variables; shall be emptied before a transaction is committed'; 1.23 + 1.24 +COMMENT ON COLUMN "internal_session_store"."backend_pid" IS 'Value returned by function pg_backend_pid()'; 1.25 + 1.26 + 1.27 CREATE TABLE "system_setting" ( 1.28 "member_ttl" INTERVAL ); 1.29 CREATE UNIQUE INDEX "system_setting_singleton_idx" ON "system_setting" ((1)); 1.30 @@ -1587,6 +1598,14 @@ 1.31 "issue_id_v" "issue"."id"%TYPE; 1.32 "issue_row" "issue"%ROWTYPE; 1.33 BEGIN 1.34 + IF EXISTS ( 1.35 + SELECT NULL FROM "internal_session_store" 1.36 + WHERE "backend_pid" = pg_backend_pid() 1.37 + AND "key" = 'override_protection_triggers' 1.38 + AND "value" = TRUE::TEXT 1.39 + ) THEN 1.40 + RETURN NULL; 1.41 + END IF; 1.42 IF TG_OP = 'DELETE' THEN 1.43 "issue_id_v" := OLD."issue_id"; 1.44 ELSE 1.45 @@ -1594,7 +1613,12 @@ 1.46 END IF; 1.47 SELECT INTO "issue_row" * FROM "issue" 1.48 WHERE "id" = "issue_id_v" FOR SHARE; 1.49 - IF "issue_row"."closed" NOTNULL THEN 1.50 + IF ( 1.51 + "issue_row"."closed" NOTNULL OR ( 1.52 + "issue_row"."state" = 'voting' AND 1.53 + "issue_row"."phase_finished" NOTNULL 1.54 + ) 1.55 + ) THEN 1.56 IF 1.57 TG_RELID = 'direct_voter'::regclass AND 1.58 TG_OP = 'UPDATE' 1.59 @@ -1607,14 +1631,7 @@ 1.60 RETURN NULL; -- allows changing of voter comment 1.61 END IF; 1.62 END IF; 1.63 - RAISE EXCEPTION 'Tried to modify data belonging to a closed issue.'; 1.64 - ELSIF 1.65 - "issue_row"."state" = 'voting' AND 1.66 - "issue_row"."phase_finished" NOTNULL 1.67 - THEN 1.68 - IF TG_RELID = 'vote'::regclass THEN 1.69 - RAISE EXCEPTION 'Tried to modify data after voting has been closed.'; 1.70 - END IF; 1.71 + RAISE EXCEPTION 'Tried to modify data after voting has been closed.'; 1.72 END IF; 1.73 RETURN NULL; 1.74 END; 1.75 @@ -3653,6 +3670,10 @@ 1.76 PERFORM "require_transaction_isolation"(); 1.77 SELECT "area_id" INTO "area_id_v" FROM "issue" WHERE "id" = "issue_id_p"; 1.78 SELECT "unit_id" INTO "unit_id_v" FROM "area" WHERE "id" = "area_id_v"; 1.79 + -- override protection triggers: 1.80 + DELETE FROM "internal_session_store"; 1.81 + INSERT INTO "internal_session_store" ("backend_pid", "key", "value") 1.82 + VALUES (pg_backend_pid(), 'override_protection_triggers', TRUE::TEXT); 1.83 -- delete timestamp of voting comment: 1.84 UPDATE "direct_voter" SET "comment_changed" = NULL 1.85 WHERE "issue_id" = "issue_id_p"; 1.86 @@ -3681,6 +3702,8 @@ 1.87 UPDATE "direct_voter" SET "weight" = 1 1.88 WHERE "issue_id" = "issue_id_p"; 1.89 PERFORM "add_vote_delegations"("issue_id_p"); 1.90 + -- finish overriding protection triggers (mandatory, as pids may be reused): 1.91 + DELETE FROM "internal_session_store"; 1.92 -- materialize battle_view: 1.93 -- NOTE: "closed" column of issue must be set at this point 1.94 DELETE FROM "battle" WHERE "issue_id" = "issue_id_p";