active_record_sql_exporter 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 424be3069f5c4eba7de91c11e9ecf4d5d1c992df
4
- data.tar.gz: ffe6c1b80be0cff1f5771b9b10d3e22864e9b486
3
+ metadata.gz: 1c44c585e477da643c57579a3ef10570114c0ff4
4
+ data.tar.gz: fdbba556edb6b9f70379c4713282e5bae63eb122
5
5
  SHA512:
6
- metadata.gz: 0177db7db64008aae9161e45244c72cd309185f9900aa3776f5553717d8066e5a7fe6f8a6a1a24bbbf1ab51b1d4affa07512d1ad49af7fa9a797326c8c45c39d
7
- data.tar.gz: 47cd991e77c821c7b86d1e9a8a7265976fba0870ab2e9a590eccfa24cf2a8c19ae2d801b0052c65912899b60d0a4ba6513fef1e6b0aae4897d1a476fbe6e6aa0
6
+ metadata.gz: c782f7eb0a7173f0a3927f922d9dc2f250278698640ef1f3fcbcf3abe24e03008c7d28f82ed477fee133007cc5f4e4cdfbb50c730fe9f3bc7efdef6b4a690718
7
+ data.tar.gz: 3b41f151a4084d599b9801ec24961e46c139b988024618b838443f55d4f1848fff28cff681063963a62c4580fb2c88ed93d259e84b41f38c9df0f6cf13b8621a
@@ -2,7 +2,7 @@
2
2
  module ActiveRecord::SqlExporter
3
3
  class NestedException < ArgumentError
4
4
  attr_accessor :old_exception, :klass
5
- def initialize( old_exception, klass, key )
5
+ def initialize(old_exception, klass, key)
6
6
  @old_exception = old_exception
7
7
  @klass = klass
8
8
  @key = key
@@ -14,29 +14,35 @@ module ActiveRecord::SqlExporter
14
14
  end
15
15
  end
16
16
  # ------------------------------------------------------------------ included?
17
- def included?( klass )
18
- klass.include( InstanceMethods )
19
- klass.extend( ClassMethods )
17
+ def included?(klass)
18
+ klass.include(InstanceMethods)
19
+ klass.extend(ClassMethods)
20
+ return if klass.respond_to?(:quote_value)
21
+ class_eval <<-EOC
22
+ def self.quote_value(*args)
23
+ connection.quote_value(*args)
24
+ end
25
+ EOC
20
26
  end
21
27
  ##############################################################################
22
28
  # FileWriter
23
29
  ##############################################################################
24
30
  class FileWriter
25
31
  # --------------------------------------------------------------- initialize
26
- def initialize( file )
32
+ def initialize(file)
27
33
  @file = file
28
34
  end
29
35
  # ------------------------------------------------------------------------ +
30
- def +( s )
31
- @file.write( s )
36
+ def +(s)
37
+ @file.write(s)
32
38
  return self
33
39
  end
34
40
  end
35
41
 
36
42
  module ClassMethods
37
43
  # ---------------------------------------------------------- build_check_sql
38
- def build_check_sql( id )
39
- "IF( NOT EXISTS( SELECT * FROM #{quoted_table_name} WHERE #{connection.quote_column_name(primary_key)} = #{quote_value(id, columns_hash[primary_key])} ) THEN ROLLBACK; END IF;\n"
44
+ def build_check_sql(id)
45
+ "IF( NOT EXISTS( SELECT * FROM #{quoted_table_name} WHERE #{connection.quote_column_name(primary_key)} = #{quote_value(id, columns_hash[primary_key])}) THEN ROLLBACK; END IF;\n"
40
46
  end
41
47
  end
42
48
 
@@ -44,17 +50,17 @@ module ActiveRecord::SqlExporter
44
50
  CREATION_NODE = 1
45
51
  EXISTENCE_CHECK_NODE = 2
46
52
  UPDATE_NODE = 3
47
- # --------------------- pretend_to_sql( args = {}, classes_to_ignore = [] )
48
- def print_relation_tree( args = {}, classes_to_ignore = [] )
53
+ # --------------------- pretend_to_sql(args = {}, classes_to_ignore = [])
54
+ def print_relation_tree(args = {}, classes_to_ignore = [])
49
55
  tree = {}
