activerecord-jdbc-adapter-onsite 1.2.2

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 (228) hide show
  1. data/.gitignore +22 -0
  2. data/.travis.yml +14 -0
  3. data/Appraisals +16 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +45 -0
  6. data/History.txt +488 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.rdoc +214 -0
  9. data/Rakefile +62 -0
  10. data/activerecord-jdbc-adapter.gemspec +23 -0
  11. data/bench/bench_attributes.rb +13 -0
  12. data/bench/bench_attributes_new.rb +14 -0
  13. data/bench/bench_create.rb +12 -0
  14. data/bench/bench_find_all.rb +12 -0
  15. data/bench/bench_find_all_mt.rb +25 -0
  16. data/bench/bench_model.rb +85 -0
  17. data/bench/bench_new.rb +12 -0
  18. data/bench/bench_new_valid.rb +12 -0
  19. data/bench/bench_valid.rb +13 -0
  20. data/gemfiles/rails23.gemfile +10 -0
  21. data/gemfiles/rails23.gemfile.lock +38 -0
  22. data/gemfiles/rails30.gemfile +9 -0
  23. data/gemfiles/rails30.gemfile.lock +33 -0
  24. data/gemfiles/rails31.gemfile +9 -0
  25. data/gemfiles/rails31.gemfile.lock +35 -0
  26. data/gemfiles/rails32.gemfile +9 -0
  27. data/gemfiles/rails32.gemfile.lock +35 -0
  28. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  29. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  30. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  31. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  32. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  33. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  34. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  35. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
  36. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
  37. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
  40. data/lib/activerecord-jdbc-adapter.rb +8 -0
  41. data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
  42. data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
  43. data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
  44. data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +15 -0
  45. data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
  46. data/lib/arel/engines/sql/compilers/mssql_compiler.rb +46 -0
  47. data/lib/arel/visitors/compat.rb +13 -0
  48. data/lib/arel/visitors/db2.rb +17 -0
  49. data/lib/arel/visitors/derby.rb +32 -0
  50. data/lib/arel/visitors/firebird.rb +24 -0
  51. data/lib/arel/visitors/hsqldb.rb +26 -0
  52. data/lib/arel/visitors/sql_server.rb +46 -0
  53. data/lib/arjdbc.rb +24 -0
  54. data/lib/arjdbc/db2.rb +2 -0
  55. data/lib/arjdbc/db2/adapter.rb +541 -0
  56. data/lib/arjdbc/derby.rb +7 -0
  57. data/lib/arjdbc/derby/adapter.rb +358 -0
  58. data/lib/arjdbc/derby/connection_methods.rb +19 -0
  59. data/lib/arjdbc/discover.rb +92 -0
  60. data/lib/arjdbc/firebird.rb +2 -0
  61. data/lib/arjdbc/firebird/adapter.rb +140 -0
  62. data/lib/arjdbc/h2.rb +4 -0
  63. data/lib/arjdbc/h2/adapter.rb +54 -0
  64. data/lib/arjdbc/h2/connection_methods.rb +13 -0
  65. data/lib/arjdbc/hsqldb.rb +4 -0
  66. data/lib/arjdbc/hsqldb/adapter.rb +184 -0
  67. data/lib/arjdbc/hsqldb/connection_methods.rb +15 -0
  68. data/lib/arjdbc/informix.rb +3 -0
  69. data/lib/arjdbc/informix/adapter.rb +142 -0
  70. data/lib/arjdbc/informix/connection_methods.rb +11 -0
  71. data/lib/arjdbc/jdbc.rb +2 -0
  72. data/lib/arjdbc/jdbc/adapter.rb +356 -0
  73. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  74. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  75. data/lib/arjdbc/jdbc/callbacks.rb +44 -0
  76. data/lib/arjdbc/jdbc/column.rb +47 -0
  77. data/lib/arjdbc/jdbc/compatibility.rb +51 -0
  78. data/lib/arjdbc/jdbc/connection.rb +134 -0
  79. data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
  80. data/lib/arjdbc/jdbc/core_ext.rb +24 -0
  81. data/lib/arjdbc/jdbc/discover.rb +18 -0
  82. data/lib/arjdbc/jdbc/driver.rb +35 -0
  83. data/lib/arjdbc/jdbc/extension.rb +47 -0
  84. data/lib/arjdbc/jdbc/java.rb +14 -0
  85. data/lib/arjdbc/jdbc/jdbc.rake +131 -0
  86. data/lib/arjdbc/jdbc/missing_functionality_helper.rb +88 -0
  87. data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
  88. data/lib/arjdbc/jdbc/railtie.rb +9 -0
  89. data/lib/arjdbc/jdbc/rake_tasks.rb +10 -0
  90. data/lib/arjdbc/jdbc/require_driver.rb +16 -0
  91. data/lib/arjdbc/jdbc/type_converter.rb +126 -0
  92. data/lib/arjdbc/mimer.rb +2 -0
  93. data/lib/arjdbc/mimer/adapter.rb +142 -0
  94. data/lib/arjdbc/mssql.rb +4 -0
  95. data/lib/arjdbc/mssql/adapter.rb +477 -0
  96. data/lib/arjdbc/mssql/connection_methods.rb +31 -0
  97. data/lib/arjdbc/mssql/limit_helpers.rb +101 -0
  98. data/lib/arjdbc/mssql/lock_helpers.rb +72 -0
  99. data/lib/arjdbc/mssql/tsql_helper.rb +61 -0
  100. data/lib/arjdbc/mysql.rb +4 -0
  101. data/lib/arjdbc/mysql/adapter.rb +505 -0
  102. data/lib/arjdbc/mysql/connection_methods.rb +28 -0
  103. data/lib/arjdbc/oracle.rb +3 -0
  104. data/lib/arjdbc/oracle/adapter.rb +432 -0
  105. data/lib/arjdbc/oracle/connection_methods.rb +12 -0
  106. data/lib/arjdbc/postgresql.rb +4 -0
  107. data/lib/arjdbc/postgresql/adapter.rb +861 -0
  108. data/lib/arjdbc/postgresql/connection_methods.rb +23 -0
  109. data/lib/arjdbc/sqlite3.rb +4 -0
  110. data/lib/arjdbc/sqlite3/adapter.rb +389 -0
  111. data/lib/arjdbc/sqlite3/connection_methods.rb +35 -0
  112. data/lib/arjdbc/sybase.rb +2 -0
  113. data/lib/arjdbc/sybase/adapter.rb +46 -0
  114. data/lib/arjdbc/version.rb +8 -0
  115. data/lib/generators/jdbc/USAGE +10 -0
  116. data/lib/generators/jdbc/jdbc_generator.rb +9 -0
  117. data/lib/jdbc_adapter.rb +2 -0
  118. data/lib/jdbc_adapter/rake_tasks.rb +3 -0
  119. data/lib/jdbc_adapter/version.rb +3 -0
  120. data/lib/pg.rb +26 -0
  121. data/pom.xml +57 -0
  122. data/rails_generators/jdbc_generator.rb +15 -0
  123. data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
  124. data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
  125. data/rakelib/bundler_ext.rb +11 -0
  126. data/rakelib/compile.rake +23 -0
  127. data/rakelib/db.rake +39 -0
  128. data/rakelib/rails.rake +41 -0
  129. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +69 -0
  130. data/src/java/arjdbc/derby/DerbyModule.java +324 -0
  131. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +70 -0
  132. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +74 -0
  133. data/src/java/arjdbc/jdbc/AdapterJavaService.java +68 -0
  134. data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +36 -0
  135. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1346 -0
  136. data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
  137. data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +127 -0
  138. data/src/java/arjdbc/mysql/MySQLModule.java +134 -0
  139. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +161 -0
  140. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +85 -0
  141. data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +82 -0
  142. data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +126 -0
  143. data/test/abstract_db_create.rb +135 -0
  144. data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
  145. data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
  146. data/test/activerecord/jall.sh +7 -0
  147. data/test/activerecord/jtest.sh +3 -0
  148. data/test/db/db2.rb +11 -0
  149. data/test/db/derby.rb +12 -0
  150. data/test/db/h2.rb +11 -0
  151. data/test/db/hsqldb.rb +13 -0
  152. data/test/db/informix.rb +11 -0
  153. data/test/db/jdbc.rb +12 -0
  154. data/test/db/jndi_config.rb +40 -0
  155. data/test/db/logger.rb +3 -0
  156. data/test/db/mssql.rb +9 -0
  157. data/test/db/mysql.rb +10 -0
  158. data/test/db/oracle.rb +34 -0
  159. data/test/db/postgres.rb +18 -0
  160. data/test/db/sqlite3.rb +11 -0
  161. data/test/db2_reset_column_information_test.rb +8 -0
  162. data/test/db2_simple_test.rb +66 -0
  163. data/test/derby_migration_test.rb +68 -0
  164. data/test/derby_multibyte_test.rb +12 -0
  165. data/test/derby_reset_column_information_test.rb +8 -0
  166. data/test/derby_row_locking_test.rb +9 -0
  167. data/test/derby_simple_test.rb +139 -0
  168. data/test/generic_jdbc_connection_test.rb +29 -0
  169. data/test/h2_change_column_test.rb +68 -0
  170. data/test/h2_simple_test.rb +41 -0
  171. data/test/has_many_through.rb +79 -0
  172. data/test/helper.rb +108 -0
  173. data/test/hsqldb_simple_test.rb +6 -0
  174. data/test/informix_simple_test.rb +48 -0
  175. data/test/jdbc_common.rb +28 -0
  176. data/test/jndi_callbacks_test.rb +36 -0
  177. data/test/jndi_test.rb +25 -0
  178. data/test/manualTestDatabase.rb +191 -0
  179. data/test/models/add_not_null_column_to_table.rb +9 -0
  180. data/test/models/auto_id.rb +15 -0
  181. data/test/models/custom_pk_name.rb +14 -0
  182. data/test/models/data_types.rb +30 -0
  183. data/test/models/entry.rb +40 -0
  184. data/test/models/mixed_case.rb +22 -0
  185. data/test/models/reserved_word.rb +15 -0
  186. data/test/models/string_id.rb +17 -0
  187. data/test/models/thing.rb +16 -0
  188. data/test/models/validates_uniqueness_of_string.rb +19 -0
  189. data/test/mssql_db_create_test.rb +26 -0
  190. data/test/mssql_identity_insert_test.rb +19 -0
  191. data/test/mssql_ignore_system_views_test.rb +27 -0
  192. data/test/mssql_legacy_types_test.rb +58 -0
  193. data/test/mssql_limit_offset_test.rb +136 -0
  194. data/test/mssql_multibyte_test.rb +18 -0
  195. data/test/mssql_null_test.rb +14 -0
  196. data/test/mssql_reset_column_information_test.rb +8 -0
  197. data/test/mssql_row_locking_sql_test.rb +159 -0
  198. data/test/mssql_row_locking_test.rb +9 -0
  199. data/test/mssql_simple_test.rb +55 -0
  200. data/test/mysql_db_create_test.rb +27 -0
  201. data/test/mysql_index_length_test.rb +58 -0
  202. data/test/mysql_info_test.rb +123 -0
  203. data/test/mysql_multibyte_test.rb +10 -0
  204. data/test/mysql_nonstandard_primary_key_test.rb +42 -0
  205. data/test/mysql_reset_column_information_test.rb +8 -0
  206. data/test/mysql_simple_test.rb +125 -0
  207. data/test/oracle_reset_column_information_test.rb +8 -0
  208. data/test/oracle_simple_test.rb +18 -0
  209. data/test/oracle_specific_test.rb +83 -0
  210. data/test/postgres_db_create_test.rb +32 -0
  211. data/test/postgres_drop_db_test.rb +16 -0
  212. data/test/postgres_information_schema_leak_test.rb +29 -0
  213. data/test/postgres_mixed_case_test.rb +29 -0
  214. data/test/postgres_native_type_mapping_test.rb +93 -0
  215. data/test/postgres_nonseq_pkey_test.rb +38 -0
  216. data/test/postgres_reserved_test.rb +22 -0
  217. data/test/postgres_reset_column_information_test.rb +8 -0
  218. data/test/postgres_schema_search_path_test.rb +48 -0
  219. data/test/postgres_simple_test.rb +168 -0
  220. data/test/postgres_table_alias_length_test.rb +15 -0
  221. data/test/postgres_type_conversion_test.rb +34 -0
  222. data/test/row_locking.rb +90 -0
  223. data/test/simple.rb +731 -0
  224. data/test/sqlite3_reset_column_information_test.rb +8 -0
  225. data/test/sqlite3_simple_test.rb +316 -0
  226. data/test/sybase_jtds_simple_test.rb +28 -0
  227. data/test/sybase_reset_column_information_test.rb +8 -0
  228. metadata +288 -0
