daff 1.2.6 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -6
  3. data/bin/daff.rb +0 -0
  4. data/lib/daff.rb +6 -0
  5. data/lib/lib/coopy/alignment.rb +146 -169
  6. data/lib/lib/coopy/cell_builder.rb +1 -1
  7. data/lib/lib/coopy/cell_info.rb +2 -1
  8. data/lib/lib/coopy/column_change.rb +16 -0
  9. data/lib/lib/coopy/compare_flags.rb +33 -5
  10. data/lib/lib/coopy/compare_table.rb +219 -99
  11. data/lib/lib/coopy/coopy.rb +205 -99
  12. data/lib/lib/coopy/csv.rb +17 -22
  13. data/lib/lib/coopy/diff_render.rb +16 -8
  14. data/lib/lib/coopy/flat_cell_builder.rb +11 -8
  15. data/lib/lib/coopy/highlight_patch.rb +363 -63
  16. data/lib/lib/coopy/highlight_patch_unit.rb +1 -1
  17. data/lib/lib/coopy/index.rb +21 -8
  18. data/lib/lib/coopy/index_item.rb +7 -3
  19. data/lib/lib/coopy/index_pair.rb +13 -10
  20. data/lib/lib/coopy/merger.rb +3 -3
  21. data/lib/lib/coopy/meta.rb +17 -0
  22. data/lib/lib/coopy/mover.rb +7 -5
  23. data/lib/lib/coopy/ndjson.rb +2 -2
  24. data/lib/lib/coopy/nested_cell_builder.rb +7 -7
  25. data/lib/lib/coopy/ordering.rb +6 -2
  26. data/lib/lib/coopy/property_change.rb +16 -0
  27. data/lib/lib/coopy/row.rb +1 -0
  28. data/lib/lib/coopy/row_change.rb +42 -0
  29. data/lib/lib/coopy/row_stream.rb +11 -0
  30. data/lib/lib/coopy/simple_table.rb +84 -30
  31. data/lib/lib/coopy/simple_view.rb +8 -8
  32. data/lib/lib/coopy/sparse_sheet.rb +1 -1
  33. data/lib/lib/coopy/sql_column.rb +22 -10
  34. data/lib/lib/coopy/sql_compare.rb +397 -85
  35. data/lib/lib/coopy/sql_database.rb +2 -0
  36. data/lib/lib/coopy/sql_helper.rb +5 -0
  37. data/lib/lib/coopy/sql_table.rb +122 -19
  38. data/lib/lib/coopy/sql_table_name.rb +1 -1
  39. data/lib/lib/coopy/sqlite_helper.rb +250 -3
  40. data/lib/lib/coopy/table.rb +1 -0
  41. data/lib/lib/coopy/table_diff.rb +643 -464
  42. data/lib/lib/coopy/table_io.rb +19 -6
  43. data/lib/lib/coopy/table_modifier.rb +1 -1
  44. data/lib/lib/coopy/table_stream.rb +102 -0
  45. data/lib/lib/coopy/terminal_diff_render.rb +4 -3
  46. data/lib/lib/coopy/unit.rb +22 -2
  47. data/lib/lib/coopy/viterbi.rb +4 -4
  48. data/lib/lib/haxe/ds/int_map.rb +1 -1
  49. data/lib/lib/haxe/ds/string_map.rb +1 -1
  50. data/lib/lib/haxe/format/json_parser.rb +1 -1
  51. data/lib/lib/haxe/format/json_printer.rb +1 -1
  52. data/lib/lib/haxe/io/bytes.rb +2 -2
  53. data/lib/lib/haxe/io/eof.rb +1 -1
  54. data/lib/lib/haxe/io/output.rb +1 -1
  55. data/lib/lib/hx_overrides.rb +1 -1
  56. data/lib/lib/hx_sys.rb +9 -5
  57. data/lib/lib/lambda.rb +3 -3
  58. data/lib/lib/list.rb +1 -1
  59. data/lib/lib/rb/ruby_iterator.rb +2 -2
  60. data/lib/lib/reflect.rb +1 -1
  61. data/lib/lib/sys/io/file_output.rb +1 -1
  62. data/lib/lib/sys/io/hx_file.rb +1 -1
  63. data/lib/lib/x_list/list_iterator.rb +2 -2
  64. metadata +29 -25
  65. data/lib/lib/coopy/table_text.rb +0 -26
  66. data/lib/lib/haxe/io/bytes_buffer.rb +0 -19
  67. data/lib/lib/haxe/io/bytes_input.rb +0 -13
  68. data/lib/lib/haxe/io/bytes_output.rb +0 -33
  69. data/lib/lib/haxe/io/input.rb +0 -11
@@ -8,6 +8,7 @@ module Coopy
8
8
  @data = {}
9
9
  @w = w
10
10
  @h = h
11
+ @meta = nil
11
12
  end
12
13
 
13
14
  # protected - in ruby this doesn't play well with static/inline methods
@@ -15,11 +16,12 @@ module Coopy
15
16
  attr_accessor :data
16
17
  attr_accessor :w
17
18
  attr_accessor :h
19
+ attr_accessor :meta
18
20
 
19
21
  public
20
22
 
21
23
  def get_table
22
- return self
24
+ self
23
25
  end
24
26
 
25
27
  def height() get_height end