50
- _print_relation( tree, classes_to_ignore )
51
- return if classes_to_ignore.include?( self.class )
56
+ _print_relation(tree, classes_to_ignore)
57
+ return if classes_to_ignore.include?(self.class)
52
58
  end
53
59
  # ------------------------------------------------------------------- to_sql
54
- def to_backup_sql( args = {}, classes_to_ignore = [] )
60
+ def to_backup_sql(args = {}, classes_to_ignore = [])
55
61
  tree = {}
56
- build_export_tree( tree, classes_to_ignore )
57
- sql = args[:file] ? ActiveRecord::SqlExporter::FileWriter.new( args[:file] ) : ''
62
+ build_export_tree(tree, classes_to_ignore)
63
+ sql = args[:file] ? ActiveRecord::SqlExporter::FileWriter.new(args[:file]) : ''
58
64
  unless args[:no_transaction]
59
65
  sql += "BEGIN;"
60
66
  end
@@ -63,16 +69,16 @@ module ActiveRecord::SqlExporter
63
69
  node = tree[klass][id]
64
70
  begin
65
71
  if node[:type] == EXISTENCE_CHECK_NODE
66
- sql += klass.constantize.build_check_sql( id )
72
+ sql += klass.constantize.build_check_sql(id)
67
73
  elsif node[:type] == CREATION_NODE
68
74
  if id
69
- object = klass.constantize.find( id )
75
+ object = klass.constantize.find(id)
70
76
  sql += object.sql_restore_string
71
77
  end
72
78
  elsif node[:type] == UPDATE_NODE
73
79
  if id
74
- object = klass.constantize.find( id )
75
- sql += object.update_sql_string( node[:key] )
80
+ object = klass.constantize.find(id)
81
+ sql += object.update_sql_string(node[:key])
76
82
  end
77
83
  end
78
84
  rescue Encoding::UndefinedConversionError
@@ -83,17 +89,20 @@ module ActiveRecord::SqlExporter
83
89
  sql += "COMMIT;" unless args[:no_transaction]
84
90
  return sql
85
91
  end
86
- ################################################################################
87
- protected
88
- ################################################################################
92
+ ##############################################################################
93
+
94
+ protected
95
+
96
+ ##############################################################################
89
97
  # -------------------------------------------------------- update_sql_string
90
- def update_sql_string( key_name )
98
+ def update_sql_string(key_name)
91
99
  data = []
92
100
  self.class.columns.map do |x|
93
101
  next if is_primary_key_field?(x)
94
- data << "#{self.class.connection.quote_column_name( x.name )}=#{self.class.connection.quote( read_attribute(x.name))}"
102
+ data << "#{self.class.connection.quote_column_name(x.name)}=#{self.class.connection.quote(read_attribute(x.name))}"
95
103
  end
96
- "UPDATE #{self.class.quoted_table_name} SET #{data.join(',')} WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)};\n"
104
+ quoted_id = self.class.quote_value(id, self.class.columns_hash[self.class.primary_key])
105
+ "UPDATE #{self.class.quoted_table_name} SET #{data.join(',')} WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{quoted_id};\n"
97
106
  end
98
107
 
99
108
  def is_primary_key_field?(col)
@@ -101,12 +110,12 @@ module ActiveRecord::SqlExporter
101
110
  end
102
111
 
103
112
  # ------------------------------------------------------- sql_restore_string
104
- def sql_restore_string( args = {} )
113
+ def sql_restore_string(args = {})
105
114
  columns = self.class.columns.map do |x|
106
- self.class.connection.quote_column_name( x.name )
115
+ self.class.connection.quote_column_name(x.name)
107
116
  end
108
117
  values = self.class.columns.map do |x|
109
- self.class.connection.quote( read_attribute( x.name ) )
118
+ self.class.connection.quote(read_attribute(x.name))
110
119
  end
111
120
 
112
121
  sql = "\nINSERT INTO #{self.class.quoted_table_name} (#{columns.join(',')}) VALUES (#{values.join(',')})"
@@ -121,16 +130,16 @@ module ActiveRecord::SqlExporter
121
130
  return sql
122
131
  end
123
132
  # -------------------------------------------------------- build_export_tree
