activerecord-cockroachdb-adapter 5.2.2 → 6.0.0.pre.beta.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8a3ba83448f71d7a2d0e5a4d21f065531f17a862aa8a33e7ed4e9470927f0a
4
- data.tar.gz: ae23824599ad3bc37773f99e08a143b7242e81094098674d22499df7153c5856
3
+ metadata.gz: e242232ac6fcfc87b6bddc17eeb852099a959d3a024064ed3a32e85bd80ad786
4
+ data.tar.gz: 5ab114df9f5fee7fb5c18c5cf0eb0dfdc822f7513f19d79312f65e0b55e1e459
5
5
  SHA512:
6
- metadata.gz: 4100c35b51262901f1f087be1d0a5b4864f45a89585878e5d00aa12919863cdc66cd8ffddfcd0f3b16037bd6b21539845ddbe18c7901fd2f48f7d7e807f61f0b
7
- data.tar.gz: accca94dcb97b512e261a676d031657c8cc34d22590866744ffd6dbaf757a67386d9c642638d77aa4354d5281437e7a5e8c5c5dc141335f441422e20a3605aee
6
+ metadata.gz: a2de1e036b53ebeb11185eaeb10bd465f9a1103a34307354bc4bbbe94b8beb4c5a2313938e01703db8b68f5a689ee6b9b778b8282bceac3bb852b6569340351b
7
+ data.tar.gz: 4138ea2ccad0bac070c277adb9ec4aa837be440900f72fe8f2728bac78d58a96d96ed7df9a830841b3389e5f51678dba9377e0598b3aa96d682d36c609dcedfb
data/CHANGELOG.md ADDED
@@ -0,0 +1,25 @@
1
+ # Changelog
2
+
3
+ ## 6.0.0-beta.5 - 2021-04-02
4
+
5
+ - Added a configuration option named `use_follower_reads_for_type_introspection`.
6
+ If true, it improves the speed of type introspection by allowing potentially stale
7
+ type metadata to be read. Defaults to false.
8
+
9
+ ## 6.0.0-beta.4 - 2021-03-06
10
+
11
+ - Improved connection performance by refactoring an introspection
12
+ that loads types.
13
+ - Changed version numbers to semver.
14
+
15
+ ## 6.0.0beta3
16
+
17
+ - Added support for spatial features.
18
+
19
+ ## 6.0.0beta2
20
+
21
+ - Updated transaction retry logic to work with Rails 6.
22
+
23
+ ## 6.0.0beta1
24
+
25
+ - Initial support for Rails 6.
data/README.md CHANGED
@@ -22,6 +22,12 @@ development:
22
22
  user: <username>
