activerecord-jdbc-adapter 1.0.0.beta2-java → 1.0.0-java

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/History.txt CHANGED
@@ -2,8 +2,9 @@
2
2
 
3
3
  - Thanks to David Kellum, Dmitry Denisov, Dwayne Litzenberger, Gregor
4
4
  Schmidt, James Walker, John Duff, Joshua Suggs, Nicholas J Kreucher,
5
- Peter Donald, Geoff Longman, and Ryan Bell for their contributions
6
- to this release.
5
+ Peter Donald, Geoff Longman, Uwe Kubosch, Youhei Kondou, Michael
6
+ Pitman, Alex B, and Ryan Bell for their contributions to this
7
+ release.
7
8
  - BIG set of DB2 updates (Thanks Nick Kreucher)
8
9
  - Deprecate jdbc_adapter/rake_tasks
9
10
  - (1.0.0.beta1)
@@ -21,19 +22,19 @@
21
22
  - JRUBY-1642: Don't use H2 INFORMATION_SCHEMA in table or column
22
23
  searches
23
24
  - JRUBY-4972: Attempt to deal with type(0)/:limit => 0 by not setting
24
- it808e213 JRUBY-5040: Fix issue with limits on timestamps in MySQL
25
- - JRUBY-3555: Allow setting Derby schema with 'schema:' option917ebd9
26
- ACTIVERECORD_JDBC-98: Make sure we actuall raise an error when
25
+ it808e213
26
+ - JRUBY-5040: Fix issue with limits on timestamps in MySQL
27
+ - JRUBY-3555: Allow setting Derby schema with 'schema:' option
28
+ - ACTIVERECORD_JDBC-98: Make sure we actuall raise an error when
27
29
  inappropriately configured
28
30
  - ACTIVERECORD_JDBC-112: Add schema dumper tests for already-fixed
29
31
  MySQL type limits
30
- - ACTIVERECORD_JDBC-113: Fix PG float precision issue2c6b1aa No longer
31
- need M[ys]SQL escape hatch on case-sensitive test
32
+ - ACTIVERECORD_JDBC-113: Fix PG float precision issue
32
33
  - ACTIVERECORD_JDBC-103: Fix decimal options for PG add/change column
33
34
  (Michael Pitman)
34
35
  - ACTIVERECORD_JDBC-127: Fix quoting of Date vs. Time(stamp) for
35
36
  Oracle (Lenny Marks)
36
- - Oracle: Sort out theNUMBER vs NUMBER(x) vs NUMBER(x,y) situation.
37
+ - Oracle: Sort out the NUMBER vs NUMBER(x) vs NUMBER(x,y) situation.
37
38
  - JRUBY-3051: Think we finally got the PG mixed-case patches applied.
38
39
  - JRUBY-5081: Consolidate code for dropping DB via postgres
39
40
  - ACTIVERECORD_JDBC-101: Add override of LONGVARCHAR => CLOB for
@@ -45,6 +46,10 @@
45
46
  queries (alex b)
46
47
  - ACTIVERECORD_JDBC-129: Don't have limits for text, binary or bit
47
48
  fields
49
+ - (1.0.0 final)
50
+ - Fix a few more SQLite3 AR tests
51
+ - SQLite3: handle ":memory:" database
52
+ - Release new SQLite3 driver 3.6.14.2 and new Derby driver 10.6.2.1
48
53
 
49
54
  == 0.9.7
50
55
 
data/Manifest.txt CHANGED
@@ -7,7 +7,6 @@ lib/activerecord-jdbc-adapter.rb
7
7
  lib/arjdbc.rb
8
8
  lib/jdbc_adapter.rb
9
9
  lib/pg.rb
10
- lib/active_record/connection_adapters/cachedb_adapter.rb
11
10
  lib/active_record/connection_adapters/derby_adapter.rb
12
11
  lib/active_record/connection_adapters/h2_adapter.rb
13
12
  lib/active_record/connection_adapters/hsqldb_adapter.rb
@@ -26,7 +25,6 @@ lib/arel/engines/sql/compilers/h2_compiler.rb
26
25
  lib/arel/engines/sql/compilers/hsqldb_compiler.rb
27
26
  lib/arel/engines/sql/compilers/jdbc_compiler.rb
28
27
  lib/arel/engines/sql/compilers/mssql_compiler.rb
29
- lib/arjdbc/cachedb.rb
30
28
  lib/arjdbc/db2.rb
31
29
  lib/arjdbc/derby.rb
32
30
  lib/arjdbc/discover.rb
@@ -43,8 +41,6 @@ lib/arjdbc/postgresql.rb
43
41
  lib/arjdbc/sqlite3.rb