124
- def build_export_tree( tree = {}, classes_to_ignore = [] )
125
- return if classes_to_ignore.include?( self.class )
126
- if tree[self.class.name].nil? || ( tree[self.class.name] && ( tree[self.class.name][id].nil? || tree[self.class.name][id][:type] == EXISTENCE_CHECK_NODE ) )
127
- self.add_to_tree( tree, CREATION_NODE )
128
- expand_tree_with_relations( tree, self.class.reflections, classes_to_ignore )
133
+ def build_export_tree(tree = {}, classes_to_ignore = [])
134
+ return if classes_to_ignore.include?(self.class)
135
+ if tree[self.class.name].nil? || (tree[self.class.name] && (tree[self.class.name][id].nil? || tree[self.class.name][id][:type] == EXISTENCE_CHECK_NODE))
136
+ self.add_to_tree(tree, CREATION_NODE)
137
+ expand_tree_with_relations(tree, self.class.reflections, classes_to_ignore)
129
138
  end
130
139
  return tree
131
140
  end
132
141
  # ------------------------------------------------------------- add_to_tree
133
- def add_to_tree( tree, type, options = {} )
142
+ def add_to_tree(tree, type, options = {})
134
143
  tree[self.class.name] ||= {}
135
144
  node = tree[self.class.name][self.id]
136
145
  if node.nil? || node[:type] == EXISTENCE_CHECK_NODE
@@ -141,17 +150,17 @@ module ActiveRecord::SqlExporter
141
150
  end
142
151
  # ---------------------------------------------------------- build_check_sql
143
152
  def build_check_sql
144
- "IF( NOT EXISTS( SELECT * FROM #{self.class.quoted_table_name} WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)} ) THEN ROLLBACK; END IF;\n"
153
+ "IF( NOT EXISTS( SELECT * FROM #{self.class.quoted_table_name} WHERE #{self.class.connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)}) THEN ROLLBACK; END IF;\n"
145
154
  end
146
155
  # ---------------------------------------- convert_has_many_relations_to_sql
147
- def expand_tree_with_relations( tree, reflections, classes_to_ignore )
156
+ def expand_tree_with_relations(tree, reflections, classes_to_ignore)
148
157
  reflections.each_pair do |key, value|
149
- next if value.options[:dependent] && ![:destroy, :nullify].include?( value.options[:dependent] )
158
+ next if value.options[:dependent] && ![:destroy, :nullify].include?(value.options[:dependent])
150
159
  if value.options[:polymorphic]
151
- next if classes_to_ignore.include?( send( key ).class )
160
+ next if classes_to_ignore.include?(send(key).class)
152
161
  else
153
162
  begin
154
- next if classes_to_ignore.include?( value.klass )
163
+ next if classes_to_ignore.include?(value.klass)
155
164
  rescue
156
165
  raise "Problem in a #{self.class.name} with #{key} = #{value}"
157
166
  end
@@ -159,33 +168,33 @@ module ActiveRecord::SqlExporter
159
168
  case value.macro
160
169
  when :has_one
161
170
  begin
162
- singleton_method( key ) do |e|
163
- e.build_export_tree( tree, classes_to_ignore )
171
+ singleton_method(key) do |e|
172
+ e.build_export_tree(tree, classes_to_ignore)
164
173
  end
165
174
  rescue NestedException => ex
166
- raise NestedException.new( ex.old_exception, "#{self.class.name}.#{ex.klass}", key )
175
+ raise NestedException.new(ex.old_exception, "#{self.class.name}.#{ex.klass}", key)
167
176
  rescue Exception => ex
168
- raise NestedException.new( ex, self.class.name, key )
177
+ raise NestedException.new(ex, self.class.name, key)
169
178
  end
170
179
  when :has_many, :has_and_belongs_to_many
171
180
  begin
172
- records = send( key )
181
+ records = send(key)
173
182
  if value.options[:dependent] == :nullify
174
183
  records.each do |record|
175
- record.add_to_tree( tree, UPDATE_NODE, key: value.association_primary_key )
184
+ record.add_to_tree(tree, UPDATE_NODE, key: value.association_primary_key)
176
185
  end
177
186
  else
178
- records.each{ |x| x.build_export_tree( tree, classes_to_ignore ) }
187
+ records.each{ |x| x.build_export_tree(tree, classes_to_ignore) }
179
188
  end
180
189
  rescue NestedException => ex
181
- raise NestedException.new( ex.old_exception, "#{self.class.name}.#{ex.klass}", key )
190
+ raise NestedException.new(ex.old_exception, "#{self.class.name}.#{ex.klass}", key)
182
191
  rescue Exception => ex
