activerecord-jdbc-adapter 51.7-java → 52.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -2
  3. data/.travis.yml +26 -51
  4. data/README.md +9 -11
  5. data/Rakefile +19 -74
  6. data/activerecord-jdbc-adapter.gemspec +2 -2
  7. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  8. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  9. data/lib/arjdbc/abstract/core.rb +2 -12
  10. data/lib/arjdbc/abstract/database_statements.rb +24 -10
  11. data/lib/arjdbc/abstract/statement_cache.rb +4 -4
  12. data/lib/arjdbc/db2/adapter.rb +52 -2
  13. data/lib/arjdbc/jdbc.rb +4 -0
  14. data/lib/arjdbc/jdbc/column.rb +11 -5
  15. data/lib/arjdbc/jdbc/connection_methods.rb +9 -2
  16. data/lib/arjdbc/jdbc/jdbc.rake +4 -0
  17. data/lib/arjdbc/mssql.rb +7 -0
  18. data/lib/arjdbc/mssql/adapter.rb +804 -0
  19. data/lib/arjdbc/mssql/column.rb +200 -0
  20. data/lib/arjdbc/mssql/connection_methods.rb +79 -0
  21. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  22. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  23. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  24. data/lib/arjdbc/mssql/types.rb +343 -0
  25. data/lib/arjdbc/mssql/utils.rb +82 -0
  26. data/lib/arjdbc/mysql/adapter.rb +22 -14
  27. data/lib/arjdbc/mysql/connection_methods.rb +9 -18
  28. data/lib/arjdbc/postgresql/adapter.rb +102 -75
  29. data/lib/arjdbc/postgresql/column.rb +3 -6
  30. data/lib/arjdbc/postgresql/connection_methods.rb +3 -12
  31. data/lib/arjdbc/postgresql/oid_types.rb +12 -86
  32. data/lib/arjdbc/sqlite3/adapter.rb +88 -92
  33. data/lib/arjdbc/sqlite3/connection_methods.rb +0 -1
  34. data/lib/arjdbc/tasks/database_tasks.rb +36 -16
  35. data/lib/arjdbc/tasks/databases.rake +75 -32
  36. data/lib/arjdbc/tasks/databases3.rake +215 -0
  37. data/lib/arjdbc/tasks/databases4.rake +39 -0
  38. data/lib/arjdbc/version.rb +1 -1
  39. data/rakelib/01-tomcat.rake +2 -2
  40. data/rakelib/02-test.rake +3 -0
  41. data/rakelib/compile.rake +70 -0
  42. data/rakelib/db.rake +7 -21
  43. data/rakelib/rails.rake +4 -5
  44. data/src/java/arjdbc/ArJdbcModule.java +15 -5
  45. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +2 -2
  46. data/src/java/arjdbc/jdbc/ConnectionFactory.java +87 -0
  47. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +1 -0
  48. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +29 -113
  49. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +14 -259
  50. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +2 -2
  51. data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
  52. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +13 -21
  53. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +50 -44
  54. data/src/java/arjdbc/util/DateTimeUtils.java +5 -141
  55. data/src/java/arjdbc/util/QuotingUtils.java +7 -6
  56. metadata +26 -11
  57. data/src/java/arjdbc/jdbc/RubyConnectionFactory.java +0 -61
  58. data/src/java/arjdbc/postgresql/PgDateTimeUtils.java +0 -52
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  ArJdbc::ConnectionMethods.module_eval do
3
3
  def postgresql_connection(config)
4
- config = config.deep_dup
5
4
  # NOTE: this isn't "really" necessary but Rails (in tests) assumes being able to :
6
5
  # ActiveRecord::Base.postgresql_connection ActiveRecord::Base.configurations['arunit'].merge(:insert_returning => false)
7
6
  # ... while using symbols by default but than configurations returning string keys ;(
@@ -17,8 +16,7 @@ ArJdbc::ConnectionMethods.module_eval do
17
16
  ::Jdbc::Postgres.load_driver(:require) if defined?(::Jdbc::Postgres.load_driver)
