daff 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/README.md +4 -1
  2. data/lib/daff.rb +20 -7
  3. data/lib/lib/coopy/alignment.rb +6 -0
  4. data/lib/lib/coopy/cell_info.rb +1 -0
  5. data/lib/lib/coopy/compare_flags.rb +2 -0
  6. data/lib/lib/coopy/compare_table.rb +1 -1
  7. data/lib/lib/coopy/coopy.rb +80 -18
  8. data/lib/lib/coopy/csv.rb +1 -1
  9. data/lib/lib/coopy/diff_render.rb +61 -22
  10. data/lib/lib/coopy/flat_cell_builder.rb +1 -1
  11. data/lib/lib/coopy/highlight_patch.rb +8 -6
  12. data/lib/lib/coopy/mover.rb +1 -1
  13. data/lib/lib/coopy/ndjson.rb +134 -0
  14. data/lib/lib/coopy/nested_cell_builder.rb +74 -0
  15. data/lib/lib/coopy/simple_view.rb +29 -0
  16. data/lib/lib/coopy/sql_column.rb +35 -0
  17. data/lib/lib/coopy/sql_compare.rb +245 -0
  18. data/lib/lib/coopy/sql_database.rb +19 -0
  19. data/lib/lib/coopy/sql_helper.rb +12 -0
  20. data/lib/lib/coopy/sql_table.rb +216 -0
  21. data/lib/lib/coopy/sql_table_name.rb +23 -0
  22. data/lib/lib/coopy/sqlite_helper.rb +47 -0
  23. data/lib/lib/coopy/table_diff.rb +18 -6
  24. data/lib/lib/coopy/table_io.rb +5 -0
  25. data/lib/lib/coopy/terminal_diff_render.rb +8 -9
  26. data/lib/lib/coopy/view.rb +5 -0
  27. data/lib/lib/haxe/ds/int_map.rb +4 -0
  28. data/lib/lib/haxe/ds/string_map.rb +4 -0
  29. data/lib/lib/haxe/format/json_parser.rb +8 -8
  30. data/lib/lib/haxe/imap.rb +1 -0
  31. data/lib/lib/haxe/io/bytes.rb +1 -1
  32. data/lib/lib/haxe/io/bytes_output.rb +1 -1
  33. data/lib/lib/haxe/io/error.rb +1 -0
  34. data/lib/lib/haxe/io/output.rb +2 -2
  35. data/lib/lib/hx_overrides.rb +12 -0
  36. data/lib/lib/hx_sys.rb +1 -1
  37. data/lib/lib/rb/boot.rb +5 -1
  38. data/lib/lib/reflect.rb +1 -0
  39. data/lib/lib/sys/io/file_handle.rb +1 -0
  40. data/lib/lib/sys/io/file_output.rb +1 -1
  41. data/lib/lib/value_type.rb +1 -0
  42. metadata +36 -25
@@ -62,7 +62,7 @@ module Coopy
62
62
  score+=1
63
63
  end
64
64
  end
65
- str = "_" + _hx_str(str) if str[score..-1] == _nil
65
+ str = "_" + _hx_str(str) if HxOverrides.substr(str,score,nil) == _nil
66
66
  return str
67
67
  end
68
68
 
@@ -8,6 +8,7 @@ module Coopy
8
8
  @source = source
9
9
  @patch = patch
10
10
  @view = patch.get_cell_view
11
+ @source_view = source.get_cell_view
11
12
  end
12
13
 
13
14
  protected
@@ -15,6 +16,7 @@ module Coopy
15
16
  attr_accessor :source
16
17
  attr_accessor :patch
17
18
  attr_accessor :view
19
+ attr_accessor :source_view
18
20
  attr_accessor :csv
19
21
  attr_accessor :header
20
22
  attr_accessor :header_pre
@@ -201,13 +203,13 @@ module Coopy
201
203
  if mod != nil
202
204
  if (mod[0].ord rescue nil) == 58