44
42
  lib/arjdbc/sybase.rb
45
43
  lib/arjdbc/version.rb
46
- lib/arjdbc/cachedb/adapter.rb
47
- lib/arjdbc/cachedb/connection_methods.rb
48
44
  lib/arjdbc/db2/adapter.rb
49
45
  lib/arjdbc/derby/adapter.rb
50
46
  lib/arjdbc/derby/connection_methods.rb
@@ -90,7 +86,6 @@ lib/jdbc_adapter/rake_tasks.rb
90
86
  lib/jdbc_adapter/version.rb
91
87
  lib/arjdbc/jdbc/adapter_java.jar
92
88
  test/abstract_db_create.rb
93
- test/cachedb_simple_test.rb
94
89
  test/db2_simple_test.rb
95
90
  test/derby_migration_test.rb
96
91
  test/derby_multibyte_test.rb
@@ -132,7 +127,6 @@ test/sqlite3_simple_test.rb
132
127
  test/sybase_jtds_simple_test.rb
133
128
  test/activerecord/connection_adapters/type_conversion_test.rb
134
129
  test/activerecord/connections/native_jdbc_mysql/connection.rb
135
- test/db/cachedb.rb
136
130
  test/db/db2.rb
137
131
  test/db/derby.rb
138
132
  test/db/h2.rb
data/README.txt CHANGED
@@ -110,6 +110,15 @@ or like this (but requires that you manually put the driver jar on the classpath
110
110
  :url => 'jdbc:derby:test_ar;create=true'
111
111
  )
112
112
 
113
+ == Extending AR-JDBC
114
+
115
+ You can create your own extension to AR-JDBC for a JDBC-based database
116
+ that core AR-JDBC does not support. We've created an example project
117
+ for the Intersystems Cache database that you can examine as a
118
+ template. See the project for more information at the following URL:
119
+
120
+ http://github.com/nicksieger/activerecord-cachedb-adapter
121
+
113
122
  == Getting the source
114
123
 
115
124
  The source for activerecord-jdbc-adapter is available using git.
@@ -2,15 +2,27 @@ module Arel
2
2
  module SqlCompiler
3
3
  class MsSQLCompiler < GenericCompiler
4
4
  def select_sql
5
- query = super
6
-
5
+ projections = @relation.projections
7
6
  offset = relation.skipped
8
7
  limit = relation.taken
9
- @engine.connection.add_limit_offset!(query, :limit => limit, :offset => offset) if offset || limit
10
-
8
+ if Count === projections.first && projections.size == 1 &&
9
+ (relation.taken.present? || relation.wheres.present?) && relation.joins(self).blank?
10
+ subquery = [
11
+ "SELECT * FROM #{relation.from_clauses}", build_clauses
12
+ ].join ' '
13
+ @engine.connection.add_limit_offset!(subquery, :limit => limit, :offset => offset) if offset || limit
14
+ query = "SELECT COUNT(*) AS count_id FROM (#{subquery}) AS subquery"
15
+ else
16
+ query = [
17
+ "SELECT #{relation.select_clauses.join(', ')}",
18
+ "FROM #{relation.from_clauses}",
19
+ build_clauses
20
+ ].compact.join ' '
21
+ @engine.connection.add_limit_offset!(query, :limit => limit, :offset => offset) if offset || limit
22
+ end
11
23
  query
12
24
  end
13
-
25
+
14
26
  def build_clauses
15
27
  joins = relation.joins(self)
16
28
  wheres = relation.where_clauses
@@ -98,14 +98,24 @@ module ArJdbc
98
98
 
99
99
  # holy moly batman! all this to tell AS400 "yes i am sure"
100
100
  def execute_and_auto_confirm(sql)
101
- @connection.execute_update "call qsys.qcmdexc('QSYS/CHGJOB INQMSGRPY(*SYSRPYL)',0000000031.00000)"
102
101
  begin
102
+ @connection.execute_update "call qsys.qcmdexc('QSYS/CHGJOB INQMSGRPY(*SYSRPYL)',0000000031.00000)"
103
103
  @connection.execute_update "call qsys.qcmdexc('ADDRPYLE SEQNBR(9876) MSGID(CPA32B2) RPY(''I'')',0000000045.00000)"
104
- execute sql
105
- ensure
104
+ rescue Exception => e
105
+ raise "Could not call CHGJOB INQMSGRPY(*SYSRPYL) and ADDRPYLE SEQNBR(9876) MSGID(CPA32B2) RPY('I').\n" +
106
+ "Do you have authority to do this?\n\n" + e.to_s
107
+ end
108
+
109
+ r = execute sql
110
+
111
+ begin
106
112
  @connection.execute_update "call qsys.qcmdexc('QSYS/CHGJOB INQMSGRPY(*DFT)',0000000027.00000)"
