kb-activerecord-jdbc-adapter 0.9.7.1-java → 1.0.0.beta1-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.
Files changed (123) hide show
  1. data/History.txt +11 -0
  2. data/Manifest.txt +71 -38
  3. data/lib/active_record/connection_adapters/cachedb_adapter.rb +1 -1
  4. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -13
  5. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -13
  6. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -13
  7. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -1
  8. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -661
  9. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -1
  10. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -13
  11. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -13
  12. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -1
  13. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -13
  14. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -13
  15. data/lib/activerecord-jdbc-adapter.rb +2 -2
  16. data/lib/arjdbc/cachedb/adapter.rb +20 -0
  17. data/lib/arjdbc/cachedb/connection_methods.rb +10 -0
  18. data/lib/arjdbc/cachedb.rb +3 -0
  19. data/lib/{jdbc_adapter/jdbc_db2.rb → arjdbc/db2/adapter.rb} +2 -17
  20. data/lib/arjdbc/db2.rb +2 -0
  21. data/lib/{jdbc_adapter/jdbc_derby.rb → arjdbc/derby/adapter.rb} +8 -26
  22. data/lib/arjdbc/derby/connection_methods.rb +18 -0
  23. data/lib/arjdbc/derby.rb +7 -0
  24. data/lib/arjdbc/discover.rb +99 -0
  25. data/lib/{jdbc_adapter/jdbc_firebird.rb → arjdbc/firebird/adapter.rb} +12 -16
  26. data/lib/arjdbc/firebird.rb +2 -0
  27. data/lib/arjdbc/h2/adapter.rb +15 -0
  28. data/lib/arjdbc/h2/connection_methods.rb +12 -0
  29. data/lib/arjdbc/h2.rb +4 -0
  30. data/lib/{jdbc_adapter/jdbc_hsqldb.rb → arjdbc/hsqldb/adapter.rb} +6 -58
  31. data/lib/arjdbc/hsqldb/connection_methods.rb +14 -0
  32. data/lib/arjdbc/hsqldb.rb +4 -0
  33. data/lib/{jdbc_adapter/jdbc_informix.rb → arjdbc/informix/adapter.rb} +6 -19
  34. data/lib/arjdbc/informix/connection_methods.rb +10 -0
  35. data/lib/arjdbc/informix.rb +3 -0
  36. data/lib/arjdbc/jdbc/adapter.rb +235 -0
  37. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  38. data/lib/arjdbc/jdbc/callbacks.rb +44 -0
  39. data/lib/arjdbc/jdbc/column.rb +38 -0
  40. data/lib/arjdbc/jdbc/compatibility.rb +51 -0
  41. data/lib/arjdbc/jdbc/connection.rb +97 -0
  42. data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
  43. data/lib/arjdbc/jdbc/core_ext.rb +24 -0
  44. data/lib/arjdbc/jdbc/discover.rb +18 -0
  45. data/lib/arjdbc/jdbc/driver.rb +44 -0
  46. data/lib/arjdbc/jdbc/extension.rb +47 -0
  47. data/lib/arjdbc/jdbc/java.rb +14 -0
  48. data/lib/{jdbc_adapter → arjdbc/jdbc}/missing_functionality_helper.rb +5 -5
  49. data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
  50. data/lib/{jdbc_adapter → arjdbc/jdbc}/railtie.rb +1 -1
  51. data/lib/arjdbc/jdbc/require_driver.rb +16 -0
  52. data/lib/arjdbc/jdbc/type_converter.rb +119 -0
  53. data/lib/arjdbc/jdbc.rb +2 -0
  54. data/lib/{jdbc_adapter/jdbc_mimer.rb → arjdbc/mimer/adapter.rb} +16 -19
  55. data/lib/arjdbc/mimer.rb +2 -0
  56. data/lib/{jdbc_adapter/jdbc_mssql.rb → arjdbc/mssql/adapter.rb} +19 -31
  57. data/lib/arjdbc/mssql/connection_methods.rb +13 -0
  58. data/lib/arjdbc/mssql.rb +4 -0
  59. data/lib/arjdbc/mysql/adapter.rb +388 -0
  60. data/lib/arjdbc/mysql/connection_methods.rb +26 -0
  61. data/lib/arjdbc/mysql.rb +4 -0
  62. data/lib/{jdbc_adapter/jdbc_oracle.rb → arjdbc/oracle/adapter.rb} +9 -17
  63. data/lib/arjdbc/oracle/connection_methods.rb +11 -0
  64. data/lib/arjdbc/oracle.rb +3 -0
  65. data/lib/{jdbc_adapter/jdbc_postgre.rb → arjdbc/postgresql/adapter.rb} +7 -36
  66. data/lib/arjdbc/postgresql/connection_methods.rb +21 -0
  67. data/lib/arjdbc/postgresql.rb +4 -0
  68. data/lib/{jdbc_adapter/jdbc_sqlite3.rb → arjdbc/sqlite3/adapter.rb} +106 -104
  69. data/lib/arjdbc/sqlite3/connection_methods.rb +33 -0
  70. data/lib/arjdbc/sqlite3.rb +4 -0
  71. data/lib/arjdbc/sybase/adapter.rb +46 -0
  72. data/lib/arjdbc/sybase.rb +2 -0
  73. data/lib/arjdbc/version.rb +8 -0
  74. data/lib/arjdbc.rb +29 -0
  75. data/lib/jdbc_adapter/version.rb +3 -5
  76. data/lib/jdbc_adapter.rb +2 -27
  77. data/rails_generators/templates/config/initializers/jdbc.rb +1 -1
  78. data/rakelib/compile.rake +3 -2
  79. data/rakelib/package.rake +3 -3
  80. data/src/java/{jdbc_adapter/JdbcDerbySpec.java → arjdbc/derby/DerbyModule.java} +32 -32
  81. data/src/java/{jdbc_adapter/JdbcAdapterInternalService.java → arjdbc/jdbc/AdapterJavaService.java} +13 -7
  82. data/src/java/{jdbc_adapter → arjdbc/jdbc}/JdbcConnectionFactory.java +6 -6
  83. data/src/java/{jdbc_adapter → arjdbc/jdbc}/RubyJdbcConnection.java +91 -16
  84. data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
  85. data/src/java/{jdbc_adapter → arjdbc/mssql}/MssqlRubyJdbcConnection.java +5 -2
  86. data/src/java/{jdbc_adapter/JdbcMySQLSpec.java → arjdbc/mysql/MySQLModule.java} +12 -12
  87. data/src/java/{jdbc_adapter/PostgresRubyJdbcConnection.java → arjdbc/postgresql/PostgresqlRubyJdbcConnection.java} +11 -9
  88. data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +64 -0
  89. data/test/abstract_db_create.rb +4 -1
  90. data/test/activerecord/connection_adapters/type_conversion_test.rb +1 -1
  91. data/test/db/cachedb.rb +0 -0
  92. data/test/db/derby.rb +12 -14
  93. data/test/db/hsqldb.rb +3 -2
  94. data/test/db/jndi_config.rb +4 -4
  95. data/test/db/sqlite3.rb +2 -6
  96. data/test/db2_simple_test.rb +23 -0
  97. data/test/derby_migration_test.rb +50 -3
  98. data/test/jdbc_common.rb +1 -1
  99. data/test/jndi_callbacks_test.rb +1 -0
  100. data/test/postgres_nonseq_pkey_test.rb +0 -2
  101. data/test/postgres_schema_search_path_test.rb +0 -2
  102. data/test/simple.rb +3 -3
  103. data/test/sybase_jtds_simple_test.rb +22 -0
  104. metadata +81 -46
  105. data/lib/active_record/connection_adapters/jdbc_adapter_spec.rb +0 -26
  106. data/lib/jdbc_adapter/jdbc_adapter_internal.jar +0 -0
  107. data/lib/jdbc_adapter/jdbc_cachedb.rb +0 -33
  108. data/lib/jdbc_adapter/jdbc_mysql.rb +0 -260
  109. data/lib/jdbc_adapter/jdbc_sybase.rb +0 -50
  110. data/src/java/jdbc_adapter/SQLBlock.java +0 -27
  111. data/src/java/jdbc_adapter/Sqlite3RubyJdbcConnection.java +0 -41
  112. data/test/jdbc_adapter/jdbc_db2_test.rb +0 -26
  113. data/test/jdbc_adapter/jdbc_sybase_test.rb +0 -33
  114. data/test/minirunit/testConnect.rb +0 -14
  115. data/test/minirunit/testH2.rb +0 -73
  116. data/test/minirunit/testHsqldb.rb +0 -73
  117. data/test/minirunit/testLoadActiveRecord.rb +0 -3
  118. data/test/minirunit/testMysql.rb +0 -83
  119. data/test/minirunit/testRawSelect.rb +0 -24
  120. data/test/minirunit.rb +0 -109
  121. /data/lib/{jdbc_adapter → arjdbc/jdbc}/jdbc.rake +0 -0
  122. /data/lib/{jdbc_adapter → arjdbc/jdbc}/rake_tasks.rb +0 -0
  123. /data/lib/{jdbc_adapter → arjdbc/mssql}/tsql_helper.rb +0 -0