@@ -28,15 +30,15 @@ module Coopy
28
30
  def width=(__v) @width = __v end
29
31
 
30
32
  def get_width
31
- return @w
33
+ @w
32
34
  end
33
35
 
34
36
  def get_height
35
- return @h
37
+ @h
36
38
  end
37
39
 
38
40
  def get_cell(x,y)
39
- return @data[x + y * @w]
41
+ @data[x + y * @w]
40
42
  end
41
43
 
42
44
  def set_cell(x,y,c)
@@ -48,21 +50,21 @@ module Coopy
48
50
  end
49
51
 
50
52
  def to_s
51
- return ::Coopy::SimpleTable.table_to_string(self)
53
+ ::Coopy::SimpleTable.table_to_string(self)
52
54
  end
53
55
 
54
56
  def get_cell_view
55
- return ::Coopy::SimpleView.new
57
+ ::Coopy::SimpleView.new
56
58
  end
57
59
 
58
60
  def is_resizable
59
- return true
61
+ true
60
62
  end
61
63
 
62
64
  def resize(w,h)
63
65
  @w = w
64
66
  @h = h
65
- return true
67
+ true
66
68
  end
67
69
 
68
70
  def clear
@@ -98,7 +100,7 @@ module Coopy
98
100
  end
99
101
  @h = hfate
100
102
  @data = data2
101
- return true
103
+ true
102
104
  end
103
105
 
104
106
  def insert_or_delete_columns(fate,wfate)
@@ -130,7 +132,7 @@ module Coopy
130
132
  end
131
133
  @w = wfate
132
134
  @data = data2
133
- return true
135
+ true
134
136
  end
135
137
 
136
138
  def trim_blank
@@ -201,11 +203,11 @@ module Coopy
201
203
  end
202
204
  @w = nw
203
205
  @data = data2
204
- return true
206
+ true
205
207
  end
206
208
 
207
209
  def get_data
208
- return nil
210
+ nil
209
211
  end
210
212
 
211
213
  def clone
@@ -227,37 +229,89 @@ module Coopy
227
229
  end
228
230
  end
229
231
  end
230
- return result
232
+ result.meta = @meta.clone_meta(result) if @meta != nil
233
+ result
234
+ end
235
+
236
+ def set_meta(meta)
237
+ @meta = meta
238
+ end
239
+
240
+ def get_meta
241
+ @meta
231
242
  end
232
243
 
233
244
  def SimpleTable.table_to_string(tab)
234
- x = ""
245
+ meta = tab.get_meta
246
+ if meta != nil
247
+ stream = meta.get_row_stream
248
+ if stream != nil
249
+ x = ""
250
+ cols = stream.fetch_columns
251
+ begin
252
+ _g1 = 0
253
+ _g = cols.length
254
+ while(_g1 < _g)
255
+ i = _g1
256
+ _g1+=1
257
+ x += "," if i > 0
258
+ x += cols[i]
259
+ end
260
+ end
261
+ x += "\n"
262
+ row = stream.fetch_row
263
+ while(row != nil)
264
+ begin
265
+ _g11 = 0
266
+ _g2 = cols.length
267
+ while(_g11 < _g2)
268
+ i1 = _g11
269
+ _g11+=1
270
+ x += "," if i1 > 0
271
+ begin
272
+ s = row[cols[i1]]
273
+ x += s.to_s
274
+ end
275
+ end
276
+ end
277
+ x += "\n"
278
+ row = stream.fetch_row
279
+ end
280
+ return x
281
+ end
282
+ end
283
+ x1 = ""
235
284
  begin
236
- _g1 = 0
237
- _g = tab.get_height
238
- while(_g1 < _g)
239
- i = _g1
240
- _g1+=1
285
+ _g12 = 0
286
+ _g3 = tab.get_height
287
+ while(_g12 < _g3)
288
+ i2 = _g12
289
+ _g12+=1
241
290
  begin
242
- _g3 = 0
243
- _g2 = tab.get_width
244
- while(_g3 < _g2)
245
- j = _g3
246
- _g3+=1
247
- x += " " if j > 0
291
+ _g31 = 0
292
+ _g21 = tab.get_width
293
+ while(_g31 < _g21)
294
+ j = _g31
295
+ _g31+=1
296
+ x1 += "," if j > 0
248
297
  begin
249
- s = tab.get_cell(j,i)
250
- x += s.to_s
298
+ s1 = tab.get_cell(j,i2)
299
+ x1 += s1.to_s
251
300
  end
252
301
  end
253
302
  end
254
- x += "\n"
303
+ x1 += "\n"
255
304
  end
256
305
  end
257
- return x
306
+ x1
258
307
  end
259
308
 
260
309
  def SimpleTable.table_is_similar(tab1,tab2)
310
+ if tab1.get_height == -1 || tab2.get_height == -1
311
+ txt1 = ::Coopy::SimpleTable.table_to_string(tab1)
312
+ txt2 = ::Coopy::SimpleTable.table_to_string(tab2)
313
+ return txt1 == txt2
314
+ end
261
315
  return false if tab1.get_width != tab2.get_width
262
316
  return false if tab1.get_height != tab2.get_height
263
317
  v = tab1.get_cell_view
@@ -278,7 +332,7 @@ module Coopy
278
332
  end
279
333
  end
