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.
- data/.gitignore +22 -0
- data/.travis.yml +14 -0
- data/Appraisals +16 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +45 -0
- data/History.txt +488 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +214 -0
- data/Rakefile +62 -0
- data/activerecord-jdbc-adapter.gemspec +23 -0
- data/bench/bench_attributes.rb +13 -0
- data/bench/bench_attributes_new.rb +14 -0
- data/bench/bench_create.rb +12 -0
- data/bench/bench_find_all.rb +12 -0
- data/bench/bench_find_all_mt.rb +25 -0
- data/bench/bench_model.rb +85 -0
- data/bench/bench_new.rb +12 -0
- data/bench/bench_new_valid.rb +12 -0
- data/bench/bench_valid.rb +13 -0
- data/gemfiles/rails23.gemfile +10 -0
- data/gemfiles/rails23.gemfile.lock +38 -0
- data/gemfiles/rails30.gemfile +9 -0
- data/gemfiles/rails30.gemfile.lock +33 -0
- data/gemfiles/rails31.gemfile +9 -0
- data/gemfiles/rails31.gemfile.lock +35 -0
- data/gemfiles/rails32.gemfile +9 -0
- data/gemfiles/rails32.gemfile.lock +35 -0
- data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +8 -0
- data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
- data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +15 -0
- data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +46 -0
- data/lib/arel/visitors/compat.rb +13 -0
- data/lib/arel/visitors/db2.rb +17 -0
- data/lib/arel/visitors/derby.rb +32 -0
- data/lib/arel/visitors/firebird.rb +24 -0
- data/lib/arel/visitors/hsqldb.rb +26 -0
- data/lib/arel/visitors/sql_server.rb +46 -0
- data/lib/arjdbc.rb +24 -0
- data/lib/arjdbc/db2.rb +2 -0
- data/lib/arjdbc/db2/adapter.rb +541 -0
- data/lib/arjdbc/derby.rb +7 -0
- data/lib/arjdbc/derby/adapter.rb +358 -0
- data/lib/arjdbc/derby/connection_methods.rb +19 -0
- data/lib/arjdbc/discover.rb +92 -0
- data/lib/arjdbc/firebird.rb +2 -0
- data/lib/arjdbc/firebird/adapter.rb +140 -0
- data/lib/arjdbc/h2.rb +4 -0
- data/lib/arjdbc/h2/adapter.rb +54 -0
- data/lib/arjdbc/h2/connection_methods.rb +13 -0
- data/lib/arjdbc/hsqldb.rb +4 -0
- data/lib/arjdbc/hsqldb/adapter.rb +184 -0
- data/lib/arjdbc/hsqldb/connection_methods.rb +15 -0
- data/lib/arjdbc/informix.rb +3 -0
- data/lib/arjdbc/informix/adapter.rb +142 -0
- data/lib/arjdbc/informix/connection_methods.rb +11 -0
- data/lib/arjdbc/jdbc.rb +2 -0
- data/lib/arjdbc/jdbc/adapter.rb +356 -0
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/base_ext.rb +15 -0
- data/lib/arjdbc/jdbc/callbacks.rb +44 -0
- data/lib/arjdbc/jdbc/column.rb +47 -0
- data/lib/arjdbc/jdbc/compatibility.rb +51 -0
- data/lib/arjdbc/jdbc/connection.rb +134 -0
- data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
- data/lib/arjdbc/jdbc/core_ext.rb +24 -0
- data/lib/arjdbc/jdbc/discover.rb +18 -0
- data/lib/arjdbc/jdbc/driver.rb +35 -0
- data/lib/arjdbc/jdbc/extension.rb +47 -0
- data/lib/arjdbc/jdbc/java.rb +14 -0
- data/lib/arjdbc/jdbc/jdbc.rake +131 -0
- data/lib/arjdbc/jdbc/missing_functionality_helper.rb +88 -0
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
- data/lib/arjdbc/jdbc/railtie.rb +9 -0
- data/lib/arjdbc/jdbc/rake_tasks.rb +10 -0
- data/lib/arjdbc/jdbc/require_driver.rb +16 -0
- data/lib/arjdbc/jdbc/type_converter.rb +126 -0
- data/lib/arjdbc/mimer.rb +2 -0
- data/lib/arjdbc/mimer/adapter.rb +142 -0
- data/lib/arjdbc/mssql.rb +4 -0
- data/lib/arjdbc/mssql/adapter.rb +477 -0
- data/lib/arjdbc/mssql/connection_methods.rb +31 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +101 -0
- data/lib/arjdbc/mssql/lock_helpers.rb +72 -0
- data/lib/arjdbc/mssql/tsql_helper.rb +61 -0
- data/lib/arjdbc/mysql.rb +4 -0
- data/lib/arjdbc/mysql/adapter.rb +505 -0
- data/lib/arjdbc/mysql/connection_methods.rb +28 -0
- data/lib/arjdbc/oracle.rb +3 -0
- data/lib/arjdbc/oracle/adapter.rb +432 -0
- data/lib/arjdbc/oracle/connection_methods.rb +12 -0
- data/lib/arjdbc/postgresql.rb +4 -0
- data/lib/arjdbc/postgresql/adapter.rb +861 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +23 -0
- data/lib/arjdbc/sqlite3.rb +4 -0
- data/lib/arjdbc/sqlite3/adapter.rb +389 -0
- data/lib/arjdbc/sqlite3/connection_methods.rb +35 -0
- data/lib/arjdbc/sybase.rb +2 -0
- data/lib/arjdbc/sybase/adapter.rb +46 -0
- data/lib/arjdbc/version.rb +8 -0
- data/lib/generators/jdbc/USAGE +10 -0
- data/lib/generators/jdbc/jdbc_generator.rb +9 -0
- data/lib/jdbc_adapter.rb +2 -0
- data/lib/jdbc_adapter/rake_tasks.rb +3 -0
- data/lib/jdbc_adapter/version.rb +3 -0
- data/lib/pg.rb +26 -0
- data/pom.xml +57 -0
- data/rails_generators/jdbc_generator.rb +15 -0
- data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
- data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/compile.rake +23 -0
- data/rakelib/db.rake +39 -0
- data/rakelib/rails.rake +41 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +69 -0
- data/src/java/arjdbc/derby/DerbyModule.java +324 -0
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +70 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +74 -0
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +68 -0
- data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +36 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1346 -0
- data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +127 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +134 -0
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +161 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +85 -0
- data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +82 -0
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +126 -0
- data/test/abstract_db_create.rb +135 -0
- data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
- data/test/activerecord/jall.sh +7 -0
- data/test/activerecord/jtest.sh +3 -0
- data/test/db/db2.rb +11 -0
- data/test/db/derby.rb +12 -0
- data/test/db/h2.rb +11 -0
- data/test/db/hsqldb.rb +13 -0
- data/test/db/informix.rb +11 -0
- data/test/db/jdbc.rb +12 -0
- data/test/db/jndi_config.rb +40 -0
- data/test/db/logger.rb +3 -0
- data/test/db/mssql.rb +9 -0
- data/test/db/mysql.rb +10 -0
- data/test/db/oracle.rb +34 -0
- data/test/db/postgres.rb +18 -0
- data/test/db/sqlite3.rb +11 -0
- data/test/db2_reset_column_information_test.rb +8 -0
- data/test/db2_simple_test.rb +66 -0
- data/test/derby_migration_test.rb +68 -0
- data/test/derby_multibyte_test.rb +12 -0
- data/test/derby_reset_column_information_test.rb +8 -0
- data/test/derby_row_locking_test.rb +9 -0
- data/test/derby_simple_test.rb +139 -0
- data/test/generic_jdbc_connection_test.rb +29 -0
- data/test/h2_change_column_test.rb +68 -0
- data/test/h2_simple_test.rb +41 -0
- data/test/has_many_through.rb +79 -0
- data/test/helper.rb +108 -0
- data/test/hsqldb_simple_test.rb +6 -0
- data/test/informix_simple_test.rb +48 -0
- data/test/jdbc_common.rb +28 -0
- data/test/jndi_callbacks_test.rb +36 -0
- data/test/jndi_test.rb +25 -0
- data/test/manualTestDatabase.rb +191 -0
- data/test/models/add_not_null_column_to_table.rb +9 -0
- data/test/models/auto_id.rb +15 -0
- data/test/models/custom_pk_name.rb +14 -0
- data/test/models/data_types.rb +30 -0
- data/test/models/entry.rb +40 -0
- data/test/models/mixed_case.rb +22 -0
- data/test/models/reserved_word.rb +15 -0
- data/test/models/string_id.rb +17 -0
- data/test/models/thing.rb +16 -0
- data/test/models/validates_uniqueness_of_string.rb +19 -0
- data/test/mssql_db_create_test.rb +26 -0
- data/test/mssql_identity_insert_test.rb +19 -0
- data/test/mssql_ignore_system_views_test.rb +27 -0
- data/test/mssql_legacy_types_test.rb +58 -0
- data/test/mssql_limit_offset_test.rb +136 -0
- data/test/mssql_multibyte_test.rb +18 -0
- data/test/mssql_null_test.rb +14 -0
- data/test/mssql_reset_column_information_test.rb +8 -0
- data/test/mssql_row_locking_sql_test.rb +159 -0
- data/test/mssql_row_locking_test.rb +9 -0
- data/test/mssql_simple_test.rb +55 -0
- data/test/mysql_db_create_test.rb +27 -0
- data/test/mysql_index_length_test.rb +58 -0
- data/test/mysql_info_test.rb +123 -0
- data/test/mysql_multibyte_test.rb +10 -0
- data/test/mysql_nonstandard_primary_key_test.rb +42 -0
- data/test/mysql_reset_column_information_test.rb +8 -0
- data/test/mysql_simple_test.rb +125 -0
- data/test/oracle_reset_column_information_test.rb +8 -0
- data/test/oracle_simple_test.rb +18 -0
- data/test/oracle_specific_test.rb +83 -0
- data/test/postgres_db_create_test.rb +32 -0
- data/test/postgres_drop_db_test.rb +16 -0
- data/test/postgres_information_schema_leak_test.rb +29 -0
- data/test/postgres_mixed_case_test.rb +29 -0
- data/test/postgres_native_type_mapping_test.rb +93 -0
- data/test/postgres_nonseq_pkey_test.rb +38 -0
- data/test/postgres_reserved_test.rb +22 -0
- data/test/postgres_reset_column_information_test.rb +8 -0
- data/test/postgres_schema_search_path_test.rb +48 -0
- data/test/postgres_simple_test.rb +168 -0
- data/test/postgres_table_alias_length_test.rb +15 -0
- data/test/postgres_type_conversion_test.rb +34 -0
- data/test/row_locking.rb +90 -0
- data/test/simple.rb +731 -0
- data/test/sqlite3_reset_column_information_test.rb +8 -0
- data/test/sqlite3_simple_test.rb +316 -0
- data/test/sybase_jtds_simple_test.rb +28 -0
- data/test/sybase_reset_column_information_test.rb +8 -0
- 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
|