@@ -1,47 +1,13 @@
1
- module ::JdbcSpec
2
- # Don't need to load native postgres adapter
3
- $LOADED_FEATURES << "active_record/connection_adapters/sqlite3_adapter.rb"
1
+ require 'arjdbc/jdbc/missing_functionality_helper'
4
2
 
5
- module ActiveRecordExtensions
6
- add_method_to_remove_from_ar_base(:sqlite3_connection)
7
-
8
- def sqlite3_connection(config)
9
- require File.dirname(__FILE__) + "/../active_record/connection_adapters/sqlite3_adapter"
10
-
11
- parse_sqlite3_config!(config)
12
-
13
- config[:url] ||= "jdbc:sqlite:#{config[:database]}"
14
- config[:driver] ||= "org.sqlite.JDBC"
15
- jdbc_connection(config)
16
- end
17
-
18
- def parse_sqlite3_config!(config)
19
- config[:database] ||= config[:dbfile]
20
-
21
- # Allow database path relative to RAILS_ROOT, but only if
22
- # the database path is not the special path that tells
23
- # Sqlite to build a database only in memory.
24
- rails_root_defined = defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
25
- if rails_root_defined && ':memory:' != config[:database]
26
- rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
27
- config[:database] = File.expand_path(config[:database], rails_root)
28
- end
29
- end
30
- end
3
+ module ActiveRecord::ConnectionAdapters
4
+ Sqlite3Adapter = Class.new(AbstractAdapter) unless const_defined?(:Sqlite3Adapter)
5
+ end
31
6
 