280
334
  end
281
- return true
335
+ true
282
336
  end
283
337
 
284
338
  haxe_me ["coopy", "SimpleTable"]
@@ -8,23 +8,23 @@ module Coopy
8
8
  end
9
9
 
10
10
  def to_s(d)
11
- return nil if d == nil
12
- return "" + _hx_str(d.to_s)
11
+ return "" if d == nil
12
+ "" + _hx_str(d.to_s)
13
13
  end
14
14
 
15
15
  def equals(d1,d2)
16
16
  return true if d1 == nil && d2 == nil
17
17
  return true if d1 == nil && "" + _hx_str(d2.to_s) == ""
18
18
  return true if "" + _hx_str(d1.to_s) == "" && d2 == nil
19
- return "" + _hx_str(d1.to_s) == "" + _hx_str(d2.to_s)
19
+ "" + _hx_str(d1.to_s) == "" + _hx_str(d2.to_s)
20
20
  end
21
21
 
22
22
  def to_datum(x)
23
- return x
23
+ x
24
24
  end
25
25
 
26
26
  def make_hash
27
- return {}
27
+ {}
28
28
  end
29
29
 
30
30
  def hash_set(h,str,d)
@@ -40,16 +40,16 @@ module Coopy
40
40
 
41
41
  def hash_exists(h,str)
42
42
  hh = h
43
- return hh.include?(str)
43
+ hh.include?(str)
44
44
  end
45
45
 
46
46
  def hash_get(h,str)
47
47
  hh = h
48
- return hh[str]
48
+ hh[str]
49
49
  end
50
50
 
51
51
  def is_hash(h)
52
- return h.respond_to? :keys
52
+ h.respond_to? :keys
53
53
  end
54
54
 
55
55
  haxe_me ["coopy", "SimpleView"]
@@ -33,7 +33,7 @@ module Coopy
33
33
  return @zero if cursor == nil
34
34
  val = cursor[x]
35
35
  return @zero if val == nil
36
- return val
36
+ val
37
37
  end
38
38
 
39
39
  def set(x,y,val)
@@ -5,28 +5,40 @@ module Coopy
5
5
  class SqlColumn
6
6
 
7
7
  def initialize
8
+ @name = ""
9
+ @primary = false
10
+ @type_value = nil
11
+ @type_family = nil
8
12
  end
9
13
 
10
14
  attr_accessor :name
11
15
  attr_accessor :primary
16
+ attr_accessor :type_value
17
+ attr_accessor :type_family
18
+
19
+ def set_name(name)
20
+ @name = name
21
+ end
22
+
23
+ def set_primary_key(primary)
24
+ @primary = primary
25
+ end
26
+
27
+ def set_type(value,family)
28
+ @type_value = value
29
+ @type_family = family
30
+ end
12
31
 
13
32
  def get_name
14
- return @name
33
+ @name
15
34
  end
16
35
 
17
36
  def is_primary_key
18
- return @primary
37
+ @primary
19
38
  end
20
39
 
21
40
  def to_s
22
- return _hx_str((((@primary) ? "*" : ""))) + _hx_str(@name)
23
- end
24
-
25
- def SqlColumn.by_name_and_primary_key(name,primary)
26
- result = ::Coopy::SqlColumn.new
27
- result.name = name
28
- result.primary = primary
29
- return result
41
+ _hx_str((((@primary) ? "*" : ""))) + _hx_str(@name)
30
42
  end
31
43
 
32
44
  haxe_me ["coopy", "SqlColumn"]
@@ -4,22 +4,44 @@
4
4
  module Coopy
5
5
  class SqlCompare
6
6
 
7
- def initialize(db,local,remote)
7
+ def initialize(db,local,remote,alt,align = nil)
8
8
  @db = db
9
9
  @local = local
10
10
  @remote = remote
11
+ @alt = alt
12
+ @align = align
13
+ @peered = false
14
+ if @remote.get_database.get_name_for_attachment != nil
15
+ if @remote.get_database.get_name_for_attachment != @local.get_database.get_name_for_attachment
16
+ local.get_database.get_helper.attach(db,"__peer__",@remote.get_database.get_name_for_attachment)
17
+ @peered = true
18
+ end
19
+ end
20
+ @alt_peered = false
21
+ if @alt != nil
22
+ if @alt.get_database.get_name_for_attachment != nil
23
+ if @alt.get_database.get_name_for_attachment != @local.get_database.get_name_for_attachment
24
+ local.get_database.get_helper.attach(db,"__alt__",@alt.get_database.get_name_for_attachment)
25
+ @alt_peered = true
26
+ end
27
+ end
28
+ end
11
29
  end
12
30
 
13
31
  attr_accessor :db
14
- attr_accessor :parent
15
32
  attr_accessor :local
16
33
  attr_accessor :remote
34
+ attr_accessor :alt
17
35
 
18
36
  protected
19
37
 
20
38
  attr_accessor :at0
21
39
  attr_accessor :at1
40
+ attr_accessor :at2
22
41
  attr_accessor :align
42
+ attr_accessor :peered
43
+ attr_accessor :alt_peered
44
+ attr_accessor :needed
23
45
 
24
46
  def equal_array(a1,a2)
25
47
  return false if a1.length != a2.length