203
205
  move = true
204
- mod = mod[1,mod.length]
206
+ mod = HxOverrides.substr(mod,1,mod.length)
205
207
  end
206
208
  end
207
209
  @header[i] = name
208
210
  if mod != nil
209
211
  if (mod[0].ord rescue nil) == 40
210
- prev_name = mod[1,mod.length - 2]
212
+ prev_name = HxOverrides.substr(mod,1,mod.length - 2)
211
213
  @header_pre[prev_name] = i
212
214
  @header_post[name] = i
213
215
  @header_rename[prev_name] = name
@@ -276,13 +278,13 @@ module Coopy
276
278
 
277
279
  def check_act
278
280
  act = self.get_string(@rc_offset)
279
- ::Coopy::DiffRender.examine_cell(0,0,act,"",act,"",@row_info) if @row_info.value != act
281
+ ::Coopy::DiffRender.examine_cell(0,0,@view,act,"",act,"",@row_info) if @row_info.value != act
280
282
  end
281
283
 
282
284
  def get_pre_string(txt)
283
285
  self.check_act
284
286
  return txt if !@row_info.updated
285
- ::Coopy::DiffRender.examine_cell(0,0,txt,"",@row_info.value,"",@cell_info)
287
+ ::Coopy::DiffRender.examine_cell(0,0,@view,txt,"",@row_info.value,"",@cell_info)
286
288
  return txt if !@cell_info.updated
287
289
  return @cell_info.lvalue
288
290
  end
@@ -310,7 +312,7 @@ module Coopy
310
312
  end
311
313
 
312
314
  def process_mods(rmods,fate,len)
313
- rmods.sort{|a,b| self.sort_mods(a,b)}
315
+ rmods.sort!{|a,b| self.sort_mods(a,b)}
314
316
  offset = 0
315
317
  last = -1
316
318
  target = 0
@@ -512,7 +514,7 @@ module Coopy
512
514
  while(_it2.has_next) do
513
515
  c1 = _it2._next
514
516
  txt = @view.to_s(@patch.get_cell(c1,mod1.patch_row))
515
- ::Coopy::DiffRender.examine_cell(0,0,txt,"",@row_info.value,"",@cell_info)
517
+ ::Coopy::DiffRender.examine_cell(0,0,@view,txt,"",@row_info.value,"",@cell_info)
516
518
  next if !@cell_info.updated
517
519
  next if @cell_info.conflicted
518
520
  d = @view.to_datum(@csv.parse_cell(@cell_info.rvalue))
@@ -155,7 +155,7 @@ module Coopy
155
155
  k = _it._next
156
156
  blks.push(k)
157
157
  end