7
+ module ::ArJdbc
32
8
  module SQLite3
33
- def self.extended(base)
34
- base.class.class_eval do
35
- alias_chained_method :insert, :query_dirty, :insert
36
- end
37
- end
38
-
39
- def self.adapter_matcher(name, *)
40
- name =~ /sqlite/i ? self : false
41
- end
42
-
43
9
  def self.column_selector
44
- [/sqlite/i, lambda {|cfg,col| col.extend(::JdbcSpec::SQLite3::Column)}]
10
+ [/sqlite/i, lambda {|cfg,col| col.extend(::ArJdbc::SQLite3::Column)}]
45
11
  end
46
12
 
47
13
  def self.jdbc_connection_class
@@ -57,12 +23,12 @@ module ::JdbcSpec
57
23
  return nil if value.nil?
58
24
  case type
59
25
  when :string then value
60
- when :integer then JdbcSpec::SQLite3::Column.cast_to_integer(value)
26
+ when :integer then ArJdbc::SQLite3::Column.cast_to_integer(value)
61
27
  when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
62
28
  when :float then value.to_f
63
- when :datetime then JdbcSpec::SQLite3::Column.cast_to_date_or_time(value)
64
- when :date then JdbcSpec::SQLite3::Column.cast_to_date_or_time(value)
65
- when :time then JdbcSpec::SQLite3::Column.cast_to_time(value)
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)
66
32
  when :decimal then self.class.value_to_decimal(value)
67
33
  when :boolean then self.class.value_to_boolean(value)
68
34
  else value
@@ -71,10 +37,10 @@ module ::JdbcSpec
71
37
 
72
38
  def type_cast_code(var_name)
73
39
  case type
74
- when :integer then "JdbcSpec::SQLite3::Column.cast_to_integer(#{var_name})"
75
- when :datetime then "JdbcSpec::SQLite3::Column.cast_to_date_or_time(#{var_name})"
76
- when :date then "JdbcSpec::SQLite3::Column.cast_to_date_or_time(#{var_name})"
77
- when :time then "JdbcSpec::SQLite3::Column.cast_to_time(#{var_name})"
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})"
78
44
  else
79
45
  super
80
46
  end
@@ -98,11 +64,11 @@ module ::JdbcSpec
98
64
 
99
65
  def extract_precision(sql_type)
100
66
  case sql_type
101
- when /^(real)\((\d+)(,\d+)?\)/i then $2.to_i
67
+ when /^(real)\((\d+)(,\d+)?\)/i then $2.to_i
102
68
  else super
103
- end
69
+ end
104
70
  end
105
-
71
+
106
72
  def extract_scale(sql_type)
107
73
  case sql_type
108
74
  when /^(real)\((\d+)\)/i then 0
@@ -190,14 +156,7 @@ module ::JdbcSpec
190
156
  end
191
157
 
192
158
  def quote_column_name(name) #:nodoc:
193
- name = name.to_s
194
- # Did not find reference on values needing quoting, but these
195
- # happen in AR unit tests
196
- if name == "references" || name =~ /-/
197
- %Q("#{name}")
198
- else
199
- name
200
- end
159
+ %Q("#{name}")
201
160
  end
202
161
 
203
162
  def quote_string(str)