107
- @connection.execute_update "call qsys.qcmdexc('RMVRPYLE SEQNBR(9876)',0000000021.00000) "
113
+ @connection.execute_update "call qsys.qcmdexc('RMVRPYLE SEQNBR(9876)',0000000021.00000)"
114
+ rescue Exception => e
115
+ raise "Could not call CHGJOB INQMSGRPY(*DFT) and RMVRPYLE SEQNBR(9876).\n" +
116
+ "Do you have authority to do this?\n\n" + e.to_s
108
117
  end
118
+ r
109
119
  end
110
120
 
111
121
  def last_insert_id(sql)
@@ -214,18 +224,18 @@ um <= #{sanitize_limit(limit) + offset}"
214
224
 
215
225
  def change_column_null(table_name, column_name, null)
216
226
  if null
217
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP NOT NULL"
227
+ execute_and_auto_confirm "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP NOT NULL"
218
228
  else
219
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET NOT NULL"
229
+ execute_and_auto_confirm "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET NOT NULL"
220
230
  end
221
231
  reorg_table(table_name)
222
232
  end
223
233
 
224
234
  def change_column_default(table_name, column_name, default)
225
235
  if default.nil?
226
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP DEFAULT"
236
+ execute_and_auto_confirm "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP DEFAULT"
227
237
  else
228
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET WITH DEFAULT #{quote(default)}"
238
+ execute_and_auto_confirm "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET WITH DEFAULT #{quote(default)}"
229
239
  end
230
240
  reorg_table(table_name)
231
241
  end
@@ -263,7 +273,7 @@ um <= #{sanitize_limit(limit) + offset}"
263
273
  # http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000980.html
264
274
  def rename_table(name, new_name) #:nodoc:
265
275
  execute "RENAME TABLE #{name} TO #{new_name}"
266
- reorg_table(table_name)
276
+ reorg_table(new_name)
267
277
  end
268
278
 
269
279
  def tables
@@ -20,13 +20,6 @@ module ::ArJdbc
20
20
  end
21
21
 
22
22
  # Other adapters are lazy-loaded
23
- extension :CacheDB do |name|
24
- if name =~ /cache/i
25
- require 'arjdbc/cachedb'
26
- true
27
- end
28
- end
29
-
30
23
  extension :DB2 do |name, config|
31
24
  if name =~ /(db2|as400)/i && config[:url] !~ /^jdbc:derby:net:/
32
25
  require 'arjdbc/db2'
@@ -32,6 +32,7 @@ module ActiveRecord
32
32
  end
33
33
  super(connection, logger)
34
34
  extend spec if spec
35
+ configure_arel2_visitors
35
36
  connection.adapter = self
36
37
  JndiConnectionPoolCallbacks.prepare(self, connection)
37
38
  end
@@ -88,6 +89,19 @@ module ActiveRecord
88
89
  'JDBC'
89
90
  end
90
91
 
92
+ def arel2_visitors
93
+ {}
94
+ end
95
+
96
+ def configure_arel2_visitors
97
+ if defined?(::Arel::Visitors::VISITORS)
98
+ visitors = ::Arel::Visitors::VISITORS
99
+ arel2_visitors.each do |k,v|
100
+ visitors[k] = v unless visitors.has_key?(k)
101
+ end
102
+ end
103
+ end
104
+
91
105
  def is_a?(klass) # :nodoc:
92
106
  # This is to fake out current_adapter? conditional logic in AR tests
93
107
  if Class === klass && klass.name =~ /#{adapter_name}Adapter$/i
Binary file
@@ -90,6 +90,10 @@ module ::ArJdbc
90
90
  'MySQL'
91
91
  end
92
92
 
93
+ def arel2_visitors
94
+ {'jdbcmysql' => ::Arel::Visitors::MySQL}
95
+ end
96
+
93
97
  def case_sensitive_equality_operator
94
98
  "= BINARY"
95
99
  end
@@ -23,26 +23,11 @@ module ::ArJdbc
23
23
  return nil if value.nil?
24
24
  case type
25
25
  when :string then value
26
- when :integer then ArJdbc::SQLite3::Column.cast_to_integer(value)
27
26
  when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
28
27
  when :float then value.to_f
29
- when :datetime then ArJdbc::SQLite3::Column.cast_to_date_or_time(value)
30
- when :date then ArJdbc::SQLite3::Column.cast_to_date_or_time(value)
31
- when :time then ArJdbc::SQLite3::Column.cast_to_time(value)
32
28
  when :decimal then self.class.value_to_decimal(value)
