2 proc do_changeset_test
{tn session res
} {
4 foreach x
$res {lappend r
$x}
5 uplevel do_test
$tn [list [subst -nocommands {
7 sqlite3session_foreach c
[$session changeset
] { lappend x
[set c
] }
12 proc do_patchset_test
{tn session res
} {
14 foreach x
$res {lappend r
$x}
15 uplevel do_test
$tn [list [subst -nocommands {
17 sqlite3session_foreach c
[$session patchset
] { lappend x
[set c
] }
23 proc do_changeset_invert_test
{tn session res
} {
25 foreach x
$res {lappend r
$x}
26 uplevel do_test
$tn [list [subst -nocommands {
28 set changeset
[sqlite3changeset_invert
[$session changeset
]]
29 sqlite3session_foreach c
[set changeset
] { lappend x
[set c
] }
35 proc do_conflict_test
{tn args
} {
39 set O
(-conflicts) [list]
43 foreach key
[array names V
] {
44 if {![info exists O
($key)]} {error "no such option: $key"}
48 proc xConflict
{args
} [subst -nocommands {
49 lappend ::xConflict [set args
]
52 proc bgerror {args
} { set ::background_error $args }
54 sqlite3session S db main
55 foreach t
$O(-tables) { S attach
$t }
58 set ::xConflict [list]
59 sqlite3changeset_apply db2
[S changeset
] xConflict
62 foreach c
$O(-conflicts) {
69 uplevel do_test
$tn [list { set ::xConflict }] [list $conflicts]
73 proc do_common_sql
{sql
} {
78 proc changeset_from_sql
{sql
{dbname main
}} {
79 if {$dbname == "main"} {
80 return [sql_exec_changeset db
$sql]
83 sqlite3session S db
$dbname
84 db
eval "SELECT name FROM $dbname.sqlite_master WHERE type = 'table'" {
98 proc do_then_apply_sql
{sql
{dbname main
}} {
99 proc xConflict args
{ return "OMIT" }
101 sqlite3session S db
$dbname
102 db
eval "SELECT name FROM $dbname.sqlite_master WHERE type = 'table'" {
106 sqlite3changeset_apply db2
[S changeset
] xConflict
111 if {$rc} {error $msg}
114 proc do_iterator_test
{tn tbl_list sql res
} {
115 sqlite3session S db main
116 if {[llength $tbl_list]==0} { S attach
* }
117 foreach t
$tbl_list {S attach
$t}
122 foreach v
$res { lappend r
$v }
125 sqlite3session_foreach c
[S changeset
] { lappend x
$c }
126 uplevel do_test
$tn [list [list set {} $x]] [list $r]
131 # Compare the contents of all tables in [db1] and [db2]. Throw an error if
132 # they are not identical, or return an empty string if they are.
134 proc compare_db
{db1 db2
} {
136 set sql
{SELECT name FROM sqlite_master WHERE type
= 'table' ORDER BY name
}
137 set lot1
[$db1 eval $sql]
138 set lot2
[$db2 eval $sql]
140 if {$lot1 != $lot2} {
143 error "databases contain different tables"
150 $db1 eval "PRAGMA table_info = $tbl" { lappend col1
$name }
151 $db2 eval "PRAGMA table_info = $tbl" { lappend col2
$name }
152 if {$col1 != $col2} { error "table $tbl schema mismatch" }
154 set sql
"SELECT * FROM $tbl ORDER BY [join $col1 ,]"
155 set data1
[$db1 eval $sql]
156 set data2
[$db2 eval $sql]
157 if {$data1 != $data2} {
160 error "table $tbl data mismatch"
167 proc changeset_to_list
{c
} {
169 sqlite3session_foreach elem
$c { lappend list $elem }