18
17
  rescue LoadError # assuming driver.jar is on the class-path
19
18
  end
20
- driver = (config[:driver] ||=
21
- defined?(::Jdbc::Postgres.driver_name) ? ::Jdbc::Postgres.driver_name : 'org.postgresql.Driver')
19
+ driver = config[:driver] ||= 'org.postgresql.Driver'
22
20
 
23
21
  host = config[:host] ||= ( config[:hostaddr] || ENV['PGHOST'] || 'localhost' )
24
22
  port = config[:port] ||= ( ENV['PGPORT'] || 5432 )
@@ -53,15 +51,8 @@ ArJdbc::ConnectionMethods.module_eval do
53
51
  properties['tcpKeepAlive'] ||= config[:keepalives] if config.key?(:keepalives)
54
52
  properties['kerberosServerName'] ||= config[:krbsrvname] if config[:krbsrvname]
55
53
 
56
- prepared_statements = config.fetch(:prepared_statements) { true }
57
- prepared_statements = false if prepared_statements == 'false'
58
- if prepared_statements
59
- # this makes the pgjdbc driver handle hot compatibility internally
60
- properties['autosave'] ||= 'conservative'
61
- else
62
- # If prepared statements are off, lets make sure they are really *off*
63
- properties['prepareThreshold'] = 0
64
- end
54
+ # If prepared statements are off, lets make sure they are really *off*
55
+ properties['prepareThreshold'] ||= 0 unless config[:prepared_statements]
65
56
 
66
57
  jdbc_connection(config)
67
58
  end
@@ -9,61 +9,6 @@ module ArJdbc
9
9
  # @private
10
10
  OID = ::ActiveRecord::ConnectionAdapters::PostgreSQL::OID
11
11
 
12
- # this version makes sure to register the types by name as well
13
- # we still need to version with OID since it's used from SchemaStatements as well
14
- class ArjdbcTypeMapInitializer < OID::TypeMapInitializer
15
- private
16
-
17
- def name_with_ns(row)
18
- if row['in_ns']
19
- row['typname']
20
- else
21
- %Q("#{row['nspname']}"."#{row['typname']}")
22
- end
23
- end
24
-
25
- def register_enum_type(row)
26
- super
27
- register name_with_ns(row), OID::Enum.new
28
- end
29
-
30
- def register_array_type(row)
31
- super
32
- register_with_subtype(name_with_ns(row), row['typelem'].to_i) do |subtype|
33
- OID::Array.new(subtype, row['typdelim'])
34
- end
35
- end
36
-
37
- def register_range_type(row)
38
- super
39
- name = name_with_ns(row)
40
- register_with_subtype(name, row['rngsubtype'].to_i) do |subtype|
41
- OID::Range.new(subtype, name.to_sym)
42
- end
43
- end
44
-
45
- def register_domain_type(row)
46
- if base_type = @store.lookup(row['typbasetype'].to_i)
47
- register row['oid'], base_type
48
- register name_with_ns(row), base_type
49
- else
50
- warn "unknown base type (OID: #{row['typbasetype']}) for domain #{row['typname']}."
51
- end
52
- end
53
-
54
- def register_composite_type(row)
55
- if subtype = @store.lookup(row['typelem'].to_i)
56
- register row['oid'], OID::Vector.new(row['typdelim'], subtype)
57
- register name_with_ns(row), OID::Vector.new(row['typdelim'], subtype)
58
- end
59
- end
60
-
61
- def assert_valid_registration(oid, oid_type)
62
- ret = super
63
- ret == 0 ? oid : ret
64
- end
65
- end
66
-
67
12
  # @private
68
13
  module OIDTypes
69
14
 
@@ -96,7 +41,7 @@ module ArJdbc
96
41
 
97
42
  def get_oid_type(oid, fmod, column_name, sql_type = '') # :nodoc:
98
43
  if !type_map.key?(oid)
99
- load_additional_types(type_map, oid)
44
+ load_additional_types([oid])
100
45
  end
101
46
 