33
29
  when :boolean then self.class.value_to_boolean(value)
34
- else value
35
- end
36
- end
37
-
38
- def type_cast_code(var_name)
39
- case type
40
- when :integer then "ArJdbc::SQLite3::Column.cast_to_integer(#{var_name})"
41
- when :datetime then "ArJdbc::SQLite3::Column.cast_to_date_or_time(#{var_name})"
42
- when :date then "ArJdbc::SQLite3::Column.cast_to_date_or_time(#{var_name})"
43
- when :time then "ArJdbc::SQLite3::Column.cast_to_time(#{var_name})"
44
- else
45
- super
30
+ else super
46
31
  end
47
32
  end
48
33
 
@@ -84,35 +69,16 @@ module ::ArJdbc
84
69
 
85
70
  value
86
71
  end
87
-
88
- def self.cast_to_integer(value)
89
- return nil if value =~ /NULL/ or value.to_s.empty? or value.nil?
90
- return (value.to_i) ? value.to_i : (value ? 1 : 0)
91
- end
92
-
93
- def self.cast_to_date_or_time(value)
94
- return value if value.is_a? Date
95
- return nil if value.blank?
96
- guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
97
- end
98
-
99
- def self.cast_to_time(value)
100
- return value if value.is_a? Time
101
- time_array = ParseDate.parsedate value
102
- time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
103
- Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
104
- end
105
-
106
- def self.guess_date_or_time(value)
107
- (value.hour == 0 and value.min == 0 and value.sec == 0) ?
108
- Date.new(value.year, value.month, value.day) : value
109
- end
110
72
  end
111
73
 
112
74
  def adapter_name #:nodoc:
113
75
  'SQLite'
114
76
  end
115
77
 
78
+ def supports_add_column?
79
+ sqlite_version >= '3.1.6'
80
+ end
81
+
116
82
  def supports_count_distinct? #:nodoc:
117
83
  sqlite_version >= '3.2.6'
118
84
  end
@@ -135,26 +101,10 @@ module ::ArJdbc
135
101
  tp[:time] = { :name => "TIME" }
136
102
  tp[:date] = { :name => "DATE" }
137
103
  tp[:boolean] = { :name => "BOOLEAN" }
104
+ tp[:binary] = { :name => "BLOB" }
138
105
  tp
139
106
  end
140
107
 
141
- def quote(value, column = nil) # :nodoc:
142
- return value.quoted_id if value.respond_to?(:quoted_id)
143
- case value
144
- when String
145
- if column && column.type == :binary
146
- "'#{quote_string(column.class.string_to_binary(value))}'"
147
- elsif column && [:integer, :float].include?(column.type)
148
- (column.type == :integer ? value.to_i : value.to_f).to_s
149
- elsif column && column.respond_to?(:primary) && column.primary && column.klass != String
150
- value.to_i.to_s
151
- else
152
- "'#{quote_string(value)}'"
153
- end
154
- else super
155
- end
156
- end
157
-
158
108
  def quote_column_name(name) #:nodoc:
159
109
  %Q("#{name}")
160
110
  end
@@ -171,56 +121,6 @@ module ::ArJdbc
171
121
  %Q{'f'}
172
122
  end
173
123
 
174
- def add_column(table_name, column_name, type, options = {})
175
- if option_not_null = options[:null] == false
176
- option_not_null = options.delete(:null)
177
- end
178
- add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
179
- add_column_options!(add_column_sql, options)
180
- execute(add_column_sql)
181
- if option_not_null
182
- alter_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ALTER #{quote_column_name(column_name)} NOT NULL"
183
- end
184
- end
185
-
186
- def remove_column(table_name, *column_names) #:nodoc:
187
- column_names.flatten.each do |column_name|
188
- alter_table(table_name) do |definition|
189
- definition.columns.delete(definition[column_name])
190
- end
191
- end
192
- end
193
- alias :remove_columns :remove_column
194
-
195
- def change_column(table_name, column_name, type, options = {}) #:nodoc:
196
- alter_table(table_name) do |definition|
197
- include_default = options_include_default?(options)
198
- definition[column_name].instance_eval do
199
- self.type = type
200
- self.limit = options[:limit] if options.include?(:limit)
201
- self.default = options[:default] if include_default
202
- self.null = options[:null] if options.include?(:null)
203
- end
204
- end
205
- end
206
-
207
- def change_column_default(table_name, column_name, default) #:nodoc:
208
- alter_table(table_name) do |definition|
209
- definition[column_name].default = default
210
- end
211
- end
212
-
213
- def rename_column(table_name, column_name, new_column_name) #:nodoc:
214
- unless columns(table_name).detect{|c| c.name == column_name.to_s }
215
- raise ActiveRecord::ActiveRecordError, "Missing column #{table_name}.#{column_name}"
216
- end
217
- alter_table(table_name, :rename => {column_name.to_s => new_column_name.to_s})
218
- end
219
-
220
- def rename_table(name, new_name)
221
- execute "ALTER TABLE #{name} RENAME TO #{new_name}"
222
- end
223
-
224
124
  def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
