daff 1.3.2 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -2
- data/lib/daff.rb +11 -2
- data/lib/lib/coopy/alignment.rb +26 -2
- data/lib/lib/coopy/combined_table.rb +127 -0
- data/lib/lib/coopy/combined_table_body.rb +151 -0
- data/lib/lib/coopy/combined_table_head.rb +103 -0
- data/lib/lib/coopy/compare_flags.rb +3 -0
- data/lib/lib/coopy/compare_table.rb +38 -2
- data/lib/lib/coopy/coopy.rb +188 -110
- data/lib/lib/coopy/csv.rb +22 -3
- data/lib/lib/coopy/diff_render.rb +38 -10
- data/lib/lib/coopy/highlight_patch.rb +1 -1
- data/lib/lib/coopy/index.rb +8 -1
- data/lib/lib/coopy/json_table.rb +165 -0
- data/lib/lib/coopy/json_tables.rb +129 -0
- data/lib/lib/coopy/meta.rb +3 -0
- data/lib/lib/coopy/simple_meta.rb +314 -0
- data/lib/lib/coopy/simple_table.rb +4 -0
- data/lib/lib/coopy/simple_view.rb +12 -0
- data/lib/lib/coopy/sql_compare.rb +114 -66
- data/lib/lib/coopy/sql_table.rb +18 -2
- data/lib/lib/coopy/sql_tables.rb +128 -0
- data/lib/lib/coopy/sqlite_helper.rb +23 -1
- data/lib/lib/coopy/table.rb +1 -0
- data/lib/lib/coopy/table_comparison_state.rb +15 -0
- data/lib/lib/coopy/table_diff.rb +115 -5
- data/lib/lib/coopy/tables.rb +52 -0
- data/lib/lib/coopy/terminal_diff_render.rb +24 -8
- data/lib/lib/coopy/view.rb +3 -0
- data/lib/lib/rb/boot.rb +19 -0
- data/lib/lib/reflect.rb +10 -0
- data/lib/lib/std.rb +12 -0
- metadata +27 -16
data/lib/lib/coopy/meta.rb
CHANGED
@@ -11,6 +11,9 @@ module Coopy
|
|
11
11
|
def useForColumnChanges() puts "Abstract Meta.useForColumnChanges called" end
|
12
12
|
def useForRowChanges() puts "Abstract Meta.useForRowChanges called" end
|
13
13
|
def getRowStream() puts "Abstract Meta.getRowStream called" end
|
14
|
+
def isNested() puts "Abstract Meta.isNested called" end
|
15
|
+
def isSql() puts "Abstract Meta.isSql called" end
|
16
|
+
def getName() puts "Abstract Meta.getName called" end
|
14
17
|
haxe_me ["coopy", "Meta"]
|
15
18
|
end
|
16
19
|
|
@@ -0,0 +1,314 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
module Coopy
|
5
|
+
class SimpleMeta
|
6
|
+
|
7
|
+
def initialize(t,has_properties = true,may_be_nested = false)
|
8
|
+
@t = t
|
9
|
+
self.row_change
|
10
|
+
self.col_change
|
11
|
+
@has_properties = has_properties
|
12
|
+
@may_be_nested = may_be_nested
|
13
|
+
@metadata = nil
|
14
|
+
@keys = nil
|
15
|
+
@row_active = false
|
16
|
+
@row_change_cache = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
attr_accessor :t
|
22
|
+
attr_accessor :name2row
|
23
|
+
attr_accessor :name2col
|
24
|
+
attr_accessor :has_properties
|
25
|
+
attr_accessor :metadata
|
26
|
+
attr_accessor :keys
|
27
|
+
attr_accessor :row_active
|
28
|
+
attr_accessor :row_change_cache
|
29
|
+
attr_accessor :may_be_nested
|
30
|
+
|
31
|
+
public
|
32
|
+
|
33
|
+
def store_row_changes(changes)
|
34
|
+
@row_change_cache = changes
|
35
|
+
@row_active = true
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def row_change
|
41
|
+
@name2row = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def col_change
|
45
|
+
@name2col = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def col(key)
|
49
|
+
return -1 if @t.get_height < 1
|
50
|
+
if @name2col == nil
|
51
|
+
@name2col = {}
|
52
|
+
w = @t.get_width
|
53
|
+
begin
|
54
|
+
_g = 0
|
55
|
+
while(_g < w)
|
56
|
+
c = _g
|
57
|
+
_g+=1
|
58
|
+
begin
|
59
|
+
key1 = @t.get_cell(c,0)
|
60
|
+
@name2col[key1] = c
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
return -1 if !@name2col.include?(key)
|
66
|
+
@name2col[key]
|
67
|
+
end
|
68
|
+
|
69
|
+
def row(key)
|
70
|
+
return -1 if @t.get_width < 1
|
71
|
+
if @name2row == nil
|
72
|
+
@name2row = {}
|
73
|
+
h = @t.get_height
|
74
|
+
begin
|
75
|
+
_g = 1
|
76
|
+
while(_g < h)
|
77
|
+
r = _g
|
78
|
+
_g+=1
|
79
|
+
begin
|
80
|
+
key1 = @t.get_cell(0,r)
|
81
|
+
@name2row[key1] = r
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
return -1 if !@name2row.include?(key)
|
87
|
+
@name2row[key]
|
88
|
+
end
|
89
|
+
|
90
|
+
public
|
91
|
+
|
92
|
+
def alter_columns(columns)
|
93
|
+
target = {}
|
94
|
+
wfate = 0
|
95
|
+
if @has_properties
|
96
|
+
target["@"] = wfate
|
97
|
+
wfate+=1
|
98
|
+
end
|
99
|
+
begin
|
100
|
+
_g1 = 0
|
101
|
+
_g = columns.length
|
102
|
+
while(_g1 < _g)
|
103
|
+
i = _g1
|
104
|
+
_g1+=1
|
105
|
+
col = columns[i]
|
106
|
+
target[col.prev_name] = wfate if col.prev_name != nil
|
107
|
+
wfate+=1 if col.name != nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
fate = Array.new
|
111
|
+
begin
|
112
|
+
_g11 = 0
|
113
|
+
_g2 = @t.get_width
|
114
|
+
while(_g11 < _g2)
|
115
|
+
i1 = _g11
|
116
|
+
_g11+=1
|
117
|
+
targeti = -1
|
118
|
+
name = @t.get_cell(i1,0)
|
119
|
+
targeti = target[name] if target.include?(name)
|
120
|
+
fate.push(targeti)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
@t.insert_or_delete_columns(fate,wfate)
|
124
|
+
start = nil
|
125
|
+
if @has_properties
|
126
|
+
start = 1
|
127
|
+
else
|
128
|
+
start = 0
|
129
|
+
end
|
130
|
+
at = start
|
131
|
+
begin
|
132
|
+
_g12 = 0
|
133
|
+
_g3 = columns.length
|
134
|
+
while(_g12 < _g3)
|
135
|
+
i2 = _g12
|
136
|
+
_g12+=1
|
137
|
+
col1 = columns[i2]
|
138
|
+
if col1.name != nil
|
139
|
+
@t.set_cell(at,0,col1.name) if col1.name != col1.prev_name
|
140
|
+
end
|
141
|
+
at+=1 if col1.name != nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
return true if !@has_properties
|
145
|
+
self.col_change
|
146
|
+
at = start
|
147
|
+
begin
|
148
|
+
_g13 = 0
|
149
|
+
_g4 = columns.length
|
150
|
+
while(_g13 < _g4)
|
151
|
+
i3 = _g13
|
152
|
+
_g13+=1
|
153
|
+
col2 = columns[i3]
|
154
|
+
if col2.name != nil
|
155
|
+
_g21 = 0
|
156
|
+
_g31 = col2.props
|
157
|
+
while(_g21 < _g31.length)
|
158
|
+
prop = _g31[_g21]
|
159
|
+
_g21+=1
|
160
|
+
self.set_cell(col2.name,prop.name,prop.val)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
at+=1 if col2.name != nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
169
|
+
protected
|
170
|
+
|
171
|
+
def set_cell(c,r,val)
|
172
|
+
ri = self.row(r)
|
173
|
+
return false if ri == -1
|
174
|
+
ci = self.col(c)
|
175
|
+
return false if ci == -1
|
176
|
+
@t.set_cell(ci,ri,val)
|
177
|
+
true
|
178
|
+
end
|
179
|
+
|
180
|
+
public
|
181
|
+
|
182
|
+
def add_meta_data(column,property,val)
|
183
|
+
if @metadata == nil
|
184
|
+
@metadata = {}
|
185
|
+
@keys = {}
|
186
|
+
end
|
187
|
+
if !@metadata.include?(column)
|
188
|
+
value = {}
|
189
|
+
@metadata[column] = value
|
190
|
+
end
|
191
|
+
props = @metadata[column]
|
192
|
+
begin
|
193
|
+
value1 = val
|
194
|
+
begin
|
195
|
+
value2 = value1
|
196
|
+
props[property] = value2
|
197
|
+
end
|
198
|
+
end
|
199
|
+
@keys[property] = true
|
200
|
+
end
|
201
|
+
|
202
|
+
def as_table
|
203
|
+
return @t if @has_properties && @metadata == nil
|
204
|
+
return nil if @metadata == nil
|
205
|
+
w = @t.get_width
|
206
|
+
props = Array.new
|
207
|
+
_it = ::Rb::RubyIterator.new(@keys.keys)
|
208
|
+
while(_it.has_next) do
|
209
|
+
k = _it._next
|
210
|
+
props.push(k)
|
211
|
+
end
|
212
|
+
props.sort!{|a,b| Reflect.compare(a,b)}
|
213
|
+
mt = ::Coopy::SimpleTable.new(w + 1,props.length + 1)
|
214
|
+
mt.set_cell(0,0,"@")
|
215
|
+
begin
|
216
|
+
_g = 0
|
217
|
+
while(_g < w)
|
218
|
+
x = _g
|
219
|
+
_g+=1
|
220
|
+
name = @t.get_cell(x,0)
|
221
|
+
mt.set_cell(1 + x,0,name)
|
222
|
+
next if !@metadata.include?(name)
|
223
|
+
vals = @metadata[name]
|
224
|
+
begin
|
225
|
+
_g2 = 0
|
226
|
+
_g1 = props.length
|
227
|
+
while(_g2 < _g1)
|
228
|
+
i = _g2
|
229
|
+
_g2+=1
|
230
|
+
mt.set_cell(1 + x,i + 1,vals[props[i]]) if vals.include?(props[i])
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
begin
|
236
|
+
_g11 = 0
|
237
|
+
_g3 = props.length
|
238
|
+
while(_g11 < _g3)
|
239
|
+
y = _g11
|
240
|
+
_g11+=1
|
241
|
+
mt.set_cell(0,y + 1,props[y])
|
242
|
+
end
|
243
|
+
end
|
244
|
+
mt
|
245
|
+
end
|
246
|
+
|
247
|
+
def clone_meta(table = nil)
|
248
|
+
result = ::Coopy::SimpleMeta.new(table)
|
249
|
+
if @metadata != nil
|
250
|
+
result.keys = {}
|
251
|
+
_it = ::Rb::RubyIterator.new(@keys.keys)
|
252
|
+
while(_it.has_next) do
|
253
|
+
k = _it._next
|
254
|
+
result.keys[k] = true
|
255
|
+
end
|
256
|
+
result.metadata = {}
|
257
|
+
_it2 = ::Rb::RubyIterator.new(@metadata.keys)
|
258
|
+
while(_it2.has_next) do
|
259
|
+
k1 = _it2._next
|
260
|
+
next if !@metadata.include?(k1)
|
261
|
+
vals = @metadata[k1]
|
262
|
+
nvals = {}
|
263
|
+
_it3 = ::Rb::RubyIterator.new(vals.keys)
|
264
|
+
while(_it3.has_next) do
|
265
|
+
p = _it3._next
|
266
|
+
value = vals[p]
|
267
|
+
begin
|
268
|
+
value1 = value
|
269
|
+
nvals[p] = value1
|
270
|
+
end
|
271
|
+
end
|
272
|
+
result.metadata[k1] = nvals
|
273
|
+
end
|
274
|
+
end
|
275
|
+
result
|
276
|
+
end
|
277
|
+
|
278
|
+
def use_for_column_changes
|
279
|
+
true
|
280
|
+
end
|
281
|
+
|
282
|
+
def use_for_row_changes
|
283
|
+
@row_active
|
284
|
+
end
|
285
|
+
|
286
|
+
def change_row(rc)
|
287
|
+
@row_change_cache.push(rc)
|
288
|
+
false
|
289
|
+
end
|
290
|
+
|
291
|
+
def apply_flags(flags)
|
292
|
+
false
|
293
|
+
end
|
294
|
+
|
295
|
+
def get_row_stream
|
296
|
+
::Coopy::TableStream.new(@t)
|
297
|
+
end
|
298
|
+
|
299
|
+
def is_nested
|
300
|
+
@may_be_nested
|
301
|
+
end
|
302
|
+
|
303
|
+
def is_sql
|
304
|
+
false
|
305
|
+
end
|
306
|
+
|
307
|
+
def get_name
|
308
|
+
nil
|
309
|
+
end
|
310
|
+
|
311
|
+
haxe_me ["coopy", "SimpleMeta"]
|
312
|
+
end
|
313
|
+
|
314
|
+
end
|
@@ -11,14 +11,16 @@ module Coopy
|
|
11
11
|
@alt = alt
|
12
12
|
@align = align
|
13
13
|
@peered = false
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
@
|
14
|
+
@alt_peered = false
|
15
|
+
if local != nil && remote != nil
|
16
|
+
if @remote.get_database.get_name_for_attachment != nil
|
17
|
+
if @remote.get_database.get_name_for_attachment != @local.get_database.get_name_for_attachment
|
18
|
+
local.get_database.get_helper.attach(db,"__peer__",@remote.get_database.get_name_for_attachment)
|
19
|
+
@peered = true
|
20
|
+
end
|
18
21
|
end
|
19
22
|
end
|
20
|
-
@
|
21
|
-
if @alt != nil
|
23
|
+
if @alt != nil && local != nil
|
22
24
|
if @alt.get_database.get_name_for_attachment != nil
|
23
25
|
if @alt.get_database.get_name_for_attachment != @local.get_database.get_name_for_attachment
|
24
26
|
local.get_database.get_helper.attach(db,"__alt__",@alt.get_database.get_name_for_attachment)
|
@@ -38,6 +40,7 @@ module Coopy
|
|
38
40
|
attr_accessor :at0
|
39
41
|
attr_accessor :at1
|
40
42
|
attr_accessor :at2
|
43
|
+
attr_accessor :diff_ct
|
41
44
|
attr_accessor :align
|
42
45
|
attr_accessor :peered
|
43
46
|
attr_accessor :alt_peered
|
@@ -60,25 +63,42 @@ module Coopy
|
|
60
63
|
public
|
61
64
|
|
62
65
|
def validate_schema
|
63
|
-
all_cols1 =
|
64
|
-
|
66
|
+
all_cols1 = []
|
67
|
+
key_cols1 = []
|
68
|
+
access_error = false
|
69
|
+
pk_missing = false
|
70
|
+
if @local != nil
|
71
|
+
all_cols1 = @local.get_column_names
|
72
|
+
key_cols1 = @local.get_primary_key
|
73
|
+
access_error = true if all_cols1.length == 0
|
74
|
+
pk_missing = true if key_cols1.length == 0
|
75
|
+
end
|
76
|
+
all_cols2 = []
|
77
|
+
key_cols2 = []
|
78
|
+
if @remote != nil
|
79
|
+
all_cols2 = @remote.get_column_names
|
80
|
+
key_cols2 = @remote.get_primary_key
|
81
|
+
access_error = true if all_cols2.length == 0
|
82
|
+
pk_missing = true if key_cols2.length == 0
|
83
|
+
end
|
65
84
|
all_cols3 = all_cols2
|
66
|
-
key_cols1 = @local.get_primary_key
|
67
|
-
key_cols2 = @remote.get_primary_key
|
68
85
|
key_cols3 = key_cols2
|
69
86
|
if @alt != nil
|
70
87
|
all_cols3 = @alt.get_column_names
|
71
88
|
key_cols3 = @alt.get_primary_key
|
89
|
+
access_error = true if all_cols3.length == 0
|
90
|
+
pk_missing = true if key_cols3.length == 0
|
72
91
|
end
|
73
|
-
raise hx_raise("Error accessing SQL table") if
|
74
|
-
|
75
|
-
|
76
|
-
|
92
|
+
raise hx_raise("Error accessing SQL table") if access_error
|
93
|
+
raise hx_raise("sql diff not possible when primary key not available") if pk_missing
|
94
|
+
pk_change = false
|
95
|
+
if @local != nil && @remote != nil
|
96
|
+
pk_change = true if !self.equal_array(key_cols1,key_cols2)
|
77
97
|
end
|
78
|
-
if
|
79
|
-
|
80
|
-
return false
|
98
|
+
if @local != nil && @alt != nil
|
99
|
+
pk_change = true if !self.equal_array(key_cols1,key_cols3)
|
81
100
|
end
|
101
|
+
raise hx_raise("sql diff not possible when primary key changes") if pk_change
|
82
102
|
true
|
83
103
|
end
|
84
104
|
|
@@ -90,6 +110,7 @@ module Coopy
|
|
90
110
|
end
|
91
111
|
|
92
112
|
def link
|
113
|
+
@diff_ct+=1
|
93
114
|
mode = @db.get(0)
|
94
115
|
i0 = self.denull(@db.get(1))
|
95
116
|
i1 = self.denull(@db.get(2))
|
@@ -208,18 +229,32 @@ module Coopy
|
|
208
229
|
|
209
230
|
def apply
|
210
231
|
return nil if @db == nil
|
232
|
+
@align = ::Coopy::Alignment.new if @align == nil
|
211
233
|
return nil if !self.validate_schema
|
212
234
|
rowid_name = @db.rowid
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
235
|
+
key_cols = []
|
236
|
+
data_cols = []
|
237
|
+
all_cols = []
|
238
|
+
all_cols1 = []
|
239
|
+
all_cols2 = []
|
240
|
+
all_cols3 = []
|
241
|
+
common = @local
|
242
|
+
if @local != nil
|
243
|
+
key_cols = @local.get_primary_key
|
244
|
+
data_cols = @local.get_all_but_primary_key
|
245
|
+
all_cols = @local.get_column_names
|
246
|
+
all_cols1 = @local.get_column_names
|
247
|
+
end
|
248
|
+
if @remote != nil
|
249
|
+
all_cols2 = @remote.get_column_names
|
250
|
+
common = @remote if common == nil
|
251
|
+
end
|
252
|
+
if @alt != nil
|
253
|
+
all_cols3 = @alt.get_column_names
|
254
|
+
common = @alt if common == nil
|
255
|
+
else
|
256
|
+
all_cols3 = all_cols2
|
257
|
+
end
|
223
258
|
all_common_cols = Array.new
|
224
259
|
data_common_cols = Array.new
|
225
260
|
present1 = {}
|
@@ -305,9 +340,11 @@ module Coopy
|
|
305
340
|
self.scan_columns(all_cols1,all_cols3,key_cols,present1,present3,@align.reference)
|
306
341
|
@align.reference.tables(@local,@alt)
|
307
342
|
end
|
308
|
-
sql_table1 =
|
309
|
-
sql_table2 =
|
343
|
+
sql_table1 = ""
|
344
|
+
sql_table2 = ""
|
310
345
|
sql_table3 = ""
|
346
|
+
sql_table1 = @local.get_quoted_table_name if @local != nil
|
347
|
+
sql_table2 = @remote.get_quoted_table_name if @remote != nil
|
311
348
|
sql_table3 = @alt.get_quoted_table_name if @alt != nil
|
312
349
|
if @peered
|
313
350
|
sql_table1 = "main." + _hx_str(sql_table1)
|
@@ -322,7 +359,7 @@ module Coopy
|
|
322
359
|
i6 = _g16
|
323
360
|
_g16+=1
|
324
361
|
sql_key_cols += "," if i6 > 0
|
325
|
-
sql_key_cols +=
|
362
|
+
sql_key_cols += common.get_quoted_column_name(key_cols[i6])
|
326
363
|
end
|
327
364
|
end
|
328
365
|
sql_all_cols = ""
|
@@ -333,7 +370,7 @@ module Coopy
|
|
333
370
|
i7 = _g17
|
334
371
|
_g17+=1
|
335
372
|
sql_all_cols += "," if i7 > 0
|
336
|
-
sql_all_cols +=
|
373
|
+
sql_all_cols += common.get_quoted_column_name(all_common_cols[i7])
|
337
374
|
end
|
338
375
|
end
|
339
376
|
sql_all_cols1 = ""
|
@@ -355,7 +392,7 @@ module Coopy
|
|
355
392
|
i9 = _g19
|
356
393
|
_g19+=1
|
357
394
|
sql_all_cols2 += "," if i9 > 0
|
358
|
-
sql_all_cols2 += @
|
395
|
+
sql_all_cols2 += @remote.get_quoted_column_name(all_cols2[i9])
|
359
396
|
end
|
360
397
|
end
|
361
398
|
sql_all_cols3 = ""
|
@@ -366,7 +403,7 @@ module Coopy
|
|
366
403
|
i10 = _g110
|
367
404
|
_g110+=1
|
368
405
|
sql_all_cols3 += "," if i10 > 0
|
369
|
-
sql_all_cols3 += @
|
406
|
+
sql_all_cols3 += @alt.get_quoted_column_name(all_cols3[i10])
|
370
407
|
end
|
371
408
|
end
|
372
409
|
sql_key_match2 = ""
|
@@ -377,7 +414,7 @@ module Coopy
|
|
377
414
|
i11 = _g111
|
378
415
|
_g111+=1
|
379
416
|
sql_key_match2 += " AND " if i11 > 0
|
380
|
-
n =
|
417
|
+
n = common.get_quoted_column_name(key_cols[i11])
|
381
418
|
sql_key_match2 += _hx_str(sql_table1) + "." + _hx_str(n) + " IS " + _hx_str(sql_table2) + "." + _hx_str(n)
|
382
419
|
end
|
383
420
|
end
|
@@ -389,7 +426,7 @@ module Coopy
|
|
389
426
|
i12 = _g112
|
390
427
|
_g112+=1
|
391
428
|
sql_key_match3 += " AND " if i12 > 0
|
392
|
-
n1 =
|
429
|
+
n1 = common.get_quoted_column_name(key_cols[i12])
|
393
430
|
sql_key_match3 += _hx_str(sql_table1) + "." + _hx_str(n1) + " IS " + _hx_str(sql_table3) + "." + _hx_str(n1)
|
394
431
|
end
|
395
432
|
end
|
@@ -401,7 +438,7 @@ module Coopy
|
|
401
438
|
i13 = _g113
|
402
439
|
_g113+=1
|
403
440
|
sql_data_mismatch += " OR " if i13 > 0
|
404
|
-
n2 =
|
441
|
+
n2 = common.get_quoted_column_name(data_common_cols[i13])
|
405
442
|
sql_data_mismatch += _hx_str(sql_table1) + "." + _hx_str(n2) + " IS NOT " + _hx_str(sql_table2) + "." + _hx_str(n2)
|
406
443
|
end
|
407
444
|
end
|
@@ -414,7 +451,7 @@ module Coopy
|
|
414
451
|
key5 = all_cols2[i14]
|
415
452
|
if !present1.include?(key5)
|
416
453
|
sql_data_mismatch += " OR " if sql_data_mismatch != ""
|
417
|
-
n3 =
|
454
|
+
n3 = common.get_quoted_column_name(key5)
|
418
455
|
sql_data_mismatch += _hx_str(sql_table2) + "." + _hx_str(n3) + " IS NOT NULL"
|
419
456
|
end
|
420
457
|
end
|
@@ -427,7 +464,7 @@ module Coopy
|
|
427
464
|
i15 = _g115
|
428
465
|
_g115+=1
|
429
466
|
sql_data_mismatch += " OR " if sql_data_mismatch.length > 0
|
430
|
-
n4 =
|
467
|
+
n4 = common.get_quoted_column_name(data_common_cols[i15])
|
431
468
|
sql_data_mismatch += _hx_str(sql_table1) + "." + _hx_str(n4) + " IS NOT " + _hx_str(sql_table3) + "." + _hx_str(n4)
|
432
469
|
end
|
433
470
|
end
|
@@ -440,7 +477,7 @@ module Coopy
|
|
440
477
|
key6 = all_cols3[i16]
|
441
478
|
if !present1.include?(key6)
|
442
479
|
sql_data_mismatch += " OR " if sql_data_mismatch != ""
|
443
|
-
n5 =
|
480
|
+
n5 = common.get_quoted_column_name(key6)
|
444
481
|
sql_data_mismatch += _hx_str(sql_table3) + "." + _hx_str(n5) + " IS NOT NULL"
|
445
482
|
end
|
446
483
|
end
|
@@ -456,7 +493,7 @@ module Coopy
|
|
456
493
|
_g117+=1
|
457
494
|
sql_dbl_cols += "," if sql_dbl_cols != ""
|
458
495
|
buf = "__coopy_" + _hx_str(i17)
|
459
|
-
n6 =
|
496
|
+
n6 = common.get_quoted_column_name(all_cols1[i17])
|
460
497
|
sql_dbl_cols += _hx_str(sql_table1) + "." + _hx_str(n6) + " AS " + _hx_str(buf)
|
461
498
|
dbl_cols.push(buf)
|
462
499
|
end
|
@@ -469,7 +506,7 @@ module Coopy
|
|
469
506
|
_g118+=1
|
470
507
|
sql_dbl_cols += "," if sql_dbl_cols != ""
|
471
508
|
buf1 = "__coopy_" + _hx_str(i18) + "b"
|
472
|
-
n7 =
|
509
|
+
n7 = common.get_quoted_column_name(all_cols2[i18])
|
473
510
|
sql_dbl_cols += _hx_str(sql_table2) + "." + _hx_str(n7) + " AS " + _hx_str(buf1)
|
474
511
|
dbl_cols.push(buf1)
|
475
512
|
end
|
@@ -482,7 +519,7 @@ module Coopy
|
|
482
519
|
_g119+=1
|
483
520
|
sql_dbl_cols += "," if sql_dbl_cols != ""
|
484
521
|
buf2 = "__coopy_" + _hx_str(i19) + "c"
|
485
|
-
n8 =
|
522
|
+
n8 = common.get_quoted_column_name(all_cols3[i19])
|
486
523
|
sql_dbl_cols += _hx_str(sql_table3) + "." + _hx_str(n8) + " AS " + _hx_str(buf2)
|
487
524
|
dbl_cols.push(buf2)
|
488
525
|
end
|
@@ -495,7 +532,7 @@ module Coopy
|
|
495
532
|
i20 = _g120
|
496
533
|
_g120+=1
|
497
534
|
sql_order += "," if i20 > 0
|
498
|
-
n9 =
|
535
|
+
n9 = common.get_quoted_column_name(key_cols[i20])
|
499
536
|
sql_order += n9
|
500
537
|
end
|
501
538
|
end
|
@@ -505,49 +542,60 @@ module Coopy
|
|
505
542
|
rowid3 = "-3"
|
506
543
|
if rowid_name != nil
|
507
544
|
rowid = rowid_name
|
508
|
-
rowid1 = _hx_str(sql_table1) + "." + _hx_str(rowid_name)
|
509
|
-
rowid2 = _hx_str(sql_table2) + "." + _hx_str(rowid_name)
|
510
|
-
rowid3 = _hx_str(sql_table3) + "." + _hx_str(rowid_name)
|
545
|
+
rowid1 = _hx_str(sql_table1) + "." + _hx_str(rowid_name) if @local != nil
|
546
|
+
rowid2 = _hx_str(sql_table2) + "." + _hx_str(rowid_name) if @remote != nil
|
547
|
+
rowid3 = _hx_str(sql_table3) + "." + _hx_str(rowid_name) if @alt != nil
|
511
548
|
end
|
512
549
|
@at0 = 1
|
513
550
|
@at1 = 1
|
514
551
|
@at2 = 1
|
515
|
-
|
516
|
-
|
517
|
-
|
552
|
+
@diff_ct = 0
|
553
|
+
if @remote != nil
|
554
|
+
sql_inserts = "SELECT DISTINCT 0 AS __coopy_code, NULL, " + _hx_str(rowid) + " AS rowid, NULL, " + _hx_str(sql_all_cols2) + " FROM " + _hx_str(sql_table2)
|
555
|
+
sql_inserts += " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table1) + _hx_str(self.where(sql_key_match2)) + ")" if @local != nil
|
556
|
+
sql_inserts_order = ["__coopy_code","NULL","rowid","NULL"].concat(all_cols2)
|
557
|
+
self.link_query(sql_inserts,sql_inserts_order)
|
558
|
+
end
|
518
559
|
if @alt != nil
|
519
|
-
sql_inserts1 = "SELECT DISTINCT 1 AS __coopy_code, NULL, NULL, " + _hx_str(rowid) + " AS rowid, " + _hx_str(sql_all_cols3) + " FROM " + _hx_str(sql_table3)
|
560
|
+
sql_inserts1 = "SELECT DISTINCT 1 AS __coopy_code, NULL, NULL, " + _hx_str(rowid) + " AS rowid, " + _hx_str(sql_all_cols3) + " FROM " + _hx_str(sql_table3)
|
561
|
+
sql_inserts1 += " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table1) + _hx_str(self.where(sql_key_match3)) + ")" if @local != nil
|
520
562
|
sql_inserts_order1 = ["__coopy_code","NULL","NULL","rowid"].concat(all_cols3)
|
521
563
|
self.link_query(sql_inserts1,sql_inserts_order1)
|
522
564
|
end
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
565
|
+
if @local != nil && @remote != nil
|
566
|
+
sql_updates = "SELECT DISTINCT 2 AS __coopy_code, " + _hx_str(rowid1) + " AS __coopy_rowid0, " + _hx_str(rowid2) + " AS __coopy_rowid1, "
|
567
|
+
if @alt != nil
|
568
|
+
sql_updates += _hx_str(rowid3) + " AS __coopy_rowid2,"
|
569
|
+
else
|
570
|
+
sql_updates += " NULL,"
|
571
|
+
end
|
572
|
+
sql_updates += _hx_str(sql_dbl_cols) + " FROM " + _hx_str(sql_table1)
|
573
|
+
sql_updates += " INNER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match2) if sql_table1 != sql_table2
|
574
|
+
sql_updates += " INNER JOIN " + _hx_str(sql_table3) + " ON " + _hx_str(sql_key_match3) if @alt != nil && sql_table1 != sql_table3
|
575
|
+
sql_updates += self.where(sql_data_mismatch)
|
576
|
+
sql_updates_order = ["__coopy_code","__coopy_rowid0","__coopy_rowid1","__coopy_rowid2"].concat(dbl_cols)
|
577
|
+
self.link_query(sql_updates,sql_updates_order)
|
578
|
+
end
|
535
579
|
if @alt == nil
|
536
|
-
|
537
|
-
|
538
|
-
|
580
|
+
if @local != nil
|
581
|
+
sql_deletes = "SELECT DISTINCT 0 AS __coopy_code, " + _hx_str(rowid) + " AS rowid, NULL, NULL, " + _hx_str(sql_all_cols1) + " FROM " + _hx_str(sql_table1)
|
582
|
+
sql_deletes += " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table2) + _hx_str(self.where(sql_key_match2)) + ")" if @remote != nil
|
583
|
+
sql_deletes_order = ["__coopy_code","rowid","NULL","NULL"].concat(all_cols1)
|
584
|
+
self.link_query(sql_deletes,sql_deletes_order)
|
585
|
+
end
|
539
586
|
end
|
540
587
|
if @alt != nil
|
541
588
|
sql_deletes1 = "SELECT 2 AS __coopy_code, " + _hx_str(rowid1) + " AS __coopy_rowid0, " + _hx_str(rowid2) + " AS __coopy_rowid1, "
|
542
589
|
sql_deletes1 += _hx_str(rowid3) + " AS __coopy_rowid2, "
|
543
590
|
sql_deletes1 += sql_dbl_cols
|
544
591
|
sql_deletes1 += " FROM " + _hx_str(sql_table1)
|
545
|
-
sql_deletes1 += " LEFT OUTER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match2)
|
592
|
+
sql_deletes1 += " LEFT OUTER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match2) if @remote != nil
|
546
593
|
sql_deletes1 += " LEFT OUTER JOIN " + _hx_str(sql_table3) + " ON " + _hx_str(sql_key_match3)
|
547
594
|
sql_deletes1 += " WHERE __coopy_rowid1 IS NULL OR __coopy_rowid2 IS NULL"
|
548
595
|
sql_deletes_order1 = ["__coopy_code","__coopy_rowid0","__coopy_rowid1","__coopy_rowid2"].concat(dbl_cols)
|
549
596
|
self.link_query(sql_deletes1,sql_deletes_order1)
|
550
597
|
end
|
598
|
+
@align.mark_identical if @diff_ct == 0
|
551
599
|
@align
|
552
600
|
end
|
553
601
|
|