@@ -262,23 +221,13 @@ module ::JdbcSpec
262
221
  execute "ALTER TABLE #{name} RENAME TO #{new_name}"
263
222
  end
264
223
 
265
- def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
266
- log(sql,name) do
267
- @connection.execute_update(sql)
268
- end
269
- table = sql.split(" ", 4)[2]
270
- id_value || last_insert_id(table, nil)
271
- end
272
-
273
- def last_insert_id(table, sequence_name)
274
- Integer(select_value("SELECT SEQ FROM SQLITE_SEQUENCE WHERE NAME = '#{table}'"))
224
+ def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
225
+ @connection.execute_update(sql)
226
+ id_value || last_insert_id
275
227
  end
276
228
 
277
- def add_limit_offset!(sql, options) #:nodoc:
278
- if options[:limit]
279
- sql << " LIMIT #{options[:limit]}"
280
- sql << " OFFSET #{options[:offset]}" if options[:offset]
281
- end
229
+ def last_insert_id
230
+ Integer(select_value("SELECT last_insert_rowid()"))
282
231
  end
283
232
 
284
233
  def tables(name = nil) #:nodoc:
@@ -304,11 +253,13 @@ module ::JdbcSpec
304
253
  name = row[0]
305
254
  index_sql = row[1]
306
255
  unique = (index_sql =~ /unique/i)
307
- cols = index_sql.match(/\((.*)\)/)[1].gsub(/,/,' ').split
256
+ cols = index_sql.match(/\((.*)\)/)[1].gsub(/,/,' ').split.map do |c|
257
+ match = /^"(.+)"$/.match(c); match ? match[1] : c
258
+ end
308
259
  ::ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, name, unique, cols)
309
260
  end
310
261
  end
311
-
262
+
312
263
  def primary_key(table_name) #:nodoc:
313
264
  column = table_structure(table_name).find {|field| field['pk'].to_i == 1}
314
265
  column ? column['name'] : nil
@@ -319,14 +270,10 @@ module ::JdbcSpec
319
270
  end
320
271
 
321
272
  def _execute(sql, name = nil)
322
- if ActiveRecord::ConnectionAdapters::JdbcConnection::select?(sql)
323
- @connection.execute_query(sql)
324
- else
325
- affected_rows = @connection.execute_update(sql)
326
- ActiveRecord::ConnectionAdapters::JdbcConnection::insert?(sql) ? last_insert_id(sql.split(" ", 4)[2], nil) : affected_rows
327
- end
273
+ result = super
274
+ ActiveRecord::ConnectionAdapters::JdbcConnection::insert?(sql) ? last_insert_id : result
328
275
  end
329
-
276
+
330
277
  def select(sql, name=nil)
331
278
  execute(sql, name).map do |row|
332
279
  record = {}
@@ -338,49 +285,104 @@ module ::JdbcSpec
338
285
  record
339
286
  end
340
287
  end
341
-
288
+
342
289
  def table_structure(table_name)
343
290
  structure = @connection.execute_query("PRAGMA table_info(#{quote_table_name(table_name)})")
344
291
  raise ActiveRecord::StatementInvalid, "Could not find table '#{table_name}'" if structure.empty?
345
292
  structure
346
293
  end
347
-
348
- def columns(table_name, name = nil) #:nodoc:
294
+
295
+ def columns(table_name, name = nil) #:nodoc:
349
296
  table_structure(table_name).map do |field|
350
297
  ::ActiveRecord::ConnectionAdapters::JdbcColumn.new(@config, field['name'], field['dflt_value'], field['type'], field['notnull'] == 0)
351
298
  end
352
299
  end
353
-
300
+
354
301
  # SELECT ... FOR UPDATE is redundant since the table is locked.
355
302
  def add_lock!(sql, options) #:nodoc:
356
303
  sql
357
304
  end
358
-
305
+
359
306
  protected
360
- include JdbcSpec::MissingFunctionalityHelper
307
+ include ArJdbc::MissingFunctionalityHelper
308
+
309
+ def translate_exception(exception, message)
310
+ case exception.message
311
+ when /column(s)? .* (is|are) not unique/
312
+ ActiveRecord::RecordNotUnique.new(message, exception)
313
+ else
314
+ super
315
+ end
316
+ end
361
317
  end
362
318
  end
363
319
 
364
- module ActiveRecord
365
- module ConnectionAdapters
366
- class JdbcColumn < Column
367
- def self.string_to_binary(value)
368
- value.gsub(/\0|%/n) do |b|
369
- case b
370
- when "\0" then "%00"
371
- when "\%" then "%25"
372
- end
320
+ module ActiveRecord::ConnectionAdapters
321
+ class SQLiteColumn < JdbcColumn
322
+ include ArJdbc::SQLite3::Column
323
+
324
+ def initialize(name, *args)
325
+ if Hash === name
326
+ super
327
+ else
328
+ super(nil, name, *args)
329
+ end
330
+ end
331
+
332
+ def call_discovered_column_callbacks(*)
333
+ end
334
+
335
+ 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"
373
340
  end
