activerecord-import 2.2.0 → 2.3.0

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.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.markdown +9 -9
  4. data/lib/activerecord-import/active_record/adapters/mysql2_proxy_adapter.rb +8 -0
  5. data/lib/activerecord-import/active_record/adapters/postgresql_proxy_adapter.rb +8 -0
  6. data/lib/activerecord-import/active_record/adapters/sqlite3_proxy_adapter.rb +8 -0
  7. data/lib/activerecord-import/active_record/adapters/trilogy_proxy_adapter.rb +8 -0
  8. data/lib/activerecord-import/adapters/active_record_proxy_adapter.rb +19 -0
  9. data/lib/activerecord-import/adapters/mysql2_proxy_adapter.rb +9 -0
  10. data/lib/activerecord-import/adapters/mysql_adapter.rb +10 -3
  11. data/lib/activerecord-import/adapters/postgresql_adapter.rb +1 -1
  12. data/lib/activerecord-import/adapters/postgresql_proxy_adapter.rb +9 -0
  13. data/lib/activerecord-import/adapters/sqlite3_proxy_adapter.rb +9 -0
  14. data/lib/activerecord-import/adapters/trilogy_proxy_adapter.rb +9 -0
  15. data/lib/activerecord-import/base.rb +0 -2
  16. data/lib/activerecord-import/import.rb +243 -207
  17. data/lib/activerecord-import/version.rb +1 -1
  18. metadata +13 -208
  19. data/.github/workflows/test.yaml +0 -165
  20. data/.gitignore +0 -37
  21. data/.rubocop.yml +0 -118
  22. data/.rubocop_todo.yml +0 -30
  23. data/Brewfile +0 -5
  24. data/Dockerfile +0 -23
  25. data/Gemfile +0 -63
  26. data/Rakefile +0 -75
  27. data/activerecord-import.gemspec +0 -28
  28. data/benchmarks/README +0 -32
  29. data/benchmarks/benchmark.rb +0 -72
  30. data/benchmarks/lib/base.rb +0 -143
  31. data/benchmarks/lib/cli_parser.rb +0 -111
  32. data/benchmarks/lib/float.rb +0 -17
  33. data/benchmarks/lib/mysql2_benchmark.rb +0 -21
  34. data/benchmarks/lib/output_to_csv.rb +0 -21
  35. data/benchmarks/lib/output_to_html.rb +0 -66
  36. data/benchmarks/models/test_innodb.rb +0 -5
  37. data/benchmarks/models/test_memory.rb +0 -5
  38. data/benchmarks/models/test_myisam.rb +0 -5
  39. data/benchmarks/schema/mysql2_schema.rb +0 -18
  40. data/docker-compose.yml +0 -34
  41. data/gemfiles/5.2.gemfile +0 -4
  42. data/gemfiles/6.0.gemfile +0 -4
  43. data/gemfiles/6.1.gemfile +0 -4
  44. data/gemfiles/7.0.gemfile +0 -4
  45. data/gemfiles/7.1.gemfile +0 -3
  46. data/gemfiles/7.2.gemfile +0 -3
  47. data/gemfiles/8.0.gemfile +0 -3
  48. data/test/adapters/janus_mysql2.rb +0 -3
  49. data/test/adapters/janus_trilogy.rb +0 -11
  50. data/test/adapters/jdbcmysql.rb +0 -3
  51. data/test/adapters/jdbcpostgresql.rb +0 -3
  52. data/test/adapters/jdbcsqlite3.rb +0 -3
  53. data/test/adapters/makara_postgis.rb +0 -3
  54. data/test/adapters/mysql2.rb +0 -3
  55. data/test/adapters/mysql2_makara.rb +0 -3
  56. data/test/adapters/mysql2_proxy.rb +0 -3
  57. data/test/adapters/mysql2spatial.rb +0 -3
  58. data/test/adapters/postgis.rb +0 -3
  59. data/test/adapters/postgresql.rb +0 -3
  60. data/test/adapters/postgresql_makara.rb +0 -3
  61. data/test/adapters/postgresql_proxy.rb +0 -3
  62. data/test/adapters/seamless_database_pool.rb +0 -3
  63. data/test/adapters/spatialite.rb +0 -3
  64. data/test/adapters/sqlite3.rb +0 -3
  65. data/test/adapters/trilogy.rb +0 -11
  66. data/test/database.yml.sample +0 -73
  67. data/test/github/database.yml +0 -85
  68. data/test/import_test.rb +0 -970
  69. data/test/janus_mysql2/import_test.rb +0 -8
  70. data/test/janus_trilogy/import_test.rb +0 -7
  71. data/test/jdbcmysql/import_test.rb +0 -7
  72. data/test/jdbcpostgresql/import_test.rb +0 -6
  73. data/test/jdbcsqlite3/import_test.rb +0 -6
  74. data/test/makara_postgis/import_test.rb +0 -10
  75. data/test/models/account.rb +0 -5
  76. data/test/models/alarm.rb +0 -4
  77. data/test/models/animal.rb +0 -8
  78. data/test/models/author.rb +0 -9
  79. data/test/models/bike_maker.rb +0 -10
  80. data/test/models/book.rb +0 -18
  81. data/test/models/car.rb +0 -5
  82. data/test/models/card.rb +0 -5
  83. data/test/models/chapter.rb +0 -6
  84. data/test/models/composite_book.rb +0 -19
  85. data/test/models/composite_chapter.rb +0 -12
  86. data/test/models/customer.rb +0 -18
  87. data/test/models/deck.rb +0 -8
  88. data/test/models/dictionary.rb +0 -6
  89. data/test/models/discount.rb +0 -5
  90. data/test/models/end_note.rb +0 -6
  91. data/test/models/group.rb +0 -5
  92. data/test/models/order.rb +0 -17
  93. data/test/models/playing_card.rb +0 -4
  94. data/test/models/promotion.rb +0 -5
  95. data/test/models/question.rb +0 -5
  96. data/test/models/rule.rb +0 -5
  97. data/test/models/tag.rb +0 -12
  98. data/test/models/tag_alias.rb +0 -11
  99. data/test/models/topic.rb +0 -31
  100. data/test/models/user.rb +0 -5
  101. data/test/models/user_token.rb +0 -6
  102. data/test/models/vendor.rb +0 -9
  103. data/test/models/widget.rb +0 -33
  104. data/test/mysql2/import_test.rb +0 -7
  105. data/test/mysql2_makara/import_test.rb +0 -8
  106. data/test/mysql2_proxy/import_test.rb +0 -6
  107. data/test/mysqlspatial2/import_test.rb +0 -8
  108. data/test/postgis/import_test.rb +0 -10
  109. data/test/postgresql/import_test.rb +0 -6
  110. data/test/postgresql_proxy/import_test.rb +0 -6
  111. data/test/schema/generic_schema.rb +0 -230
  112. data/test/schema/jdbcpostgresql_schema.rb +0 -3
  113. data/test/schema/mysql2_schema.rb +0 -21
  114. data/test/schema/postgis_schema.rb +0 -3
  115. data/test/schema/postgresql_schema.rb +0 -94
  116. data/test/schema/sqlite3_schema.rb +0 -15
  117. data/test/schema/version.rb +0 -12
  118. data/test/sqlite3/import_test.rb +0 -6
  119. data/test/support/active_support/test_case_extensions.rb +0 -73
  120. data/test/support/assertions.rb +0 -75
  121. data/test/support/factories.rb +0 -66
  122. data/test/support/generate.rb +0 -31
  123. data/test/support/mysql/import_examples.rb +0 -97
  124. data/test/support/postgresql/import_examples.rb +0 -642
  125. data/test/support/shared_examples/on_duplicate_key_ignore.rb +0 -45
  126. data/test/support/shared_examples/on_duplicate_key_update.rb +0 -437
  127. data/test/support/shared_examples/recursive_import.rb +0 -352
  128. data/test/support/sqlite3/import_examples.rb +0 -232
  129. data/test/synchronize_test.rb +0 -43
  130. data/test/test_helper.rb +0 -91
  131. data/test/trilogy/import_test.rb +0 -7
  132. data/test/value_sets_bytes_parser_test.rb +0 -106
  133. data/test/value_sets_records_parser_test.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7cd19fa557186daf34db96db71f26a7db70b15e66a0a42eaab33be304945ab0
