mass_record 0.0.2 → 0.0.3
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/lib/mass_record/version.rb +1 -1
- data/lib/mass_record.rb +49 -28
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa0932cb1a7cca3be43da636721f64a1bf561f99
|
4
|
+
data.tar.gz: 5a06ac8edb6dc364b469272afbb74195e174567c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4563ff2538f3580206787a73b93d43d798267099400b48806e32b5a29ea94e80bd4ee3d22c44975e481503d07490cb2d672619dfd07bbfbc5e444f68a57ac326
|
7
|
+
data.tar.gz: 784a6ed6e6747e55111289496e0e04169f963095e01f3162b2b8c4b72a77c37cf7c20fb1e19af9fd63dfacbcded5221cb835e042a47f7b5562b5a8c97b046a92
|
data/lib/mass_record/version.rb
CHANGED
data/lib/mass_record.rb
CHANGED
@@ -51,13 +51,18 @@ module MassRecord
|
|
51
51
|
}
|
52
52
|
|
53
53
|
object_array = [object_array] unless object_array.is_a? Array
|
54
|
+
return false if object_array.blank?
|
55
|
+
|
54
56
|
queue = []
|
55
57
|
|
56
58
|
object_array.each do |object|
|
57
|
-
queue << {key[:table] => object.class.
|
59
|
+
queue << {key[:table] => object.class.name, key[:operation] => operation, key[:object] => object} unless object.blank?
|
58
60
|
end
|
59
|
-
|
60
|
-
|
61
|
+
# begin
|
62
|
+
File.open(folder[:queued]+"/#{operation.to_s}_#{file_tag}.json",'w'){|f| f.write queue.to_json}
|
63
|
+
# rescue Exception => e
|
64
|
+
# pp "#{e.message}\n#{e.backtrace[0..5].pretty_inspect}".red
|
65
|
+
# end
|
61
66
|
end
|
62
67
|
|
63
68
|
def execute_queued_queries key:{
|
@@ -117,7 +122,7 @@ module MassRecord
|
|
117
122
|
# close database connection
|
118
123
|
|
119
124
|
# move to appropriate folder and remove '.processing' from the filename
|
120
|
-
errors_present = errors.any?{|op,tables| tables.has_key? :run_time or tables.any?{|table,col_sets| !
|
125
|
+
errors_present = errors.any?{|op,tables| tables.has_key? :run_time or tables.any?{|table,col_sets| !col_sets.blank?}}
|
121
126
|
errored_objects = collect_errored_objects found_in:errors, from:json_objects, key:key, synonyms:synonyms if errors_present
|
122
127
|
|
123
128
|
individual_errors = errors_present ? (query_per_object errored_objects, key:key, synonyms:synonyms) : []
|
@@ -213,7 +218,8 @@ module MassRecord
|
|
213
218
|
return {} if from.blank? or for_table.blank?
|
214
219
|
table = for_table
|
215
220
|
hashes = from.select{|o| o[key[:table]] == table}.collect{|x| x[key[:object]]}
|
216
|
-
model =
|
221
|
+
model = get_model from:for_table
|
222
|
+
connection = model.connection
|
217
223
|
pk = model.primary_key
|
218
224
|
|
219
225
|
# organize hashes based on whether they exist (based on their primary key(s)) in the table or not
|
@@ -223,16 +229,16 @@ module MassRecord
|
|
223
229
|
ids.each do |id|
|
224
230
|
equivalence_clauses = []
|
225
231
|
id.each do |k,v|
|
226
|
-
equivalence_clauses << "#{
|
232
|
+
equivalence_clauses << "#{k} = #{connection.quote(connection.type_cast(v, model.column_types[k]))}"
|
227
233
|
end
|
228
234
|
where_clauses << "(#{equivalence_clauses.join ' and '})"
|
229
235
|
end
|
230
|
-
existing_id_sets =
|
236
|
+
existing_id_sets = model.find_by_sql("SELECT #{pk.join ', '} FROM #{model.table_name} WHERE #{where_clauses.join ' OR '}").collect{|x| x.attributes} #.collect{|x| Hash[x.map.with_index{|x,i| [pk[i],x]}]}
|
231
237
|
insert_hashes = hashes.reject{|h| existing_id_sets.any?{|set| h == h.merge(set)}}
|
232
238
|
update_hashes = hashes.select{|h| existing_id_sets.any?{|set| h == h.merge(set)}}
|
233
239
|
else
|
234
240
|
ids = hashes.reject{|x| x[pk].blank?}.collect{|x| x[pk]} # should not include null values
|
235
|
-
existing_ids =
|
241
|
+
existing_ids = model.find_by_sql("SELECT #{pk} FROM #{model.table_name} WHERE #{pk} in ('#{ids.join "','"}')").collect{|x| x[pk]} # for some reason model.connection.execute returns the count
|
236
242
|
insert_hashes = hashes.reject{|x| existing_ids.include? x[pk].to_s}
|
237
243
|
update_hashes = hashes.select{|x| existing_ids.include? x[pk].to_s}
|
238
244
|
end
|
@@ -250,7 +256,7 @@ module MassRecord
|
|
250
256
|
sorted_hashes = sort_save_operations from:json_objects, for_table:table, key:key
|
251
257
|
|
252
258
|
# perform the appropriate operations
|
253
|
-
model = table
|
259
|
+
model = get_model from:table
|
254
260
|
errors += update sorted_hashes[:update], into:model unless sorted_hashes[:update].blank?
|
255
261
|
errors += insert sorted_hashes[:insert], into:model unless sorted_hashes[:insert].blank?
|
256
262
|
end
|
@@ -275,9 +281,19 @@ module MassRecord
|
|
275
281
|
end
|
276
282
|
end
|
277
283
|
|
284
|
+
def get_model from:nil
|
285
|
+
return from if from.is_a? Class
|
286
|
+
if from.is_a? String
|
287
|
+
model = from.constantize rescue nil
|
288
|
+
model = from.classify.constantize rescue nil if model.blank?
|
289
|
+
return model
|
290
|
+
end
|
291
|
+
return nil
|
292
|
+
end
|
293
|
+
|
278
294
|
def sql_for_insert hash, into:nil
|
279
295
|
return nil if hash.blank? or into.blank?
|
280
|
-
model =
|
296
|
+
model = get_model from:into
|
281
297
|
id_column_name = model.primary_key
|
282
298
|
created_at = model.attribute_alias?("created_at") ? model.attribute_alias("created_at") : "created_at"
|
283
299
|
updated_at = model.attribute_alias?("updated_at") ? model.attribute_alias("updated_at") : "updated_at"
|
@@ -288,7 +304,8 @@ module MassRecord
|
|
288
304
|
# assemble an individual query
|
289
305
|
im = Arel::InsertManager.new(ActiveRecord::Base)
|
290
306
|
unless id_column_name.is_a? Array # don't modify the id fields if there are concatenated primary keys
|
291
|
-
|
307
|
+
database_column = model.columns.select{|x| x.name == id_column_name}.first
|
308
|
+
h.delete id_column_name if h[id_column_name].blank? or (database_column.methods.include? :extra and database_column.extra == 'auto_increment')
|
292
309
|
end
|
293
310
|
h = convert_to_db_format h, model:model, created_at:created_at, updated_at:updated_at
|
294
311
|
pairs = h.collect do |k,v|
|
@@ -300,7 +317,7 @@ module MassRecord
|
|
300
317
|
|
301
318
|
def sql_for_update hash, into:nil
|
302
319
|
return nil if hash.blank? or into.blank?
|
303
|
-
model =
|
320
|
+
model = get_model from:into
|
304
321
|
id_column_name = model.primary_key
|
305
322
|
created_at = model.attribute_alias?("created_at") ? model.attribute_alias("created_at") : "created_at"
|
306
323
|
updated_at = model.attribute_alias?("updated_at") ? model.attribute_alias("updated_at") : "updated_at"
|
@@ -327,14 +344,15 @@ module MassRecord
|
|
327
344
|
begin
|
328
345
|
return false if hashes.blank? or into.blank?
|
329
346
|
hashes = [hashes] unless hashes.is_a? Array
|
347
|
+
model = get_model from:into
|
330
348
|
|
331
349
|
errors = []
|
332
350
|
# create an array of single insert queries
|
333
351
|
hashes.each do |hash|
|
334
|
-
sql = sql_for_insert hash, into:
|
352
|
+
sql = sql_for_insert hash, into:model
|
335
353
|
|
336
354
|
begin
|
337
|
-
query sql
|
355
|
+
query sql, connection:model
|
338
356
|
rescue Exception => e
|
339
357
|
puts e.message
|
340
358
|
errors << IndividualError.new(e,table:into,operation:"update",json_object:hash)
|
@@ -350,21 +368,20 @@ module MassRecord
|
|
350
368
|
begin
|
351
369
|
return false if hashes.blank? or into.blank?
|
352
370
|
hashes = [hashes] unless hashes.is_a? Array
|
371
|
+
model = get_model from:into
|
353
372
|
|
354
373
|
errors = []
|
355
374
|
# create an array of single insert queries
|
356
375
|
hashes.each do |hash|
|
357
|
-
sql = sql_for_insert hash, into:
|
376
|
+
sql = sql_for_insert hash, into:model
|
358
377
|
|
359
378
|
begin
|
360
|
-
query sql
|
379
|
+
query sql, connection:model
|
361
380
|
rescue Exception => e
|
362
381
|
puts e.message
|
363
382
|
errors << IndividualError.new(e,table:into,operation:"insert",json_object:hash)
|
364
383
|
end
|
365
384
|
end
|
366
|
-
|
367
|
-
# reparse the queries and execute them
|
368
385
|
return errors
|
369
386
|
rescue Exception => e
|
370
387
|
return (defined? errors) ? (errors << IndividualError.new(e, table:into, operation:"insert")) : [IndividualError.new( e, table:into, operation:"insert")]
|
@@ -405,7 +422,7 @@ module MassRecord
|
|
405
422
|
sorted_hashes = sort_save_operations from:json_objects, for_table:table, key:key
|
406
423
|
|
407
424
|
# perform the appropriate operations
|
408
|
-
model = table
|
425
|
+
model = get_model from:table
|
409
426
|
errors[table.to_sym] = {}
|
410
427
|
errors[table.to_sym].merge! mass_update sorted_hashes[:update], into:model unless sorted_hashes[:update].blank?
|
411
428
|
errors[table.to_sym].merge! mass_insert sorted_hashes[:insert], into:model unless sorted_hashes[:insert].blank?
|
@@ -422,7 +439,7 @@ module MassRecord
|
|
422
439
|
begin
|
423
440
|
return false if hashes.blank? or into.blank?
|
424
441
|
|
425
|
-
model =
|
442
|
+
model = get_model from:into
|
426
443
|
id_column_name = model.primary_key
|
427
444
|
created_at = model.attribute_alias?("created_at") ? model.attribute_alias("created_at") : "created_at"
|
428
445
|
updated_at = model.attribute_alias?("updated_at") ? model.attribute_alias("updated_at") : "updated_at"
|
@@ -492,12 +509,12 @@ module MassRecord
|
|
492
509
|
set_columns = []
|
493
510
|
|
494
511
|
set_fragments.each do |column, values|
|
495
|
-
set_columns << "#{column} = CASE #{model.table_name}.#{id_column_name} #{values.join ' '} END" unless id_column_name.is_a? Array
|
496
|
-
set_columns << "#{column} = CASE #{values.join ' '} END" if id_column_name.is_a? Array
|
512
|
+
set_columns << "#{column} = CASE #{model.table_name}.#{id_column_name} #{values.join ' ' } WHEN 'findabetterwaytodothis' THEN '0' END" unless id_column_name.is_a? Array #TODO: ugly hack, find a better solution
|
513
|
+
set_columns << "#{column} = CASE #{values.join ' '} WHEN 1=0 THEN '0' END" if id_column_name.is_a? Array
|
497
514
|
end
|
498
515
|
|
499
516
|
begin
|
500
|
-
query "#{update} #{set_columns.join ', '} #{where}"
|
517
|
+
query "#{update} #{set_columns.join ', '} #{where}", connection:model
|
501
518
|
rescue Exception => e
|
502
519
|
puts e.message
|
503
520
|
errors[column_set] = e
|
@@ -535,7 +552,7 @@ module MassRecord
|
|
535
552
|
return false if hashes.blank? or into.blank?
|
536
553
|
|
537
554
|
# create an array of single insert queries
|
538
|
-
model =
|
555
|
+
model = get_model from:into
|
539
556
|
concentrated_queries = {}
|
540
557
|
|
541
558
|
hashes.each do |hash|
|
@@ -557,7 +574,7 @@ module MassRecord
|
|
557
574
|
# reparse the queries and execute them
|
558
575
|
concentrated_queries.each do |column_set,clauses|
|
559
576
|
begin
|
560
|
-
query "#{clauses[:into]} VALUES #{clauses[:values].join(", ")}"
|
577
|
+
query "#{clauses[:into]} VALUES #{clauses[:values].join(", ")}", connection:model
|
561
578
|
rescue Exception => e
|
562
579
|
puts e.message
|
563
580
|
errors[column_set] = e
|
@@ -592,12 +609,16 @@ module MassRecord
|
|
592
609
|
return json_object
|
593
610
|
end
|
594
611
|
|
595
|
-
def query sql
|
596
|
-
|
612
|
+
def query sql, connection:database_connection
|
613
|
+
sql = sql.gsub /`(.*?)`/,'\1' # some queries don't like the "`"s
|
614
|
+
if connection.blank? # a blank value was passed in or the cached connection is empty
|
597
615
|
res = ActiveRecord::Base.connection.execute sql
|
598
616
|
ActiveRecord::Base.connection.close
|
617
|
+
elsif connection.is_a? Class and connection.ancestors.include? ActiveRecord::Base # an ActiveRecord Class was passed in
|
618
|
+
connection.connection.execute sql
|
619
|
+
connection.connection.close
|
599
620
|
else
|
600
|
-
res =
|
621
|
+
res = connection.execute sql
|
601
622
|
end
|
602
623
|
|
603
624
|
return res
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mass_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Hanna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: colorize
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sqlite3
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|