225
125
  @connection.execute_update(sql)
226
126
  id_value || last_insert_id
@@ -294,15 +194,94 @@ module ::ArJdbc
294
194
 
295
195
  def columns(table_name, name = nil) #:nodoc:
296
196
  table_structure(table_name).map do |field|
297
- ::ActiveRecord::ConnectionAdapters::JdbcColumn.new(@config, field['name'], field['dflt_value'], field['type'], field['notnull'] == 0)
197
+ ::ActiveRecord::ConnectionAdapters::SQLite3Column.new(@config, field['name'], field['dflt_value'], field['type'], field['notnull'] == 0)
198
+ end
199
+ end
200
+
201
+ def primary_key(table_name) #:nodoc:
202
+ column = table_structure(table_name).find { |field|
203
+ field['pk'].to_i == 1
204
+ }
205
+ column && column['name']
206
+ end
207
+
208
+ def remove_index!(table_name, index_name) #:nodoc:
209
+ execute "DROP INDEX #{quote_column_name(index_name)}"
210
+ end
211
+
212
+ def rename_table(name, new_name)
213
+ execute "ALTER TABLE #{quote_table_name(name)} RENAME TO #{quote_table_name(new_name)}"
214
+ end
215
+
216
+ # See: http://www.sqlite.org/lang_altertable.html
217
+ # SQLite has an additional restriction on the ALTER TABLE statement
218
+ def valid_alter_table_options( type, options)
219
+ type.to_sym != :primary_key
220
+ end
221
+
222
+ def add_column(table_name, column_name, type, options = {}) #:nodoc:
223
+ if supports_add_column? && valid_alter_table_options( type, options )
224
+ super(table_name, column_name, type, options)
225
+ else
226
+ alter_table(table_name) do |definition|
227
+ definition.column(column_name, type, options)
228
+ end
229
+ end
230
+ end
231
+
232
+ def remove_column(table_name, *column_names) #:nodoc:
233
+ raise ArgumentError.new("You must specify at least one column name. Example: remove_column(:people, :first_name)") if column_names.empty?
234
+ column_names.flatten.each do |column_name|
235
+ alter_table(table_name) do |definition|
236
+ definition.columns.delete(definition[column_name])
237
+ end
238
+ end
239
+ end
240
+ alias :remove_columns :remove_column
241
+
242
+ def change_column_default(table_name, column_name, default) #:nodoc:
243
+ alter_table(table_name) do |definition|
244
+ definition[column_name].default = default
298
245
  end
299
246
  end
300
247
 
248
+ def change_column_null(table_name, column_name, null, default = nil)
249
+ unless null || default.nil?
250
+ execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
251
+ end
252
+ alter_table(table_name) do |definition|
253
+ definition[column_name].null = null
254
+ end
255
+ end
256
+
257
+ def change_column(table_name, column_name, type, options = {}) #:nodoc:
258
+ alter_table(table_name) do |definition|
259
+ include_default = options_include_default?(options)
260
+ definition[column_name].instance_eval do
261
+ self.type = type
262
+ self.limit = options[:limit] if options.include?(:limit)
263
+ self.default = options[:default] if include_default
264
+ self.null = options[:null] if options.include?(:null)
265
+ end
266
+ end
267
+ end
268
+
269
+ def rename_column(table_name, column_name, new_column_name) #:nodoc:
270
+ unless columns(table_name).detect{|c| c.name == column_name.to_s }
271
+ raise ActiveRecord::ActiveRecordError, "Missing column #{table_name}.#{column_name}"
272
+ end
273
+ alter_table(table_name, :rename => {column_name.to_s => new_column_name.to_s})
274
+ end
275
+
301
276
  # SELECT ... FOR UPDATE is redundant since the table is locked.
302
277
  def add_lock!(sql, options) #:nodoc:
303
278
  sql
304
279
  end
305
280
 
281
+ def empty_insert_statement_value
282
+ "VALUES(NULL)"
283
+ end
284
+
306
285
  protected
307
286
  include ArJdbc::MissingFunctionalityHelper
308
287
 
@@ -318,7 +297,7 @@ module ::ArJdbc
318
297
  end