@@ -32,7 +54,7 @@ module Coopy
32
54
  return false if a1[i] != a2[i]
33
55
  end
34
56
  end
35
- return true
57
+ true
36
58
  end
37
59
 
38
60
  public
@@ -40,24 +62,38 @@ module Coopy
40
62
  def validate_schema
41
63
  all_cols1 = @local.get_column_names
42
64
  all_cols2 = @remote.get_column_names
43
- return false if !self.equal_array(all_cols1,all_cols2)
65
+ all_cols3 = all_cols2
44
66
  key_cols1 = @local.get_primary_key
45
67
  key_cols2 = @remote.get_primary_key
46
- return false if !self.equal_array(key_cols1,key_cols2)
47
- return false if key_cols1.length == 0
48
- return true
68
+ key_cols3 = key_cols2
69
+ if @alt != nil
70
+ all_cols3 = @alt.get_column_names
71
+ key_cols3 = @alt.get_primary_key
72
+ end
73
+ raise hx_raise("Error accessing SQL table") if all_cols1.length == 0 || all_cols2.length == 0 || all_cols3.length == 0
74
+ if !(self.equal_array(key_cols1,key_cols2) && self.equal_array(key_cols1,key_cols3))
75
+ puts "sql diff not possible when primary key changes"
76
+ return false
77
+ end
78
+ if key_cols1.length == 0
79
+ puts "sql diff not possible when primary key not available"
80
+ return false
81
+ end
82
+ true
49
83
  end
50
84
 
51
85
  protected
52
86
 
53
87
  def denull(x)
54
88
  return -1 if x == nil
55
- return x
89
+ x
56
90
  end
57
91
 
58
92
  def link
59
- i0 = self.denull(@db.get(0))
60
- i1 = self.denull(@db.get(1))
93
+ mode = @db.get(0)
94
+ i0 = self.denull(@db.get(1))
95
+ i1 = self.denull(@db.get(2))
96
+ i2 = self.denull(@db.get(3))
61
97
  if i0 == -3
62
98
  i0 = @at0
63
99
  @at0+=1
@@ -66,33 +102,54 @@ module Coopy
66
102
  i1 = @at1
67
103
  @at1+=1
68
104
  end
69
- factor = nil
70
- if i0 >= 0 && i1 >= 0
71
- factor = 2
72
- else
73
- factor = 1
105
+ if i2 == -3
106
+ i2 = @at2
107
+ @at2+=1
74
108
  end
75
- offset = factor - 1
109
+ offset = 4
76
110
  if i0 >= 0
77
- _g1 = 0
78
- _g = @local.get_width
79
- while(_g1 < _g)
80
- x = _g1
81
- _g1+=1
82
- @local.set_cell_cache(x,i0,@db.get(2 + factor * x))
111
+ begin
112
+ _g1 = 0
113
+ _g = @local.get_width
114
+ while(_g1 < _g)
115
+ x = _g1
116
+ _g1+=1
117
+ @local.set_cell_cache(x,i0,@db.get(x + offset))
118
+ end
83
119
  end
120
+ offset += @local.get_width
84
121
  end
85
122
  if i1 >= 0
86
- _g11 = 0
87
- _g2 = @remote.get_width
88
- while(_g11 < _g2)
89
- x1 = _g11
90
- _g11+=1
91
- @remote.set_cell_cache(x1,i1,@db.get(2 + factor * x1 + offset))
123
+ begin
124
+ _g11 = 0
125
+ _g2 = @remote.get_width
126
+ while(_g11 < _g2)
127
+ x1 = _g11
128
+ _g11+=1
129
+ @remote.set_cell_cache(x1,i1,@db.get(x1 + offset))
130
+ end
131
+ end
132
+ offset += @remote.get_width
133
+ end
134
+ if i2 >= 0
135
+ _g12 = 0
136
+ _g3 = @alt.get_width
137
+ while(_g12 < _g3)
138
+ x2 = _g12
139
+ _g12+=1
140
+ @alt.set_cell_cache(x2,i2,@db.get(x2 + offset))
141
+ end
142
+ end
143
+ if mode == 0 || mode == 2
144
+ @align.link(i0,i1)
145
+ @align.add_to_order(i0,i1)
146
+ end
147
+ if @alt != nil
148
+ if mode == 1 || mode == 2
149
+ @align.reference.link(i0,i2)
150
+ @align.reference.add_to_order(i0,i2)
92
151
  end
93
152
  end
94
- @align.link(i0,i1)
95
- @align.add_to_order(i0,i1)
96
153
  end
97
154
 
98
155
  def link_query(query,order)
@@ -104,139 +161,394 @@ module Coopy
104
161
  end
105
162
  end
106
163
 
164
+ def where(txt)
165
+ return " WHERE 1 = 0" if txt == ""
166
+ " WHERE " + _hx_str(txt)
167
+ end
168
+
107
169
  public
108
170
 