4
- data.tar.gz: ff8afe763d437210ea1c78e21bacd0b4ae84f113fbadbda087077bf402f08e64
3
+ metadata.gz: 18ab977c921d6e9c51ca329d136998d858ddbe3cae0a186160886cd43ee6b6e9
4
+ data.tar.gz: 98d166b037d997de14492f621099ffb63af16505da1c8c36a2e302a903213777
5
5
  SHA512:
6
- metadata.gz: 402d2087c8c35a2adfa3787ee4e183883df74cc1f4ad2276de1227ba9778b630bfbee546faa3b53b7dcbe1142232bd7d03de046ccab5c6caa5c475a3bc4f15c1
7
- data.tar.gz: ef5ce7d4dba744b3c58a0affbe326b50d764c7e4c4726b468ad4d18eacee13fbaa8d7b5d78459bc048e8eeb0628cf34b52a59f759f0a1f4d9d491b7439d5845a
6
+ metadata.gz: 2a593859fb0b568b88e29e99e849257b536a78b87c9557e1f98fe196a8c1c0be3116c88676c74c58044f76cb69a2ae17a6093fcc463bd2ad5d914f551229c9b2
7
+ data.tar.gz: 10b347057b09a027bbaafc752363553ed117ada314ced7c383276863b9989eda8ec92e9eabee8697099c5b6db7b6e909002a7f86d40df821438b9dabadb15f55
data/CHANGELOG.md CHANGED
@@ -1,3 +1,36 @@
1
+ ## Changes in 2.3.0
2
+
3
+ ### New Features
4
+
5
+ * Add Support for trilogy_proxy from [active_record_proxy_adapters](https://rubygems.org/gems/active_record_proxy_adapters) by @mateuscruz via #887.
6
+ * Add Support for sqlite3_proxy from [active_record_proxy_adapters](https://rubygems.org/gems/active_record_proxy_adapters) by @mateuscruz via #887.
7
+ * Add affected rows support for the MySQL adapter. `ActiveRecord::Import::Result` now carries an
8
+ `affected_rows` member, which reports the number of rows the server actually reported as
9
+ affected when the adapter exposes it (`nil` otherwise). This is most useful with
10
+ `on_duplicate_key_update`, where the count distinguishes inserted from updated rows.
11
+ Thanks to @ehasrouni via #882 and #885.
12
+
13
+ ### Fixes
14
+
15
+ * Fix `NoMethodError: undefined method 'validation_context='` when importing with validations
16
+ against Rails main (8.2.0.alpha). Rails removed ActiveModel's private `validation_context=`
17
+ writer in rails/rails@0f9d1270834a6407a59637650bf910d8ae826169 in favor of a validation
18
+ context object reachable through `context_for_validation`. `ActiveRecord::Import::Validator`
19
+ now sets and restores the validation context through whichever API the loaded ActiveModel
20
+ provides. Thanks to @yu-yaba via #900.
21
+ * Fix adapter-specific import support (e.g. `on_duplicate_key_update`) never loading for
22
+ a connection established via `connects_to`/`ActiveRecord::ConnectionAdapters::
23
+ ConnectionHandler#establish_connection` instead of `ActiveRecord::Base.establish_connection`
24
+ directly - most commonly hit with a Rails multi-database secondary connection. The lazy
25
+ adapter loader now hooks `ConnectionHandler#establish_connection` instead of
26
+ `ActiveRecord::Base.establish_connection`, so it fires for every connection regardless of
27
+ how it was established. Thanks to @mateuscruz via #886.
28
+ * Fix `active_record_proxy_adapters` support, which was not loading the import adapter for
29
+ proxied connections. Thanks to @mateuscruz via #880.
30
+ * Use `with_connection` instead of `ActiveRecord::Base.connection`, which is deprecated as of
31
+ ActiveRecord 7.2. Thanks to @nerdrew via #875 and #876.
32
+ * Reduce the size of the published gem by excluding test files. Thanks to @yuri-zubov via #893.
33
+
1
34
  ## Changes in 2.2.0
2
35
 
3
36
  ### New Features
data/README.markdown CHANGED
@@ -121,20 +121,20 @@ Book.import values
121
121
  The `import` method can take an array of column names and an array of hash objects. The column names are used to determine what fields of data should be imported. The following example will only import books with the `title` field:
122
122
 
123
123
  ```ruby
124
- books = [
124
+ values = [
125
125
  { title: "Book 1", author: "George Orwell" },
126
126
  { title: "Book 2", author: "Bob Jones" }
127
127
  ]
128
128
  columns = [ :title ]
129
129
 
130
130
  # without validations
131
- Book.import columns, books, validate: false
131
+ Book.import columns, values, validate: false
132
132
 
133
133
  # with validations
134
- Book.import columns, books, validate: true
134
+ Book.import columns, values, validate: true
135
135
 
136
136
  # when not specified :validate defaults to true
137
- Book.import columns, books
137
+ Book.import columns, values
138
138
 
139
139
  # result in table books
140
140
  # title | author
@@ -296,7 +296,7 @@ book.reload.title # => "Book1" (stayed the same)
296
296
  book.reload.author # => "George Orwell" (stayed the same)
297
297
  ```
298
298
 
299
- The option `:on_duplicate_key_ignore` is bypassed when `:recursive` is enabled for [PostgreSQL imports](https://github.com/zdennis/activerecord-import/wiki#recursive-example-postgresql-only).
299
+ The option `:on_duplicate_key_ignore` is bypassed when `:recursive` is enabled for [PostgreSQL imports](https://rubydoc.info/gems/activerecord-import/ActiveRecord/Base#label-Options) (`:recursive` is not supported with other adapters).
300
300
 
301
301
  #### Duplicate Key Update
302
302
 
@@ -507,10 +507,10 @@ The following database adapters are currently supported:
507
507
  * MySQL2 - supports core import functionality plus on duplicate key update support (included in activerecord-import 0.2.0 and higher)
508
508
  * PostgreSQL - supports core import functionality (included in activerecord-import 0.1.0 and higher)
509
509
  * SQLite3 - supports core import functionality (included in activerecord-import 0.1.0 and higher)
510
- * Oracle - supports core import functionality through DML trigger (available as an external gem: [activerecord-import-oracle_enhanced](https://github.com/keeguon/activerecord-import-oracle_enhanced)
511
- * SQL Server - supports core import functionality (available as an external gem: [activerecord-import-sqlserver](https://github.com/keeguon/activerecord-import-sqlserver)
510
+ * Oracle - supports core import functionality through DML trigger (available as an external gem: [activerecord-import-oracle_enhanced](https://github.com/keeguon/activerecord-import-oracle_enhanced))
511
+ * SQL Server - supports core import functionality (available as an external gem: [activerecord-import-sqlserver](https://github.com/keeguon/activerecord-import-sqlserver))
512
512
 
513
- If your adapter isn't listed here, please consider creating an external gem as described in the README to provide support. If you do, feel free to update this wiki to include a link to the new adapter's repository!
513
+ If your adapter isn't listed here, please consider creating an external gem as described in the README to provide support. If you do, feel free to update this README to include a link to the new adapter's repository!
514
514
 
515
515
  To test which features are supported by your adapter, use the following methods on a model class:
516
516
  * `supports_import?(*args)`
@@ -624,7 +624,7 @@ See https://github.com/zdennis/activerecord-import/issues/233 for further discus
624
624
 
625
625
  ### More Information
626
626
 
627
- For more information on Activerecord-Import please see its wiki: https://github.com/zdennis/activerecord-import/wiki
627
+ For more information on Activerecord-Import please see its docs: https://rubydoc.info/gems/activerecord-import/ActiveRecord/Base
628
628
 
629
629
  To document new information, please add to the README instead of the wiki. See https://github.com/zdennis/activerecord-import/issues/397 for discussion.
630
630
 
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/mysql2_proxy_adapter"
4
+ require "activerecord-import/adapters/mysql2_proxy_adapter"
5
+
6
+ ActiveSupport.on_load(:active_record_mysql2proxyadapter) do |klass|
7
+ klass.include(ActiveRecord::Import::Mysql2ProxyAdapter)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/postgresql_proxy_adapter"
4
+ require "activerecord-import/adapters/postgresql_proxy_adapter"
5
+
6
+ ActiveSupport.on_load(:active_record_postgresqlproxyadapter) do |klass|
7
+ klass.include(ActiveRecord::Import::PostgreSQLProxyAdapter)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/sqlite3_proxy_adapter"
4
+ require "activerecord-import/adapters/sqlite3_proxy_adapter"
5
+
6
+ ActiveSupport.on_load(:active_record_sqlite3proxyadapter) do |klass|
7
+ klass.include(ActiveRecord::Import::SQLite3ProxyAdapter)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/trilogy_proxy_adapter"
4
+ require "activerecord-import/adapters/trilogy_proxy_adapter"
5
+
6
+ ActiveSupport.on_load(:active_record_trilogyproxyadapter) do |klass|
7
+ klass.include(ActiveRecord::Import::TrilogyProxyAdapter)
8
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord::Import::ActiveRecordProxyAdapter
4
+ def insert_many(*args, **kwargs, &block)
5
+ sticking_to_primary { super(*args, **kwargs, &block) }
6
+ end
7
+
8
+ def insert(*args, **kwargs, &block)
9
+ sticking_to_primary { super(*args, **kwargs, &block) }
10
+ end
11
+
12
+ def sticking_to_primary(&block)
13
+ ActiveRecord::Base.connected_to(role: writing_role, &block)
14
+ end
15
+
16
+ def writing_role
17
+ ActiveRecord.try(:writing_role) || ActiveRecord::Base.try(:writing_role) || :writing
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activerecord-import/adapters/mysql2_adapter"
4
+ require "activerecord-import/adapters/active_record_proxy_adapter"
5
+
6
+ module ActiveRecord::Import::Mysql2ProxyAdapter
7
+ include ActiveRecord::Import::Mysql2Adapter
8
+ include ActiveRecord::Import::ActiveRecordProxyAdapter
9
+ end
@@ -12,6 +12,7 @@ module ActiveRecord::Import::MysqlAdapter
12
12
  def insert_many( sql, values, options = {}, *args ) # :nodoc:
13
13
  # the number of inserts default
14
14
  number_of_inserts = 0
15
+ affected_rows = nil
15
16
 
16
17
  base_sql, post_sql = case sql
17
18
  when String
@@ -37,7 +38,10 @@ module ActiveRecord::Import::MysqlAdapter
37
38
  if max == NO_MAX_PACKET || total_bytes <= max || options[:force_single_insert]
38
39
  number_of_inserts += 1
39
40
  sql2insert = base_sql + values.join( ',' ) + post_sql
40
- insert( sql2insert, *args )
41
+ result = execute( sql2insert, *args )
42
+ if result.respond_to?(:affected_rows)
43
+ affected_rows = (affected_rows || 0) + result.affected_rows
44
+ end
41
45
  else
42
46
  value_sets = ::ActiveRecord::Import::ValueSetsBytesParser.parse(values,
43
47
  reserved_bytes: sql_size,
@@ -47,12 +51,15 @@ module ActiveRecord::Import::MysqlAdapter
47
51
  value_sets.each do |value_set|
48
52
  number_of_inserts += 1
49
53
  sql2insert = base_sql + value_set.join( ',' ) + post_sql
50
- insert( sql2insert, *args )
54
+ result = execute( sql2insert, *args )
55
+ if result.respond_to?(:affected_rows)
56
+ affected_rows = (affected_rows || 0) + result.affected_rows
57
+ end
51
58
  end
52
59
  end
53
60
  end
54
61
 
55
- ActiveRecord::Import::Result.new([], number_of_inserts, [], [])
62
+ ActiveRecord::Import::Result.new([], number_of_inserts, [], [], affected_rows)
56
63
  end
57
64
 
58
65
  # Returns the maximum number of bytes that the server will allow
@@ -93,7 +93,7 @@ module ActiveRecord::Import::PostgreSQLAdapter
93
93
  sql << " RETURNING #{selections.join(', ')}"
94
94
  end
95
95
 
96
- sql
96
+ sql.uniq
97
97
  end
98
98
 
99
99
  def returning_selections(options)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activerecord-import/adapters/postgresql_adapter"
4
+ require "activerecord-import/adapters/active_record_proxy_adapter"
5
+
6
+ module ActiveRecord::Import::PostgreSQLProxyAdapter
7
+ include ActiveRecord::Import::PostgreSQLAdapter
8
+ include ActiveRecord::Import::ActiveRecordProxyAdapter
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activerecord-import/adapters/sqlite3_adapter"
4
+ require "activerecord-import/adapters/active_record_proxy_adapter"
5
+
6
+ module ActiveRecord::Import::SQLite3ProxyAdapter
7
+ include ActiveRecord::Import::SQLite3Adapter
8
+ include ActiveRecord::Import::ActiveRecordProxyAdapter
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "activerecord-import/adapters/trilogy_adapter"
4
+ require "activerecord-import/adapters/active_record_proxy_adapter"
5
+
6
+ module ActiveRecord::Import::TrilogyProxyAdapter
7
+ include ActiveRecord::Import::TrilogyAdapter
8
+ include ActiveRecord::Import::ActiveRecordProxyAdapter
9
+ end
@@ -11,11 +11,9 @@ module ActiveRecord::Import
11
11
  case adapter
12
12
  when 'mysql2_makara' then 'mysql2'
13
13
  when 'mysql2spatial' then 'mysql2'
14
- when 'mysql2_proxy' then 'mysql2'
15
14
  when 'janus_mysql2' then 'mysql2'
16
15
  when 'spatialite' then 'sqlite3'
17
16
  when 'postgresql_makara' then 'postgresql'
18
- when 'postgresql_proxy' then 'postgresql'
19
17
  when 'makara_postgis' then 'postgresql'
20
18
  when 'postgis' then 'postgresql'
21
19
  when 'cockroachdb' then 'postgresql'