activerecord-import 0.14.1 → 1.4.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 +5 -5
- data/.github/workflows/test.yaml +107 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +74 -8
- data/Brewfile +3 -1
- data/CHANGELOG.md +448 -2
- data/Gemfile +26 -19
- data/LICENSE +21 -56
- data/README.markdown +568 -32
- data/Rakefile +5 -1
- data/activerecord-import.gemspec +8 -7
- data/benchmarks/README +2 -2
- data/benchmarks/benchmark.rb +8 -1
- data/benchmarks/lib/base.rb +2 -0
- data/benchmarks/lib/cli_parser.rb +5 -2
- data/benchmarks/lib/float.rb +2 -0
- data/benchmarks/lib/mysql2_benchmark.rb +2 -0
- data/benchmarks/lib/output_to_csv.rb +2 -0
- data/benchmarks/lib/output_to_html.rb +4 -2
- data/benchmarks/models/test_innodb.rb +2 -0
- data/benchmarks/models/test_memory.rb +2 -0
- data/benchmarks/models/test_myisam.rb +2 -0
- data/benchmarks/schema/{mysql_schema.rb → mysql2_schema.rb} +2 -0
- data/gemfiles/4.2.gemfile +4 -3
- data/gemfiles/5.0.gemfile +4 -3
- data/gemfiles/5.1.gemfile +4 -0
- data/gemfiles/5.2.gemfile +4 -0
- data/gemfiles/6.0.gemfile +4 -0
- data/gemfiles/6.1.gemfile +4 -0
- data/gemfiles/7.0.gemfile +4 -0
- data/lib/activerecord-import/active_record/adapters/abstract_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb +6 -4
- data/lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/jdbcsqlite3_adapter.rb +8 -0
- data/lib/activerecord-import/active_record/adapters/mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/postgresql_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/seamless_database_pool_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/abstract_adapter.rb +12 -16
- data/lib/activerecord-import/adapters/em_mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/mysql_adapter.rb +35 -18
- data/lib/activerecord-import/adapters/postgresql_adapter.rb +107 -28
- data/lib/activerecord-import/adapters/sqlite3_adapter.rb +141 -18
- data/lib/activerecord-import/base.rb +15 -8
- data/lib/activerecord-import/import.rb +642 -178
- data/lib/activerecord-import/mysql2.rb +2 -0
- data/lib/activerecord-import/postgresql.rb +2 -0
- data/lib/activerecord-import/sqlite3.rb +2 -0
- data/lib/activerecord-import/synchronize.rb +5 -3
- data/lib/activerecord-import/value_sets_parser.rb +29 -3
- data/lib/activerecord-import/version.rb +3 -1
- data/lib/activerecord-import.rb +5 -16
- data/test/adapters/jdbcmysql.rb +2 -0
- data/test/adapters/jdbcpostgresql.rb +2 -0
- data/test/adapters/jdbcsqlite3.rb +3 -0
- data/test/adapters/makara_postgis.rb +3 -0
- data/test/adapters/mysql2.rb +2 -0
- data/test/adapters/mysql2_makara.rb +2 -0
- data/test/adapters/mysql2spatial.rb +2 -0
- data/test/adapters/postgis.rb +2 -0
- data/test/adapters/postgresql.rb +2 -0
- data/test/adapters/postgresql_makara.rb +2 -0
- data/test/adapters/seamless_database_pool.rb +2 -0
- data/test/adapters/spatialite.rb +2 -0
- data/test/adapters/sqlite3.rb +2 -0
- data/test/{travis → github}/database.yml +7 -1
- data/test/import_test.rb +498 -32
- data/test/jdbcmysql/import_test.rb +2 -1
- data/test/jdbcpostgresql/import_test.rb +2 -1
- data/test/jdbcsqlite3/import_test.rb +6 -0
- data/test/makara_postgis/import_test.rb +10 -0
- data/test/models/account.rb +5 -0
- data/test/models/alarm.rb +4 -0
- data/test/models/animal.rb +8 -0
- data/test/models/bike_maker.rb +9 -0
- data/test/models/book.rb +4 -0
- data/test/models/car.rb +5 -0
- data/test/models/card.rb +5 -0
- data/test/models/chapter.rb +2 -0
- data/test/models/customer.rb +8 -0
- data/test/models/deck.rb +8 -0
- data/test/models/dictionary.rb +6 -0
- data/test/models/discount.rb +2 -0
- data/test/models/end_note.rb +2 -0
- data/test/models/group.rb +2 -0
- data/test/models/order.rb +8 -0
- data/test/models/playing_card.rb +4 -0
- data/test/models/promotion.rb +2 -0
- data/test/models/question.rb +2 -0
- data/test/models/rule.rb +2 -0
- data/test/models/tag.rb +7 -0
- data/test/models/tag_alias.rb +5 -0
- data/test/models/topic.rb +16 -0
- data/test/models/user.rb +5 -0
- data/test/models/user_token.rb +6 -0
- data/test/models/vendor.rb +9 -0
- data/test/models/widget.rb +18 -0
- data/test/mysql2/import_test.rb +2 -0
- data/test/mysql2_makara/import_test.rb +2 -0
- data/test/mysqlspatial2/import_test.rb +2 -0
- data/test/postgis/import_test.rb +6 -0
- data/test/postgresql/import_test.rb +2 -4
- data/test/schema/generic_schema.rb +88 -3
- data/test/schema/jdbcpostgresql_schema.rb +3 -0
- data/test/schema/mysql2_schema.rb +21 -0
- data/test/schema/postgis_schema.rb +3 -0
- data/test/schema/postgresql_schema.rb +63 -0
- data/test/schema/sqlite3_schema.rb +15 -0
- data/test/schema/version.rb +2 -0
- data/test/sqlite3/import_test.rb +4 -50
- data/test/support/active_support/test_case_extensions.rb +8 -1
- data/test/support/assertions.rb +2 -0
- data/test/support/factories.rb +17 -8
- data/test/support/generate.rb +10 -8
- data/test/support/mysql/import_examples.rb +17 -3
- data/test/support/postgresql/import_examples.rb +442 -9
- data/test/support/shared_examples/on_duplicate_key_ignore.rb +45 -0
- data/test/support/shared_examples/on_duplicate_key_update.rb +278 -1
- data/test/support/shared_examples/recursive_import.rb +137 -12
- data/test/support/sqlite3/import_examples.rb +232 -0
- data/test/synchronize_test.rb +10 -0
- data/test/test_helper.rb +44 -3
- data/test/value_sets_bytes_parser_test.rb +15 -2
- data/test/value_sets_records_parser_test.rb +2 -0
- metadata +74 -22
- data/.travis.yml +0 -52
- data/gemfiles/3.2.gemfile +0 -3
- data/gemfiles/4.0.gemfile +0 -3
- data/gemfiles/4.1.gemfile +0 -3
- data/test/schema/mysql_schema.rb +0 -16
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord # :nodoc:
|
|
2
4
|
class Base # :nodoc:
|
|
3
5
|
# Synchronizes the passed in ActiveRecord instances with data
|
|
@@ -31,7 +33,7 @@ module ActiveRecord # :nodoc:
|
|
|
31
33
|
|
|
32
34
|
klass = instances.first.class
|
|
33
35
|
|
|
34
|
-
fresh_instances = klass.where(conditions).order(order)
|
|
36
|
+
fresh_instances = klass.unscoped.where(conditions).order(order)
|
|
35
37
|
instances.each do |instance|
|
|
36
38
|
matched_instance = fresh_instances.detect do |fresh_instance|
|
|
37
39
|
keys.all? { |key| fresh_instance.send(key) == instance.send(key) }
|
|
@@ -39,8 +41,8 @@ module ActiveRecord # :nodoc:
|
|
|
39
41
|
|
|
40
42
|
next unless matched_instance
|
|
41
43
|
|
|
42
|
-
instance.
|
|
43
|
-
instance.send :
|
|
44
|
+
instance.instance_variable_set :@association_cache, {}
|
|
45
|
+
instance.send :clear_aggregation_cache if instance.respond_to?(:clear_aggregation_cache, true)
|
|
44
46
|
instance.instance_variable_set :@attributes, matched_instance.instance_variable_get(:@attributes)
|
|
45
47
|
|
|
46
48
|
if instance.respond_to?(:clear_changes_information)
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_support/core_ext/array'
|
|
4
|
+
|
|
1
5
|
module ActiveRecord::Import
|
|
6
|
+
class ValueSetTooLargeError < StandardError
|
|
7
|
+
attr_reader :size
|
|
8
|
+
def initialize(msg = "Value set exceeds max size", size = 0)
|
|
9
|
+
@size = size
|
|
10
|
+
super(msg)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
2
14
|
class ValueSetsBytesParser
|
|
3
15
|
attr_reader :reserved_bytes, :max_bytes, :values
|
|
4
16
|
|
|
@@ -8,8 +20,8 @@ module ActiveRecord::Import
|
|
|
8
20
|
|
|
9
21
|
def initialize(values, options)
|
|
10
22
|
@values = values
|
|
11
|
-
@reserved_bytes = options[:reserved_bytes]
|
|
12
|
-
@max_bytes = options
|
|
23
|
+
@reserved_bytes = options[:reserved_bytes] || 0
|
|
24
|
+
@max_bytes = options.fetch(:max_bytes) { default_max_bytes }
|
|
13
25
|
end
|
|
14
26
|
|
|
15
27
|
def parse
|
|
@@ -18,6 +30,12 @@ module ActiveRecord::Import
|
|
|
18
30
|
current_size = 0
|
|
19
31
|
values.each_with_index do |val, i|
|
|
20
32
|
comma_bytes = arr.size
|
|
33
|
+
insert_size = reserved_bytes + val.bytesize
|
|
34
|
+
|
|
35
|
+
if insert_size > max_bytes
|
|
36
|
+
raise ValueSetTooLargeError.new("#{insert_size} bytes exceeds the max allowed for an insert [#{@max_bytes}]", insert_size)
|
|
37
|
+
end
|
|
38
|
+
|
|
21
39
|
bytes_thus_far = reserved_bytes + current_size + val.bytesize + comma_bytes
|
|
22
40
|
if bytes_thus_far <= max_bytes
|
|
23
41
|
current_size += val.bytesize
|
|
@@ -32,7 +50,15 @@ module ActiveRecord::Import
|
|
|
32
50
|
value_sets << arr if i == (values.size - 1)
|
|
33
51
|
end
|
|
34
52
|
|
|
35
|
-
|
|
53
|
+
value_sets
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def default_max_bytes
|
|
59
|
+
values_in_bytes = values.sum(&:bytesize)
|
|
60
|
+
comma_separated_bytes = values.size - 1
|
|
61
|
+
reserved_bytes + values_in_bytes + comma_separated_bytes
|
|
36
62
|
end
|
|
37
63
|
end
|
|
38
64
|
|
data/lib/activerecord-import.rb
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
# rubocop:disable
|
|
1
|
+
# rubocop:disable Naming/FileName
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
class ActiveRecord::Base
|
|
5
|
-
class << self
|
|
6
|
-
def establish_connection_with_activerecord_import(*args)
|
|
7
|
-
conn = establish_connection_without_activerecord_import(*args)
|
|
8
|
-
if !ActiveRecord.const_defined?(:Import) || !ActiveRecord::Import.respond_to?(:load_from_connection_pool)
|
|
9
|
-
require "activerecord-import/base"
|
|
10
|
-
end
|
|
4
|
+
require "active_support/lazy_load_hooks"
|
|
11
5
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
end
|
|
15
|
-
alias establish_connection_without_activerecord_import establish_connection
|
|
16
|
-
alias establish_connection establish_connection_with_activerecord_import
|
|
17
|
-
end
|
|
18
|
-
end
|
|
6
|
+
ActiveSupport.on_load(:active_record) do
|
|
7
|
+
require "activerecord-import/base"
|
|
19
8
|
end
|
data/test/adapters/jdbcmysql.rb
CHANGED
data/test/adapters/mysql2.rb
CHANGED
data/test/adapters/postgis.rb
CHANGED
data/test/adapters/postgresql.rb
CHANGED
data/test/adapters/spatialite.rb
CHANGED
data/test/adapters/sqlite3.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
common: &common
|
|
2
2
|
username: root
|
|
3
|
-
password:
|
|
3
|
+
password: root
|
|
4
4
|
encoding: utf8
|
|
5
|
+
collation: utf8_general_ci
|
|
5
6
|
host: localhost
|
|
6
7
|
database: activerecord_import_test
|
|
7
8
|
|
|
@@ -15,6 +16,10 @@ jdbcmysql: &mysql2
|
|
|
15
16
|
<<: *common
|
|
16
17
|
adapter: jdbcmysql
|
|
17
18
|
|
|
19
|
+
jdbcsqlite3: &sqlite3
|
|
20
|
+
<<: *common
|
|
21
|
+
adapter: jdbcsqlite3
|
|
22
|
+
|
|
18
23
|
mysql2: &mysql2
|
|
19
24
|
<<: *common
|
|
20
25
|
adapter: mysql2
|
|
@@ -33,6 +38,7 @@ oracle:
|
|
|
33
38
|
postgresql: &postgresql
|
|
34
39
|
<<: *common
|
|
35
40
|
username: postgres
|
|
41
|
+
password: postgres
|
|
36
42
|
adapter: postgresql
|
|
37
43
|
min_messages: warning
|
|
38
44
|
|