activerecord-cockroachdb-adapter 6.0.0.pre.beta.4 → 6.0.0.pre.beta.5
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +6 -0
- data/activerecord-cockroachdb-adapter.gemspec +1 -1
- data/lib/active_record/connection_adapters/cockroachdb_adapter.rb +98 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e242232ac6fcfc87b6bddc17eeb852099a959d3a024064ed3a32e85bd80ad786
|
4
|
+
data.tar.gz: 5ab114df9f5fee7fb5c18c5cf0eb0dfdc822f7513f19d79312f65e0b55e1e459
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2de1e036b53ebeb11185eaeb10bd465f9a1103a34307354bc4bbbe94b8beb4c5a2313938e01703db8b68f5a689ee6b9b778b8282bceac3bb852b6569340351b
|
7
|
+
data.tar.gz: 4138ea2ccad0bac070c277adb9ec4aa837be440900f72fe8f2728bac78d58a96d96ed7df9a830841b3389e5f51678dba9377e0598b3aa96d682d36c609dcedfb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Changelog
|
2
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
|
+
|
3
9
|
## 6.0.0-beta.4 - 2021-03-06
|
4
10
|
|
5
11
|
- Improved connection performance by refactoring an introspection
|
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 = "6.0.0-beta.
|
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"]
|
@@ -218,6 +218,10 @@ module ActiveRecord
|
|
218
218
|
@crdb_version >= 202
|
219
219
|
end
|
220
220
|
|
221
|
+
def supports_partitioned_indexes?
|
222
|
+
false
|
223
|
+
end
|
224
|
+
|
221
225
|
# This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
|
222
226
|
# migration from PostgreSQL to CockroachDB. In practice, this limitation
|
223
227
|
# is arbitrary since CockroachDB supports index name lengths and table alias
|
@@ -399,6 +403,100 @@ module ActiveRecord
|
|
399
403
|
return "{}"
|
400
404
|
end
|
401
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
|
+
|
402
500
|
# end private
|
403
501
|
end
|
404
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: 6.0.0.pre.beta.
|
4
|
+
version: 6.0.0.pre.beta.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cockroach Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|