@@ -0,0 +1,51 @@
1
+ # AR's 2.2 version of this method is sufficient, but we need it for
2
+ # older versions
3
+ if ActiveRecord::VERSION::MAJOR <= 2 && ActiveRecord::VERSION::MINOR < 2
4
+ module ActiveRecord
5
+ module ConnectionAdapters # :nodoc:
6
+ module SchemaStatements
7
+ # Convert the speficied column type to a SQL string.
8
+ def type_to_sql(type, limit = nil, precision = nil, scale = nil)
9
+ if native = native_database_types[type]
10
+ column_type_sql = (native.is_a?(Hash) ? native[:name] : native).dup
11
+
12
+ if type == :decimal # ignore limit, use precision and scale
13
+ scale ||= native[:scale]
14
+
15
+ if precision ||= native[:precision]
16
+ if scale
17
+ column_type_sql << "(#{precision},#{scale})"
18
+ else
19
+ column_type_sql << "(#{precision})"
20
+ end
21
+ elsif scale
22
+ raise ArgumentError, "Error adding decimal column: precision cannot be empty if scale if specified"
23
+ end
24
+
25
+ elsif limit ||= native.is_a?(Hash) && native[:limit]
26
+ column_type_sql << "(#{limit})"
27
+ end
28
+
29
+ column_type_sql
30
+ else
31
+ type
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ module ActiveRecord
40
+ module ConnectionAdapters
41
+ module CompatibilityMethods
42
+ def self.needed?(base)
43
+ !base.instance_methods.include?("quote_table_name")
44
+ end
45
+
46
+ def quote_table_name(name)
47
+ quote_column_name(name)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,134 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ class JdbcConnection
4
+ module ConfigHelper
5
+ attr_reader :config
6
+
7
+ def config=(config)
8
+ @config = config.symbolize_keys
9
+ end
10
+
11
+ def configure_connection
12
+ config[:retry_count] ||= 5
13
+ config[:connection_alive_sql] ||= "select 1"
14
+ @jndi_connection = false
15
+ @connection = nil
16
+ if config[:jndi]
17
+ begin
18
+ configure_jndi
19
+ rescue => e
20
+ warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
21
+ configure_jdbc
22
+ end
23
+ else
24
+ configure_jdbc
25
+ end
26
+ end
27
+
28
+ def configure_jndi
29
+ jndi = config[:jndi].to_s
30
+ ctx = javax.naming.InitialContext.new
31
+ ds = ctx.lookup(jndi)
32
+ @connection_factory = JdbcConnectionFactory.impl do
33
+ ds.connection
34
+ end
35
+ unless config[:driver]
36
+ config[:driver] = connection.meta_data.connection.java_class.name
37
+ end
38
+ @jndi_connection = true
39
+ end
40
+
41
+ def configure_url
42
+ url = config[:url].to_s
43
+ if Hash === config[:options]
44
+ options = ''
45
+ config[:options].each do |k,v|
46
+ options << '&' unless options.empty?
47
+ options << "#{k}=#{v}"
48
+ end
49
+ url = url['?'] ? "#{url}&#{options}" : "#{url}?#{options}" unless options.empty?
50
+ config[:url] = url
51
+ config[:options] = nil
52
+ end
53
+ url
54
+ end
55
+
56
+ def configure_jdbc
57
+ unless config[:driver] && config[:url]
58
+ raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires driver class and url"
59
+ end
60
+
61
+ driver = config[:driver].to_s
62
+ user = config[:username].to_s
63
+ pass = config[:password].to_s
64
+ url = configure_url
65
+ jdbc_driver = (config[:driver_instance] ||= JdbcDriver.new(driver))
66
+ @connection_factory = JdbcConnectionFactory.impl do
67
+ jdbc_driver.connection(url, user, pass)
68
+ end
69
+ end
70
+ end
71
+
72
+ attr_reader :adapter, :connection_factory
73
+
74
+ # @native_database_types - setup properly by adapter= versus set_native_database_types.
75
+ # This contains type information for the adapter. Individual adapters can make tweaks
76
+ # by defined modify_types
77
+ #
78
+ # @native_types - This is the default type settings sans any modifications by the
79
+ # individual adapter. My guess is that if we loaded two adapters of different types
80
+ # then this is used as a base to be tweaked by each adapter to create @native_database_types
81
+
82
+ def initialize(config)
83
+ self.config = config
84
+ configure_connection
85
+ connection # force the connection to load
86
+ set_native_database_types
87
+ @stmts = {}
88
+ rescue ::ActiveRecord::ActiveRecordError
89
+ raise
90
+ rescue Exception => e
91
+ raise ::ActiveRecord::JDBCError.new("The driver encountered an unknown error: #{e}").tap { |err|
92
+ err.errno = 0
93
+ err.sql_exception = e
94
+ }
95
+ end
96
+
97
+ def adapter=(adapter)
98
+ @adapter = adapter
99
+ @native_database_types = dup_native_types
100
+ @adapter.modify_types(@native_database_types)
101
+ @adapter.config.replace(config)
102
+ end
103
+
104
+ # Duplicate all native types into new hash structure so it can be modified
105
+ # without destroying original structure.
106
+ def dup_native_types
107
+ types = {}
108
+ @native_types.each_pair do |k, v|
109
+ types[k] = v.inject({}) do |memo, kv|
110
+ memo[kv.first] = if kv.last.is_a? Numeric
111
+ kv.last
112
+ else
113
+ begin kv.last.dup rescue kv.last end
114
+ end
115
+ memo
116
+ end
117
+ end
118
+ types
119
+ end
120
+ private :dup_native_types
121
+
122
+ def jndi_connection?
123
+ @jndi_connection
124
+ end
125
+
126
+ def active?
127
+ @connection
128
+ end
129
+
130
+ private
131
+ include ConfigHelper
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,16 @@
1
+ class ActiveRecord::Base
2
+ class << self
3
+ def jdbc_connection(config)
4
+ adapter_class = config[:adapter_class]
5
+ adapter_class ||= ::ActiveRecord::ConnectionAdapters::JdbcAdapter
6
+ adapter_class.new(nil, logger, config)
7
+ end
8
+ alias jndi_connection jdbc_connection
9
+
10
+ def embedded_driver(config)
11
+ config[:username] ||= "sa"
12
+ config[:password] ||= ""
13
+ jdbc_connection(config)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveRecord # :nodoc:
2
+ # Represents exceptions that have propagated up through the JDBC API.
3
+ class JDBCError < ActiveRecordError
4
+ # The vendor code or error number that came from the database
5
+ attr_accessor :errno
6
+
7
+ # The full Java SQLException object that was raised
8
+ attr_accessor :sql_exception
9
+ end
10
+
11
+ module ConnectionAdapters # :nodoc:
12
+ # Allows properly re-wrapping/re-defining methods that may already
13
+ # be alias_method_chain'd.
14
+ module ShadowCoreMethods
15
+ def alias_chained_method(meth, feature, target)
16
+ if instance_methods.include?("#{meth}_without_#{feature}")
17
+ alias_method "#{meth}_without_#{feature}".to_sym, target
18
+ else
19
+ alias_method meth, target if meth != target
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module ArJdbc
2
+ def self.discover_extensions
3
+ if defined?(::Gem) && ::Gem.respond_to?(:find_files)
4
+ files = ::Gem.find_files('arjdbc/discover')
5
+ else
6
+ files = $LOAD_PATH.map do |p|
7
+ discover = File.join(p, 'arjdbc','discover.rb')
8
+ File.exist?(discover) ? discover : nil
9
+ end.compact
10
+ end
11
+ files.each do |f|
12
+ puts "Loading #{f}" if $DEBUG
13
+ require f
14
+ end
15
+ end
16
+
17
+ discover_extensions
18
+ end
@@ -0,0 +1,35 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ class JdbcDriver
4
+ def initialize(name)
5
+ @name = name
6
+ @driver = driver_class.new
7
+ end
8
+
9
+ def driver_class
10
+ @driver_class ||= begin
11
+ driver_class_const = (@name[0...1].capitalize + @name[1..@name.length]).gsub(/\./, '_')
12
+ Jdbc::Mutex.synchronized do
13
+ unless Jdbc.const_defined?(driver_class_const)
14
+ driver_class_name = @name
15
+ Jdbc.module_eval do
16
+ java_import(driver_class_name) { driver_class_const }
17
+ end
18
+ end
19
+ end
20
+ driver_class = Jdbc.const_get(driver_class_const)
21
+ raise "You must specify a driver for your JDBC connection" unless driver_class
22
+ driver_class
23
+ end
24
+ end
25
+
26
+ def connection(url, user, pass)
27
+ # bypass DriverManager to get around problem with dynamically loaded jdbc drivers
28
+ props = java.util.Properties.new
29
+ props.setProperty("user", user)
30
+ props.setProperty("password", pass)
31
+ @driver.connect(url, props)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,47 @@
1
+ module ArJdbc
2
+ # Defines an AR-JDBC extension. An extension consists of a
3
+ # declaration using this method and an ArJdbc::XYZ module that
4
+ # contains implementation and overrides for methods in
5
+ # ActiveRecord::ConnectionAdapters::AbstractAdapter. When you
6
+ # declare your extension, you provide a block that detects when a
7
+ # database configured to use the extension is present and loads the
8
+ # necessary code for it. AR-JDBC will patch the code into the base
9
+ # ActiveRecord::ConnectionAdapters::JdbcAdapter by extending an
10
+ # instance of it with your extension module.
11
+ #
12
+ # +name+ should be a symbol that is the name of a module to be
13
+ # defined under the +ArJdbc+ module.
14
+ #
15
+ # +block+ should be a one- or two-arity block that receives the
16
+ # dialect name or driver class name as the first argument, and
17
+ # optionally the whole database configuration hash as a second
18
+ # argument.
19
+ #
20
+ # Example:
21
+ #
22
+ # ArJdbc.extension :Frob do |name|
23
+ # if name =~ /frob/i
24
+ # # arjdbc/frob.rb should contain the implementation
25
+ # require 'arjdbc/frob'
26
+ # true
27
+ # end
28
+ # end
29
+ def self.extension(name,&block)
30
+ if const_defined?(name)
31
+ mod = const_get(name)
32
+ else
33
+ mod = const_set(name, Module.new)
34
+ end
35
+ (class << mod; self; end).instance_eval do
36
+ unless respond_to?(:adapter_matcher)
37
+ define_method :adapter_matcher do |_name, config|
38
+ if block.arity == 1
39
+ block.call(_name) ? mod : false
40
+ else
41
+ block.call(_name, config) ? mod : false
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,14 @@
1
+ require 'java'
2
+ require 'arjdbc/jdbc/adapter_java'
3
+
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ module Jdbc
7
+ Mutex = java.lang.Object.new
8
+ DriverManager = java.sql.DriverManager
9
+ Types = java.sql.Types
10
+ end
11
+
12
+ java_import "arjdbc.jdbc.JdbcConnectionFactory"
13
+ end
14
+ end
@@ -0,0 +1,131 @@
1
+ def redefine_task(*args, &block)
2
+ task_name = Hash === args.first ? args.first.keys[0] : args.first
3
+ existing_task = Rake.application.lookup task_name
4
+ if existing_task
5
+ class << existing_task
6
+ public :instance_variable_set
7
+ attr_reader :actions
8
+ end
9
+ existing_task.instance_variable_set "@prerequisites", FileList[]
10
+ existing_task.actions.shift
11
+ enhancements = existing_task.actions
12
+ existing_task.instance_variable_set "@actions", []
13
+ end
14
+ redefined_task = task(*args, &block)
15
+ enhancements.each {|enhancement| redefined_task.actions << enhancement}
16
+ end
17
+
18
+ def rails_env
19
+ defined?(Rails.env) ? Rails.env : RAILS_ENV
20
+ end
21
+
22
+ namespace :db do
23
+ redefine_task :create => :rails_env do
24
+ create_database(ActiveRecord::Base.configurations[rails_env])
25
+ end
26
+ task :create => :load_config if Rake.application.lookup(:load_config)
27
+
28
+ redefine_task :drop => :environment do
29
+ config = ActiveRecord::Base.configurations[rails_env]
30
+ begin
31
+ db = find_database_name(config)
32
+ ActiveRecord::Base.connection.drop_database(db)
33
+ rescue
34
+ drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
35
+ end
36
+ end
37
+ task :drop => :load_config if Rake.application.lookup(:load_config)
38
+
39
+ namespace :create do
40
+ task :all => :rails_env
41
+ end
42
+
43
+ namespace :drop do
44
+ task :all => :environment
45
+ end
46
+
47
+ class << self
48
+ alias_method :previous_create_database, :create_database
49
+ alias_method :previous_drop_database, :drop_database
50
+ end
51
+
52
+ def find_database_name(config)
53
+ db = config['database']
54
+ if config['adapter'] =~ /postgresql/i
55
+ config = config.dup
56
+ if config['url']
57
+ url = config['url'].dup
58
+ db = url[/\/([^\/]*)$/, 1]
59
+ if db
60
+ url[/\/([^\/]*)$/, 1] = 'postgres'
61
+ config['url'] = url
62
+ end
63
+ else
64
+ db = config['database']
65
+ config['database'] = 'postgres'
66
+ end
67
+ ActiveRecord::Base.establish_connection(config)
68
+ else
69
+ ActiveRecord::Base.establish_connection(config)
70
+ db = ActiveRecord::Base.connection.database_name
71
+ end
72
+ db
73
+ end
74
+
75
+ def create_database(config)
76
+ begin
77
+ ActiveRecord::Base.establish_connection(config)
78
+ ActiveRecord::Base.connection
79
+ rescue
80
+ begin
81
+ if url = config['url'] and url =~ /^(.*(?<!\/)\/)(?=\w)/
82
+ url = $1
83
+ end
84
+
85
+ ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
86
+ ActiveRecord::Base.connection.create_database(config['database'])
87
+ ActiveRecord::Base.establish_connection(config)
88
+ rescue => e
89
+ raise e unless config['adapter'] =~ /mysql|postgresql|sqlite/
90
+ previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
91
+ end
92
+ end
93
+ end
94
+
95
+ def drop_database(config)
96
+ previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
97
+ end
98
+
99
+ namespace :structure do
100
+ redefine_task :dump => :environment do
101
+ abcs = ActiveRecord::Base.configurations
102
+ ActiveRecord::Base.establish_connection(abcs[rails_env])
103
+ File.open("db/#{rails_env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
104
+ if ActiveRecord::Base.connection.supports_migrations?
105
+ File.open("db/#{rails_env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
106
+ end
107
+ end
108
+ end
109
+
110
+ namespace :test do
111
+ redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
112
+ abcs = ActiveRecord::Base.configurations
113
+ abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
114
+ ActiveRecord::Base.establish_connection(abcs["test"])
115
+ ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
116
+ IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
117
+ begin
118
+ ActiveRecord::Base.connection.execute(ddl.chomp(';'))
119
+ rescue Exception => ex
120
+ puts ex.message
121
+ end
122
+ end
123
+ end
124
+
125
+ redefine_task :purge => :environment do
126
+ abcs = ActiveRecord::Base.configurations
127
+ db = find_database_name(abcs['test'])
128
+ ActiveRecord::Base.connection.recreate_database(db)
129
+ end
130
+ end
131
+ end