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,23 @@
|
|
|
1
|
+
# Don't need to load native postgres adapter
|
|
2
|
+
$LOADED_FEATURES << "active_record/connection_adapters/postgresql_adapter.rb"
|
|
3
|
+
|
|
4
|
+
class ActiveRecord::Base
|
|
5
|
+
class << self
|
|
6
|
+
def postgresql_connection(config)
|
|
7
|
+
require "arjdbc/postgresql"
|
|
8
|
+
config[:host] ||= "localhost"
|
|
9
|
+
config[:port] ||= 5432
|
|
10
|
+
config[:url] ||= "jdbc:postgresql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
|
11
|
+
config[:url] << config[:pg_params] if config[:pg_params]
|
|
12
|
+
config[:driver] ||= "org.postgresql.Driver"
|
|
13
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
|
|
14
|
+
config[:adapter_spec] = ::ArJdbc::PostgreSQL
|
|
15
|
+
conn = jdbc_connection(config)
|
|
16
|
+
conn.execute("SET SEARCH_PATH TO #{config[:schema_search_path]}") if config[:schema_search_path]
|
|
17
|
+
conn
|
|
18
|
+
end
|
|
19
|
+
alias_method :jdbcpostgresql_connection, :postgresql_connection
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
require 'arjdbc/jdbc/missing_functionality_helper'
|
|
2
|
+
|
|
3
|
+
module ActiveRecord::ConnectionAdapters
|
|
4
|
+
Sqlite3Adapter = Class.new(AbstractAdapter) unless const_defined?(:Sqlite3Adapter)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module ::ArJdbc
|
|
8
|
+
module SQLite3
|
|
9
|
+
def self.column_selector
|
|
10
|
+
[/sqlite/i, lambda {|cfg,col| col.extend(::ArJdbc::SQLite3::Column)}]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.jdbc_connection_class
|
|
14
|
+
::ActiveRecord::ConnectionAdapters::Sqlite3JdbcConnection
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Column
|
|
18
|
+
def init_column(name, default, *args)
|
|
19
|
+
@default = nil if default =~ /NULL/
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def type_cast(value)
|
|
23
|
+
return nil if value.nil?
|
|
24
|
+
case type
|
|
25
|
+
when :string then value
|
|
26
|
+
when :primary_key then defined?(value.to_i) ? value.to_i : (value ? 1 : 0)
|
|
27
|
+
when :float then value.to_f
|
|
28
|
+
when :decimal then self.class.value_to_decimal(value)
|
|
29
|
+
when :boolean then self.class.value_to_boolean(value)
|
|
30
|
+
else super
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
def simplified_type(field_type)
|
|
36
|
+
case field_type
|
|
37
|
+
when /boolean/i then :boolean
|
|
38
|
+
when /text/i then :text
|
|
39
|
+
when /varchar/i then :string
|
|
40
|
+
when /int/i then :integer
|
|
41
|
+
when /float/i then :float
|
|
42
|
+
when /real|decimal/i then @scale == 0 ? :integer : :decimal
|
|
43
|
+
when /datetime/i then :datetime
|
|
44
|
+
when /date/i then :date
|
|
45
|
+
when /time/i then :time
|
|
46
|
+
when /blob/i then :binary
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def extract_limit(sql_type)
|
|
51
|
+
return nil if sql_type =~ /^(real)\(\d+/i
|
|
52
|
+
super
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def extract_precision(sql_type)
|
|
56
|
+
case sql_type
|
|
57
|
+
when /^(real)\((\d+)(,\d+)?\)/i then $2.to_i
|
|
58
|
+
else super
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def extract_scale(sql_type)
|
|
63
|
+
case sql_type
|
|
64
|
+
when /^(real)\((\d+)\)/i then 0
|
|
65
|
+
when /^(real)\((\d+)(,(\d+))\)/i then $4.to_i
|
|
66
|
+
else super
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Post process default value from JDBC into a Rails-friendly format (columns{-internal})
|
|
71
|
+
def default_value(value)
|
|
72
|
+
# jdbc returns column default strings with actual single quotes around the value.
|
|
73
|
+
return $1 if value =~ /^'(.*)'$/
|
|
74
|
+
|
|
75
|
+
value
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def adapter_name #:nodoc:
|
|
80
|
+
'SQLite'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def self.arel2_visitors(config)
|
|
84
|
+
{}.tap {|v| %w(sqlite3 jdbcsqlite3).each {|x| v[x] = ::Arel::Visitors::SQLite } }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def supports_ddl_transactions?
|
|
88
|
+
true # sqlite_version >= '2.0.0'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def supports_add_column?
|
|
92
|
+
sqlite_version >= '3.1.6'
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def supports_count_distinct? #:nodoc:
|
|
96
|
+
sqlite_version >= '3.2.6'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def supports_autoincrement? #:nodoc:
|
|
100
|
+
sqlite_version >= '3.1.0'
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def sqlite_version
|
|
104
|
+
@sqlite_version ||= select_value('select sqlite_version(*)')
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def modify_types(tp)
|
|
108
|
+
tp[:primary_key] = "integer primary key autoincrement not null"
|
|
109
|
+
tp[:string] = { :name => "varchar", :limit => 255 }
|
|
110
|
+
tp[:text] = { :name => "text" }
|
|
111
|
+
tp[:float] = { :name => "float" }
|
|
112
|
+
tp[:decimal] = { :name => "decimal" }
|
|
113
|
+
tp[:datetime] = { :name => "datetime" }
|
|
114
|
+
tp[:timestamp] = { :name => "datetime" }
|
|
115
|
+
tp[:time] = { :name => "time" }
|
|
116
|
+
tp[:date] = { :name => "date" }
|
|
117
|
+
tp[:boolean] = { :name => "boolean" }
|
|
118
|
+
tp[:binary] = { :name => "blob" }
|
|
119
|
+
tp
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def quote_column_name(name) #:nodoc:
|
|
123
|
+
%Q("#{name.to_s.gsub('"', '""')}")
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def quote_string(str)
|
|
127
|
+
str.gsub(/'/, "''")
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def quoted_true
|
|
131
|
+
%Q{'t'}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def quoted_false
|
|
135
|
+
%Q{'f'}
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Quote date/time values for use in SQL input. Includes microseconds
|
|
139
|
+
# if the value is a Time responding to usec.
|
|
140
|
+
def quoted_date(value) #:nodoc:
|
|
141
|
+
if value.respond_to?(:usec)
|
|
142
|
+
"#{super}.#{sprintf("%06d", value.usec)}"
|
|
143
|
+
else
|
|
144
|
+
super
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = []) #:nodoc:
|
|
149
|
+
sql = substitute_binds(sql, binds)
|
|
150
|
+
log(sql, name) { @connection.execute_update(sql) }
|
|
151
|
+
id_value || last_insert_id
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def last_insert_id
|
|
155
|
+
@connection.last_insert_row_id
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def tables(name = nil) #:nodoc:
|
|
159
|
+
sql = <<-SQL
|
|
160
|
+
SELECT name
|
|
161
|
+
FROM sqlite_master
|
|
162
|
+
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
|
|
163
|
+
SQL
|
|
164
|
+
|
|
165
|
+
select_rows(sql, name).map do |row|
|
|
166
|
+
row[0]
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def indexes(table_name, name = nil)
|
|
171
|
+
result = select_rows("SELECT name, sql FROM sqlite_master WHERE tbl_name = #{quote_table_name(table_name)} AND type = 'index'", name)
|
|
172
|
+
|
|
173
|
+
result.collect do |row|
|
|
174
|
+
name = row[0]
|
|
175
|
+
index_sql = row[1]
|
|
176
|
+
unique = (index_sql =~ /unique/i)
|
|
177
|
+
cols = index_sql.match(/\((.*)\)/)[1].gsub(/,/,' ').split.map do |c|
|
|
178
|
+
match = /^"(.+)"$/.match(c); match ? match[1] : c
|
|
179
|
+
end
|
|
180
|
+
::ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, name, unique, cols)
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def primary_key(table_name) #:nodoc:
|
|
185
|
+
column = table_structure(table_name).find {|field| field['pk'].to_i == 1}
|
|
186
|
+
column ? column['name'] : nil
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def recreate_database(name)
|
|
190
|
+
tables.each{ |table| drop_table(table) }
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def _execute(sql, name = nil)
|
|
194
|
+
result = super
|
|
195
|
+
ActiveRecord::ConnectionAdapters::JdbcConnection::insert?(sql) ? last_insert_id : result
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def select(sql, name=nil, binds = [])
|
|
199
|
+
execute(sql, name, binds).map do |row|
|
|
200
|
+
record = {}
|
|
201
|
+
row.each_key do |key|
|
|
202
|
+
if key.is_a?(String)
|
|
203
|
+
record[key.sub(/^"?\w+"?\./, '')] = row[key]
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
record
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def table_structure(table_name)
|
|
211
|
+
sql = "PRAGMA table_info(#{quote_table_name(table_name)})"
|
|
212
|
+
log(sql, 'SCHEMA') { @connection.execute_query(sql) }
|
|
213
|
+
rescue ActiveRecord::JDBCError => error
|
|
214
|
+
e = ActiveRecord::StatementInvalid.new("Could not find table '#{table_name}'")
|
|
215
|
+
e.set_backtrace error.backtrace
|
|
216
|
+
raise e
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def jdbc_columns(table_name, name = nil) #:nodoc:
|
|
220
|
+
table_structure(table_name).map do |field|
|
|
221
|
+
::ActiveRecord::ConnectionAdapters::SQLite3Column.new(@config, field['name'], field['dflt_value'], field['type'], field['notnull'] == 0)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def primary_key(table_name) #:nodoc:
|
|
226
|
+
column = table_structure(table_name).find { |field|
|
|
227
|
+
field['pk'].to_i == 1
|
|
228
|
+
}
|
|
229
|
+
column && column['name']
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def remove_index!(table_name, index_name) #:nodoc:
|
|
233
|
+
execute "DROP INDEX #{quote_column_name(index_name)}"
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def rename_table(name, new_name)
|
|
237
|
+
execute "ALTER TABLE #{quote_table_name(name)} RENAME TO #{quote_table_name(new_name)}"
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
# See: http://www.sqlite.org/lang_altertable.html
|
|
241
|
+
# SQLite has an additional restriction on the ALTER TABLE statement
|
|
242
|
+
def valid_alter_table_options( type, options)
|
|
243
|
+
type.to_sym != :primary_key
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def add_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
247
|
+
if supports_add_column? && valid_alter_table_options( type, options )
|
|
248
|
+
super(table_name, column_name, type, options)
|
|
249
|
+
else
|
|
250
|
+
alter_table(table_name) do |definition|
|
|
251
|
+
definition.column(column_name, type, options)
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def remove_column(table_name, *column_names) #:nodoc:
|
|
257
|
+
raise ArgumentError.new("You must specify at least one column name. Example: remove_column(:people, :first_name)") if column_names.empty?
|
|
258
|
+
column_names.flatten.each do |column_name|
|
|
259
|
+
alter_table(table_name) do |definition|
|
|
260
|
+
definition.columns.delete(definition[column_name])
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
alias :remove_columns :remove_column
|
|
265
|
+
|
|
266
|
+
def change_column_default(table_name, column_name, default) #:nodoc:
|
|
267
|
+
alter_table(table_name) do |definition|
|
|
268
|
+
definition[column_name].default = default
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def change_column_null(table_name, column_name, null, default = nil)
|
|
273
|
+
unless null || default.nil?
|
|
274
|
+
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
|
275
|
+
end
|
|
276
|
+
alter_table(table_name) do |definition|
|
|
277
|
+
definition[column_name].null = null
|
|
278
|
+
end
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
282
|
+
alter_table(table_name) do |definition|
|
|
283
|
+
include_default = options_include_default?(options)
|
|
284
|
+
definition[column_name].instance_eval do
|
|
285
|
+
self.type = type
|
|
286
|
+
self.limit = options[:limit] if options.include?(:limit)
|
|
287
|
+
self.default = options[:default] if include_default
|
|
288
|
+
self.null = options[:null] if options.include?(:null)
|
|
289
|
+
self.precision = options[:precision] if options.include?(:precision)
|
|
290
|
+
self.scale = options[:scale] if options.include?(:scale)
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def rename_column(table_name, column_name, new_column_name) #:nodoc:
|
|
296
|
+
unless columns(table_name).detect{|c| c.name == column_name.to_s }
|
|
297
|
+
raise ActiveRecord::ActiveRecordError, "Missing column #{table_name}.#{column_name}"
|
|
298
|
+
end
|
|
299
|
+
alter_table(table_name, :rename => {column_name.to_s => new_column_name.to_s})
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# SELECT ... FOR UPDATE is redundant since the table is locked.
|
|
303
|
+
def add_lock!(sql, options) #:nodoc:
|
|
304
|
+
sql
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def empty_insert_statement_value
|
|
308
|
+
"VALUES(NULL)"
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
protected
|
|
312
|
+
include ArJdbc::MissingFunctionalityHelper
|
|
313
|
+
|
|
314
|
+
def translate_exception(exception, message)
|
|
315
|
+
case exception.message
|
|
316
|
+
when /column(s)? .* (is|are) not unique/
|
|
317
|
+
ActiveRecord::RecordNotUnique.new(message, exception)
|
|
318
|
+
else
|
|
319
|
+
super
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
module ActiveRecord::ConnectionAdapters
|
|
326
|
+
remove_const(:SQLite3Adapter) if const_defined?(:SQLite3Adapter)
|
|
327
|
+
remove_const(:SQLiteAdapter) if const_defined?(:SQLiteAdapter)
|
|
328
|
+
|
|
329
|
+
class SQLite3Column < JdbcColumn
|
|
330
|
+
include ArJdbc::SQLite3::Column
|
|
331
|
+
|
|
332
|
+
def initialize(name, *args)
|
|
333
|
+
if Hash === name
|
|
334
|
+
super
|
|
335
|
+
else
|
|
336
|
+
super(nil, name, *args)
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def call_discovered_column_callbacks(*)
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def self.string_to_binary(value)
|
|
344
|
+
"\000b64" + [value].pack('m*').split("\n").join('')
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def self.binary_to_string(value)
|
|
348
|
+
if value.respond_to?(:force_encoding) && value.encoding != Encoding::ASCII_8BIT
|
|
349
|
+
value = value.force_encoding(Encoding::ASCII_8BIT)
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
if value[0..3] == "\000b64"
|
|
353
|
+
value[4..-1].unpack('m*').first
|
|
354
|
+
else
|
|
355
|
+
value
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
class SQLite3Adapter < JdbcAdapter
|
|
361
|
+
include ArJdbc::SQLite3
|
|
362
|
+
|
|
363
|
+
def jdbc_connection_class(spec)
|
|
364
|
+
::ArJdbc::SQLite3.jdbc_connection_class
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def jdbc_column_class
|
|
368
|
+
ActiveRecord::ConnectionAdapters::SQLite3Column
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
alias_chained_method :columns, :query_cache, :jdbc_columns
|
|
372
|
+
|
|
373
|
+
protected
|
|
374
|
+
|
|
375
|
+
def last_inserted_id(result)
|
|
376
|
+
last_insert_id
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
SQLiteAdapter = SQLite3Adapter
|
|
381
|
+
end
|
|
382
|
+
|
|
383
|
+
# Fake out sqlite3/version driver for AR tests
|
|
384
|
+
$LOADED_FEATURES << 'sqlite3/version.rb'
|
|
385
|
+
module SQLite3
|
|
386
|
+
module Version
|
|
387
|
+
VERSION = '1.2.6' # query_cache_test.rb requires SQLite3::Version::VERSION > '1.2.5'
|
|
388
|
+
end
|
|
389
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
database = config[:database]
|
|
12
|
+
database = '' if database == ':memory:'
|
|
13
|
+
config[:url] ||= "jdbc:sqlite:#{database}"
|
|
14
|
+
config[:driver] ||= "org.sqlite.JDBC"
|
|
15
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter
|
|
16
|
+
config[:adapter_spec] = ::ArJdbc::SQLite3
|
|
17
|
+
jdbc_connection(config)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def parse_sqlite3_config!(config)
|
|
21
|
+
config[:database] ||= config[:dbfile]
|
|
22
|
+
|
|
23
|
+
# Allow database path relative to RAILS_ROOT, but only if
|
|
24
|
+
# the database path is not the special path that tells
|
|
25
|
+
# Sqlite to build a database only in memory.
|
|
26
|
+
rails_root_defined = defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
|
|
27
|
+
if rails_root_defined && ':memory:' != config[:database]
|
|
28
|
+
rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
|
|
29
|
+
config[:database] = File.expand_path(config[:database], rails_root)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
alias_method :jdbcsqlite3_connection, :sqlite3_connection
|
|
34
|
+
end
|
|
35
|
+
end
|