319
298
 
320
299
  module ActiveRecord::ConnectionAdapters
321
- class SQLiteColumn < JdbcColumn
300
+ class SQLite3Column < JdbcColumn
322
301
  include ArJdbc::SQLite3::Column
323
302
 
324
303
  def initialize(name, *args)
@@ -333,44 +312,19 @@ module ActiveRecord::ConnectionAdapters
333
312
  end
334
313
 
335
314
  def self.string_to_binary(value)
336
- value.gsub(/\0|%/n) do |b|
337
- case b
338
- when "\0" then "%00"
339
- when "\%" then "%25"
340
- end
341
- end
315
+ "\000b64" + [value].pack('m*').split("\n").join('')
342
316
  end
343
317
 
344
318
  def self.binary_to_string(value)
345
- value.gsub(/%00|%25/n) do |b|
346
- case b
347
- when "%00" then "\0"
348
- when "%25" then "%"
349
- end
319
+ if value.respond_to?(:force_encoding) && value.encoding != Encoding::ASCII_8BIT
320
+ value = value.force_encoding(Encoding::ASCII_8BIT)
350
321
  end
351
- end
352
-
353
- def self.cast_to_integer(value)
354
- return nil if value =~ /NULL/ or value.to_s.empty? or value.nil?
355
- return (value.to_i) ? value.to_i : (value ? 1 : 0)
356
- end
357
-
358
- def self.cast_to_date_or_time(value)
359
- return value if value.is_a? Date
360
- return nil if value.blank?
361
- guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
362
- end
363
-
364
- def self.cast_to_time(value)
365
- return value if value.is_a? Time
366
- time_array = ParseDate.parsedate value
367
- time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
368
- Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
369
- end
370
322
 
371
- def self.guess_date_or_time(value)
372
- (value.hour == 0 and value.min == 0 and value.sec == 0) ?
373
- Date.new(value.year, value.month, value.day) : value
323
+ if value[0..3] == "\000b64"
324
+ value[4..-1].unpack('m*').first
325
+ else
326
+ value
327
+ end
374
328
  end
375
329
  end
376
330
 
@@ -381,8 +335,20 @@ module ActiveRecord::ConnectionAdapters
381
335
  # return nil to avoid extending ArJdbc::SQLite3, which we've already done
382
336
  end
383
337
 
338
+ def jdbc_connection_class(spec)
339
+ ArJdbc::SQLite3.jdbc_connection_class
340
+ end
341
+
384
342
  def jdbc_column_class
385
- ActiveRecord::ConnectionAdapters::SQLiteColumn
343
+ ActiveRecord::ConnectionAdapters::SQLite3Column
386
344
  end
387
345
  end
388
346
  end
347
+
348
+ # Fake out sqlite3/version driver for AR tests
349
+ $LOADED_FEATURES << 'sqlite3/version.rb'
350
+ module SQLite3
351
+ module Version
352
+ VERSION = '1.2.6' # query_cache_test.rb requires SQLite3::Version::VERSION > '1.2.5'
353
+ end
354
+ end
@@ -8,8 +8,9 @@ class ActiveRecord::Base
8
8
  require "arjdbc/sqlite3"
9
9
 
10
10
  parse_sqlite3_config!(config)
11
-
12
- config[:url] ||= "jdbc:sqlite:#{config[:database]}"
11
+ database = config[:database]
12
+ database = '' if database == ':memory:'
13
+ config[:url] ||= "jdbc:sqlite:#{database}"
13
14
  config[:driver] ||= "org.sqlite.JDBC"
14
15
  config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter
15
16
  jdbc_connection(config)
@@ -1,6 +1,6 @@
1
1
  module ArJdbc
2
2
  module Version
3
- VERSION = "1.0.0.beta2"
3
+ VERSION = "1.0.0"
4
4
  end
5
5
  end
6
6
  # Compatibility with older versions of ar-jdbc for other extensions out there
data/rakelib/compile.rake CHANGED
@@ -16,9 +16,10 @@ jar_name = File.join(*%w(lib arjdbc jdbc adapter_java.jar))
16
16
 
17
17
  desc "Compile the native Java code."
18
18
  task :java_compile do
19
+ debug = ENV['DEBUG'] ? '-g' : ''
19
20
  pkg_classes = File.join(*%w(pkg classes))
20
21
  mkdir_p pkg_classes
21
- sh "javac -target 1.5 -source 1.5 -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
22
+ sh "javac -target 1.5 -source 1.5 #{debug} -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
22
23
  sh "jar cf #{jar_name} -C #{pkg_classes} ."
23
24
  end
24
25
  file jar_name => :java_compile