102
47
  type_map.fetch(oid, fmod, sql_type) {
@@ -120,7 +65,7 @@ module ArJdbc
120
65
 
121
66
  private
122
67
 
123
- def initialize_type_map(m)
68
+ def initialize_type_map(m = type_map)
124
69
  register_class_with_limit m, 'int2', Type::Integer
125
70
  register_class_with_limit m, 'int4', Type::Integer
126
71
  register_class_with_limit m, 'int8', Type::Integer
@@ -142,7 +87,7 @@ module ArJdbc
142
87
  m.register_type 'bytea', OID::Bytea.new
143
88
  m.register_type 'point', OID::Point.new
144
89
  m.register_type 'hstore', OID::Hstore.new
145
- m.register_type 'json', OID::Json.new
90
+ m.register_type 'json', Type::Json.new
146
91
  m.register_type 'jsonb', OID::Jsonb.new
147
92
  m.register_type 'cidr', OID::Cidr.new
148
93
  m.register_type 'inet', OID::Inet.new
@@ -187,48 +132,29 @@ module ArJdbc
187
132
  end
188
133
  end
189
134
 
190
- load_additional_types(m)
191
-
192
- # pgjdbc returns these if the column is auto-incrmenting
193
- m.alias_type 'serial', 'int4'
194
- m.alias_type 'bigserial', 'int8'
135
+ load_additional_types
195
136
  end
196
137
 
197
- def load_additional_types(type_map, oid = nil) # :nodoc:
198
- initializer = ArjdbcTypeMapInitializer.new(type_map)
138
+ def load_additional_types(oids = nil) # :nodoc:
139
+ initializer = OID::TypeMapInitializer.new(type_map)
199
140
 
200
141
  if supports_ranges?
201
142
  query = <<-SQL
202
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype,
203
- ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
143
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
204
144
  FROM pg_type as t
205
145
  LEFT JOIN pg_range as r ON oid = rngtypid
206
- JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
207
146
  SQL
208
147
  else
209
148
  query = <<-SQL
210
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype,
211
- ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
149
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype
212
150
  FROM pg_type as t
213
- JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
214
151
  SQL
215
152
  end
216
153
 
217
- if oid
218
- if oid.is_a? Numeric || oid.match(/^\d+$/)
219
- # numeric OID
220
- query += "WHERE t.oid::integer = %s" % oid
221
-
222
- elsif m = oid.match(/"?(\w+)"?\."?(\w+)"?/)
223
- # namespace and type name
224
- query += "WHERE ns.nspname = '%s' AND t.typname = '%s'" % [m[1], m[2]]
225
-
226
- else
227
- # only type name
228
- query += "WHERE t.typname = '%s' AND ns.nspname = ANY(current_schemas(true))" % oid
229
- end
154
+ if oids
155
+ query += "WHERE t.oid::integer IN (%s)" % oids.join(", ")
230
156
  else
231
- query += initializer.query_conditions_for_initial_load(type_map)
157
+ query += initializer.query_conditions_for_initial_load
232
158
  end
233
159
 
234
160
  records = execute(query, 'SCHEMA')
@@ -247,7 +173,7 @@ module ArJdbc
247
173
  ActiveRecord::Type.register(:enum, OID::Enum, adapter: :postgresql)
248
174
  ActiveRecord::Type.register(:hstore, OID::Hstore, adapter: :postgresql)
249
175
  ActiveRecord::Type.register(:inet, OID::Inet, adapter: :postgresql)
250
- ActiveRecord::Type.register(:json, OID::Json, adapter: :postgresql)
176
+ ActiveRecord::Type.register(:json, Type::Json, adapter: :postgresql)
251
177
  ActiveRecord::Type.register(:jsonb, OID::Jsonb, adapter: :postgresql)
252
178
  ActiveRecord::Type.register(:money, OID::Money, adapter: :postgresql)
253
179
  ActiveRecord::Type.register(:point, OID::Point, adapter: :postgresql)
@@ -12,6 +12,7 @@ require "active_record/connection_adapters/sqlite3/schema_creation"
12
12
  require "active_record/connection_adapters/sqlite3/schema_definitions"
13
13
  require "active_record/connection_adapters/sqlite3/schema_dumper"
14
14
  require "active_record/connection_adapters/sqlite3/schema_statements"
15
+ require "active_support/core_ext/class/attribute"
15
16
 
16
17
  module ArJdbc
17
18
  # All the code in this module is a copy of ConnectionAdapters::SQLite3Adapter from active_record 5.
@@ -33,11 +34,10 @@ module ArJdbc
33
34
 
34
35
  # DIFFERENCE: FQN
35
36
  include ::ActiveRecord::ConnectionAdapters::SQLite3::Quoting
36
- include ::ActiveRecord::ConnectionAdapters::SQLite3::ColumnDumper
37
37
  include ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaStatements
38
38
 
39
39
  NATIVE_DATABASE_TYPES = {
40
- primary_key: "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL",
40
+ primary_key: "integer PRIMARY KEY AUTOINCREMENT NOT NULL",
41
41
  string: { name: "varchar" },
42
42
  text: { name: "text" },
43
43
  integer: { name: "integer" },
@@ -47,9 +47,13 @@ module ArJdbc
47
47
  time: { name: "time" },
48
48
  date: { name: "date" },
49
49
  binary: { name: "blob" },
50
- boolean: { name: "boolean" }
50
+ boolean: { name: "boolean" },
51
+ json: { name: "json" },
51
52
  }
52
53
 
54
+ # DIFFERENCE: class_attribute in original adapter is moved down to our section which is a class
55
+ # since we cannot define it here in the module (original source this is a class).
56
+
53
57
  class StatementPool < ConnectionAdapters::StatementPool
54
58
  private
55
59
 
@@ -58,24 +62,11 @@ module ArJdbc
58
62
  end
59
63
  end
60
64
 
61
- def update_table_definition(table_name, base) # :nodoc:
62
- # DIFFERENCE: FQN
63
- ::ActiveRecord::ConnectionAdapters::SQLite3::Table.new(table_name, base)
64
- end
65
-
66
- def schema_creation # :nodoc:
67
- # DIFFERENCE: FQN
68
- ::ActiveRecord::ConnectionAdapters::SQLite3::SchemaCreation.new self
69
- end
70
-
71
- def arel_visitor # :nodoc:
72
- Arel::Visitors::SQLite.new(self)
73
- end
74
-
75
- def initialize(connection, logger, connection_options, config)
65
+ # DIFFERENCE: we remove connection_options because we are not using it.
66
+ def initialize(connection, logger, config)
76
67
  super(connection, logger, config)
77
68
 
78
- @active = nil
69
+ @active = true
79
70
  @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))
