activerecord-import 0.19.0 → 0.19.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9a15b84eab5c3e37adc77106a0c55a8cb030d6d3
4
- data.tar.gz: b2cab0765b2dcb2465dd6178a767836da1b61d65
3
+ metadata.gz: 2ccaefe9611ff80d350abf4beca0e741a23c0167
4
+ data.tar.gz: 374da8395b259808c29d102df17bde738046d428
5
5
  SHA512:
6
- metadata.gz: c70a9f7ea0ac30697a9342d3243b459a38fc78048ee7287b4172da5353939fd4fbb73567a9ab7c79b7b0ef9e3a367b8ea9c0e6ec78c89050db36964735fc4782
7
- data.tar.gz: 1193d03b7d5ddb8cab84110a2d34c57df9a5c6fca2d38c9967d64dd0e9573d7b3c85a88c3448b3f5a6270a6ddafc459083e5fecd2d50a26a79d7c7c50184ce3a
6
+ metadata.gz: 527652ab74bcf4a44014ba016b846f403e0d94a1b57450d36ea35a65702fcd15a9c273ab82de42278c0fc1c7dd84baee16425d0afab17d425ba36cebbb500d56
7
+ data.tar.gz: 82f9e31dfe9c002eddedb59e34b4a6f3d3763504f5932d8fbd15a8c39630ae385a5fdbe6006d5aaef5841a6d158eedc19f8158b090f9e1fd7fd43ef219d6aa8d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## Changes in 0.19.1
2
+
3
+ ### Fixes
4
+
5
+ * Fix a regression where models weren't properly being marked clean. Thanks to @tjwp via \#434.
6
+ * Raise ActiveRecord::Import::ValueSetTooLargeError when a record being inserted exceeds the
7
+ `max_allowed_packet` for MySQL. Thanks to @saizai, @jkowens via \#437.
8
+ * Fix issue concatenating column names array with primary key. Thanks to @keeguon via \#440.
9
+
1
10
  ## Changes in 0.19.0
2
11
 
3
12
  ### New Features
@@ -497,7 +497,7 @@ class ActiveRecord::Base
497
497
 
498
498
  if !symbolized_primary_key.to_set.subset?(symbolized_column_names.to_set) && connection.prefetch_primary_key? && sequence_name
499
499
  column_count = column_names.size
500
- column_names.concat(primary_key).uniq!
500
+ column_names.concat(Array(primary_key)).uniq!
501
501
  columns_added = column_names.size - column_count
502
502
  new_fields = Array.new(columns_added)
503
503
  array_of_attributes.each { |a| a.concat(new_fields) }
@@ -657,14 +657,6 @@ class ActiveRecord::Base
657
657
  def set_attributes_and_mark_clean(models, import_result, timestamps)
658
658
  return if models.nil?
659
659
  models -= import_result.failed_instances
660
- models.each do |model|
661
- if model.respond_to?(:clear_changes_information) # Rails 4.0 and higher
662
- model.clear_changes_information
663
- else # Rails 3.2
664
- model.instance_variable_get(:@changed_attributes).clear
665
- end
666
- model.instance_variable_set(:@new_record, false)
667
- end
668
660
 
669
661
  # if ids were returned for all models we know all were updated
670
662
  if models.size == import_result.ids.size
@@ -677,6 +669,15 @@ class ActiveRecord::Base
677
669
  end
678
670
  end
679
671
  end
672
+
673
+ models.each do |model|
674
+ if model.respond_to?(:clear_changes_information) # Rails 4.0 and higher
675
+ model.clear_changes_information
676
+ else # Rails 3.2
677
+ model.instance_variable_get(:@changed_attributes).clear
678
+ end
679
+ model.instance_variable_set(:@new_record, false)
680
+ end
680
681
  end
681
682
 
682
683
  def import_associations(models, options)
@@ -1,4 +1,12 @@
1
1
  module ActiveRecord::Import
2
+ class ValueSetTooLargeError < StandardError
3
+ attr_reader :size
4
+ def initialize(msg = "Value set exceeds max size", size = 0)
5
+ @size = size
6
+ super(msg)
7
+ end
8
+ end
9
+
2
10
  class ValueSetsBytesParser
3
11
  attr_reader :reserved_bytes, :max_bytes, :values
4
12
 
@@ -18,6 +26,12 @@ module ActiveRecord::Import
18
26
  current_size = 0
19
27
  values.each_with_index do |val, i|
20
28
  comma_bytes = arr.size
29
+ insert_size = reserved_bytes + val.bytesize
30
+
31
+ if insert_size > max_bytes
32
+ raise ValueSetTooLargeError.new("#{insert_size} bytes exceeds the max allowed for an insert [#{@max_bytes}]", insert_size)
33
+ end
34
+
21
35
  bytes_thus_far = reserved_bytes + current_size + val.bytesize + comma_bytes
22
36
  if bytes_thus_far <= max_bytes
23
37
  current_size += val.bytesize
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Import
3
- VERSION = "0.19.0".freeze
3
+ VERSION = "0.19.1".freeze
4
4
  end
5
5
  end
@@ -24,6 +24,30 @@ def should_support_postgresql_import_functionality
24
24
  end
25
25
  end
26
26
 
27
+ context "setting attributes and marking clean" do
28
+ let(:topic) { Build(:topics) }
29
+
30
+ setup { Topic.import([topic]) }
31
+
32
+ it "assigns ids" do
33
+ assert topic.id.present?
34
+ end
35
+
36
+ it "marks models as clean" do
37
+ assert !topic.changed?
38
+ end
39
+
40
+ it "marks models as persisted" do
41
+ assert !topic.new_record?
42
+ assert topic.persisted?
43
+ end
44
+
45
+ it "assigns timestamps" do
46
+ assert topic.created_at.present?
47
+ assert topic.updated_at.present?
48
+ end
49
+ end
50
+
27
51
  describe "with query cache enabled" do
28
52
  setup do
29
53
  unless ActiveRecord::Base.connection.query_cache_enabled
@@ -8,6 +8,15 @@ describe ActiveRecord::Import::ValueSetsBytesParser do
8
8
  let(:base_sql) { "INSERT INTO atable (a,b,c)" }
9
9
  let(:values) { ["(1,2,3)", "(2,3,4)", "(3,4,5)"] }
10
10
 
11
+ context "when the max allowed bytes is 30 and the base SQL is 26 bytes" do
12
+ it "should raise ActiveRecord::Import::ValueSetTooLargeError" do
13
+ error = assert_raises ActiveRecord::Import::ValueSetTooLargeError do
14
+ parser.parse values, reserved_bytes: base_sql.size, max_bytes: 30
15
+ end
16
+ assert_match(/33 bytes exceeds the max allowed for an insert \[30\]/, error.message)
17
+ end
18
+ end
19
+
11
20
  context "when the max allowed bytes is 33 and the base SQL is 26 bytes" do
12
21
  it "should return 3 value sets when given 3 value sets of 7 bytes a piece" do
13
22
  value_sets = parser.parse values, reserved_bytes: base_sql.size, max_bytes: 33
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0
4
+ version: 0.19.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-13 00:00:00.000000000 Z
11
+ date: 2017-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord