activerecord-import 0.2.8 → 0.2.9
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.
- data/VERSION +1 -1
- data/lib/activerecord-import.rb +4 -4
- data/lib/activerecord-import/active_record/adapters/mysql2_adapter.rb +2 -2
- data/lib/activerecord-import/active_record/adapters/mysql_adapter.rb +2 -2
- data/lib/activerecord-import/active_record/adapters/postgresql_adapter.rb +1 -1
- data/lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb +1 -1
- data/lib/activerecord-import/adapters/abstract_adapter.rb +1 -7
- data/lib/activerecord-import/adapters/mysql_adapter.rb +46 -52
- data/lib/activerecord-import/adapters/postgresql_adapter.rb +3 -9
- data/lib/activerecord-import/adapters/sqlite3_adapter.rb +2 -4
- data/lib/activerecord-import/base.rb +2 -6
- data/test/support/mysql/import_examples.rb +2 -2
- metadata +50 -55
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.9
|
data/lib/activerecord-import.rb
CHANGED
@@ -2,15 +2,15 @@ class ActiveRecord::Base
|
|
2
2
|
class << self
|
3
3
|
def establish_connection_with_activerecord_import(*args)
|
4
4
|
establish_connection_without_activerecord_import(*args)
|
5
|
-
ActiveSupport.run_load_hooks(:active_record_connection_established,
|
5
|
+
ActiveSupport.run_load_hooks(:active_record_connection_established, connection_pool)
|
6
6
|
end
|
7
7
|
alias_method_chain :establish_connection, :activerecord_import
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
ActiveSupport.on_load(:active_record_connection_established) do |
|
12
|
-
if !ActiveRecord.const_defined?(:Import) || !ActiveRecord::Import.respond_to?(:
|
11
|
+
ActiveSupport.on_load(:active_record_connection_established) do |connection_pool|
|
12
|
+
if !ActiveRecord.const_defined?(:Import) || !ActiveRecord::Import.respond_to?(:load_from_connection_pool)
|
13
13
|
require File.join File.dirname(__FILE__), "activerecord-import/base"
|
14
14
|
end
|
15
|
-
ActiveRecord::Import.
|
15
|
+
ActiveRecord::Import.load_from_connection_pool connection_pool
|
16
16
|
end
|
@@ -2,5 +2,5 @@ require "active_record/connection_adapters/mysql2_adapter"
|
|
2
2
|
require "activerecord-import/adapters/mysql_adapter"
|
3
3
|
|
4
4
|
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
5
|
-
include ActiveRecord::Import::MysqlAdapter
|
6
|
-
end
|
5
|
+
include ActiveRecord::Import::MysqlAdapter
|
6
|
+
end
|
@@ -2,5 +2,5 @@ require "active_record/connection_adapters/mysql_adapter"
|
|
2
2
|
require "activerecord-import/adapters/mysql_adapter"
|
3
3
|
|
4
4
|
class ActiveRecord::ConnectionAdapters::MysqlAdapter
|
5
|
-
include ActiveRecord::Import::MysqlAdapter
|
6
|
-
end
|
5
|
+
include ActiveRecord::Import::MysqlAdapter
|
6
|
+
end
|
@@ -2,6 +2,6 @@ require "active_record/connection_adapters/postgresql_adapter"
|
|
2
2
|
require "activerecord-import/adapters/postgresql_adapter"
|
3
3
|
|
4
4
|
class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
|
5
|
-
include ActiveRecord::Import::PostgreSQLAdapter
|
5
|
+
include ActiveRecord::Import::PostgreSQLAdapter
|
6
6
|
end
|
7
7
|
|
@@ -2,6 +2,6 @@ require "active_record/connection_adapters/sqlite3_adapter"
|
|
2
2
|
require "activerecord-import/adapters/sqlite3_adapter"
|
3
3
|
|
4
4
|
class ActiveRecord::ConnectionAdapters::Sqlite3Adapter
|
5
|
-
include ActiveRecord::Import::Sqlite3Adapter
|
5
|
+
include ActiveRecord::Import::Sqlite3Adapter
|
6
6
|
end
|
7
7
|
|
@@ -3,12 +3,6 @@ module ActiveRecord::Import::AbstractAdapter
|
|
3
3
|
QUERY_OVERHEAD = 8 #This was shown to be true for MySQL, but it's not clear where the overhead is from.
|
4
4
|
|
5
5
|
module ClassMethods
|
6
|
-
# Returns the sum of the sizes of the passed in objects. This should
|
7
|
-
# probably be moved outside this class, but to where?
|
8
|
-
def sum_sizes( *objects ) # :nodoc:
|
9
|
-
objects.inject( 0 ){ |sum,o| sum += o.bytesize }
|
10
|
-
end
|
11
|
-
|
12
6
|
def get_insert_value_sets( values, sql_size, max_bytes ) # :nodoc:
|
13
7
|
value_sets = []
|
14
8
|
arr, current_arr_values_size, current_size = [], 0, 0
|
@@ -51,7 +45,7 @@ module ActiveRecord::Import::AbstractAdapter
|
|
51
45
|
sql_size = QUERY_OVERHEAD + base_sql.size + post_sql.size
|
52
46
|
|
53
47
|
# the number of bytes the requested insert statement values will take up
|
54
|
-
values_in_bytes =
|
48
|
+
values_in_bytes = values.sum {|value| value.bytesize }
|
55
49
|
|
56
50
|
# the number of bytes (commas) it will take to comma separate our values
|
57
51
|
comma_separated_bytes = values.size-1
|
@@ -1,59 +1,53 @@
|
|
1
1
|
module ActiveRecord::Import::MysqlAdapter
|
2
|
-
|
3
|
-
|
4
|
-
klass.instance_eval do
|
5
|
-
include ActiveRecord::Import::ImportSupport
|
6
|
-
include ActiveRecord::Import::OnDuplicateKeyUpdateSupport
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
# Returns the maximum number of bytes that the server will allow
|
11
|
-
# in a single packet
|
12
|
-
def max_allowed_packet # :nodoc:
|
13
|
-
result = execute( "SHOW VARIABLES like 'max_allowed_packet';" )
|
14
|
-
# original Mysql gem responds to #fetch_row while Mysql2 responds to #first
|
15
|
-
val = result.respond_to?(:fetch_row) ? result.fetch_row[1] : result.first[1]
|
16
|
-
val.to_i
|
17
|
-
end
|
18
|
-
|
19
|
-
# Returns a generated ON DUPLICATE KEY UPDATE statement given the passed
|
20
|
-
# in +args+.
|
21
|
-
def sql_for_on_duplicate_key_update( table_name, *args ) # :nodoc:
|
22
|
-
sql = ' ON DUPLICATE KEY UPDATE '
|
23
|
-
arg = args.first
|
24
|
-
if arg.is_a?( Array )
|
25
|
-
sql << sql_for_on_duplicate_key_update_as_array( table_name, arg )
|
26
|
-
elsif arg.is_a?( Hash )
|
27
|
-
sql << sql_for_on_duplicate_key_update_as_hash( table_name, arg )
|
28
|
-
elsif arg.is_a?( String )
|
29
|
-
sql << arg
|
30
|
-
else
|
31
|
-
raise ArgumentError.new( "Expected Array or Hash" )
|
32
|
-
end
|
33
|
-
sql
|
34
|
-
end
|
2
|
+
include ActiveRecord::Import::ImportSupport
|
3
|
+
include ActiveRecord::Import::OnDuplicateKeyUpdateSupport
|
35
4
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
5
|
+
# Returns the maximum number of bytes that the server will allow
|
6
|
+
# in a single packet
|
7
|
+
def max_allowed_packet # :nodoc:
|
8
|
+
result = execute( "SHOW VARIABLES like 'max_allowed_packet';" )
|
9
|
+
# original Mysql gem responds to #fetch_row while Mysql2 responds to #first
|
10
|
+
val = result.respond_to?(:fetch_row) ? result.fetch_row[1] : result.first[1]
|
11
|
+
val.to_i
|
12
|
+
end
|
43
13
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
14
|
+
# Returns a generated ON DUPLICATE KEY UPDATE statement given the passed
|
15
|
+
# in +args+.
|
16
|
+
def sql_for_on_duplicate_key_update( table_name, *args ) # :nodoc:
|
17
|
+
sql = ' ON DUPLICATE KEY UPDATE '
|
18
|
+
arg = args.first
|
19
|
+
if arg.is_a?( Array )
|
20
|
+
sql << sql_for_on_duplicate_key_update_as_array( table_name, arg )
|
21
|
+
elsif arg.is_a?( Hash )
|
22
|
+
sql << sql_for_on_duplicate_key_update_as_hash( table_name, arg )
|
23
|
+
elsif arg.is_a?( String )
|
24
|
+
sql << arg
|
25
|
+
else
|
26
|
+
raise ArgumentError.new( "Expected Array or Hash" )
|
52
27
|
end
|
28
|
+
sql
|
29
|
+
end
|
53
30
|
|
54
|
-
|
55
|
-
|
56
|
-
|
31
|
+
def sql_for_on_duplicate_key_update_as_array( table_name, arr ) # :nodoc:
|
32
|
+
results = arr.map do |column|
|
33
|
+
qc = quote_column_name( column )
|
34
|
+
"#{table_name}.#{qc}=VALUES(#{qc})"
|
57
35
|
end
|
36
|
+
results.join( ',' )
|
37
|
+
end
|
38
|
+
|
39
|
+
def sql_for_on_duplicate_key_update_as_hash( table_name, hsh ) # :nodoc:
|
40
|
+
sql = ' ON DUPLICATE KEY UPDATE '
|
41
|
+
results = hsh.map do |column1, column2|
|
42
|
+
qc1 = quote_column_name( column1 )
|
43
|
+
qc2 = quote_column_name( column2 )
|
44
|
+
"#{table_name}.#{qc1}=VALUES( #{qc2} )"
|
45
|
+
end
|
46
|
+
results.join( ',')
|
47
|
+
end
|
48
|
+
|
49
|
+
#return true if the statement is a duplicate key record error
|
50
|
+
def duplicate_key_update_error?(exception)# :nodoc:
|
51
|
+
exception.is_a?(ActiveRecord::StatementInvalid) && exception.to_s.include?('Duplicate entry')
|
58
52
|
end
|
59
|
-
end
|
53
|
+
end
|
@@ -1,13 +1,7 @@
|
|
1
1
|
module ActiveRecord::Import::PostgreSQLAdapter
|
2
|
-
|
3
|
-
def self.included(klass)
|
4
|
-
klass.instance_eval do
|
5
|
-
include ActiveRecord::Import::ImportSupport
|
6
|
-
end
|
7
|
-
end
|
2
|
+
include ActiveRecord::Import::ImportSupport
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
4
|
+
def next_value_for_sequence(sequence_name)
|
5
|
+
%{nextval('#{sequence_name}')}
|
12
6
|
end
|
13
7
|
end
|
@@ -12,12 +12,8 @@ module ActiveRecord::Import
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# Loads the import functionality for the passed in ActiveRecord connection
|
15
|
-
def self.
|
16
|
-
|
17
|
-
unless connection.class.ancestors.map(&:name).include?(import_adapter)
|
18
|
-
config = connection.instance_variable_get :@config
|
19
|
-
require_adapter config[:adapter]
|
20
|
-
end
|
15
|
+
def self.load_from_connection_pool(connection_pool)
|
16
|
+
require_adapter connection_pool.spec.config[:adapter]
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
@@ -9,7 +9,7 @@ def should_support_mysql_import_functionality
|
|
9
9
|
"('7','8','9')" ]
|
10
10
|
|
11
11
|
adapter = ActiveRecord::Base.connection.class
|
12
|
-
values_size_in_bytes =
|
12
|
+
values_size_in_bytes = values.sum {|value| value.bytesize }
|
13
13
|
base_sql_size_in_bytes = 15
|
14
14
|
max_bytes = 30
|
15
15
|
|
@@ -38,7 +38,7 @@ def should_support_mysql_import_functionality
|
|
38
38
|
base_sql_size_in_bytes = 15
|
39
39
|
max_bytes = 26
|
40
40
|
|
41
|
-
values_size_in_bytes =
|
41
|
+
values_size_in_bytes = values.sum {|value| value.bytesize }
|
42
42
|
value_sets = adapter.get_insert_value_sets( values, base_sql_size_in_bytes, max_bytes )
|
43
43
|
|
44
44
|
assert_equal 2, value_sets.size, 'Two value sets were expected!'
|
metadata
CHANGED
@@ -1,70 +1,68 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-import
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.9
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.8
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Zach Dennis
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-01-20 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: activerecord
|
17
|
-
requirement: &
|
16
|
+
requirement: &70098107427660 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
|
-
requirements:
|
18
|
+
requirements:
|
20
19
|
- - ~>
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 3.
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
26
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70098107427660
|
25
|
+
- !ruby/object:Gem::Dependency
|
27
26
|
name: rake
|
28
|
-
requirement: &
|
27
|
+
requirement: &70098107425120 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
34
33
|
type: :development
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
37
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *70098107425120
|
36
|
+
- !ruby/object:Gem::Dependency
|
38
37
|
name: jeweler
|
39
|
-
requirement: &
|
38
|
+
requirement: &70098107421120 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
44
43
|
version: 1.4.0
|
45
44
|
type: :development
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
- !ruby/object:Gem::Dependency
|
46
|
+
version_requirements: *70098107421120
|
47
|
+
- !ruby/object:Gem::Dependency
|
49
48
|
name: activerecord
|
50
|
-
requirement: &
|
49
|
+
requirement: &70098107418880 !ruby/object:Gem::Requirement
|
51
50
|
none: false
|
52
|
-
requirements:
|
51
|
+
requirements:
|
53
52
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 3.
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
56
55
|
type: :runtime
|
57
56
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
description: Extraction of the ActiveRecord::Base#import functionality from ar-extensions
|
57
|
+
version_requirements: *70098107418880
|
58
|
+
description: Extraction of the ActiveRecord::Base#import functionality from ar-extensions
|
59
|
+
for Rails 3 and beyond
|
60
60
|
email: zach.dennis@gmail.com
|
61
61
|
executables: []
|
62
|
-
|
63
62
|
extensions: []
|
64
|
-
|
65
|
-
extra_rdoc_files:
|
63
|
+
extra_rdoc_files:
|
66
64
|
- README.markdown
|
67
|
-
files:
|
65
|
+
files:
|
68
66
|
- README.markdown
|
69
67
|
- Rakefile
|
70
68
|
- VERSION
|
@@ -112,35 +110,32 @@ files:
|
|
112
110
|
- test/test_helper.rb
|
113
111
|
homepage: http://github.com/zdennis/activerecord-import
|
114
112
|
licenses: []
|
115
|
-
|
116
113
|
post_install_message:
|
117
114
|
rdoc_options: []
|
118
|
-
|
119
|
-
require_paths:
|
115
|
+
require_paths:
|
120
116
|
- lib
|
121
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
118
|
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
segments:
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
segments:
|
128
124
|
- 0
|
129
|
-
|
130
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
hash: -2341236183371821495
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
127
|
none: false
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
version:
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
136
132
|
requirements: []
|
137
|
-
|
138
133
|
rubyforge_project:
|
139
|
-
rubygems_version: 1.8.
|
134
|
+
rubygems_version: 1.8.10
|
140
135
|
signing_key:
|
141
136
|
specification_version: 3
|
142
137
|
summary: Bulk-loading extension for ActiveRecord
|
143
|
-
test_files:
|
138
|
+
test_files:
|
144
139
|
- test/active_record/connection_adapter_test.rb
|
145
140
|
- test/adapters/jdbcmysql.rb
|
146
141
|
- test/adapters/mysql.rb
|