80
71
 
81
72
  configure_connection
@@ -93,12 +84,6 @@ module ArJdbc
93
84
  sqlite_version >= "3.8.0"
94
85
  end
95
86
 
96
- # Returns true, since this connection adapter supports prepared statement
97
- # caching.
98
- def supports_statement_cache?
99
- true
100
- end
101
-
102
87
  def requires_reloading?
103
88
  true
104
89
  end
@@ -120,7 +105,7 @@ module ArJdbc
120
105
  end
121
106
 
122
107
  def active?
123
- @active != false
108
+ @active
124
109
  end
125
110
 
126
111
  # Disconnects from the database if already connected. Otherwise, this
@@ -248,53 +233,6 @@ module ArJdbc
248
233
 
249
234
  # SCHEMA STATEMENTS ========================================
250
235
 
251
- def new_column_from_field(table_name, field) # :nondoc:
252
- case field["dflt_value"]
253
- when /^null$/i
254
- field["dflt_value"] = nil
255
- when /^'(.*)'$/m
256
- field["dflt_value"] = $1.gsub("''", "'")
257
- when /^"(.*)"$/m
258
- field["dflt_value"] = $1.gsub('""', '"')
259
- end
260
-
261
- collation = field["collation"]
262
- sql_type = field["type"]
263
- type_metadata = fetch_type_metadata(sql_type)
264
- new_column(field["name"], field["dflt_value"], type_metadata, field["notnull"].to_i == 0, table_name, nil, collation)
265
- end
266
-
267
- # Returns an array of indexes for the given table.
268
- def indexes(table_name, name = nil) #:nodoc:
269
- if name
270
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
271
- Passing name to #indexes is deprecated without replacement.
272
- MSG
273
- end
274
-
275
- exec_query("PRAGMA index_list(#{quote_table_name(table_name)})", "SCHEMA").map do |row|
276
- sql = <<-SQL
277
- SELECT sql
278
- FROM sqlite_master
279
- WHERE name=#{quote(row['name'])} AND type='index'
280
- UNION ALL
281
- SELECT sql
282
- FROM sqlite_temp_master
283
- WHERE name=#{quote(row['name'])} AND type='index'
284
- SQL
285
- index_sql = exec_query(sql).first["sql"]
286
- match = /\sWHERE\s+(.+)$/i.match(index_sql)
287
- where = match[1] if match
288
- IndexDefinition.new(
289
- table_name,
290
- row["name"],
291
- row["unique"] != 0,
292
- exec_query("PRAGMA index_info('#{row['name']}')", "SCHEMA").map { |col|
293
- col["name"]
294
- }, nil, nil, where)
295
- end
296
- end
297
-
298
236
  def primary_keys(table_name) # :nodoc:
