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,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,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,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