]> gitweb @ CieloNegro.org - blackboard-dns.git/blob - DDNS/DBInfo.hs
DB thingy
[blackboard-dns.git] / DDNS / DBInfo.hs
1 module DDNS.DBInfo
2     ( dbinfo
3     , indexDeclarations
4     )
5     where
6
7 import           Database.HaskellDB.DBSpec
8 import qualified Database.HaskellDB.DBSpec.PPHelpers as PP
9
10
11 dbinfo :: DBInfo
12 dbinfo = DBInfo {
13            dbname = "BlackboardDNS"
14          , opts   = DBOptions {
15                       useBString = False
16                     , makeIdent  = PP.mkIdentPreserving
17                     }
18          , tbls   = [ zones
19                     , records
20                     ]
21          }
22
23 zones :: TInfo
24 zones = TInfo {
25           tname = "zones"
26         , cols  = [ CInfo "zone"    (StringT, False)
27                   , CInfo "ns"      (StringT, False)
28                   , CInfo "owner"   (StringT, False)
29                   , CInfo "serial"  (IntT   , False)
30                   , CInfo "refresh" (IntT   , False)
31                   , CInfo "retry"   (IntT   , False)
32                   , CInfo "expire"  (IntT   , False)
33                   , CInfo "minTTL"  (IntT   , False)
34                   ]
35         }
36
37 records :: TInfo
38 records = TInfo {
39             tname = "records"
40           , cols  = [ CInfo "name"    (StringT, False)
41                     , CInfo "zone"    (StringT, False)
42                     , CInfo "recType" (StringT, False)
43                     , CInfo "recData" (StringT, False)
44                     ]
45           }
46
47 -- This kind of dirty hack should go away someday.
48 indexDeclarations :: [String]
49 indexDeclarations
50     = [ "CREATE UNIQUE INDEX pkey_on_zones ON zones ( zone )"
51       , "CREATE INDEX pkey_on_records ON records ( name, zone )"
52       , "CREATE TRIGGER insert_into_records\n" ++
53         "  BEFORE INSERT ON records\n" ++
54         "  FOR EACH ROW\n" ++
55         "  WHEN\n" ++
56         "    NOT EXISTS (\n" ++
57         "      SELECT 1\n" ++
58         "        FROM zones\n" ++
59         "       WHERE zone = NEW.zone\n" ++
60         "    )\n" ++
61         "  BEGIN\n" ++
62         "    SELECT RAISE(ABORT, \"FK constraint failure\");\n" ++
63         "  END"
64       , "CREATE TRIGGER change_record_zone\n" ++
65         "  BEFORE UPDATE OF zone ON records\n" ++
66         "  FOR EACH ROW\n" ++
67         "  WHEN\n" ++
68         "    NOT EXISTS (\n" ++
69         "      SELECT 1\n" ++
70         "        FROM zones\n" ++
71         "       WHERE zone = NEW.zone\n" ++
72         "    )\n" ++
73         "  BEGIN\n" ++
74         "    SELECT RAISE(ABORT, \"FK constraint failure\");\n" ++
75         "  END"
76       , "CREATE TRIGGER update_zone_name\n" ++
77         "  AFTER UPDATE OF zone ON zones\n" ++
78         "  FOR EACH ROW\n" ++
79         "  BEGIN\n" ++
80         "    UPDATE records\n" ++
81         "       SET zone = NEW.zone\n" ++
82         "     WHERE zone = OLD.zone;\n" ++
83         "  END"
84       , "CREATE TRIGGER delete_zone\n" ++
85         "  AFTER DELETE ON zones\n" ++
86         "  FOR EACH ROW\n" ++
87         "  BEGIN\n" ++
88         "    DELETE\n" ++
89         "      FROM records\n" ++
90         "     WHERE zone = OLD.zone;\n" ++
91         "  END"
92       ]