data/test/db/db2.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  config = {
2
- :username => "blog",
3
- :password => "",
2
+ # DB2 uses $USER if running locally, just add
3
+ # yourself to your db2 groups in /etc/group
4
+ # :username => "blog",
5
+ # :password => "",
4
6
  :adapter => "jdbc",
5
7
  :driver => "com.ibm.db2.jcc.DB2Driver",
6
8
  :url => "jdbc:db2:weblog_development"
@@ -31,7 +31,7 @@ System.set_property(Context::PROVIDER_URL, "file://#{jndi_dir}")
31
31
  ic = InitialContext.new
32
32
  ic.rebind(JNDI_CONFIG[:jndi],
33
33
  org.apache.derby.jdbc.EmbeddedDataSource.new.tap {|ds|
34
- ds.database_name = "derby-testdb"
34
+ ds.database_name = "derby-testdb-jndi"
35
35
  ds.create_database = "create"
36
36
  ds.user = "sa"
37
37
  ds.password = ""})
@@ -3,15 +3,20 @@ require 'active_record'
3
3
 
4
4
  module Migration
5
5
  class MixedCase < ActiveRecord::Migration
6
-
6
+
7
7
  def self.up
8
8
  create_table "mixed_cases" do |t|
9
9
  t.column :SOME_value, :string
10
10
  end
11
+ create_table "tblUsers" do |t|
12
+ t.column :firstName, :string
13
+ t.column :lastName, :string
14
+ end
11
15
  end
12
-
16
+
13
17
  def self.down
14
18
  drop_table "mixed_cases"
19
+ drop_table "tblUsers"
15
20
  end
16
21
  end
17
22
  end
@@ -1,13 +1,18 @@
1
1
  require 'jdbc_common'
2
+ require 'models/entry'
2
3
  require 'models/mixed_case'
3
4
 
4
5
  class MixedCaseTest < Test::Unit::TestCase
5
-
6
6
  def setup
7
7
  Migration::MixedCase.up
8
+ @table_name = User.table_name
9
+ User.table_name = 'tblUsers'
10
+ User.reset_column_information
8
11
  end
9
12
 
10
13
  def teardown
14
+ User.table_name = @table_name
15
+ User.reset_column_information
11
16
  Migration::MixedCase.down
12
17
  end
13
18
 
@@ -16,4 +21,9 @@ class MixedCaseTest < Test::Unit::TestCase
16
21
  assert_equal 'some value', mixed_case.SOME_value
17
22
  end
18
23
 
24
+ def test_find_mixed_table_name
25
+ User.create :firstName => "Nick", :lastName => "Sieger"
26
+ u = User.find :first
27
+ assert_equal "Nick Sieger", "#{u.firstName} #{u.lastName}"
28
+ end
19
29
  end
data/test/simple.rb CHANGED
@@ -111,6 +111,16 @@ module SimpleTestMethods
111
111
  assert_equal prev_count - 1, Entry.count
112
112
  end
113
113
 
114
+ if Entry.respond_to?(:limit)
115
+ def test_limit
116
+ Entry.limit(10).to_a
117
+ end
118
+
119
+ def test_count_with_limit
120
+ assert_equal Entry.count, Entry.limit(10).count
121
+ end
122
+ end
123
+
114
124
  if Time.respond_to?(:zone)
115
125
  def test_save_time_with_utc
116
126
  current_zone = Time.zone
@@ -241,7 +251,6 @@ module SimpleTestMethods
241
251
  binary_string = "\000ABCDEFGHIJKLMNOPQRSTUVWXYZ'\001\003"*1#2_000
242
252
  e = DbType.find(:first)
243
253
  e.sample_binary = binary_string
244
- e.send(:write_attribute, :binary, binary_string)
245
254
  e.save!
246
255
  e = DbType.find(:first)
247
256
  assert_equal binary_string, e.sample_binary
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: true
4
+ prerelease: false
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
8
  - 0
9
- - beta2
10
- version: 1.0.0.beta2
9
+ version: 1.0.0
11
10
  platform: java
12
11
  authors:
13
12
  - Nick Sieger, Ola Bini and JRuby contributors
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-09-25 00:00:00 -05:00
17
+ date: 2010-10-14 00:00:00 -05:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -72,7 +71,6 @@ files:
72
71
  - lib/arjdbc.rb
73
72
  - lib/jdbc_adapter.rb
74
73
  - lib/pg.rb
75
- - lib/active_record/connection_adapters/cachedb_adapter.rb
76
74
  - lib/active_record/connection_adapters/derby_adapter.rb
77
75
  - lib/active_record/connection_adapters/h2_adapter.rb
78
76
  - lib/active_record/connection_adapters/hsqldb_adapter.rb
@@ -91,7 +89,6 @@ files:
91
89
  - lib/arel/engines/sql/compilers/hsqldb_compiler.rb
92
90
  - lib/arel/engines/sql/compilers/jdbc_compiler.rb
93
91
  - lib/arel/engines/sql/compilers/mssql_compiler.rb
94
- - lib/arjdbc/cachedb.rb
95
92
  - lib/arjdbc/db2.rb
96
93
  - lib/arjdbc/derby.rb
97
94
  - lib/arjdbc/discover.rb
@@ -108,8 +105,6 @@ files:
108
105
  - lib/arjdbc/sqlite3.rb
109
106
  - lib/arjdbc/sybase.rb
110
107
  - lib/arjdbc/version.rb
111
- - lib/arjdbc/cachedb/adapter.rb
112
- - lib/arjdbc/cachedb/connection_methods.rb
113
108
  - lib/arjdbc/db2/adapter.rb
114
109
  - lib/arjdbc/derby/adapter.rb
115
110
  - lib/arjdbc/derby/connection_methods.rb
@@ -155,7 +150,6 @@ files:
155
150
  - lib/jdbc_adapter/version.rb
156
151
  - lib/arjdbc/jdbc/adapter_java.jar
157
152
  - test/abstract_db_create.rb
158
- - test/cachedb_simple_test.rb
159
153
  - test/db2_simple_test.rb
160
154
  - test/derby_migration_test.rb
161
155
  - test/derby_multibyte_test.rb
@@ -197,7 +191,6 @@ files:
197
191
  - test/sybase_jtds_simple_test.rb
198
192
  - test/activerecord/connection_adapters/type_conversion_test.rb
199
193
  - test/activerecord/connections/native_jdbc_mysql/connection.rb
200
- - test/db/cachedb.rb
201
194
  - test/db/db2.rb
202
195
  - test/db/derby.rb
203
196
  - test/db/h2.rb
@@ -262,13 +255,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
262
255
  required_rubygems_version: !ruby/object:Gem::Requirement
263
256
  none: false
264
257
  requirements:
265
- - - ">"
258
+ - - ">="
266
259
  - !ruby/object:Gem::Version
267
260
  segments:
268
- - 1
269
- - 3
270
- - 1
271
- version: 1.3.1
261
+ - 0
262
+ version: "0"
272
263
  requirements: []
273
264
 
274
265
  rubyforge_project: jruby-extras
@@ -1 +0,0 @@
1
- require 'arjdbc/cachedb'
@@ -1,3 +0,0 @@
1
- require 'arjdbc/jdbc'
2
- require 'arjdbc/cachedb/connection_methods'
3
- require 'arjdbc/cachedb/adapter'
@@ -1,20 +0,0 @@
1
- require 'arjdbc/mssql/tsql_helper'
2
-
3
- module ::ArJdbc
4
- module CacheDB
5
- include TSqlMethods
6
-
7
- def self.column_selector
8
- [ /cache/i, lambda { | cfg, col | col.extend( ::ArJdbc::CacheDB::Column ) } ]
9
- end
10
-
11
- module Column
12
- end
13
-
14
- def create_table(name, options = { })
15
- super(name, options)
16
- primary_key = options[:primary_key] || "id"
17
- execute "ALTER TABLE #{name} ADD CONSTRAINT #{name}_PK PRIMARY KEY(#{primary_key})" unless options[:id] == false
18
- end
19
- end
20
- end
@@ -1,10 +0,0 @@
1
- class ActiveRecord::Base
2
- class << self
3
- def cachedb_connection( config )
4
- config[:port] ||= 1972
5
- config[:url] ||= "jdbc:Cache://#{config[:host]}:#{config[:port]}/#{ config[:database]}"
6
- config[:driver] ||= "com.intersys.jdbc.CacheDriver"
7
- jdbc_connection(config)
8
- end
9
- end
10
- end
@@ -1,6 +0,0 @@
1
- require 'jdbc_common'
2
- require 'db/cachedb'
3
-
4
- class CacheDBSimpleTest < Test::Unit::TestCase
5
- include SimpleTestMethods
6
- end
data/test/db/cachedb.rb DELETED
@@ -1,9 +0,0 @@
1
- config = {
2
- :username => '_SYSTEM',
3
- :password => 'SYS',
4
- :adapter => 'cachedb',
5
- :host => ENV[ "CACHE_HOST" ] || 'localhost',
6
- :database => ENV[ "CACHE_NAMESPACE" ] || 'weblog_development'
7
- }
8
-
9
- ActiveRecord::Base.establish_connection( config )