171
+ def scan_columns(all_cols1,all_cols2,key_cols,present1,present2,align)
172
+ align.meta = ::Coopy::Alignment.new
173
+ begin
174
+ _g1 = 0
175
+ _g = all_cols1.length
176
+ while(_g1 < _g)
177
+ i = _g1
178
+ _g1+=1
179
+ key = all_cols1[i]
180
+ if present2.include?(key)
181
+ align.meta.link(i,present2[key])
182
+ else
183
+ align.meta.link(i,-1)
184
+ end
185
+ end
186
+ end
187
+ begin
188
+ _g11 = 0
189
+ _g2 = all_cols2.length
190
+ while(_g11 < _g2)
191
+ i1 = _g11
192
+ _g11+=1
193
+ key1 = all_cols2[i1]
194
+ align.meta.link(-1,i1) if !present1.include?(key1)
195
+ end
196
+ end
197
+ align.meta.range(all_cols1.length,all_cols2.length)
198
+ begin
199
+ _g3 = 0
200
+ while(_g3 < key_cols.length)
201
+ key2 = key_cols[_g3]
202
+ _g3+=1
203
+ unit = ::Coopy::Unit.new(present1[key2],present2[key2])
204
+ align.add_index_columns(unit)
205
+ end
206
+ end
207
+ end
208
+
109
209
  def apply
110
210
  return nil if @db == nil
111
211
  return nil if !self.validate_schema
112
212
  rowid_name = @db.rowid
113
- @align = ::Coopy::Alignment.new
213
+ @align = ::Coopy::Alignment.new if @align == nil
114
214
  key_cols = @local.get_primary_key
115
215
  data_cols = @local.get_all_but_primary_key
116
216
  all_cols = @local.get_column_names
117
- @align.meta = ::Coopy::Alignment.new
217
+ all_cols1 = @local.get_column_names
218
+ all_cols2 = @remote.get_column_names
219
+ all_cols3 = all_cols2
220
+ all_cols3 = @alt.get_column_names if @alt != nil
221
+ data_cols1 = @local.get_all_but_primary_key
222
+ data_cols2 = @remote.get_all_but_primary_key
223
+ all_common_cols = Array.new
224
+ data_common_cols = Array.new
225
+ present1 = {}
226
+ present2 = {}
227
+ present3 = {}
228
+ present_primary = {}
229
+ has_column_add = false
118
230
  begin
119
231
  _g1 = 0
120
- _g = all_cols.length
232
+ _g = key_cols.length
121
233
  while(_g1 < _g)
122
234
  i = _g1
123
235
  _g1+=1
124
- @align.meta.link(i,i)
236
+ present_primary[key_cols[i]] = i
125
237
  end
126
238
  end
127
- @align.meta.range(all_cols.length,all_cols.length)
128
- @align.tables(@local,@remote)
129
- @align.range(999,999)
130
- sql_table1 = @local.get_quoted_table_name
131
- sql_table2 = @remote.get_quoted_table_name
132
- sql_key_cols = ""
133
239
  begin
134
240
  _g11 = 0
135
- _g2 = key_cols.length
241
+ _g2 = all_cols1.length
136
242
  while(_g11 < _g2)
137
243
  i1 = _g11
138
244
  _g11+=1
139
- sql_key_cols += "," if i1 > 0
140
- sql_key_cols += @local.get_quoted_column_name(key_cols[i1])
245
+ key = all_cols1[i1]
246
+ present1[key] = i1
141
247
  end
142
248
  end
143
- sql_all_cols = ""
144
249
  begin
145
250
  _g12 = 0
146
- _g3 = all_cols.length
251
+ _g3 = all_cols2.length
147
252
  while(_g12 < _g3)
148
253
  i2 = _g12
149
254
  _g12+=1
150
- sql_all_cols += "," if i2 > 0
151
- sql_all_cols += @local.get_quoted_column_name(all_cols[i2])
255
+ key1 = all_cols2[i2]
256
+ has_column_add = true if !present1.include?(key1)
257
+ present2[key1] = i2
152
258
  end
153
259
  end
154
- sql_key_match = ""
155
260
  begin
156
261
  _g13 = 0
157
- _g4 = key_cols.length
262
+ _g4 = all_cols3.length
158
263
  while(_g13 < _g4)
159
264
  i3 = _g13
160
265
  _g13+=1
161
- sql_key_match += " AND " if i3 > 0
162
- n = @local.get_quoted_column_name(key_cols[i3])
163
- sql_key_match += _hx_str(sql_table1) + "." + _hx_str(n) + " IS " + _hx_str(sql_table2) + "." + _hx_str(n)
266
+ key2 = all_cols3[i3]
267
+ has_column_add = true if !present1.include?(key2)
268
+ present3[key2] = i3
269
+ if present1.include?(key2)
270
+ if present2.include?(key2)
271
+ all_common_cols.push(key2)
272
+ data_common_cols.push(key2) if !present_primary.include?(key2)
273
+ end
274
+ end
164
275
  end
165
276
  end
166
- sql_data_mismatch = ""
277
+ @align.meta = ::Coopy::Alignment.new
167
278
  begin
168
279
  _g14 = 0
169
- _g5 = data_cols.length
280
+ _g5 = all_cols1.length
170
281
  while(_g14 < _g5)
171
282
  i4 = _g14
172
283
  _g14+=1
173
- sql_data_mismatch += " OR " if i4 > 0
174
- n1 = @local.get_quoted_column_name(data_cols[i4])
175
- sql_data_mismatch += _hx_str(sql_table1) + "." + _hx_str(n1) + " IS NOT " + _hx_str(sql_table2) + "." + _hx_str(n1)
284
+ key3 = all_cols1[i4]
285
+ if present2.include?(key3)
286
+ @align.meta.link(i4,present2[key3])
287
+ else
288
+ @align.meta.link(i4,-1)
289
+ end
176
290
  end
