daff 1.3.2 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|