OLD | NEW |
| (Empty) |
1 # 2015-07-31 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # May you do good and not evil. | |
7 # May you find forgiveness for yourself and forgive others. | |
8 # May you share freely, never taking more than you give. | |
9 # | |
10 #*********************************************************************** | |
11 # | |
12 # Tests for the [sqldiff --rbu] command. | |
13 # | |
14 # | |
15 if {![info exists testdir]} { | |
16 set testdir [file join [file dirname [info script]] .. .. test] | |
17 } | |
18 source $testdir/tester.tcl | |
19 set testprefix rbudiff | |
20 | |
21 if {$tcl_platform(platform)=="windows"} { | |
22 set PROG "sqldiff.exe" | |
23 } else { | |
24 set PROG "./sqldiff" | |
25 } | |
26 if {![file exe $PROG]} { | |
27 puts "rbudiff.test cannot run because $PROG is not available" | |
28 finish_test | |
29 return | |
30 } | |
31 db close | |
32 | |
33 proc get_rbudiff_sql {db1 db2} { | |
34 exec $::PROG --rbu $db1 $db2 | |
35 } | |
36 | |
37 proc step_rbu {target rbu} { | |
38 while 1 { | |
39 sqlite3rbu rbu $target $rbu | |
40 set rc [rbu step] | |
41 rbu close | |
42 if {$rc != "SQLITE_OK"} break | |
43 } | |
44 set rc | |
45 } | |
46 | |
47 proc apply_rbudiff {sql target} { | |
48 forcedelete rbu.db | |
49 sqlite3 rbudb rbu.db | |
50 rbudb eval $sql | |
51 rbudb close | |
52 step_rbu $target rbu.db | |
53 } | |
54 | |
55 proc rbudiff_cksum {db1} { | |
56 set txt "" | |
57 | |
58 sqlite3 dbtmp $db1 | |
59 foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { | |
60 set cols [list] | |
61 dbtmp eval "PRAGMA table_info = $tbl" { lappend cols "quote( $name )" } | |
62 append txt [dbtmp eval \ | |
63 "SELECT [join $cols {||'.'||}] FROM $tbl ORDER BY 1" | |
64 ] | |
65 } | |
66 dbtmp close | |
67 | |
68 md5 $txt | |
69 } | |
70 | |
71 foreach {tn init mod} { | |
72 1 { | |
73 CREATE TABLE t1(a PRIMARY KEY, b, c); | |
74 INSERT INTO t1 VALUES(1, 2, 3); | |
75 INSERT INTO t1 VALUES(4, 5, 6); | |
76 | |
77 CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); | |
78 INSERT INTO t2 VALUES(1, 2, 3); | |
79 INSERT INTO t2 VALUES(4, 5, 6); | |
80 } { | |
81 INSERT INTO t1 VALUES(7, 8, 9); | |
82 DELETE FROM t1 WHERE a=4; | |
83 UPDATE t1 SET c = 11 WHERE a = 1; | |
84 | |
85 INSERT INTO t2 VALUES(7, 8, 9); | |
86 DELETE FROM t2 WHERE a=4; | |
87 UPDATE t2 SET c = 11 WHERE a = 1; | |
88 } | |
89 | |
90 2 { | |
91 CREATE TABLE t1(a, b, c, PRIMARY KEY(a, b, c)); | |
92 INSERT INTO t1 VALUES('u', 'v', 'w'); | |
93 INSERT INTO t1 VALUES('x', 'y', 'z'); | |
94 } { | |
95 DELETE FROM t1 WHERE a='u'; | |
96 INSERT INTO t1 VALUES('a', 'b', 'c'); | |
97 } | |
98 | |
99 3 { | |
100 CREATE TABLE t1(i INTEGER PRIMARY KEY, x); | |
101 INSERT INTO t1 VALUES(1, | |
102 X'0000000000000000111111111111111122222222222222223333333333333333' | |
103 ); | |
104 CREATE TABLE t2(y INTEGER PRIMARY KEY, x); | |
105 INSERT INTO t2 VALUES(1, | |
106 X'0000000000000000111111111111111122222222222222223333333333333333' | |
107 ); | |
108 } { | |
109 DELETE FROM t1; | |
110 INSERT INTO t1 VALUES(1, | |
111 X'0000000000000000111111111111111122222555555552223333333333333333' | |
112 ); | |
113 DELETE FROM t2; | |
114 INSERT INTO t2 VALUES(1, | |
115 X'0000000000000000111111111111111122222222222222223333333FFF333333' | |
116 ); | |
117 } | |
118 | |
119 } { | |
120 catch { db close } | |
121 | |
122 forcedelete test.db test.db2 | |
123 sqlite3 db test.db | |
124 db eval "$init" | |
125 sqlite3 db test.db2 | |
126 db eval "$init ; $mod" | |
127 db close | |
128 | |
129 do_test 1.$tn.2 { | |
130 set sql [get_rbudiff_sql test.db test.db2] | |
131 apply_rbudiff $sql test.db | |
132 } {SQLITE_DONE} | |
133 do_test 1.$tn.3 { rbudiff_cksum test.db } [rbudiff_cksum test.db2] | |
134 | |
135 forcedelete test.db test.db2 | |
136 sqlite3 db test.db | |
137 db eval "$init ; $mod" | |
138 sqlite3 db test.db2 | |
139 db eval "$init" | |
140 db close | |
141 | |
142 do_test 1.$tn.4 { | |
143 set sql [get_rbudiff_sql test.db test.db2] | |
144 apply_rbudiff $sql test.db | |
145 } {SQLITE_DONE} | |
146 do_test 1.$tn.5 { rbudiff_cksum test.db } [rbudiff_cksum test.db2] | |
147 } | |
148 | |
149 finish_test | |
150 | |
OLD | NEW |