183
192
  raise ex
184
- raise NestedException.new( ex, self.class.name, key )
193
+ raise NestedException.new(ex, self.class.name, key)
185
194
  end
186
195
  when :belongs_to
187
- singleton_method( key ) do |e|
188
- e.add_to_tree( tree, EXISTENCE_CHECK_NODE )
196
+ singleton_method(key) do |e|
197
+ e.add_to_tree(tree, EXISTENCE_CHECK_NODE)
189
198
  end
190
199
  else
191
200
  raise "Unhandled reflection: #{value.macro}"
@@ -194,41 +203,41 @@ module ActiveRecord::SqlExporter
194
203
  return tree
195
204
  end
196
205
  # ----------------------------------------------------------- print_relation
197
- def _print_relation( tree, classes_to_ignore, indent_depth = 0 )
198
- if tree[self.class.name].nil? || ( tree[self.class.name] && ( tree[self.class.name][id].nil? || tree[self.class.name][id][:type] == EXISTENCE_CHECK_NODE ) )
206
+ def _print_relation(tree, classes_to_ignore, indent_depth = 0)
207
+ if tree[self.class.name].nil? || (tree[self.class.name] && (tree[self.class.name][id].nil? || tree[self.class.name][id][:type] == EXISTENCE_CHECK_NODE))
199
208
  puts "%s%s - %d" % ["\t" * indent_depth, self.class.name, self.id]
200
- self.add_to_tree( tree, CREATION_NODE )
201
- _print_reflection_relations( tree, self.class.reflections, classes_to_ignore, indent_depth + 1 )
209
+ self.add_to_tree(tree, CREATION_NODE)
210
+ _print_reflection_relations(tree, self.class.reflections, classes_to_ignore, indent_depth + 1)
202
211
  end
203
212
  end
204
213
  # ---------------------------------------- convert_has_many_relations_to_sql
205
- def _print_reflection_relations( tree, reflections, classes_to_ignore, indent_level = 1 )
214
+ def _print_reflection_relations(tree, reflections, classes_to_ignore, indent_level = 1)
206
215
  reflections.each_pair do |key, value|
207
- next if value.options[:dependent] && ![:destroy, :nullify].include?( value.options[:dependent] )
216
+ next if value.options[:dependent] && ![:destroy, :nullify].include?(value.options[:dependent])
208
217
  if value.options[:polymorphic]
209
- next if classes_to_ignore.include?( send( key ).class )
218
+ next if classes_to_ignore.include?(send(key).class)
210
219
  else
211
220
  begin
212
- next if classes_to_ignore.include?( value.klass )
221
+ next if classes_to_ignore.include?(value.klass)
213
222
  rescue
214
223
  raise "Problem in a #{self.class.name} with #{key} = #{value}"
215
224
  end
216
225
  end
217
226
  case value.macro
218
227
  when :has_one
219
- singleton_method( key ) do |e|
220
- e._print_relation( tree, classes_to_ignore, indent_level )
228
+ singleton_method(key) do |e|
229
+ e._print_relation(tree, classes_to_ignore, indent_level)
221
230
  end
222
231
  when :has_many, :has_and_belongs_to_many
223
- records = send( key )
232
+ records = send(key)
224
233
  if value.options[:dependent] == :nullify
225
234
  records.each do |record|
226
- record.add_to_tree( tree, UPDATE_NODE, key: value.primary_key_name )
235
+ record.add_to_tree(tree, UPDATE_NODE, key: value.primary_key_name)
227
236
  puts "%s%s [UPDATE] - %d" % ["\t" * indent_level, record.class.name, record.id]
228
237
  end
229
238
  else
230
239
  records.each do |x|
231
- x._print_relation( tree, classes_to_ignore, indent_level )
240
+ x._print_relation(tree, classes_to_ignore, indent_level)
232
241
  end
233
242
  end
234
243
  when :belongs_to
@@ -238,8 +247,8 @@ module ActiveRecord::SqlExporter
238
247
  end
239
248
  end
240
249
  # --------------------------------------------------------- singleton_method
241
- def singleton_method( key )
242
- if v = self.send( key )
250
+ def singleton_method(key)
251
+ if v = self.send(key)
243
252
  yield v
244
253
  end
245
254
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_sql_exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Palmblad
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-21 00:00:00.000000000 Z
11
+ date: 2018-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails