chiark / gitweb /
Debianization and various other fixes.
[ezmlm] / sub_mysql / ezmlm-mktab
1 #!/bin/sh
2 # Simple script to generate input to mysql to generate tables for a list
3 # All tables are created, even though it is not advisable to put e.g. the
4 # moderator table in the SQL database nor is it very useful to put the
5 # blacklist/deny table there. The subscriber lists for the main and digest
6 # lists should be there, and it's reasonable to put the "extra" list there
7 # if used.
8 ECHO='echo'
9 CAT='cat'
10 CUT='cut'
11
12
13 CREATE='y'
14 DROP='n'
15 TROOT='list'
16 # size of std cookie
17 COOKIE='20'
18
19                                         # not everyone has getopt :-(
20 while [ "`${ECHO} "$1" | ${CUT} -c1`" = "-" ]; do
21         case "$1" in
22                 -c)     CREATE='y'; shift;;
23                 -C)     CREATE='n'; shift;;
24                 -d)     DROP='y'; shift;;
25                 -D)     DROP='n'; shift;;
26                 -cd|-dc)        CREATE='y'; DROP='y'; shift;;
27                 -cD|-Dc)        CREATE='y'; DROP='n'; shift;;
28                 -Cd|-dC)        CREATE='n'; DROP='y'; shift;;
29                 -CD|-DC)        CREATE='n'; DROP='n'; shift;;
30                 --)     shift; break;;
31                 *)      echo "usage: emzlm-mktab [-cCdD] table_toot"; exit 100;;
32         esac
33 done
34
35 [ ! -z "$1" ] && TROOT="$1";
36
37
38 if [ "$DROP" = "y" ]; then
39   cat <<EOF
40
41 /* drop old tables. This may fail unless you use mysql -f */
42 /* Usage: */
43 /* ezmlm-mktab [-d] troot | mysql -hhost -uuserid -ppw datab -f */
44
45 DROP TABLE ${TROOT};
46 DROP TABLE ${TROOT}_slog;
47 DROP TABLE ${TROOT}_digest;
48 DROP TABLE ${TROOT}_digest_slog;
49 DROP TABLE ${TROOT}_mod;
50 DROP TABLE ${TROOT}_mod_slog;
51 DROP TABLE ${TROOT}_allow;
52 DROP TABLE ${TROOT}_allow_slog;
53 DROP TABLE ${TROOT}_deny;
54 DROP TABLE ${TROOT}_deny_slog;
55 /* eliminated name table - no need */
56 DROP TABLE ${TROOT}_cookie;
57 DROP TABLE ${TROOT}_mlog;
58 DROP TABLE ${TROOT}_digest_cookie;
59 DROP TABLE ${TROOT}_digest_mlog;
60
61 EOF
62
63 fi
64
65 if [ $CREATE = 'y' ]; then
66   cat << EOF
67
68 /* Main address table */
69 /* Need varchar. Domain = 3 chars => fixed length, as opposed to varchar */
70 /* Always select on domain and hash, so that one index should do         */
71 /* primary key(address) is very inefficient for MySQL. */
72 /* MySQL tables do not need a primary key. Other RDBMS require one. For  */
73 /* the log tables, just add an INT AUTO_INCREMENT. For the address table,*/
74 /* do that or use address as a primary key. */
75
76 create TABLE ${TROOT} (
77         hash            TINYINT UNSIGNED NOT NULL,
78         address         VARCHAR(255) NOT NULL,
79         INDEX h (hash),
80         INDEX a (address(12)));
81
82 /* Subscription log table. No addr idx to make insertion fast, since that is */
83 /* almost the only thing we do with this table */
84 create TABLE ${TROOT}_slog (
85         tai             TIMESTAMP,
86         address         VARCHAR(255) NOT NULL,
87         fromline        VARCHAR(255) NOT NULL,
88         edir            CHAR(1) NOT NULL,
89         etype           CHAR(1) NOT NULL,       
90         INDEX (tai));
91
92 /* digest list table */
93 create TABLE ${TROOT}_digest (
94         hash            TINYINT UNSIGNED NOT NULL,
95         address         VARCHAR(255) NOT NULL,
96         INDEX h (hash),
97         INDEX a (address(12)));
98
99 /* digest list subscription log */
100 create TABLE ${TROOT}_digest_slog (
101         tai             TIMESTAMP,
102         address         VARCHAR(255) NOT NULL,
103         fromline        VARCHAR(255) NOT NULL,
104         edir            CHAR(1) NOT NULL,
105         etype           CHAR(1) NOT NULL,       
106         INDEX (tai));
107
108 /* moderator addresses */
109 create TABLE ${TROOT}_mod (
110         hash            TINYINT UNSIGNED NOT NULL,
111         address         VARCHAR(255) NOT NULL,
112         INDEX h(hash),
113         INDEX a(address(12)));
114
115 /* moderator subscription log */
116 create TABLE ${TROOT}_mod_slog (
117         tai             TIMESTAMP,
118         address         VARCHAR(255) NOT NULL,
119         fromline        VARCHAR(255) NOT NULL,
120         edir            CHAR(1) NOT NULL,
121         etype           CHAR(1) NOT NULL,       
122         INDEX (tai));
123
124 /* "allow" address table */
125 create TABLE ${TROOT}_allow (
126         hash            TINYINT UNSIGNED NOT NULL,
127         address         VARCHAR(255) NOT NULL,
128         INDEX h(hash),
129         INDEX a(address(12)));
130
131 /* extra address table log */
132 create TABLE ${TROOT}_allow_slog (
133         tai             TIMESTAMP,
134         address         VARCHAR(255) NOT NULL,
135         fromline        VARCHAR(255) NOT NULL,
136         edir            CHAR(1) NOT NULL,
137         etype           CHAR(1) NOT NULL,       
138         INDEX (tai));
139
140 /* blacklist address table */
141 create TABLE ${TROOT}_deny (
142         hash            TINYINT UNSIGNED NOT NULL,
143         address         VARCHAR(255) NOT NULL,
144         INDEX h(hash),
145         INDEX a(address(12)));
146
147 /* blacklist subscription log */
148 create TABLE ${TROOT}_deny_slog (
149         tai             TIMESTAMP,
150         address         VARCHAR(255) NOT NULL,
151         fromline        VARCHAR(255) NOT NULL,
152         edir            CHAR(1) NOT NULL,
153         etype           CHAR(1) NOT NULL,       
154         INDEX (tai));
155
156 /* main list inserts a cookie here. Sublists check it */
157 CREATE TABLE ${TROOT}_cookie (
158         msgnum          INTEGER UNSIGNED NOT NULL,
159         tai             TIMESTAMP NOT NULL,
160         cookie          CHAR($COOKIE) NOT NULL,
161         chunk           TINYINT UNSIGNED NOT NULL DEFAULT 0,
162         bodysize        INTEGER UNSIGNED NOT NULL DEFAULT 0,
163         PRIMARY KEY (msgnum));
164
165 /* main and sublist log here when the message is done */
166 /* done=0 for arrived, done=4 for sent, 5 for receit. */
167 /* tai reflects last change */
168 CREATE TABLE ${TROOT}_mlog (
169         msgnum          INTEGER UNSIGNED NOT NULL,
170         listno          INTEGER UNSIGNED NOT NULL,
171         tai             TIMESTAMP,
172         subs            INTEGER UNSIGNED NOT NULL DEFAULT 0,
173         done            TINYINT NOT NULL DEFAULT 0,
174         PRIMARY KEY listmsg (listno,msgnum,done));
175
176 /* ezmlm-get when creating a digests inserts a cookie here. Sublists check it */
177 CREATE TABLE ${TROOT}_digest_cookie (
178         msgnum          INTEGER UNSIGNED NOT NULL,
179         tai             TIMESTAMP NOT NULL,
180         cookie          CHAR($COOKIE) NOT NULL,
181         chunk           TINYINT UNSIGNED NOT NULL DEFAULT 0,
182         bodysize        INTEGER UNSIGNED NOT NULL DEFAULT 0,
183         PRIMARY KEY (msgnum));
184
185 /* ezmlm-get and digest sublists log here when the message is done */
186 /* done=0 for arrived, done=4 for sent, 5 for receit. */
187 /* tai reflects last change */
188 CREATE TABLE ${TROOT}_digest_mlog (
189         msgnum          INTEGER UNSIGNED NOT NULL,
190         listno          INTEGER UNSIGNED NOT NULL,
191         tai             TIMESTAMP,
192         subs            INT UNSIGNED NOT NULL DEFAULT 0,
193         done            TINYINT NOT NULL DEFAULT 0,
194         PRIMARY KEY listmsg (listno,msgnum,done));
195
196 EOF
197
198 fi
199 exit 0
200