374
341
  end
342
+ end
375
343
 
376
- def self.binary_to_string(value)
377
- value.gsub(/%00|%25/n) do |b|
378
- case b
379
- when "%00" then "\0"
380
- when "%25" then "%"
381
- end
344
+ 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 "%"
382
349
  end
383
350
  end
384
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
+
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
374
+ end
375
+ end
376
+
377
+ class SQLite3Adapter < JdbcAdapter
378
+ include ArJdbc::SQLite3
379
+
380
+ def adapter_spec(config)
381
+ # return nil to avoid extending ArJdbc::SQLite3, which we've already done
382
+ end
383
+
384
+ def jdbc_column_class
385
+ ActiveRecord::ConnectionAdapters::SQLiteColumn
386
+ end
385
387
  end
386
388
  end
@@ -0,0 +1,33 @@
1
+ # Don't need to load native sqlite3 adapter
2
+ $LOADED_FEATURES << "active_record/connection_adapters/sqlite_adapter.rb"
3
+ $LOADED_FEATURES << "active_record/connection_adapters/sqlite3_adapter.rb"
4
+
5
+ class ActiveRecord::Base
6
+ class << self
7
+ def sqlite3_connection(config)
8
+ require "arjdbc/sqlite3"
9
+
10
+ parse_sqlite3_config!(config)
11
+
12
+ config[:url] ||= "jdbc:sqlite:#{config[:database]}"
13
+ config[:driver] ||= "org.sqlite.JDBC"
14
+ config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter
15
+ jdbc_connection(config)
16
+ end
17
+
18
+ def parse_sqlite3_config!(config)
19
+ config[:database] ||= config[:dbfile]
20
+
21
+ # Allow database path relative to RAILS_ROOT, but only if
22
+ # the database path is not the special path that tells
23
+ # Sqlite to build a database only in memory.
24
+ rails_root_defined = defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
25
+ if rails_root_defined && ':memory:' != config[:database]
26
+ rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
27
+ config[:database] = File.expand_path(config[:database], rails_root)
28
+ end
29
+ end
30
+
31
+ alias_method :jdbcsqlite3_connection, :sqlite3_connection
32
+ end
33
+ end
@@ -0,0 +1,4 @@
1
+ require 'arjdbc/jdbc'
2
+ jdbc_require_driver 'jdbc/sqlite3'
3
+ require 'arjdbc/sqlite3/connection_methods'
4
+ require 'arjdbc/sqlite3/adapter'
@@ -0,0 +1,46 @@
1
+ module ArJdbc
2
+ module Sybase
3
+ def add_limit_offset!(sql, options) # :nodoc:
4
+ @limit = options[:limit]
5
+ @offset = options[:offset]
6
+ if use_temp_table?
7
+ # Use temp table to hack offset with Sybase
8
+ sql.sub!(/ FROM /i, ' INTO #artemp FROM ')
9
+ elsif zero_limit?
10
+ # "SET ROWCOUNT 0" turns off limits, so we havesy
11
+ # to use a cheap trick.
12
+ if sql =~ /WHERE/i
13
+ sql.sub!(/WHERE/i, 'WHERE 1 = 2 AND ')
14
+ elsif sql =~ /ORDER\s+BY/i
15
+ sql.sub!(/ORDER\s+BY/i, 'WHERE 1 = 2 ORDER BY')
16
+ else
17
+ sql << 'WHERE 1 = 2'
18
+ end
19
+ end
20
+ end
21
+
22
+ # If limit is not set at all, we can ignore offset;
23
+ # if limit *is* set but offset is zero, use normal select
24
+ # with simple SET ROWCOUNT. Thus, only use the temp table
25
+ # if limit is set and offset > 0.
26
+ def use_temp_table?
27
+ !@limit.nil? && !@offset.nil? && @offset > 0
28
+ end
29
+
30
+ def zero_limit?
31
+ !@limit.nil? && @limit == 0
32
+ end
33
+
34
+ def modify_types(tp) #:nodoc:
35
+ tp[:primary_key] = "NUMERIC(22,0) IDENTITY PRIMARY KEY"
36
+ tp[:integer][:limit] = nil
37
+ tp[:boolean] = {:name => "bit"}
38
+ tp[:binary] = {:name => "image"}
39
+ tp
40
+ end
41
+
42
+ def remove_index(table_name, options = {})
43
+ execute "DROP INDEX #{table_name}.#{index_name(table_name, options)}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,2 @@
1
+ require 'arjdbc/jdbc'
2
+ require 'arjdbc/sybase/adapter.rb'
@@ -0,0 +1,8 @@
1
+ module ArJdbc
2
+ module Version
3
+ VERSION = "1.0.0.beta1"
4
+ end
5
+ end
6
+ # Compatibility with older versions of ar-jdbc for other extensions out there
7
+ JdbcAdapter = ArJdbc
8
+ JdbcSpec = ArJdbc
data/lib/arjdbc.rb ADDED
@@ -0,0 +1,29 @@
1
+ if defined?(JRUBY_VERSION)
2
+ begin
3
+ tried_gem ||= false
4
+ require 'active_record/version'
5
+ rescue LoadError
6
+ raise if tried_gem
7
+ require 'rubygems'
8
+ gem 'activerecord'
9
+ tried_gem = true
10
+ retry
11
+ end
12
+ if ActiveRecord::VERSION::MAJOR < 2
13
+ if defined?(RAILS_CONNECTION_ADAPTERS)
14
+ RAILS_CONNECTION_ADAPTERS << %q(jdbc)
15
+ else
16
+ RAILS_CONNECTION_ADAPTERS = %w(jdbc)
17
+ end
18
+ if ActiveRecord::VERSION::MAJOR == 1 && ActiveRecord::VERSION::MINOR == 14
19
+ require 'arjdbc/jdbc'
20
+ end
21
+ else
22
+ require 'active_record'
23
+ require 'arjdbc/jdbc'
24
+ end
25
+ else
26
+ warn "ActiveRecord-JDBC is for use with JRuby only"
27
+ end
28
+
29
+ require 'arjdbc/version'
@@ -1,5 +1,3 @@
1
- module JdbcAdapter
2
- module Version
3
- VERSION = "0.9.7.1"
4
- end
5
- end
1
+ warn "DEPRECATED: require 'arjdbc/version' instead of 'jdbc_adapter/version'."
2
+ require 'arjdbc/version'
3
+
data/lib/jdbc_adapter.rb CHANGED
@@ -1,27 +1,2 @@
1
- if defined?(JRUBY_VERSION)
2
- begin
3
- tried_gem ||= false
4
- require 'active_record/version'
5
- rescue LoadError
6
- raise if tried_gem
7
- require 'rubygems'
8
- gem 'activerecord'
9
- tried_gem = true
10
- retry
11
- end
12
- if ActiveRecord::VERSION::MAJOR < 2
13
- if defined?(RAILS_CONNECTION_ADAPTERS)
14
- RAILS_CONNECTION_ADAPTERS << %q(jdbc)
15
- else
16
- RAILS_CONNECTION_ADAPTERS = %w(jdbc)
17
- end
18
- if ActiveRecord::VERSION::MAJOR == 1 && ActiveRecord::VERSION::MINOR == 14
19
- require 'active_record/connection_adapters/jdbc_adapter'
20
- end
21
- else
22
- require 'active_record'
23
- require 'active_record/connection_adapters/jdbc_adapter'
24
- end
25
- else
26
- warn "ActiveRecord-JDBC is for use with JRuby only"
27
- end
1
+ warn "DEPRECATED: require 'arjdbc' instead of 'jdbc_adapter'."
2
+ require 'arjdbc'
@@ -4,4 +4,4 @@
4
4
  # This file allows the JDBC drivers to be hooked into ActiveRecord
5
5
  # such that you don't have to change anything else in your Rails
6
6
  # application.
7
- require 'jdbc_adapter' if defined?(JRUBY_VERSION)
7
+ require 'arjdbc' if defined?(JRUBY_VERSION)
data/rakelib/compile.rake CHANGED
@@ -12,12 +12,13 @@ def java_classpath_arg # myriad of ways to discover JRuby classpath
12
12
  jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
13
13
  end
14
14
 
15
+ jar_name = File.join(*%w(lib arjdbc jdbc adapter_java.jar))
16
+
15
17
  desc "Compile the native Java code."
16
18
  task :java_compile do
17
19
  pkg_classes = File.join(*%w(pkg classes))
18
- jar_name = File.join(*%w(lib jdbc_adapter jdbc_adapter_internal.jar))
19
20
  mkdir_p pkg_classes
20
21
  sh "javac -target 1.5 -source 1.5 -d pkg/classes #{java_classpath_arg} #{FileList['src/java/**/*.java'].join(' ')}"
21
22
  sh "jar cf #{jar_name} -C #{pkg_classes} ."
22
23
  end
23
- file "lib/jdbc_adapter/jdbc_adapter_internal.jar" => :java_compile
24
+ file jar_name => :java_compile
data/rakelib/package.rake CHANGED
@@ -1,5 +1,5 @@
1
1
  MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt",