177
291
  end
178
- sql_dbl_cols = ""
179
- dbl_cols = []
180
292
  begin
181
293
  _g15 = 0
182
- _g6 = all_cols.length
294
+ _g6 = all_cols2.length
183
295
  while(_g15 < _g6)
184
296
  i5 = _g15
185
297
  _g15+=1
186
- sql_dbl_cols += "," if i5 > 0
187
- n2 = @local.get_quoted_column_name(all_cols[i5])
188
- buf = "__coopy_" + _hx_str(i5)
189
- sql_dbl_cols += _hx_str(sql_table1) + "." + _hx_str(n2) + " AS " + _hx_str(buf)
190
- dbl_cols.push(buf)
191
- sql_dbl_cols += ","
192
- sql_dbl_cols += _hx_str(sql_table2) + "." + _hx_str(n2) + " AS " + _hx_str(buf) + "b"
193
- dbl_cols.push(_hx_str(buf) + "b")
298
+ key4 = all_cols2[i5]
299
+ @align.meta.link(-1,i5) if !present1.include?(key4)
194
300
  end
195
301
  end
196
- sql_order = ""
302
+ self.scan_columns(all_cols1,all_cols2,key_cols,present1,present2,@align)
303
+ @align.tables(@local,@remote)
304
+ if @alt != nil
305
+ self.scan_columns(all_cols1,all_cols3,key_cols,present1,present3,@align.reference)
306
+ @align.reference.tables(@local,@alt)
307
+ end
308
+ sql_table1 = @local.get_quoted_table_name
309
+ sql_table2 = @remote.get_quoted_table_name
310
+ sql_table3 = ""
311
+ sql_table3 = @alt.get_quoted_table_name if @alt != nil
312
+ if @peered
313
+ sql_table1 = "main." + _hx_str(sql_table1)
314
+ sql_table2 = "__peer__." + _hx_str(sql_table2)
315
+ end
316
+ sql_table2 = "__alt__." + _hx_str(sql_table3) if @alt_peered
317
+ sql_key_cols = ""
197
318
  begin
198
319
  _g16 = 0
199
320
  _g7 = key_cols.length
200
321
  while(_g16 < _g7)
201
322
  i6 = _g16
202
323
  _g16+=1
203
- sql_order += "," if i6 > 0
204
- n3 = @local.get_quoted_column_name(key_cols[i6])
205
- sql_order += n3
324
+ sql_key_cols += "," if i6 > 0
325
+ sql_key_cols += @local.get_quoted_column_name(key_cols[i6])
206
326
  end
207
327
  end
208
- sql_dbl_order = ""
328
+ sql_all_cols = ""
209
329
  begin
210
330
  _g17 = 0
211
- _g8 = key_cols.length
331
+ _g8 = all_common_cols.length
212
332
  while(_g17 < _g8)
213
333
  i7 = _g17
214
334
  _g17+=1