299
237
  pks = table_structure(table_name).select { |f| f["pk"] > 0 }
300
238
  pks.sort_by { |f| f["pk"] }.map { |f| f["name"] }
@@ -314,19 +252,20 @@ module ArJdbc
314
252
  rename_table_indexes(table_name, new_name)
315
253
  end
316
254
 
317
- # See: http://www.sqlite.org/lang_altertable.html
318
- # SQLite has an additional restriction on the ALTER TABLE statement
319
- def valid_alter_table_type?(type)
320
- type.to_sym != :primary_key
255
+ # DIFFERENCE: deprecated causes a JRuby 9.1 bug where "super" calls itself -> do inline
256
+ def valid_alter_table_type?(type, options = {})
257
+ ActiveSupport::Deprecation.deprecation_warning(__method__)
258
+ !invalid_alter_table_type?(type, options)
321
259
  end
260
+ #deprecate :valid_alter_table_type?
322
261
 
323
262
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
324
- if valid_alter_table_type?(type) && !options[:primary_key]
325
- super(table_name, column_name, type, options)
326
- else
263
+ if invalid_alter_table_type?(type, options)
327
264
  alter_table(table_name) do |definition|
328
265
  definition.column(column_name, type, options)
329
266
  end
267
+ else
268
+ super
330
269
  end
331
270
  end
332
271
 
@@ -391,8 +330,32 @@ module ArJdbc
391
330
  ::ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(table_name, row["table"], options)
392
331
  end
393
332
  end
333
+
334
+ def insert_fixtures(rows, table_name)
335
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
336
+ `insert_fixtures` is deprecated and will be removed in the next version of Rails.
337
+ Consider using `insert_fixtures_set` for performance improvement.
338
+ MSG
339
+ insert_fixtures_set(table_name => rows)
340
+ end
341
+
342
+ def insert_fixtures_set(fixture_set, tables_to_delete = [])
343
+ disable_referential_integrity do
344
+ transaction(requires_new: true) do
345
+ tables_to_delete.each { |table| delete "DELETE FROM #{quote_table_name(table)}", "Fixture Delete" }
346
+
347
+ fixture_set.each do |table_name, rows|
348
+ rows.each { |row| insert_fixture(row, table_name) }
349
+ end
350
+ end
351
+ end
352
+ end
394
353
 
395
354
  private
355
+ def initialize_type_map(m = type_map)
356
+ super
357
+ register_class_with_limit m, %r(int)i, SQLite3Integer
358
+ end
396
359
 
397
360
  def table_structure(table_name)
398
361
  structure = exec_query("PRAGMA table_info(#{quote_table_name(table_name)})", "SCHEMA")
