rev |
line source |
yuuji@734
|
1 #!/bin/sh
|
yuuji@734
|
2
|
yuuji@791
|
3 # Setup variables for running time
|
yuuji@791
|
4 if $isCGI; then
|
yuuji@791
|
5 case "$S4WORLDLIST" in
|
yuuji@791
|
6 *:*:*)
|
yuuji@791
|
7 worldlistfile=cache/worldlist
|
yuuji@797
|
8 worldgrpfile=cache/worldgrps
|
yuuji@791
|
9 worldoptionfile=cache/worldoption
|
yuuji@791
|
10 worldnamefile=cache/worldname
|
yuuji@791
|
11 if [ ! -e $worldlistfile -o $worldlistfile -ot s4-config.sh \
|
yuuji@791
|
12 -o ! -e $worldoptionfile -o $worldoptionfile -ot s4-config.sh \
|
yuuji@794
|
13 -o s4-world.sh -nt $worldoptionfile ]
|
yuuji@791
|
14 then
|
yuuji@791
|
15 echo S4MASTERURL=$S4MASTERURL >> tmp/debug.out
|
yuuji@791
|
16 cat <<-EOF > $worldlistfile
|
yuuji@797
|
17 <div><table>
|
yuuji@791
|
18 <tr><th>World List</th></tr>
|
yuuji@794
|
19 <tr><td title="Base World$nl拠点となるWorldです">⇒
|
yuuji@794
|
20 <a href="${S4MASTERURL:-$URL}">Base</a></td></tr>
|
yuuji@791
|
21 EOF
|
yuuji@791
|
22 true > $worldoptionfile
|
yuuji@791
|
23 for i in $S4WORLDLIST; do
|
yuuji@791
|
24 echo $i | {
|
yuuji@791
|
25 IFS=: read name short d
|
yuuji@791
|
26 cgi="s4-world-$short$cgiext"
|
yuuji@791
|
27 conf="s4-config-$short.sh"
|
yuuji@791
|
28 cat<<-EOF >>$worldlistfile
|
yuuji@791
|
29 <tr><td title="$d">⇒ <a href="$cgi">$name</a></td></tr>
|
yuuji@791
|
30 EOF
|
yuuji@791
|
31 cat<<-EOF >>$worldoptionfile
|
yuuji@791
|
32 <option title="$d" value="$conf">$name</option>
|
yuuji@791
|
33 EOF
|
yuuji@791
|
34 echo "$name" > $worldnamefile.$short
|
yuuji@791
|
35 }
|
yuuji@791
|
36 done
|
yuuji@791
|
37 if [ -s "$worldoptionfile" ]; then
|
yuuji@791
|
38 echo "<option value=\"s4-config.sh\">Base</option>" >> $worldoptionfile
|
yuuji@791
|
39 echo "</table>$nl</div>" >> $worldlistfile
|
yuuji@797
|
40 sed 's/href="\([^>]*\)"/href="\1?grps"/' $worldlistfile \
|
yuuji@797
|
41 > $worldgrpfile
|
yuuji@791
|
42 else
|
yuuji@791
|
43 true > $worldoptionfile; true > $worldlistfile # Remove contents
|
yuuji@791
|
44 rm -f ${worldnamefile}.*
|
yuuji@791
|
45 fi
|
yuuji@791
|
46 fi
|
yuuji@791
|
47 if [ -s "$worldlistfile" ]; then
|
yuuji@797
|
48 S4WORLDS="▼spaste(\`$worldlistfile')"
|
yuuji@791
|
49 S4WORLDNAME=${S4WORLD:+`cat $worldnamefile.$S4WORLD`}
|
yuuji@797
|
50 S4WORLDGRPS="▼spaste(\`$worldgrpfile')"
|
yuuji@797
|
51 err S4WORLDGRPS=$S4WORLDGRPS
|
yuuji@791
|
52 fi
|
yuuji@791
|
53 ;;
|
yuuji@791
|
54 esac
|
yuuji@791
|
55 fi
|
yuuji@791
|
56
|
yuuji@791
|
57 err "db=$db mas=$S4MASTERDB sessdb=$sessdb"
|
yuuji@791
|
58 # If in parent world, no need to do rest of jobs
|
yuuji@734
|
59 if [ -z "$S4MASTERDB" -o ! -s "$S4MASTERDB" ]; then
|
yuuji@734
|
60 return
|
yuuji@734
|
61 fi
|
yuuji@791
|
62 # Confim child
|
yuuji@734
|
63 if [ "$db" -ef "$S4MASTERDB" ]; then
|
yuuji@734
|
64 return # Points to the same file
|
yuuji@734
|
65 fi
|
yuuji@734
|
66
|
yuuji@743
|
67 # Now Another world is ACTIVE
|
yuuji@742
|
68 # sessdb=`dirname $S4MASTERDB`/sess.sq3
|
yuuji@739
|
69 ## skey="skey-`basename $mydir`"
|
yuuji@742
|
70 syncflag=${db%.*}.synctime
|
yuuji@794
|
71 runflag=${db%.*}.run
|
yuuji@734
|
72 userupdateflag=`dirname $S4MASTERDB`/`basename $userupdateflag`
|
yuuji@771
|
73 err SYNCFLAG=$syncflag
|
yuuji@734
|
74 test ! -e "$userupdateflag" && return
|
yuuji@734
|
75 test "$syncflag" -nt "$userupdateflag" && return
|
yuuji@794
|
76 if [ -s "$runflag" ]; then
|
yuuji@794
|
77 limit=`cat $runflag|tr -c -d 0-9`
|
yuuji@794
|
78 if [ -n "$limit" -a "$limit" -gt `date +%s` ]; then
|
yuuji@794
|
79 err "World $S4WORLD account sync withholded by process $$"
|
yuuji@794
|
80 return # Running sync by other process not leaching timeout
|
yuuji@794
|
81 fi
|
yuuji@794
|
82 fi
|
yuuji@794
|
83 echo $((`date +%s` + 10)) > $runflag # Setting running flag by timeout 10s
|
yuuji@742
|
84
|
yuuji@734
|
85 # for sub.sq3
|
yuuji@734
|
86 #
|
yuuji@734
|
87 # main: user: 'taro', 'hanako', 'shige'
|
yuuji@734
|
88 # sub: user: 'taro', 'hanako', 'shige'
|
yuuji@734
|
89 # sub2: user_s: ('taro', 't'), ('hanako', 'h'), ('shige', 's')
|
yuuji@734
|
90 # then update
|
yuuji@734
|
91 #
|
yuuji@734
|
92
|
yuuji@734
|
93 ## sqlite3 -cmd '.timer 1' -cmd '.echo 1' $db <<EOF
|
yuuji@794
|
94 err "`gdate +%S.%3N` Starting account synchronization[$$]"
|
yuuji@794
|
95 ## cat > tmp/sql <<EOF
|
yuuji@794
|
96 num=$(sqlite3 -bail -cmd 'PRAGMA FOREIGN_KEYS=on' $db <<EOF
|
yuuji@734
|
97 ATTACH DATABASE "$S4MASTERDB" AS m;
|
yuuji@734
|
98 CREATE TABLE IF NOT EXISTS user(name, primary key(name));
|
yuuji@734
|
99 BEGIN;
|
yuuji@734
|
100 DElETE FROM main.user WHERE rowid NOT IN (SELECT rowid FROM m.user);
|
yuuji@734
|
101 INSERT INTO main.user(rowid, name)
|
yuuji@734
|
102 SELECT rowid, name FROM m.user
|
yuuji@734
|
103 WHERE m.user.rowid NOT IN (SELECT rowid FROM user);
|
yuuji@734
|
104 UPDATE user SET name = (SELECT name FROM m.user WHERE main.user.rowid=m.user.rowid);
|
yuuji@742
|
105 DELETE FROM main.user_s WHERE rowid NOT IN (SELECT rowid FROM m.user_s);
|
yuuji@742
|
106 REPLACE INTO main.user_s(rowid, name, key, type, val, bin)
|
yuuji@734
|
107 SELECT rowid,* FROM m.user_s;
|
yuuji@742
|
108 DELETE FROM main.user_m WHERE rowid NOT IN (SELECT rowid FROM m.user_m);
|
yuuji@742
|
109 REPLACE INTO main.user_m(rowid, name, key, type, val, bin)
|
yuuji@734
|
110 SELECT rowid,* FROM m.user_m
|
yuuji@734
|
111 WHERE key NOT LIKE '%cache%';
|
yuuji@734
|
112 END;
|
yuuji@734
|
113
|
yuuji@734
|
114 /* Compare user tables */
|
yuuji@734
|
115 WITH master AS (
|
yuuji@734
|
116 SELECT p.rowid,* FROM m.user p
|
yuuji@734
|
117 NATURAL LEFT JOIN m.user_s
|
yuuji@734
|
118 NATURAL LEFT JOIN m.user_m
|
yuuji@743
|
119 ), thisworld AS (
|
yuuji@734
|
120 SELECT p.rowid,* FROM user p
|
yuuji@734
|
121 NATURAL LEFT JOIN user_s
|
yuuji@734
|
122 NATURAL LEFT JOIN user_m
|
yuuji@734
|
123 ), m_a AS (
|
yuuji@743
|
124 SELECT * FROM master EXCEPT SELECT * FROM thisworld
|
yuuji@734
|
125 ), a_m AS (
|
yuuji@743
|
126 SELECT * FROM thisworld EXCEPT SELECT * FROM master
|
yuuji@734
|
127 ) SELECT (SELECT count(*) FROM m_a) + (SELECT count(*) FROM a_m);
|
yuuji@734
|
128 DETACH DATABASE m;
|
yuuji@734
|
129 EOF
|
yuuji@794
|
130 )
|
yuuji@794
|
131 ### num=$(sqlite3 -bail -cmd 'PRAGMA FOREIGN_KEYS=on' $db < tmp/sql )
|
yuuji@794
|
132 if [ -n "$num" -a $num -eq 0 ]; then
|
yuuji@794
|
133 err "`gdate +%S.%3N` Account synchronization[$$] done in difference $num"
|
yuuji@794
|
134 echo "`date '+%F %T'`: Sync done by process $$" >> $syncflag
|
yuuji@794
|
135 else
|
yuuji@794
|
136 err "Account synch[$$] failed or bailed with num=[$num]"
|
yuuji@739
|
137 fi
|
yuuji@794
|
138 test -e "$runflag" && rm -f "$runflag"
|
yuuji@739
|
139 return $num
|