215
- sql_dbl_order += "," if i7 > 0
216
- n4 = @local.get_quoted_column_name(key_cols[i7])
217
- sql_dbl_order += _hx_str(sql_table1) + "." + _hx_str(n4)
335
+ sql_all_cols += "," if i7 > 0
336
+ sql_all_cols += @local.get_quoted_column_name(all_common_cols[i7])
337
+ end
338
+ end
339
+ sql_all_cols1 = ""
340
+ begin
341
+ _g18 = 0
342
+ _g9 = all_cols1.length
343
+ while(_g18 < _g9)
344
+ i8 = _g18
345
+ _g18+=1
346
+ sql_all_cols1 += "," if i8 > 0
347
+ sql_all_cols1 += @local.get_quoted_column_name(all_cols1[i8])
348
+ end
349
+ end
350
+ sql_all_cols2 = ""
351
+ begin
352
+ _g19 = 0
353
+ _g10 = all_cols2.length
354
+ while(_g19 < _g10)
355
+ i9 = _g19
356
+ _g19+=1
357
+ sql_all_cols2 += "," if i9 > 0
358
+ sql_all_cols2 += @local.get_quoted_column_name(all_cols2[i9])
359
+ end
360
+ end
361
+ sql_all_cols3 = ""
362
+ if @alt != nil
363
+ _g110 = 0
364
+ _g20 = all_cols3.length
365
+ while(_g110 < _g20)
366
+ i10 = _g110
367
+ _g110+=1
368
+ sql_all_cols3 += "," if i10 > 0
369
+ sql_all_cols3 += @local.get_quoted_column_name(all_cols3[i10])
370
+ end
371
+ end
372
+ sql_key_match2 = ""
373
+ begin
374
+ _g111 = 0
375
+ _g21 = key_cols.length
376
+ while(_g111 < _g21)
377
+ i11 = _g111
378
+ _g111+=1
379
+ sql_key_match2 += " AND " if i11 > 0
380
+ n = @local.get_quoted_column_name(key_cols[i11])
381
+ sql_key_match2 += _hx_str(sql_table1) + "." + _hx_str(n) + " IS " + _hx_str(sql_table2) + "." + _hx_str(n)
382
+ end
383
+ end
384
+ sql_key_match3 = ""
385
+ if @alt != nil
386
+ _g112 = 0
387
+ _g22 = key_cols.length
388
+ while(_g112 < _g22)
389
+ i12 = _g112
390
+ _g112+=1
391
+ sql_key_match3 += " AND " if i12 > 0
392
+ n1 = @local.get_quoted_column_name(key_cols[i12])
393
+ sql_key_match3 += _hx_str(sql_table1) + "." + _hx_str(n1) + " IS " + _hx_str(sql_table3) + "." + _hx_str(n1)
394
+ end
395
+ end
396
+ sql_data_mismatch = ""
397
+ begin
398
+ _g113 = 0
399
+ _g23 = data_common_cols.length
400
+ while(_g113 < _g23)
401
+ i13 = _g113
402
+ _g113+=1
403
+ sql_data_mismatch += " OR " if i13 > 0
404
+ n2 = @local.get_quoted_column_name(data_common_cols[i13])
405
+ sql_data_mismatch += _hx_str(sql_table1) + "." + _hx_str(n2) + " IS NOT " + _hx_str(sql_table2) + "." + _hx_str(n2)
406
+ end
407
+ end
408
+ begin
409
+ _g114 = 0
410
+ _g24 = all_cols2.length
411
+ while(_g114 < _g24)
412
+ i14 = _g114
413
+ _g114+=1
414
+ key5 = all_cols2[i14]
415
+ if !present1.include?(key5)
416
+ sql_data_mismatch += " OR " if sql_data_mismatch != ""
417
+ n3 = @remote.get_quoted_column_name(key5)
418
+ sql_data_mismatch += _hx_str(sql_table2) + "." + _hx_str(n3) + " IS NOT NULL"
419
+ end
420
+ end
421
+ end
422
+ if @alt != nil
423
+ begin
424
+ _g115 = 0
425
+ _g25 = data_common_cols.length
426
+ while(_g115 < _g25)
427
+ i15 = _g115
428
+ _g115+=1
429
+ sql_data_mismatch += " OR " if sql_data_mismatch.length > 0
430
+ n4 = @local.get_quoted_column_name(data_common_cols[i15])
431
+ sql_data_mismatch += _hx_str(sql_table1) + "." + _hx_str(n4) + " IS NOT " + _hx_str(sql_table3) + "." + _hx_str(n4)
432
+ end
433
+ end
434
+ begin
435
+ _g116 = 0
436
+ _g26 = all_cols3.length
437
+ while(_g116 < _g26)
438
+ i16 = _g116
439
+ _g116+=1
440
+ key6 = all_cols3[i16]
441
+ if !present1.include?(key6)
442
+ sql_data_mismatch += " OR " if sql_data_mismatch != ""
443
+ n5 = @alt.get_quoted_column_name(key6)
444
+ sql_data_mismatch += _hx_str(sql_table3) + "." + _hx_str(n5) + " IS NOT NULL"
445
+ end
446
+ end
447
+ end
448
+ end
449
+ sql_dbl_cols = ""
450
+ dbl_cols = []
451
+ begin
452
+ _g117 = 0
453
+ _g27 = all_cols1.length
454
+ while(_g117 < _g27)
455
+ i17 = _g117
456
+ _g117+=1
457
+ sql_dbl_cols += "," if sql_dbl_cols != ""
458
+ buf = "__coopy_" + _hx_str(i17)
459
+ n6 = @local.get_quoted_column_name(all_cols1[i17])
460
+ sql_dbl_cols += _hx_str(sql_table1) + "." + _hx_str(n6) + " AS " + _hx_str(buf)
461
+ dbl_cols.push(buf)
462
+ end
463
+ end
464
+ begin
465
+ _g118 = 0
466
+ _g28 = all_cols2.length
467
+ while(_g118 < _g28)
468
+ i18 = _g118
469
+ _g118+=1
470
+ sql_dbl_cols += "," if sql_dbl_cols != ""
471
+ buf1 = "__coopy_" + _hx_str(i18) + "b"
472
+ n7 = @local.get_quoted_column_name(all_cols2[i18])
473
+ sql_dbl_cols += _hx_str(sql_table2) + "." + _hx_str(n7) + " AS " + _hx_str(buf1)
474
+ dbl_cols.push(buf1)
475
+ end
476
+ end
477
+ if @alt != nil
478
+ _g119 = 0
479
+ _g29 = all_cols3.length
480
+ while(_g119 < _g29)
481
+ i19 = _g119
482
+ _g119+=1
483
+ sql_dbl_cols += "," if sql_dbl_cols != ""
484
+ buf2 = "__coopy_" + _hx_str(i19) + "c"
485
+ n8 = @local.get_quoted_column_name(all_cols3[i19])
486
+ sql_dbl_cols += _hx_str(sql_table3) + "." + _hx_str(n8) + " AS " + _hx_str(buf2)
487
+ dbl_cols.push(buf2)
488
+ end
489
+ end
490
+ sql_order = ""
491
+ begin
492
+ _g120 = 0
493
+ _g30 = key_cols.length
494
+ while(_g120 < _g30)
495
+ i20 = _g120
496
+ _g120+=1
497
+ sql_order += "," if i20 > 0
498
+ n9 = @local.get_quoted_column_name(key_cols[i20])
499
+ sql_order += n9
218
500
  end
