Allow for multiple records to have somehow got into the DB.
[awl.git] / dba / schema-management.sql
blob432230f0a00e00c971a50d50f29c9c2ea52dc050
1 -- SQL file for AWL tables
3 -- Table for holding the schema version so we can be more structured in future
4 CREATE TABLE awl_db_revision (
5    schema_id INT4,
6    schema_major INT4,
7    schema_minor INT4,
8    schema_patch INT4,
9    schema_name TEXT,
10    applied_on TIMESTAMP WITH TIME ZONE DEFAULT current_timestamp
13 CREATE or REPLACE FUNCTION check_db_revision( INT, INT, INT ) RETURNS BOOLEAN AS '
14    DECLARE
15       major ALIAS FOR $1;
16       minor ALIAS FOR $2;
17       patch ALIAS FOR $3;
18       matching INT;
19    BEGIN
20       SELECT COUNT(*) INTO matching FROM awl_db_revision
21              WHERE (schema_major = major AND schema_minor = minor AND schema_patch > patch)
22                 OR (schema_major = major AND schema_minor > minor)
23                 OR (schema_major > major)
24              ;
25       IF matching >= 1 THEN
26         RAISE EXCEPTION ''Database revisions after %.%.% have already been applied.'', major, minor, patch;
27         RETURN FALSE;
28       END IF;
29       SELECT COUNT(*) INTO matching FROM awl_db_revision
30                       WHERE schema_major = major AND schema_minor = minor AND schema_patch = patch;
31       IF matching >= 1 THEN
32         RAISE EXCEPTION ''Database has not been upgraded to %.%.%'', major, minor, patch;
33         RETURN FALSE;
34       END IF;
35       RETURN TRUE;
36    END;
37 ' LANGUAGE 'plpgsql';
39 -- The schema_id should always be incremented.  The major / minor / patch level should
40 -- be incremented as seems appropriate...
41 CREATE or REPLACE FUNCTION new_db_revision( INT, INT, INT, TEXT ) RETURNS BOOLEAN AS '
42    DECLARE
43       major ALIAS FOR $1;
44       minor ALIAS FOR $2;
45       patch ALIAS FOR $3;
46       blurb ALIAS FOR $4;
47       new_id INT;
48    BEGIN
49       SELECT MAX(schema_id) + 1 INTO new_id FROM awl_db_revision;
50       IF NOT FOUND OR new_id IS NULL THEN
51         new_id := 1;
52       END IF;
53       INSERT INTO awl_db_revision (schema_id, schema_major, schema_minor, schema_patch, schema_name)
54                     VALUES( new_id, major, minor, patch, blurb );
55       RETURN TRUE;
56    END;
57 ' LANGUAGE 'plpgsql';
58 SELECT new_db_revision(1,1,0, 'Dawn' );