158
- blks.sort {|a,b|
158
+ blks.sort! {|a,b|
159
159
  return blk_len[b] - blk_len[a]
160
160
  }
161
161
  moved = Array.new
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class Ndjson
6
+
7
+ def initialize(tab)
8
+ @tab = tab
9
+ @view = tab.get_cell_view
10
+ @header_row = 0
11
+ end
12
+
13
+ protected
14
+
15
+ attr_accessor :tab
16
+ attr_accessor :view
17
+ attr_accessor :columns
18
+ attr_accessor :header_row
19
+
20
+ public
21
+
22
+ def render_row(r)
23
+ row = {}
24
+ begin
25
+ _g1 = 0
26
+ _g = @tab.get_width
27
+ while(_g1 < _g)
28
+ c = _g1
29
+ _g1+=1
30
+ key = @view.to_s(@tab.get_cell(c,@header_row))
31
+ key = "@:@" if c == 0 && @header_row == 1
32
+ begin
33
+ value = @tab.get_cell(c,r)
34
+ begin
35
+ value1 = value
36
+ row[key] = value1
37
+ end
38
+ end
39
+ end
40
+ end
41
+ return ::Haxe::Format::JsonPrinter._print(row,nil,nil)
42
+ end
43
+
44
+ def render
45
+ txt = ""
46
+ offset = 0
47
+ return txt if @tab.get_height == 0
48
+ return txt if @tab.get_width == 0
49
+ offset = 1 if @tab.get_cell(0,0) == "@:@"
50
+ @header_row = offset
51
+ begin
52
+ _g1 = @header_row + 1
53
+ _g = @tab.get_height
54
+ while(_g1 < _g)
55
+ r = _g1
56
+ _g1+=1
57
+ txt += self.render_row(r)
58
+ txt += "\n"
59
+ end
60
+ end
61
+ return txt
62
+ end
63
+
64
+ def add_row(r,txt)
65
+ json = ::Haxe::Format::JsonParser.new(txt).parse_rec
66
+ @columns = {} if @columns == nil
67
+ w = @tab.get_width
68
+ h = @tab.get_height
69
+ resize = false
70
+ begin
71
+ _g = 0
72
+ _g1 = Reflect.fields(json)
73
+ while(_g < _g1.length)
74
+ name = _g1[_g]
75
+ _g+=1
76
+ if !@columns.include?(name)
77
+ @columns[name] = w
78
+ w+=1
79
+ resize = true
80
+ end
81
+ end
82
+ end
83
+ if r >= h
84
+ h = r + 1
85
+ resize = true
86
+ end
87
+ @tab.resize(w,h) if resize
88
+ begin
89
+ _g2 = 0
90
+ _g11 = Reflect.fields(json)
91
+ while(_g2 < _g11.length)
92
+ name1 = _g11[_g2]
93
+ _g2+=1
94
+ v = Reflect.field(json,name1)
95
+ c = @columns[name1]
96
+ @tab.set_cell(c,r,v)
97
+ end
98
+ end
99
+ end
100
+
101
+ def add_header_row(r)
102
+ names = ::Rb::RubyIterator.new(@columns.keys)
103
+ _it = names
104
+ while(_it.has_next) do
105
+ n = _it._next
106
+ @tab.set_cell(@columns[n],r,@view.to_datum(n))
107
+ end
108
+ end
109
+
110
+ def parse(txt)
111
+ @columns = nil
112
+ rows = txt.split("\n")
113
+ h = rows.length
114
+ if h == 0
115
+ @tab.clear
116
+ return
117
+ end
118
+ h-=1 if rows[h - 1] == ""
119
+ begin
120
+ _g = 0
121
+ while(_g < h)
122
+ i = _g
123
+ _g+=1
124
+ at = h - i - 1
125
+ self.add_row(at + 1,rows[at])
126
+ end
127
+ end
128
+ self.add_header_row(0)
129
+ end
130
+
131
+ haxe_me
132
+ end
133
+
134
+ end
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class NestedCellBuilder
6
+
7
+ def initialize
8
+ end
9
+
10
+ protected
11
+
12
+ attr_accessor :view
13
+
14
+ public
15
+
16
+ def need_separator
17
+ return false
18
+ end
19
+
20
+ def set_separator(separator)
21
+ end
22
+
23
+ def set_conflict_separator(separator)
24
+ end
25
+
26
+ def set_view(view)
27
+ @view = view
28
+ end
29
+
30
+ def update(local,remote)
31
+ h = @view.make_hash
32
+ @view.hash_set(h,"before",local)
33
+ @view.hash_set(h,"after",remote)
34
+ return h
35
+ end
36
+
37
+ def conflict(parent,local,remote)
38
+ h = @view.make_hash
39
+ @view.hash_set(h,"before",parent)
40
+ @view.hash_set(h,"ours",local)
41
+ @view.hash_set(h,"theirs",remote)
42
+ return h
43
+ end
44
+
45
+ def marker(label)
46
+ return @view.to_datum(label)
47
+ end
48
+
49
+ protected
50
+
51
+ def neg_to_null(x)
52
+ return nil if x < 0
53
+ return x
54
+ end
55
+
56
+ public
57
+
58
+ def links(unit)
59
+ h = @view.make_hash
60
+ if unit.p >= -1
61
+ @view.hash_set(h,"before",self.neg_to_null(unit.p))
62
+ @view.hash_set(h,"ours",self.neg_to_null(unit.l))
63
+ @view.hash_set(h,"theirs",self.neg_to_null(unit.r))
64
+ return h
65
+ end
66
+ @view.hash_set(h,"before",self.neg_to_null(unit.l))
67
+ @view.hash_set(h,"after",self.neg_to_null(unit.r))
68
+ return h
69
+ end
70
+
71
+ haxe_me
72
+ end
73
+
74
+ end
@@ -23,6 +23,35 @@ module Coopy
23
23
  return x
24
24
  end
25
25
 
26
+ def make_hash
27
+ return {}
28
+ end
29
+
30
+ def hash_set(h,str,d)
31
+ hh = h
32
+ begin
33
+ value = d
34
+ begin
35
+ value1 = value
36
+ hh[str] = value1
37
+ end
38
+ end
39
+ end
40
+
41
+ def hash_exists(h,str)
42
+ hh = h
43
+ return hh.include?(str)
44
+ end
45
+
46
+ def hash_get(h,str)
47
+ hh = h
48
+ return hh[str]
49
+ end
50
+
51
+ def is_hash(h)
52
+ return h.respond_to? :keys
53
+ end
54
+
26
55
  haxe_me
27
56
  end
28
57
 
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class SqlColumn
6
+
7
+ def initialize
8
+ end
9
+
10
+ attr_accessor :name
11
+ attr_accessor :primary
12
+
13
+ def get_name
14
+ return @name
15
+ end
16
+
17
+ def is_primary_key
18
+ return @primary
19
+ end
20
+
21
+ 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
30
+ end
31
+
32
+ haxe_me
33
+ end
34
+
35
+ end
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ module Coopy
5
+ class SqlCompare
6
+
7
+ def initialize(db,local,remote)
8
+ @db = db
9
+ @local = local
10
+ @remote = remote
11
+ end
12
+
13
+ attr_accessor :db
14
+ attr_accessor :parent
15
+ attr_accessor :local
16
+ attr_accessor :remote
17
+
18
+ protected
19
+
20
+ attr_accessor :at0
21
+ attr_accessor :at1
22
+ attr_accessor :align
23
+
24
+ def equal_array(a1,a2)
25
+ return false if a1.length != a2.length
26
+ begin
27
+ _g1 = 0
28
+ _g = a1.length
29
+ while(_g1 < _g)
30
+ i = _g1
31
+ _g1+=1
32
+ return false if a1[i] != a2[i]
33
+ end
34
+ end
35
+ return true
36
+ end
37
+
38
+ public
39
+
40
+ def validate_schema
41
+ all_cols1 = @local.get_column_names
42
+ all_cols2 = @remote.get_column_names
43
+ return false if !self.equal_array(all_cols1,all_cols2)
44
+ key_cols1 = @local.get_primary_key
45
+ 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
49
+ end
50
+
51
+ protected
52
+
53
+ def denull(x)
54
+ return -1 if x == nil
55
+ return x
56
+ end
57
+
58
+ def link
59
+ i0 = self.denull(@db.get(0))
60
+ i1 = self.denull(@db.get(1))
61
+ if i0 == -3
62
+ i0 = @at0
63
+ @at0+=1
64
+ end
65
+ if i1 == -3
66
+ i1 = @at1
67
+ @at1+=1
68
+ end
69
+ factor = nil
70
+ if i0 >= 0 && i1 >= 0
71
+ factor = 2
72
+ else
73
+ factor = 1
74
+ end
75
+ offset = factor - 1
76
+ 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))
83
+ end
84
+ end
85
+ 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))
92
+ end
93
+ end
94
+ @align.link(i0,i1)
95
+ @align.add_to_order(i0,i1)
96
+ end
97
+
98
+ def link_query(query,order)
99
+ if @db._begin(query,nil,order)
100
+ while(@db.read)
101
+ self.link
102
+ end
103
+ @db._end
104
+ end
105
+ end
106
+
107
+ public
108
+
109
+ def apply
110
+ return nil if @db == nil
111
+ return nil if !self.validate_schema
112
+ rowid_name = @db.rowid
113
+ @align = ::Coopy::Alignment.new
114
+ key_cols = @local.get_primary_key
115
+ data_cols = @local.get_all_but_primary_key
116
+ all_cols = @local.get_column_names
117
+ @align.meta = ::Coopy::Alignment.new
118
+ begin
119
+ _g1 = 0
120
+ _g = all_cols.length
121
+ while(_g1 < _g)
122
+ i = _g1
123
+ _g1+=1
124
+ @align.meta.link(i,i)
125
+ end
126
+ 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
+ begin
134
+ _g11 = 0
135
+ _g2 = key_cols.length
136
+ while(_g11 < _g2)
137
+ i1 = _g11
138
+ _g11+=1
139
+ sql_key_cols += "," if i1 > 0
140
+ sql_key_cols += @local.get_quoted_column_name(key_cols[i1])
141
+ end
142
+ end
143
+ sql_all_cols = ""
144
+ begin
145
+ _g12 = 0
146
+ _g3 = all_cols.length
147
+ while(_g12 < _g3)
148
+ i2 = _g12
149
+ _g12+=1
150
+ sql_all_cols += "," if i2 > 0
151
+ sql_all_cols += @local.get_quoted_column_name(all_cols[i2])
152
+ end
153
+ end
154
+ sql_key_match = ""
155
+ begin
156
+ _g13 = 0
157
+ _g4 = key_cols.length
158
+ while(_g13 < _g4)
159
+ i3 = _g13
160
+ _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)
164
+ end
165
+ end
166
+ sql_data_mismatch = ""
167
+ begin
168
+ _g14 = 0
169
+ _g5 = data_cols.length
170
+ while(_g14 < _g5)
171
+ i4 = _g14
172
+ _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)
176
+ end
177
+ end
178
+ sql_dbl_cols = ""
179
+ dbl_cols = []
180
+ begin
181
+ _g15 = 0
182
+ _g6 = all_cols.length
183
+ while(_g15 < _g6)
184
+ i5 = _g15
185
+ _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")
194
+ end
195
+ end
196
+ sql_order = ""
197
+ begin
198
+ _g16 = 0
199
+ _g7 = key_cols.length
200
+ while(_g16 < _g7)
201
+ i6 = _g16
202
+ _g16+=1
203
+ sql_order += "," if i6 > 0
204
+ n3 = @local.get_quoted_column_name(key_cols[i6])
205
+ sql_order += n3
206
+ end
207
+ end
208
+ sql_dbl_order = ""
209
+ begin
210
+ _g17 = 0
211
+ _g8 = key_cols.length
212
+ while(_g17 < _g8)
213
+ i7 = _g17
214
+ _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)
218
+ end
219
+ end
220
+ rowid = "-3"
221
+ rowid1 = "-3"
222
+ rowid2 = "-3"
223
+ if rowid_name != nil
224
+ rowid = rowid_name
225
+ rowid1 = _hx_str(sql_table1) + "." + _hx_str(rowid_name)
226
+ rowid2 = _hx_str(sql_table2) + "." + _hx_str(rowid_name)
227
+ 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
+ @at0 = 1
235
+ @at1 = 1
236
+ self.link_query(sql_inserts,sql_inserts_order)
237
+ self.link_query(sql_updates,sql_updates_order)
238
+ self.link_query(sql_deletes,sql_deletes_order)
239
+ return @align
240
+ end
241
+
242
+ haxe_me
243
+ end
244
+
245
+ end