219
501
  end
220
502
  rowid = "-3"
221
503
  rowid1 = "-3"
222
504
  rowid2 = "-3"
505
+ rowid3 = "-3"
223
506
  if rowid_name != nil
224
507
  rowid = rowid_name
225
508
  rowid1 = _hx_str(sql_table1) + "." + _hx_str(rowid_name)
226
509
  rowid2 = _hx_str(sql_table2) + "." + _hx_str(rowid_name)
510
+ rowid3 = _hx_str(sql_table3) + "." + _hx_str(rowid_name)
227
511
  end
228
- sql_inserts = "SELECT DISTINCT NULL, " + _hx_str(rowid) + " AS rowid, " + _hx_str(sql_all_cols) + " FROM " + _hx_str(sql_table2) + " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table1) + " WHERE " + _hx_str(sql_key_match) + ")"
229
- sql_inserts_order = ["NULL","rowid"].concat(all_cols)
230
- sql_updates = "SELECT DISTINCT " + _hx_str(rowid1) + " AS __coopy_rowid0, " + _hx_str(rowid2) + " AS __coopy_rowid1, " + _hx_str(sql_dbl_cols) + " FROM " + _hx_str(sql_table1) + " INNER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match) + " WHERE " + _hx_str(sql_data_mismatch)
231
- sql_updates_order = ["__coopy_rowid0","__coopy_rowid1"].concat(dbl_cols)
232
- sql_deletes = "SELECT DISTINCT " + _hx_str(rowid) + " AS rowid, NULL, " + _hx_str(sql_all_cols) + " FROM " + _hx_str(sql_table1) + " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table2) + " WHERE " + _hx_str(sql_key_match) + ")"
233
- sql_deletes_order = ["rowid","NULL"].concat(all_cols)
234
512
  @at0 = 1
235
513
  @at1 = 1
514
+ @at2 = 1
515
+ 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) + " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table1) + _hx_str(self.where(sql_key_match2)) + ")"
516
+ sql_inserts_order = ["__coopy_code","NULL","rowid","NULL"].concat(all_cols2)
236
517
  self.link_query(sql_inserts,sql_inserts_order)
518
+ 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) + " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table1) + _hx_str(self.where(sql_key_match3)) + ")"
520
+ sql_inserts_order1 = ["__coopy_code","NULL","NULL","rowid"].concat(all_cols3)
521
+ self.link_query(sql_inserts1,sql_inserts_order1)
522
+ end
523
+ sql_updates = "SELECT DISTINCT 2 AS __coopy_code, " + _hx_str(rowid1) + " AS __coopy_rowid0, " + _hx_str(rowid2) + " AS __coopy_rowid1, "
524
+ if @alt != nil
525
+ sql_updates += _hx_str(rowid3) + " AS __coopy_rowid2,"
526
+ else
527
+ sql_updates += " NULL,"
528
+ end
529
+ sql_updates += _hx_str(sql_dbl_cols) + " FROM " + _hx_str(sql_table1)
530
+ sql_updates += " INNER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match2) if sql_table1 != sql_table2
531
+ sql_updates += " INNER JOIN " + _hx_str(sql_table3) + " ON " + _hx_str(sql_key_match3) if @alt != nil && sql_table1 != sql_table3
532
+ sql_updates += self.where(sql_data_mismatch)
533
+ sql_updates_order = ["__coopy_code","__coopy_rowid0","__coopy_rowid1","__coopy_rowid2"].concat(dbl_cols)
237
534
  self.link_query(sql_updates,sql_updates_order)
238
- self.link_query(sql_deletes,sql_deletes_order)
239
- return @align
535
+ if @alt == nil
536
+ 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) + " WHERE NOT EXISTS (SELECT 1 FROM " + _hx_str(sql_table2) + _hx_str(self.where(sql_key_match2)) + ")"
537
+ sql_deletes_order = ["__coopy_code","rowid","NULL","NULL"].concat(all_cols1)
538
+ self.link_query(sql_deletes,sql_deletes_order)
539
+ end
540
+ if @alt != nil
541
+ sql_deletes1 = "SELECT 2 AS __coopy_code, " + _hx_str(rowid1) + " AS __coopy_rowid0, " + _hx_str(rowid2) + " AS __coopy_rowid1, "
542
+ sql_deletes1 += _hx_str(rowid3) + " AS __coopy_rowid2, "
543
+ sql_deletes1 += sql_dbl_cols
544
+ sql_deletes1 += " FROM " + _hx_str(sql_table1)
545
+ sql_deletes1 += " LEFT OUTER JOIN " + _hx_str(sql_table2) + " ON " + _hx_str(sql_key_match2)
546
+ sql_deletes1 += " LEFT OUTER JOIN " + _hx_str(sql_table3) + " ON " + _hx_str(sql_key_match3)
547
+ sql_deletes1 += " WHERE __coopy_rowid1 IS NULL OR __coopy_rowid2 IS NULL"
548
+ sql_deletes_order1 = ["__coopy_code","__coopy_rowid0","__coopy_rowid1","__coopy_rowid2"].concat(dbl_cols)
549
+ self.link_query(sql_deletes1,sql_deletes_order1)
550
+ end
551
+ @align
240
552
  end
241
553
 
242
554
  haxe_me ["coopy", "SqlCompare"]