s4

view s4-init.sh @ 534:ce6d0f04f520

Do not read s4-funcs.sh twice
author HIROSE Yuuji <yuuji@gentei.org>
date Sat, 06 Apr 2019 18:46:10 +0900
parents 7d7b81cfd3a0
children d63b9b287ae9
line source
1 #!/bin/sh -x
2 type cgiinit >/dev/null 2.&1 || . `dirname $0`/s4-funcs.sh
4 create() {
5 # $1=type $2=obj $3=defs...
6 target=$1; shift
7 name=$1; shift
8 [ "$debug" ] && echo "create $target if not exists $name $@"
9 sq $db "create $target if not exists $name $@"
10 }
12 create table $conftbl '(tbl,col,keytype,objtype, primary key(tbl, col))'
14 create_struct() {
15 # $1=struct-def
16 def=`basename $1`
17 tmain=${def%.*}
18 ts=${tmain}_s
19 tm=${tmain}_m
20 ct=$conftbl
21 cat $1 | \
22 (cols="" pkey="" uniq="" fkey="" fkey2=""
23 while IFS=: read prompt col keytype objtype args; do
24 addcol=""
25 case $keytype in
26 *p*|*f*)
27 addcol=$col
28 case $keytype in
29 *pf*|*fp*)
30 pkey="$pkey${pkey:+, }$col"
31 fkey="${fkey}, foreign key($col) references $objtype on delete cascade on update cascade"
32 fkey2="${fkey2}, foreign key($col) references $objtype on delete cascade on update cascade" ;;
33 *p*)
34 pkey="$pkey${pkey:+, }$col"
35 fkey2="${fkey2}, foreign key($col) references $tmain($col) on delete cascade on update cascade" ;;
36 esac
37 ;;
38 *u*) uniq="$uniq${uniq:+, }$col"
39 addcol=$col
40 ;;
41 esac
42 case $objtype in
43 author)
44 addcol=$col
45 fkey="${fkey}, foreign key($col) references user(name) on delete cascade on update cascade"
46 keytype=f # blogの場合はuserのほうがいい??
47 ;;
48 owner)
49 ;;
50 serial)
51 addcol=$addcol" varchar(20)" ;;
52 hidden)
53 continue ;;
54 user)
56 ;;
57 group)
58 esac
59 [ "$addcol" ] && cols="$cols${cols:+, }"$addcol
60 typevals="(\"/$tmain\", \"$col\", \"$keytype\", \"$objtype\")"
61 sq $db "replace into $ct values $typevals"
62 done
63 pk=${pkey:+", primary key($pkey)"}
64 uq=${uniq:+", unique($uniq)"}
65 create table $tmain "($cols$pk$uq$fkey)"
66 create table $ts "($pkey, key, type, val, bin blob, primary key($pkey, key)$fkey2)"
67 create table $tm "($pkey, key, type, val, bin blob, unique($pkey, key, val)$fkey2)"
68 )
69 }
71 create table par '(sessid text, var text, type text, val text, primary key(sessid, var, val) foreign key(sessid) references session(id) on update cascade on delete cascade);'
72 create table session '(id text primary key, expire text);'
73 create table cookie '(sessid text, var text, type text, val text, primary key(sessid, var) foreign key(sessid) references session(id) on update cascade on delete cascade);'
75 # For compatibility
76 tblacc=`query "select name from sqlite_master where name='tblaccesses';"`
77 acc=`query "select name from sqlite_master where name='acclog';"`
78 create table tblaccesses "(user, tbl, tblrowid, time, \
79 unique(user, tbl, tblrowid, time), \
80 foreign key(user) references user(name))"
81 if [ -z "$tblacc" -a -n "$acc" ]; then
82 echo Regenerating...
83 query "INSERT INTO tblaccesses SELECT * FROM acclog;
84 DROP TABLE acclog;"
85 fi
86 # Ver.2 of acclog
87 create view acclog "AS
88 SELECT user, tbl, tblrowid, max(time) time FROM tblaccesses
89 GROUP by user, tbl, tblrowid;"
91 create view gecoses "AS
92 SELECT rowid,
93 name,
94 coalesce(
95 case when (SELECT name FROM user u WHERE u.name=name) IS NOT NULL
96 then (SELECT val FROM user_s u
97 WHERE u.name=a.name AND key='gecos')
98 else (SELECT val FROM grp_s g
99 WHERE g.gname=name AND key='gecos')
100 end,
101 name) gecos
102 FROM (SELECT rowid,'user' type,name FROM user
103 UNION ALL
104 SELECT rowid,'group' type, gname FROM grp) a;"
107 for f in $formdir/*def; do
108 echo -n Creating form of $f...
109 create_struct $f && echo Done || echo FAILED
110 done