23
23
  ```
24
24
 
25
+ ## Configuration
26
+
27
+ In addition to the standard adapter settings, CockroachDB also supports the following:
28
+
29
+ - `use_follower_reads_for_type_introspection`: Use follower reads on queries to the `pg_type` catalog when set to `true`. This helps to speed up initialization by reading historical data, but may not find recently created user-defined types.
30
+
25
31
  ## Working with Spatial Data
26
32
 
27
33
  The adapter uses [RGeo](https://github.com/rgeo/rgeo) and [RGeo-ActiveRecord](https://github.com/rgeo/rgeo-activerecord) to represent geometric and geographic data as Ruby objects and easily interface them with the adapter. The following is a brief introduction to RGeo and tips to help setup your spatial application. More documentation about RGeo can be found in the [YARD Docs](https://rubydoc.info/github/rgeo/rgeo) and [wiki](https://github.com/rgeo/rgeo/wiki).
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "activerecord-cockroachdb-adapter"
7
- spec.version = "5.2.2"
7
+ spec.version = "6.0.0-beta.5"
8
8
  spec.licenses = ["Apache-2.0"]
9
9
  spec.authors = ["Cockroach Labs"]
10
10
  spec.email = ["cockroach-db@googlegroups.com"]
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = "Allows the use of CockroachDB as a backend for ActiveRecord and Rails apps."
14
14
  spec.homepage = "https://github.com/cockroachdb/activerecord-cockroachdb-adapter"
15
15
 
16
- spec.add_dependency "activerecord", "~> 5.2"
16
+ spec.add_dependency "activerecord", "~> 6.0.3"
17
17
  spec.add_dependency "pg", ">= 0.20"
18
18
  spec.add_dependency "rgeo-activerecord", "~> 7.0.0"
19
19
 
@@ -4,19 +4,18 @@ module ActiveRecord
4
4
  module PostgreSQLColumnMonkeyPatch
5
5
  # most functions taken from activerecord-postgis-adapter spatial_column
6
6
  # https://github.com/rgeo/activerecord-postgis-adapter/blob/master/lib/active_record/connection_adapters/postgis/spatial_column.rb
7
- def initialize(name, default, sql_type_metadata = nil, null = true, table_name = nil,
8
- default_function = nil, collation = nil, comment = nil, cast_type = nil, opts = nil)
7
+ def initialize(name, default, sql_type_metadata = nil, null = true,
8
+ default_function = nil, collation: nil, comment: nil,
9
+ serial: nil, spatial: nil)
9
10
  @sql_type_metadata = sql_type_metadata
10
11
  @geographic = !!(sql_type_metadata.sql_type =~ /geography\(/i)
11
12
 
12
- @cast_type = cast_type
13
- @geographic = !!(sql_type_metadata.sql_type =~ /geography\(/i)
14
- if opts
13
+ if spatial
15
14
  # This case comes from an entry in the geometry_columns table
16
- set_geometric_type_from_name(opts[:type])
17
- @srid = opts[:srid].to_i
18
- @has_z = !!opts[:has_z]
19
- @has_m = !!opts[:has_m]
15
+ set_geometric_type_from_name(spatial[:type])
16
+ @srid = spatial[:srid].to_i
17
+ @has_z = !!spatial[:has_z]
18
+ @has_m = !!spatial[:has_m]
20
19
  elsif @geographic
21
20
  # Geographic type information is embedded in the SQL type
22
21
  @srid = 4326
@@ -29,14 +28,13 @@ module ActiveRecord
29
28
  # @geometric_type = geo_type_from_sql_type(sql_type)
30
29
  build_from_sql_type(sql_type_metadata.sql_type)
31
30
  end
32
- super(name, default, sql_type_metadata, null, table_name, default_function, collation, comment: comment)
33
- if spatial?
34
- if @srid
35
- @limit = { srid: @srid, type: to_type_name(geometric_type) }
36
- @limit[:has_z] = true if @has_z
37
- @limit[:has_m] = true if @has_m
38
- @limit[:geographic] = true if @geographic
39
- end
31
+ super(name, default, sql_type_metadata, null, default_function,
32
+ collation: collation, comment: comment, serial: serial)
33
+ if spatial? && @srid
34
+ @limit = { srid: @srid, type: to_type_name(geometric_type) }
35
+ @limit[:has_z] = true if @has_z
36
+ @limit[:has_m] = true if @has_m
37
+ @limit[:geographic] = true if @geographic
40
38
  end
41
39
  end
42
40
 
@@ -0,0 +1,26 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module CockroachDB
4
+ module OID
5
+ module TypeMapInitializer
6
+ # override
7
+ # Replaces the query with a faster version that doesn't rely on the
8
+ # use of 'array_in(cstring,oid,integer)'::regprocedure.
9
+ def query_conditions_for_initial_load
10
+ known_type_names = @store.keys.map { |n| "'#{n}'" }
11
+ known_type_types = %w('r' 'e' 'd')
12
+ <<~SQL % [known_type_names.join(", "), known_type_types.join(", ")]
13
+ WHERE
14
+ t.typname IN (%s)
15
+ OR t.typtype IN (%s)
16
+ OR (t.typarray = 0 AND t.typcategory='A')
17
+ OR t.typelem != 0
18
+ SQL
19
+ end
20
+ end
21
+
22
+ PostgreSQL::OID::TypeMapInitializer.prepend(TypeMapInitializer)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -20,12 +20,11 @@ module ActiveRecord
20
20
  # but when creating objects, using RGeo features is more convenient than
21
21
  # converting to WKB, so this does it automatically.
22
22
  def _quote(value)
23
- case value
24
- when Numeric
23
+ if value.is_a?(Numeric)
25
24
  "'#{quote_string(value.to_s)}'"
26
- when RGeo::Feature::Geometry
25
+ elsif RGeo::Feature::Geometry.check_type(value)
27
26
  "'#{RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true).generate(value)}'"
28
- when RGeo::Cartesian::BoundingBox
27
+ elsif value.is_a?(RGeo::Cartesian::BoundingBox)
29
28
  "'#{value.min_x},#{value.min_y},#{value.max_x},#{value.max_y}'::box"
30
29
  else
31
30
  super
@@ -39,41 +39,32 @@ module ActiveRecord
39
39
  nil
40
40
  end
41
41
 
42
- def columns(table_name)
43
- # Limit, precision, and scale are all handled by the superclass.
44
- column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod, collation, comment|
45
- oid = oid.to_i
46
- fmod = fmod.to_i
47
- type_metadata = fetch_type_metadata(column_name, type, oid, fmod)
48
- cast_type = get_oid_type(oid.to_i, fmod.to_i, column_name, type)
49
- default_value = extract_value_from_default(default)
50
-
51
- default_function = extract_default_function(default_value, default)
52
- new_column(table_name, column_name, default_value, cast_type, type_metadata, !notnull,
53
- default_function, collation, comment)
54
- end
55
- end
42
+ # override
43
+ # https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L624
44
+ def new_column_from_field(table_name, field)
45
+ column_name, type, default, notnull, oid, fmod, collation, comment = field
46
+ type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
47
+ default_value = extract_value_from_default(default)
48
+ default_function = extract_default_function(default_value, default)
56
49
 
57
- def new_column(table_name, column_name, default, cast_type, sql_type_metadata = nil,
58
- null = true, default_function = nil, collation = nil, comment = nil)
59
- # JDBC gets true/false in Rails 4, where other platforms get 't'/'f' strings.
60
- if null.is_a?(String)
61
- null = (null == "t")
62
- end
50
+ serial =
51
+ if (match = default_function&.match(/\Anextval\('"?(?<sequence_name>.+_(?<suffix>seq\d*))"?'::regclass\)\z/))
52
+ sequence_name_from_parts(table_name, column_name, match[:suffix]) == match[:sequence_name]
53
+ end
63
54
 
64
- column_info = spatial_column_info(table_name).get(column_name, sql_type_metadata.sql_type)
55
+ # {:dimension=>2, :has_m=>false, :has_z=>false, :name=>"latlon", :srid=>0, :type=>"GEOMETRY"}
56
+ spatial = spatial_column_info(table_name).get(column_name, type_metadata.sql_type)
65
57
 
66
- PostgreSQLColumn.new(
58
+ PostgreSQL::Column.new(
67
59
  column_name,
68
- default,
69
- sql_type_metadata,
70
- null,
71
- table_name,
60
+ default_value,
61
+ type_metadata,
62
+ !notnull,
72
63
  default_function,
73
- collation,
74
- comment,
75
- cast_type,
76
- column_info
64
+ collation: collation,
65
+ comment: comment.presence,
66
+ serial: serial,
67
+ spatial: spatial
77
68
  )
78
69
  end
79
70
 
@@ -103,11 +94,36 @@ module ActiveRecord
103
94
  end
104
95
  # The call to super might have appeneded [] already.
105
96
  if array && type != :primary_key && !sql.end_with?("[]")
106
- sql = "#{sql}[]"
97
+ sql = "#{sql}[]"
107
98
  end
108
99
  sql
109
100
  end
110
101
 
102
+ # This overrides the method from PostegreSQL adapter
103
+ # Resets the sequence of a table's primary key to the maximum value.
104
+ def reset_pk_sequence!(table, pk = nil, sequence = nil)
105
+ unless pk && sequence
106
+ default_pk, default_sequence = pk_and_sequence_for(table)
107
+
108
+ pk ||= default_pk
109
+ sequence ||= default_sequence
110
+ end
111
+
112
+ if @logger && pk && !sequence
113
+ @logger.warn "#{table} has primary key #{pk} with no default sequence."
114
+ end
115
+
116
+ if pk && sequence
117
+ quoted_sequence = quote_table_name(sequence)
118
+ max_pk = query_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}", "SCHEMA")
119
+ if max_pk.nil?
120
+ minvalue = query_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass", "SCHEMA")
121
+ end
122
+
123
+ query_value("SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false})", "SCHEMA")
124
+ end
125
+ end
126
+
111
127
  # override
112
128
  def native_database_types
113
129
  # Add spatial types
@@ -127,7 +143,7 @@ module ActiveRecord
127
143
 
128
144
  # override
129
145
  def create_table_definition(*args, **kwargs)
130
- CockroachDB::TableDefinition.new(*args, **kwargs)
146
+ CockroachDB::TableDefinition.new(self, *args, **kwargs)
131
147
  end
132
148
 
133
149
  # memoize hash of column infos for tables
@@ -8,16 +8,22 @@ module ActiveRecord
8
8
  # transactions that fail due to serialization errors. Failed
9
9
  # transactions will be retried until they pass or the max retry limit is
10
10
  # exceeded.
11
- def within_new_transaction(options = {})
12
- attempts = options.fetch(:attempts, 0)
11
+ def within_new_transaction(isolation: nil, joinable: true, attempts: 0)
13
12
  super
14
- rescue ActiveRecord::SerializationFailure => error
13
+ rescue ActiveRecord::StatementInvalid => error
14
+ raise unless retryable? error
15
15
  raise if attempts >= @connection.max_transaction_retries
16
16
 
17
17
  attempts += 1
18
18
  sleep_seconds = (2 ** attempts + rand) / 10
19
19
  sleep(sleep_seconds)
20
- within_new_transaction(options.merge(attempts: attempts)) { yield }
20
+ within_new_transaction(isolation: isolation, joinable: joinable, attempts: attempts) { yield }
21
+ end
22
+
23
+ def retryable?(error)
24
+ return true if error.is_a? ActiveRecord::SerializationFailure
25
+ return retryable? error.cause if error.cause
26
+ false
21
27
  end
22
28
  end
23
29
  end
@@ -13,6 +13,7 @@ require "active_record/connection_adapters/cockroachdb/attribute_methods"
13
13
  require "active_record/connection_adapters/cockroachdb/column"
14
14
  require "active_record/connection_adapters/cockroachdb/spatial_column_info"
15
15
  require "active_record/connection_adapters/cockroachdb/setup"
16
+ require "active_record/connection_adapters/cockroachdb/oid/type_map_initializer"
16
17
  require "active_record/connection_adapters/cockroachdb/oid/spatial"
17
18
  require "active_record/connection_adapters/cockroachdb/arel_tosql"
18
19
 
@@ -36,10 +37,14 @@ module ActiveRecord
36
37
  valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:sslmode, :application_name]
37
38
  conn_params.slice!(*valid_conn_param_keys)
38
39
 
39
- # The postgres drivers don't allow the creation of an unconnected
40
- # PG::Connection object, so just pass a nil connection object for the
41
- # time being.
42
- ConnectionAdapters::CockroachDBAdapter.new(nil, logger, conn_params, config)
40
+ conn = PG.connect(conn_params)
41
+ ConnectionAdapters::CockroachDBAdapter.new(conn, logger, conn_params, config)
42
+ rescue ::PG::Error, ActiveRecord::ActiveRecordError => error
43
+ if error.message.include?("does not exist")
44
+ raise ActiveRecord::NoDatabaseError
45
+ else
46
+ raise
47
+ end
43
48
  end
44
49
  end
45
50
  end
@@ -75,9 +80,11 @@ module ActiveRecord
75
80
  # override
76
81
  # This method makes a sql query to gather information about columns
77
82
  # in a table. It returns an array of arrays (one for each col) and
78
- # is mapped to columns in the SchemaStatements#columns method.
83
+ # passes each to the SchemaStatements#new_column_from_field method
84
+ # as the field parameter. This data is then used to format the column
85
+ # objects for the model and sent to the OID for data casting.
79
86
  #
80
- # The issue with the default method is that the sql_type field is
87
+ # The issue with the default method is that the sql_type field is
81
88
  # retrieved with the `format_type` function, but this is implemented
82
89
  # differently in CockroachDB than PostGIS, so geometry/geography
83
90
  # types are missing information which makes parsing them impossible.
@@ -90,7 +97,7 @@ module ActiveRecord
90
97
  #
91
98
  # The solution is to make the default query with super, then
92
99
  # iterate through the columns and if it is a spatial type,
93
- # access the proper column_type with the information_schema.columns
100
+ # access the proper column_type with the information_schema.columns
94
101
  # table.
95
102
  #
96
103
  # @see: https://github.com/rails/rails/blob/8695b028261bdd244e254993255c6641bdbc17a5/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L829
@@ -171,11 +178,6 @@ module ActiveRecord
171
178
  false
172
179
  end
173
180
 
174
- def supports_ranges?
175
- # See cockroachdb/cockroach#17022
176
- false
177
- end
178
-
179
181
  def supports_materialized_views?
180
182
  false
181
183
  end
@@ -216,6 +218,10 @@ module ActiveRecord
216
218
  @crdb_version >= 202
217
219
  end
218
220
 
221
+ def supports_partitioned_indexes?
222
+ false
223
+ end
224
+
219
225
  # This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
220
226
  # migration from PostgreSQL to CockroachDB. In practice, this limitation
221
227
  # is arbitrary since CockroachDB supports index name lengths and table alias
@@ -249,7 +255,13 @@ module ActiveRecord
249
255
  end
250
256
  @crdb_version = version_num
251
257
  end
252
-
258
+
259
+ def self.database_exists?(config)
260
+ !!ActiveRecord::Base.cockroachdb_connection(config)
261
+ rescue ActiveRecord::NoDatabaseError
262
+ false
263
+ end
264
+
253
265
  private
254
266
 
255
267
  def initialize_type_map(m = type_map)
@@ -391,6 +403,100 @@ module ActiveRecord
391
403
  return "{}"
392
404
  end
393
405
 
406
+ # override
407
+ # This method loads info about data types from the database to
408
+ # populate the TypeMap.
409
+ #
410
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
411
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
412
+ def load_additional_types(oids = nil)
413
+ if @config[:use_follower_reads_for_type_introspection]
414
+ initializer = OID::TypeMapInitializer.new(type_map)
415
+
416
+ query = <<~SQL
417
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
418
+ FROM pg_type as t
419
+ LEFT JOIN pg_range as r ON oid = rngtypid AS OF SYSTEM TIME '-10s'
420
+ SQL
421
+
422
+ if oids
423
+ query += "WHERE t.oid IN (%s)" % oids.join(", ")
424
+ else
425
+ query += initializer.query_conditions_for_initial_load
426
+ end
427
+
428
+ execute_and_clear(query, "SCHEMA", []) do |records|
429
+ initializer.run(records)
430
+ end
431
+ else
432
+ super
433
+ end
434
+ rescue ActiveRecord::StatementInvalid => e
435
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
436
+ # use original if database is younger than 10s
437
+ super
438
+ end
439
+
440
+ # override
441
+ # This method maps data types to their proper decoder.
442
+ #
443
+ # Currently, querying from the pg_type catalog can be slow due to geo-partitioning
444
+ # so this modified query uses AS OF SYSTEM TIME '-10s' to read historical data.
445
+ def add_pg_decoders
446
+ if @config[:use_follower_reads_for_type_introspection]
447
+ @default_timezone = nil
448
+ @timestamp_decoder = nil
449
+
450
+ coders_by_name = {
451
+ "int2" => PG::TextDecoder::Integer,
452
+ "int4" => PG::TextDecoder::Integer,
453
+ "int8" => PG::TextDecoder::Integer,
454
+ "oid" => PG::TextDecoder::Integer,
455
+ "float4" => PG::TextDecoder::Float,
456
+ "float8" => PG::TextDecoder::Float,
457
+ "numeric" => PG::TextDecoder::Numeric,
458
+ "bool" => PG::TextDecoder::Boolean,
459
+ "timestamp" => PG::TextDecoder::TimestampUtc,
460
+ "timestamptz" => PG::TextDecoder::TimestampWithTimeZone,
461
+ }
462
+
463
+ known_coder_types = coders_by_name.keys.map { |n| quote(n) }
464
+ query = <<~SQL % known_coder_types.join(", ")
465
+ SELECT t.oid, t.typname
466
+ FROM pg_type as t AS OF SYSTEM TIME '-10s'
467
+ WHERE t.typname IN (%s)
468
+ SQL
469
+
470
+ coders = execute_and_clear(query, "SCHEMA", []) do |result|
471
+ result
472
+ .map { |row| construct_coder(row, coders_by_name[row["typname"]]) }
473
+ .compact
474
+ end
475
+
476
+ map = PG::TypeMapByOid.new
477
+ coders.each { |coder| map.add_coder(coder) }
478
+ @connection.type_map_for_results = map
479
+
480
+ @type_map_for_results = PG::TypeMapByOid.new
481
+ @type_map_for_results.default_type_map = map
482
+ @type_map_for_results.add_coder(PG::TextDecoder::Bytea.new(oid: 17, name: "bytea"))
483
+
484
+ # extract timestamp decoder for use in update_typemap_for_default_timezone
485
+ @timestamp_decoder = coders.find { |coder| coder.name == "timestamp" }
486
+ update_typemap_for_default_timezone
487
+ else
488
+ super
489
+ end
490
+ rescue ActiveRecord::StatementInvalid => e
491
+ raise e unless e.cause.is_a? PG::InvalidCatalogName
492
+ # use original if database is younger than 10s
493
+ super
494
+ end
495
+
496
+ def arel_visitor
497
+ Arel::Visitors::CockroachDB.new(self)
498
+ end
499
+
394
500
  # end private
395
501
  end
396
502
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-cockroachdb-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.2
4
+ version: 6.0.0.pre.beta.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cockroach Labs
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-13 00:00:00.000000000 Z
11
+ date: 2021-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.2'
19
+ version: 6.0.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.2'
26
+ version: 6.0.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pg
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -62,6 +62,7 @@ extra_rdoc_files: []
62
62
  files:
63
63
  - ".gitignore"
64
64
  - ".gitmodules"
65
+ - CHANGELOG.md
65
66
  - CONTRIBUTING.md
66
67
  - Gemfile
67
68
  - LICENSE
@@ -82,6 +83,7 @@ files:
82
83
  - lib/active_record/connection_adapters/cockroachdb/database_statements.rb
83
84
  - lib/active_record/connection_adapters/cockroachdb/database_tasks.rb
84
85
  - lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
86
+ - lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb
85
87
  - lib/active_record/connection_adapters/cockroachdb/quoting.rb
86
88
  - lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb
87
89
  - lib/active_record/connection_adapters/cockroachdb/schema_statements.rb
@@ -97,7 +99,7 @@ licenses:
97
99
  - Apache-2.0
98
100
  metadata:
99
101
  allowed_push_host: https://rubygems.org
100
- post_install_message:
102
+ post_install_message:
101
103
  rdoc_options: []
102
104
  require_paths:
103
105
  - lib
@@ -108,12 +110,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
110
  version: '0'
109
111
  required_rubygems_version: !ruby/object:Gem::Requirement
110
112
  requirements:
111
- - - ">="
113
+ - - ">"
112
114
  - !ruby/object:Gem::Version
113
- version: '0'
115
+ version: 1.3.1
114
116
  requirements: []
115
- rubygems_version: 3.0.3
116
- signing_key:
117
+ rubygems_version: 3.1.4
118
+ signing_key:
117
119
  specification_version: 4
118
120
  summary: CockroachDB adapter for ActiveRecord.
119
121
  test_files: []