@@ -400,7 +363,13 @@ module ArJdbc
400
363
  table_structure_with_collation(table_name, structure)
401
364
  end
402
365
  alias column_definitions table_structure
403
-
366
+
367
+ # See: https://www.sqlite.org/lang_altertable.html
368
+ # SQLite has an additional restriction on the ALTER TABLE statement
369
+ def invalid_alter_table_type?(type, options)
370
+ type.to_sym == :primary_key || options[:primary_key]
371
+ end
372
+
404
373
  def alter_table(table_name, options = {}) #:nodoc:
405
374
  altered_table_name = "a#{table_name}"
406
375
  caller = lambda { |definition| yield definition if block_given? }
@@ -551,23 +520,28 @@ module ArJdbc
551
520
  end
552
521
  end
553
522
 
554
- def create_table_definition(*args)
555
- # DIFFERENCE: FQN
556
- ::ActiveRecord::ConnectionAdapters::SQLite3::TableDefinition.new(*args)
557
- end
558
-
559
- def extract_foreign_key_action(specifier)
560
- case specifier
561
- when "CASCADE"; :cascade
562
- when "SET NULL"; :nullify
563
- when "RESTRICT"; :restrict
564
- end
523
+ def arel_visitor
524
+ Arel::Visitors::SQLite.new(self)
565
525
  end
566
526
 
567
527
  def configure_connection
568
528
  execute("PRAGMA foreign_keys = ON", "SCHEMA")
569
529
  end
530
+
531
+ # DIFFERENCE: FQN
532
+ class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
533
+ private
534
+ def _limit
535
+ # INTEGER storage class can be stored 8 bytes value.
536
+ # See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
537
+ limit || 8
538
+ end
539
+ end
540
+
541
+ # DIFFERENCE: FQN
542
+ ::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
570
543
  end
544
+ # DIFFERENCE: A registration here is moved down to concrete class so we are not registering part of an adapter.
571
545
  end
572
546
 
573
547
  module ActiveRecord::ConnectionAdapters
@@ -677,6 +651,25 @@ module ActiveRecord::ConnectionAdapters
677
651
  include ArJdbc::Abstract::StatementCache
678
652
  include ArJdbc::Abstract::TransactionSupport
679
653
 
654
+ # Note: This is part of original AR sqlite3_adapter.rb and not an override by us. This is to just
655
+ # work around our copy of Sqlite3Adapter being a module above and not a class.
656
+ ##
657
+ # :singleton-method:
658
+ # Indicates whether boolean values are stored in sqlite3 databases as 1
659
+ # and 0 or 't' and 'f'. Leaving <tt>ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer</tt>
660
+ # set to false is deprecated. SQLite databases have used 't' and 'f' to
661
+ # serialize boolean values and must have old data converted to 1 and 0
662
+ # (its native boolean serialization) before setting this flag to true.
663
+ # Conversion can be accomplished by setting up a rake task which runs
664
+ #
665
+ # ExampleModel.where("boolean_column = 't'").update_all(boolean_column: 1)
666
+ # ExampleModel.where("boolean_column = 'f'").update_all(boolean_column: 0)
667
+ # for all models and all boolean columns, after which the flag must be set
668
+ # to true by adding the following to your <tt>application.rb</tt> file:
669
+ #
670
+ # Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
671
+ class_attribute :represent_boolean_as_integer, default: false
672
+
680
673
  def supports_transaction_isolation?
681
674
  false
682
675
  end
@@ -704,5 +697,8 @@ module ActiveRecord::ConnectionAdapters
704
697
  def self.jdbc_connection_class
705
698
  ::ActiveRecord::ConnectionAdapters::SQLite3JdbcConnection
706
699
  end
700
+
701
+ # Note: This is not an override of ours but a moved line from AR Sqlite3Adapter to register ours vs our copied module (which would be their class).
702
+ # ActiveSupport.run_load_hooks(:active_record_sqlite3adapter, SQLite3Adapter)
707
703
  end
708
704
  end