upsert 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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