s4

view s4-annex.sh @ 742:3d2502af9c07

Annex strategy shifted to World strategy
author HIROSE Yuuji <yuuji@gentei.org>
date Sat, 06 Jun 2020 11:21:01 +0900
parents c892a3633baa
children
line source
1 #!/bin/sh
3 if [ -z "$S4MASTERDB" -o ! -s "$S4MASTERDB" ]; then
4 return
5 fi
6 if [ "$db" -ef "$S4MASTERDB" ]; then
7 return # Points to the same file
8 fi
10 # Now S4ANNEX mode is ACTIVE
11 # sessdb=`dirname $S4MASTERDB`/sess.sq3
12 ## skey="skey-`basename $mydir`"
13 S4NAME="[$S4WORLD]$S4NAME"
14 syncflag=${db%.*}.synctime
15 userupdateflag=`dirname $S4MASTERDB`/`basename $userupdateflag`
16 test ! -e "$userupdateflag" && return
17 test "$syncflag" -nt "$userupdateflag" && return
19 # for sub.sq3
20 #
21 # main: user: 'taro', 'hanako', 'shige'
22 # sub: user: 'taro', 'hanako', 'shige'
23 # sub2: user_s: ('taro', 't'), ('hanako', 'h'), ('shige', 's')
24 # then update
25 #
27 ## sqlite3 -cmd '.timer 1' -cmd '.echo 1' $db <<EOF
28 err "Starting account synchronization"
29 err "db=$db mas=$S4MASTERDB sessdb=$sessdb"
30 num=$(sqlite3 -bail -cmd 'PRAGMA FOREIGN_KEYS=on' $db <<EOF
31 ATTACH DATABASE "$S4MASTERDB" AS m;
32 CREATE TABLE IF NOT EXISTS user(name, primary key(name));
33 BEGIN;
34 DElETE FROM main.user WHERE rowid NOT IN (SELECT rowid FROM m.user);
35 INSERT INTO main.user(rowid, name)
36 SELECT rowid, name FROM m.user
37 WHERE m.user.rowid NOT IN (SELECT rowid FROM user);
38 UPDATE user SET name = (SELECT name FROM m.user WHERE main.user.rowid=m.user.rowid);
39 DELETE FROM main.user_s WHERE rowid NOT IN (SELECT rowid FROM m.user_s);
40 REPLACE INTO main.user_s(rowid, name, key, type, val, bin)
41 SELECT rowid,* FROM m.user_s;
42 DELETE FROM main.user_m WHERE rowid NOT IN (SELECT rowid FROM m.user_m);
43 REPLACE INTO main.user_m(rowid, name, key, type, val, bin)
44 SELECT rowid,* FROM m.user_m
45 WHERE key NOT LIKE '%cache%';
46 END;
48 /* Compare user tables */
49 WITH master AS (
50 SELECT p.rowid,* FROM m.user p
51 NATURAL LEFT JOIN m.user_s
52 NATURAL LEFT JOIN m.user_m
53 ), annex AS (
54 SELECT p.rowid,* FROM user p
55 NATURAL LEFT JOIN user_s
56 NATURAL LEFT JOIN user_m
57 ), m_a AS (
58 SELECT * FROM master EXCEPT SELECT * FROM annex
59 ), a_m AS (
60 SELECT * FROM annex EXCEPT SELECT * FROM master
61 ) SELECT (SELECT count(*) FROM m_a) + (SELECT count(*) FROM a_m);
63 -- SELECT * FROM annex;
64 -- SELECT rowid,* FROM m.user LIMIT 10;
65 -- SELECT rowid,* FROM user WHERE rowid NOT IN (SELECT rowid FROM m.user);
66 DETACH DATABASE m;
67 EOF
68 )
69 if [ $num -eq 0 ]; then
70 touch $syncflag
71 fi
72 return $num