upsert 1.0.2 → 1.1.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.
- data/CHANGELOG +7 -0
- data/Gemfile +4 -0
- data/README.md +115 -66
- data/Rakefile +16 -5
- data/lib/upsert.rb +86 -25
- data/lib/upsert/binary.rb +2 -0
- data/lib/upsert/column_definition.rb +27 -3
- data/lib/upsert/column_definition/mysql.rb +20 -0
- data/lib/upsert/column_definition/{PG_Connection.rb → postgresql.rb} +1 -1
- data/lib/upsert/connection.rb +20 -22
- data/lib/upsert/connection/Java_ComMysqlJdbc_JDBC4Connection.rb +25 -0
- data/lib/upsert/connection/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb +14 -0
- data/lib/upsert/connection/Java_OrgSqliteConn.rb +17 -0
- data/lib/upsert/connection/Mysql2_Client.rb +40 -18
- data/lib/upsert/connection/PG_Connection.rb +7 -3
- data/lib/upsert/connection/SQLite3_Database.rb +10 -2
- data/lib/upsert/connection/jdbc.rb +81 -0
- data/lib/upsert/connection/sqlite3.rb +23 -0
- data/lib/upsert/merge_function/Java_ComMysqlJdbc_JDBC4Connection.rb +42 -0
- data/lib/upsert/merge_function/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb +35 -0
- data/lib/upsert/merge_function/Java_OrgSqliteConn.rb +10 -0
- data/lib/upsert/merge_function/Mysql2_Client.rb +5 -58
- data/lib/upsert/merge_function/PG_Connection.rb +6 -78
- data/lib/upsert/merge_function/SQLite3_Database.rb +3 -22
- data/lib/upsert/merge_function/mysql.rb +67 -0
- data/lib/upsert/merge_function/postgresql.rb +94 -0
- data/lib/upsert/merge_function/sqlite3.rb +30 -0
- data/lib/upsert/row.rb +3 -6
- data/lib/upsert/version.rb +1 -1
- data/spec/binary_spec.rb +0 -2
- data/spec/correctness_spec.rb +26 -25
- data/spec/database_functions_spec.rb +6 -14
- data/spec/logger_spec.rb +22 -10
- data/spec/precision_spec.rb +1 -1
- data/spec/spec_helper.rb +115 -31
- data/spec/speed_spec.rb +1 -1
- data/spec/timezones_spec.rb +35 -14
- data/spec/type_safety_spec.rb +2 -2
- data/upsert.gemspec +18 -6
- metadata +25 -38
- data/lib/upsert/cell.rb +0 -5
- data/lib/upsert/cell/Mysql2_Client.rb +0 -16
- data/lib/upsert/cell/PG_Connection.rb +0 -28
- data/lib/upsert/cell/SQLite3_Database.rb +0 -36
- data/lib/upsert/column_definition/Mysql2_Client.rb +0 -24
- data/lib/upsert/column_definition/SQLite3_Database.rb +0 -7
- data/lib/upsert/row/Mysql2_Client.rb +0 -21
- data/lib/upsert/row/PG_Connection.rb +0 -7
- data/lib/upsert/row/SQLite3_Database.rb +0 -7
data/spec/type_safety_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Upsert do
|
|
5
5
|
upsert = Upsert.new $conn, :pets
|
6
6
|
lambda do
|
7
7
|
upsert.row :tag_number => ''
|
8
|
-
end.should raise_error
|
8
|
+
end.should raise_error
|
9
9
|
end
|
10
10
|
end
|
11
|
-
end if ENV['
|
11
|
+
end if ENV['DB'] == 'postgresql'
|
data/upsert.gemspec
CHANGED
@@ -16,23 +16,35 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = Upsert::VERSION
|
18
18
|
|
19
|
-
|
19
|
+
# NOTE: no runtime dependencies!
|
20
|
+
|
20
21
|
gem.add_development_dependency 'rspec-core'
|
21
22
|
gem.add_development_dependency 'rspec-expectations'
|
22
23
|
gem.add_development_dependency 'rspec-mocks'
|
23
24
|
|
24
|
-
gem.add_development_dependency '
|
25
|
-
gem.add_development_dependency 'mysql2'
|
26
|
-
gem.add_development_dependency 'pg'
|
27
|
-
gem.add_development_dependency 'activerecord' # testing only
|
25
|
+
gem.add_development_dependency 'activerecord'
|
28
26
|
gem.add_development_dependency 'active_record_inline_schema'
|
29
27
|
gem.add_development_dependency 'faker'
|
30
28
|
gem.add_development_dependency 'yard'
|
31
|
-
gem.add_development_dependency 'redcarpet' # github-flavored markdown
|
32
29
|
gem.add_development_dependency 'activerecord-import'
|
33
30
|
gem.add_development_dependency 'pry'
|
34
31
|
|
35
32
|
unless RUBY_VERSION >= '1.9'
|
36
33
|
gem.add_development_dependency 'orderedhash'
|
37
34
|
end
|
35
|
+
|
36
|
+
if RUBY_PLATFORM == 'java'
|
37
|
+
gem.add_development_dependency 'jruby-openssl'
|
38
|
+
gem.add_development_dependency 'jdbc-postgres'
|
39
|
+
gem.add_development_dependency 'jdbc-mysql'
|
40
|
+
gem.add_development_dependency 'jdbc-sqlite3'
|
41
|
+
gem.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
|
42
|
+
gem.add_development_dependency 'activerecord-jdbcmysql-adapter'
|
43
|
+
gem.add_development_dependency 'activerecord-jdbcpostgresql-adapter'
|
44
|
+
else
|
45
|
+
gem.add_development_dependency 'sqlite3'
|
46
|
+
gem.add_development_dependency 'mysql2'
|
47
|
+
gem.add_development_dependency 'pg'
|
48
|
+
gem.add_development_dependency 'redcarpet' # github-flavored markdown
|
49
|
+
end
|
38
50
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upsert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: posix-spawn
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :development
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
14
|
- !ruby/object:Gem::Dependency
|
31
15
|
name: rspec-core
|
32
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,7 +60,7 @@ dependencies:
|
|
76
60
|
- !ruby/object:Gem::Version
|
77
61
|
version: '0'
|
78
62
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
63
|
+
name: activerecord
|
80
64
|
requirement: !ruby/object:Gem::Requirement
|
81
65
|
none: false
|
82
66
|
requirements:
|
@@ -92,7 +76,7 @@ dependencies:
|
|
92
76
|
- !ruby/object:Gem::Version
|
93
77
|
version: '0'
|
94
78
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
79
|
+
name: active_record_inline_schema
|
96
80
|
requirement: !ruby/object:Gem::Requirement
|
97
81
|
none: false
|
98
82
|
requirements:
|
@@ -108,7 +92,7 @@ dependencies:
|
|
108
92
|
- !ruby/object:Gem::Version
|
109
93
|
version: '0'
|
110
94
|
- !ruby/object:Gem::Dependency
|
111
|
-
name:
|
95
|
+
name: faker
|
112
96
|
requirement: !ruby/object:Gem::Requirement
|
113
97
|
none: false
|
114
98
|
requirements:
|
@@ -124,7 +108,7 @@ dependencies:
|
|
124
108
|
- !ruby/object:Gem::Version
|
125
109
|
version: '0'
|
126
110
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
111
|
+
name: yard
|
128
112
|
requirement: !ruby/object:Gem::Requirement
|
129
113
|
none: false
|
130
114
|
requirements:
|
@@ -140,7 +124,7 @@ dependencies:
|
|
140
124
|
- !ruby/object:Gem::Version
|
141
125
|
version: '0'
|
142
126
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
127
|
+
name: activerecord-import
|
144
128
|
requirement: !ruby/object:Gem::Requirement
|
145
129
|
none: false
|
146
130
|
requirements:
|
@@ -156,7 +140,7 @@ dependencies:
|
|
156
140
|
- !ruby/object:Gem::Version
|
157
141
|
version: '0'
|
158
142
|
- !ruby/object:Gem::Dependency
|
159
|
-
name:
|
143
|
+
name: pry
|
160
144
|
requirement: !ruby/object:Gem::Requirement
|
161
145
|
none: false
|
162
146
|
requirements:
|
@@ -172,7 +156,7 @@ dependencies:
|
|
172
156
|
- !ruby/object:Gem::Version
|
173
157
|
version: '0'
|
174
158
|
- !ruby/object:Gem::Dependency
|
175
|
-
name:
|
159
|
+
name: sqlite3
|
176
160
|
requirement: !ruby/object:Gem::Requirement
|
177
161
|
none: false
|
178
162
|
requirements:
|
@@ -188,7 +172,7 @@ dependencies:
|
|
188
172
|
- !ruby/object:Gem::Version
|
189
173
|
version: '0'
|
190
174
|
- !ruby/object:Gem::Dependency
|
191
|
-
name:
|
175
|
+
name: mysql2
|
192
176
|
requirement: !ruby/object:Gem::Requirement
|
193
177
|
none: false
|
194
178
|
requirements:
|
@@ -204,7 +188,7 @@ dependencies:
|
|
204
188
|
- !ruby/object:Gem::Version
|
205
189
|
version: '0'
|
206
190
|
- !ruby/object:Gem::Dependency
|
207
|
-
name:
|
191
|
+
name: pg
|
208
192
|
requirement: !ruby/object:Gem::Requirement
|
209
193
|
none: false
|
210
194
|
requirements:
|
@@ -220,7 +204,7 @@ dependencies:
|
|
220
204
|
- !ruby/object:Gem::Version
|
221
205
|
version: '0'
|
222
206
|
- !ruby/object:Gem::Dependency
|
223
|
-
name:
|
207
|
+
name: redcarpet
|
224
208
|
requirement: !ruby/object:Gem::Requirement
|
225
209
|
none: false
|
226
210
|
requirements:
|
@@ -253,26 +237,29 @@ files:
|
|
253
237
|
- lib/upsert.rb
|
254
238
|
- lib/upsert/active_record_upsert.rb
|
255
239
|
- lib/upsert/binary.rb
|
256
|
-
- lib/upsert/cell.rb
|
257
|
-
- lib/upsert/cell/Mysql2_Client.rb
|
258
|
-
- lib/upsert/cell/PG_Connection.rb
|
259
|
-
- lib/upsert/cell/SQLite3_Database.rb
|
260
240
|
- lib/upsert/column_definition.rb
|
261
|
-
- lib/upsert/column_definition/
|
262
|
-
- lib/upsert/column_definition/
|
263
|
-
- lib/upsert/column_definition/SQLite3_Database.rb
|
241
|
+
- lib/upsert/column_definition/mysql.rb
|
242
|
+
- lib/upsert/column_definition/postgresql.rb
|
264
243
|
- lib/upsert/connection.rb
|
244
|
+
- lib/upsert/connection/Java_ComMysqlJdbc_JDBC4Connection.rb
|
245
|
+
- lib/upsert/connection/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb
|
246
|
+
- lib/upsert/connection/Java_OrgSqliteConn.rb
|
265
247
|
- lib/upsert/connection/Mysql2_Client.rb
|
266
248
|
- lib/upsert/connection/PG_Connection.rb
|
267
249
|
- lib/upsert/connection/SQLite3_Database.rb
|
250
|
+
- lib/upsert/connection/jdbc.rb
|
251
|
+
- lib/upsert/connection/sqlite3.rb
|
268
252
|
- lib/upsert/merge_function.rb
|
253
|
+
- lib/upsert/merge_function/Java_ComMysqlJdbc_JDBC4Connection.rb
|
254
|
+
- lib/upsert/merge_function/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb
|
255
|
+
- lib/upsert/merge_function/Java_OrgSqliteConn.rb
|
269
256
|
- lib/upsert/merge_function/Mysql2_Client.rb
|
270
257
|
- lib/upsert/merge_function/PG_Connection.rb
|
271
258
|
- lib/upsert/merge_function/SQLite3_Database.rb
|
259
|
+
- lib/upsert/merge_function/mysql.rb
|
260
|
+
- lib/upsert/merge_function/postgresql.rb
|
261
|
+
- lib/upsert/merge_function/sqlite3.rb
|
272
262
|
- lib/upsert/row.rb
|
273
|
-
- lib/upsert/row/Mysql2_Client.rb
|
274
|
-
- lib/upsert/row/PG_Connection.rb
|
275
|
-
- lib/upsert/row/SQLite3_Database.rb
|
276
263
|
- lib/upsert/version.rb
|
277
264
|
- spec/active_record_upsert_spec.rb
|
278
265
|
- spec/binary_spec.rb
|
data/lib/upsert/cell.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
class Upsert
|
2
|
-
class Cell
|
3
|
-
# @private
|
4
|
-
class Mysql2_Client < Cell
|
5
|
-
attr_reader :name
|
6
|
-
attr_reader :value
|
7
|
-
attr_reader :quoted_value
|
8
|
-
|
9
|
-
def initialize(connection, name, value)
|
10
|
-
@name = name
|
11
|
-
@value = value
|
12
|
-
@quoted_value = connection.quote_value value
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
class Upsert
|
2
|
-
class Cell
|
3
|
-
# @private
|
4
|
-
class PG_Connection < Cell
|
5
|
-
attr_reader :name
|
6
|
-
attr_reader :value
|
7
|
-
attr_reader :quoted_name
|
8
|
-
|
9
|
-
def initialize(connection, name, value)
|
10
|
-
@name = name
|
11
|
-
@value = value
|
12
|
-
@quoted_name = connection.quote_ident name
|
13
|
-
end
|
14
|
-
|
15
|
-
def bind_value
|
16
|
-
return @bind_value if defined?(@bind_value)
|
17
|
-
@bind_value = case value
|
18
|
-
when Upsert::Binary
|
19
|
-
{ :value => value.value, :format => 1 }
|
20
|
-
when Time, DateTime
|
21
|
-
[value.strftime(ISO8601_DATETIME), sprintf(USEC_SPRINTF, value.usec)].join('.')
|
22
|
-
else
|
23
|
-
value
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class Upsert
|
2
|
-
class Cell
|
3
|
-
# @private
|
4
|
-
class SQLite3_Database < Cell
|
5
|
-
attr_reader :name
|
6
|
-
attr_reader :value
|
7
|
-
attr_reader :quoted_name
|
8
|
-
|
9
|
-
def initialize(connection, name, value)
|
10
|
-
@name = name
|
11
|
-
@value = value
|
12
|
-
@quoted_name = connection.quote_ident name
|
13
|
-
end
|
14
|
-
|
15
|
-
def bind_value
|
16
|
-
return @bind_value if defined?(@bind_value)
|
17
|
-
@bind_value = case value
|
18
|
-
when Upsert::Binary
|
19
|
-
SQLite3::Blob.new value.value
|
20
|
-
when BigDecimal
|
21
|
-
value.to_s('F')
|
22
|
-
when TrueClass
|
23
|
-
't'
|
24
|
-
when FalseClass
|
25
|
-
'f'
|
26
|
-
when Time, DateTime
|
27
|
-
[value.strftime(ISO8601_DATETIME), sprintf(USEC_SPRINTF, value.usec)].join('.')
|
28
|
-
when Date
|
29
|
-
value.strftime ISO8601_DATE
|
30
|
-
else
|
31
|
-
value
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class Upsert
|
2
|
-
class ColumnDefinition
|
3
|
-
# @private
|
4
|
-
class Mysql2_Client < ColumnDefinition
|
5
|
-
class << self
|
6
|
-
def all(connection, table_name)
|
7
|
-
connection.execute("SHOW COLUMNS FROM #{connection.quote_ident(table_name)}").map do |row|
|
8
|
-
name, type, default = if row.is_a?(Array)
|
9
|
-
# you don't know if mysql2 is going to give you an array or a hash... and you shouldn't specify, because it's sticky
|
10
|
-
# ["name", "varchar(255)", "YES", "UNI", nil, ""]
|
11
|
-
row.values_at(0,1,4)
|
12
|
-
else
|
13
|
-
# {"Field"=>"name", "Type"=>"varchar(255)", "Null"=>"NO", "Key"=>"PRI", "Default"=>nil, "Extra"=>""}
|
14
|
-
[row['Field'], row['Type'], row['Default']]
|
15
|
-
end
|
16
|
-
new connection, name, type, default
|
17
|
-
end.sort_by do |cd|
|
18
|
-
cd.name
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
class Upsert
|
2
|
-
class Row
|
3
|
-
# @private
|
4
|
-
class Mysql2_Client < Row
|
5
|
-
attr_reader :original_setter_keys
|
6
|
-
|
7
|
-
def initialize(controller, raw_selector, raw_setter)
|
8
|
-
super
|
9
|
-
@original_setter_keys = raw_setter.keys.map(&:to_s)
|
10
|
-
end
|
11
|
-
|
12
|
-
def quoted_setter_values
|
13
|
-
@quoted_setter_values ||= setter.values.map(&:quoted_value)
|
14
|
-
end
|
15
|
-
|
16
|
-
def values_sql_bytesize
|
17
|
-
@values_sql_bytesize ||= quoted_setter_values.inject(0) { |sum, quoted_value| sum + quoted_value.to_s.bytesize } + setter.length - 1
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|