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.
Files changed (49) hide show
  1. data/CHANGELOG +7 -0
  2. data/Gemfile +4 -0
  3. data/README.md +115 -66
  4. data/Rakefile +16 -5
  5. data/lib/upsert.rb +86 -25
  6. data/lib/upsert/binary.rb +2 -0
  7. data/lib/upsert/column_definition.rb +27 -3
  8. data/lib/upsert/column_definition/mysql.rb +20 -0
  9. data/lib/upsert/column_definition/{PG_Connection.rb → postgresql.rb} +1 -1
  10. data/lib/upsert/connection.rb +20 -22
  11. data/lib/upsert/connection/Java_ComMysqlJdbc_JDBC4Connection.rb +25 -0
  12. data/lib/upsert/connection/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb +14 -0
  13. data/lib/upsert/connection/Java_OrgSqliteConn.rb +17 -0
  14. data/lib/upsert/connection/Mysql2_Client.rb +40 -18
  15. data/lib/upsert/connection/PG_Connection.rb +7 -3
  16. data/lib/upsert/connection/SQLite3_Database.rb +10 -2
  17. data/lib/upsert/connection/jdbc.rb +81 -0
  18. data/lib/upsert/connection/sqlite3.rb +23 -0
  19. data/lib/upsert/merge_function/Java_ComMysqlJdbc_JDBC4Connection.rb +42 -0
  20. data/lib/upsert/merge_function/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb +35 -0
  21. data/lib/upsert/merge_function/Java_OrgSqliteConn.rb +10 -0
  22. data/lib/upsert/merge_function/Mysql2_Client.rb +5 -58
  23. data/lib/upsert/merge_function/PG_Connection.rb +6 -78
  24. data/lib/upsert/merge_function/SQLite3_Database.rb +3 -22
  25. data/lib/upsert/merge_function/mysql.rb +67 -0
  26. data/lib/upsert/merge_function/postgresql.rb +94 -0
  27. data/lib/upsert/merge_function/sqlite3.rb +30 -0
  28. data/lib/upsert/row.rb +3 -6
  29. data/lib/upsert/version.rb +1 -1
  30. data/spec/binary_spec.rb +0 -2
  31. data/spec/correctness_spec.rb +26 -25
  32. data/spec/database_functions_spec.rb +6 -14
  33. data/spec/logger_spec.rb +22 -10
  34. data/spec/precision_spec.rb +1 -1
  35. data/spec/spec_helper.rb +115 -31
  36. data/spec/speed_spec.rb +1 -1
  37. data/spec/timezones_spec.rb +35 -14
  38. data/spec/type_safety_spec.rb +2 -2
  39. data/upsert.gemspec +18 -6
  40. metadata +25 -38
  41. data/lib/upsert/cell.rb +0 -5
  42. data/lib/upsert/cell/Mysql2_Client.rb +0 -16
  43. data/lib/upsert/cell/PG_Connection.rb +0 -28
  44. data/lib/upsert/cell/SQLite3_Database.rb +0 -36
  45. data/lib/upsert/column_definition/Mysql2_Client.rb +0 -24
  46. data/lib/upsert/column_definition/SQLite3_Database.rb +0 -7
  47. data/lib/upsert/row/Mysql2_Client.rb +0 -21
  48. data/lib/upsert/row/PG_Connection.rb +0 -7
  49. data/lib/upsert/row/SQLite3_Database.rb +0 -7
@@ -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(PG::Error, /invalid input syntax/)
8
+ end.should raise_error
9
9
  end
10
10
  end
11
- end if ENV['ADAPTER'] == 'postgresql'
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
- gem.add_development_dependency 'posix-spawn'
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 'sqlite3'
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.2
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 00:00:00.000000000 Z
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: sqlite3
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: mysql2
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: pg
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: activerecord
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: active_record_inline_schema
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: faker
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: yard
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: redcarpet
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: activerecord-import
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: pry
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/Mysql2_Client.rb
262
- - lib/upsert/column_definition/PG_Connection.rb
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,5 +0,0 @@
1
- class Upsert
2
- # @private
3
- class Cell
4
- end
5
- end
@@ -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,7 +0,0 @@
1
- class Upsert
2
- class ColumnDefinition
3
- # @private
4
- class SQLite3_Database < ColumnDefinition
5
- end
6
- end
7
- 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
@@ -1,7 +0,0 @@
1
- class Upsert
2
- class Row
3
- # @private
4
- class PG_Connection < Row
5
- end
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- class Upsert
2
- class Row
3
- # @private
4
- class SQLite3_Database < Row
5
- end
6
- end
7
- end