2
- "Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/jdbc_adapter/jdbc_adapter_internal.jar", "test/**/*.rb",
2
+ "Rakefile", "LICENSE.txt", "lib/**/*.rb", "lib/arjdbc/jdbc/adapter_java.jar", "test/**/*.rb",
3
3
  "lib/**/*.rake", "src/**/*.java", "rakelib/*.rake", "rails_generators/**/*"]
4
4
 
5
5
  file "Manifest.txt" => :manifest
@@ -8,13 +8,13 @@ task :manifest do
8
8
  end
9
9
  Rake::Task['manifest'].invoke # Always regen manifest, so Hoe has up-to-date list of files
10
10
 
11
- require File.dirname(__FILE__) + "/../lib/jdbc_adapter/version"
11
+ require File.dirname(__FILE__) + "/../lib/arjdbc/version"
12
12
  begin
13
13
  require 'hoe'
14
14
  Hoe.plugin :gemcutter
15
15
  hoe = Hoe.spec("activerecord-jdbc-adapter") do |p|
16
16
  p.name = %q{kb-activerecord-jdbc-adapter}
17
- p.version = JdbcAdapter::Version::VERSION
17
+ p.version = ArJdbc::Version::VERSION
18
18
  p.spec_extras[:platform] = Gem::Platform.new("java")
19
19
  p.spec_extras[:files] = MANIFEST
20
20
  p.rubyforge_name = "jruby-extras"
@@ -1,7 +1,7 @@
1
1
  /***** BEGIN LICENSE BLOCK *****
2
- * Copyright (c) 2006-2007 Nick Sieger <nick@nicksieger.com>
2
+ * Copyright (c) 2006-2007, 2010 Nick Sieger <nick@nicksieger.com>
3
3
  * Copyright (c) 2006-2007 Ola Bini <ola.bini@gmail.com>
4
- *
4
+ *
5
5
  * Permission is hereby granted, free of charge, to any person obtaining
6
6
  * a copy of this software and associated documentation files (the
7
7
  * "Software"), to deal in the Software without restriction, including
@@ -9,10 +9,10 @@
9
9
  * distribute, sublicense, and/or sell copies of the Software, and to
10
10
  * permit persons to whom the Software is furnished to do so, subject to
11
11
  * the following conditions:
12
- *
12
+ *
13
13
  * The above copyright notice and this permission notice shall be
14
14
  * included in all copies or substantial portions of the Software.
15
- *
15
+ *
16
16
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
17
  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
18
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -22,33 +22,33 @@
22
22
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  ***** END LICENSE BLOCK *****/
24
24
 
25
- package jdbc_adapter;
25
+ package arjdbc.derby;
26
+
27
+ import java.sql.SQLException;
28
+
29
+ import arjdbc.jdbc.RubyJdbcConnection;
26
30
 
27
31
  import org.jruby.Ruby;
28
- import org.jruby.RubyModule;
29
- import org.jruby.RubyString;
30
- import org.jruby.RubyFloat;
31
- import org.jruby.RubyFixnum;
32
+ import org.jruby.RubyBigDecimal;
32
33
  import org.jruby.RubyBignum;
33
34
  import org.jruby.RubyBoolean;
34
- import org.jruby.RubyBigDecimal;
35
- import org.jruby.RubyRange;
35
+ import org.jruby.RubyFixnum;
36
+ import org.jruby.RubyFloat;
37
+ import org.jruby.RubyModule;
36
38
  import org.jruby.RubyNumeric;
37
-
38
- import org.jruby.runtime.builtin.IRubyObject;
39
-
40
- import org.jruby.util.ByteList;
41
-
42
- import java.sql.SQLException;
43
39
  import org.jruby.RubyObjectAdapter;
40
+ import org.jruby.RubyRange;
41
+ import org.jruby.RubyString;
44
42
  import org.jruby.anno.JRubyMethod;
45
43
  import org.jruby.runtime.ThreadContext;
44
+ import org.jruby.runtime.builtin.IRubyObject;
45
+ import org.jruby.util.ByteList;
46
46
 
47
- public class JdbcDerbySpec {
47
+ public class DerbyModule {
48
48
  private static RubyObjectAdapter rubyApi;
49
- public static void load(RubyModule jdbcSpec, RubyObjectAdapter adapter) {
50
- RubyModule derby = jdbcSpec.defineModuleUnder("Derby");
51
- derby.defineAnnotatedMethods(JdbcDerbySpec.class);
49
+ public static void load(RubyModule arJdbc, RubyObjectAdapter adapter) {
50
+ RubyModule derby = arJdbc.defineModuleUnder("Derby");
51
+ derby.defineAnnotatedMethods(DerbyModule.class);
52
52
  RubyModule column = derby.defineModuleUnder("Column");
53
53
  column.defineAnnotatedMethods(Column.class);
54
54
  rubyApi = adapter;
@@ -131,7 +131,7 @@ public class JdbcDerbySpec {
131
131
  return quote_string_with_surround(runtime, "'", RubyString.objAsString(context, value), "'");
132
132
  }
133
133
  }
134
- }
134
+ }
135
135
  return super_quote(context, recv, runtime, value, runtime.getNil());
136
136
  }
