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

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