activerecord-jdbc-adapter 51.8-java → 52.0-java

Sign up to get free protection for your applications and to get access to all the features.
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 -310
  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