137
137
 
@@ -141,25 +141,25 @@ public class JdbcDerbySpec {
141
141
  if (value.respondsTo("quoted_id")) {
142
142
  return rubyApi.callMethod(value, "quoted_id");
143
143
  }
144
-
144
+
145
145
  IRubyObject type = (col.isNil()) ? col : rubyApi.callMethod(col, "type");
146
- RubyModule multibyteChars = (RubyModule)
146
+ RubyModule multibyteChars = (RubyModule)
147
147
  ((RubyModule) ((RubyModule) runtime.getModule("ActiveSupport")).getConstant("Multibyte")).getConstantAt("Chars");
148
148
  if (value instanceof RubyString || rubyApi.isKindOf(value, multibyteChars)) {
149
149
  RubyString svalue = RubyString.objAsString(context, value);
150
150
  if (type == runtime.newSymbol("binary") && col.getType().respondsTo("string_to_binary")) {
151
- return quote_string_with_surround(runtime, "'", (RubyString)(rubyApi.callMethod(col.getType(), "string_to_binary", svalue)), "'");
151
+ return quote_string_with_surround(runtime, "'", (RubyString)(rubyApi.callMethod(col.getType(), "string_to_binary", svalue)), "'");
152
152
  } else if (type == runtime.newSymbol("integer") || type == runtime.newSymbol("float")) {
153
153
  return RubyString.objAsString(context, ((type == runtime.newSymbol("integer")) ?
154
- rubyApi.callMethod(svalue, "to_i") :
154
+ rubyApi.callMethod(svalue, "to_i") :
155
155
  rubyApi.callMethod(svalue, "to_f")));
156
156
  } else {
157
- return quote_string_with_surround(runtime, "'", svalue, "'");
157
+ return quote_string_with_surround(runtime, "'", svalue, "'");
158
158
  }
159
159
  } else if (value.isNil()) {
160
160
  return runtime.newString(NULL);
161
161
  } else if (value instanceof RubyBoolean) {
162
- return (value.isTrue() ?
162
+ return (value.isTrue() ?
163
163
  (type == runtime.newSymbol(":integer")) ? runtime.newString("1") : rubyApi.callMethod(recv, "quoted_true") :
164
164
  (type == runtime.newSymbol(":integer")) ? runtime.newString("0") : rubyApi.callMethod(recv, "quoted_false"));
165
165
  } else if((value instanceof RubyFloat) || (value instanceof RubyFixnum) || (value instanceof RubyBignum)) {
@@ -167,7 +167,7 @@ public class JdbcDerbySpec {
167
167
  } else if(value instanceof RubyBigDecimal) {
168
168
  return rubyApi.callMethod(value, "to_s", runtime.newString("F"));
169
169
  } else if (rubyApi.callMethod(value, "acts_like?", runtime.newString("date")).isTrue() || rubyApi.callMethod(value, "acts_like?", runtime.newString("time")).isTrue()) {
170
- return quote_string_with_surround(runtime, "'", (RubyString)(rubyApi.callMethod(recv, "quoted_date", value)), "'");
170
+ return quote_string_with_surround(runtime, "'", (RubyString)(rubyApi.callMethod(recv, "quoted_date", value)), "'");
171
171
  } else {
172
172
  return quote_string_with_surround(runtime, "'", (RubyString)(rubyApi.callMethod(value, "to_yaml")), "'");
173
173
  }
@@ -231,14 +231,14 @@ public class JdbcDerbySpec {
231
231
  public static IRubyObject quote_string(IRubyObject recv, IRubyObject string) {
232
232
  boolean replacementFound = false;
233
233
  ByteList bl = ((RubyString) string).getByteList();
234
-
234
+
235
235
  for(int i = bl.begin; i < bl.begin + bl.realSize; i++) {
236
236
  switch (bl.bytes[i]) {
237
237
  case '\'': break;
238
238
  default: continue;
239
239
  }
240
-
241
- // On first replacement allocate a different bytelist so we don't manip original
240
+
241
+ // On first replacement allocate a different bytelist so we don't manip original
242
242
  if(!replacementFound) {
243
243
  i-= bl.begin;
244
244
  bl = new ByteList(bl);