activerecord-cockroachdb-adapter 6.1.11 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -2
- data/Gemfile +6 -4
- data/README.md +4 -2
- data/activerecord-cockroachdb-adapter.gemspec +3 -1
- data/build/teamcity-test.sh +4 -9
- data/lib/active_record/connection_adapters/cockroachdb/database_statements.rb +2 -1
- data/lib/active_record/connection_adapters/cockroachdb/database_tasks.rb +1 -37
- data/lib/active_record/connection_adapters/cockroachdb/oid/date_time.rb +21 -0
- data/lib/active_record/connection_adapters/cockroachdb/quoting.rb +1 -3
- data/lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb +23 -9
- data/lib/active_record/connection_adapters/cockroachdb_adapter.rb +24 -3
- data/lib/active_record/migration/cockroachdb/compatibility.rb +28 -0
- data/lib/version.rb +1 -1
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8f39021d1353c56c2830adac978ec3336f993bdb46e670f4c975be8d2c307c5
|
4
|
+
data.tar.gz: 8ea587bc12a5e5bc806901d28c7e67e9f63a0c2f5dfc769f2370ab4dd3f20c65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c7fca690e7203047ffeac709b9a62165c96f3ccb7ec26f3fe412daffc979f62ec392117912e15af15865aacf9f2b09bf2ff4d2efc155ee1f3dcbef1b2a213bb
|
7
|
+
data.tar.gz: 55cf42b3a055eabbec2045dac6650d50a96a085794dc2ef6bbb08efb44182daff7664720292f720099c3b08239edafbe1ae668779aa975426d9d8905fe98620b
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -54,10 +54,12 @@ end
|
|
54
54
|
|
55
55
|
group :development do
|
56
56
|
gem "byebug"
|
57
|
-
gem "minitest-excludes"
|
57
|
+
gem "minitest-excludes", "~> 2.0.1"
|
58
58
|
|
59
59
|
# Gems used by the ActiveRecord test suite
|
60
|
-
gem "bcrypt"
|
61
|
-
gem "mocha"
|
62
|
-
gem "sqlite3"
|
60
|
+
gem "bcrypt", "~> 3.1.18"
|
61
|
+
gem "mocha", "~> 1.14.0"
|
62
|
+
gem "sqlite3", "~> 1.4.4"
|
63
|
+
|
64
|
+
gem "minitest", "~> 5.15.0"
|
63
65
|
end
|
data/README.md
CHANGED
@@ -1,19 +1,21 @@
|
|
1
1
|
# ActiveRecord CockroachDB Adapter
|
2
2
|
|
3
|
-
CockroachDB adapter for ActiveRecord 5 and
|
3
|
+
CockroachDB adapter for ActiveRecord 5, 6, and 7. This is a lightweight extension of the PostgreSQL adapter that establishes compatibility with [CockroachDB](https://github.com/cockroachdb/cockroach).
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
Add this line to your project's Gemfile:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem 'activerecord-cockroachdb-adapter', '~>
|
10
|
+
gem 'activerecord-cockroachdb-adapter', '~> 7.0.0'
|
11
11
|
```
|
12
12
|
|
13
13
|
If you're using Rails 5.2, use the `5.2.x` versions of this gem.
|
14
14
|
|
15
15
|
If you're using Rails 6.0, use the `6.0.x` versions of this gem.
|
16
16
|
|
17
|
+
If you're using Rails 7.0, use the `7.0.x` versions of this gem.
|
18
|
+
|
17
19
|
In `database.yml`, use the following adapter setting:
|
18
20
|
|
19
21
|
```
|
@@ -17,10 +17,12 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.description = "Allows the use of CockroachDB as a backend for ActiveRecord and Rails apps."
|
18
18
|
spec.homepage = "https://github.com/cockroachdb/activerecord-cockroachdb-adapter"
|
19
19
|
|
20
|
-
spec.add_dependency "activerecord", "~>
|
20
|
+
spec.add_dependency "activerecord", "~> 7.0.3"
|
21
21
|
spec.add_dependency "pg", "~> 1.2"
|
22
22
|
spec.add_dependency "rgeo-activerecord", "~> 7.0.0"
|
23
23
|
|
24
|
+
spec.add_development_dependency "benchmark-ips", "~> 2.9.1"
|
25
|
+
|
24
26
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
25
27
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
26
28
|
if spec.respond_to?(:metadata)
|
data/build/teamcity-test.sh
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
set -euox pipefail
|
4
4
|
|
5
5
|
# Download CockroachDB
|
6
|
-
VERSION=
|
6
|
+
VERSION=v22.1.0
|
7
7
|
wget -qO- https://binaries.cockroachdb.com/cockroach-$VERSION.linux-amd64.tgz | tar xvz
|
8
8
|
readonly COCKROACH=./cockroach-$VERSION.linux-amd64/cockroach
|
9
9
|
|
@@ -35,6 +35,8 @@ run_cockroach() {
|
|
35
35
|
cockroach sql --insecure -e 'CREATE DATABASE activerecord_unittest2;'
|
36
36
|
cockroach sql --insecure -e 'SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;'
|
37
37
|
cockroach sql --insecure -e 'SET CLUSTER SETTING sql.stats.histogram_collection.enabled = false;'
|
38
|
+
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.retention_time = '180s';"
|
39
|
+
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.experimental_alter_column_type.enabled = 'true'"
|
38
40
|
|
39
41
|
cockroach sql --insecure -e "ALTER RANGE default CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;"
|
40
42
|
cockroach sql --insecure -e "ALTER TABLE system.public.jobs CONFIGURE ZONE USING num_replicas = 1, gc.ttlseconds = 30;"
|
@@ -46,21 +48,14 @@ run_cockroach() {
|
|
46
48
|
cockroach sql --insecure -e "SET CLUSTER SETTING kv.raft_log.disable_synchronization_unsafe = 'true'"
|
47
49
|
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.registry.interval.cancel = '180s';"
|
48
50
|
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.registry.interval.gc = '30s';"
|
49
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING jobs.retention_time = '15s';"
|
50
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.stats.automatic_collection.enabled = false;"
|
51
51
|
cockroach sql --insecure -e "SET CLUSTER SETTING kv.range_split.by_load_merge_delay = '5s';"
|
52
52
|
|
53
|
-
# Enable when we test with v22.1.
|
54
|
-
# cockroach sql --insecure -e "SET CLUSTER SETTING sql.catalog.unsafe_skip_system_config_trigger.enabled = true;"
|
55
|
-
|
56
53
|
# Enable experimental features.
|
57
54
|
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.experimental_temporary_tables.enabled = 'true';"
|
58
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.datestyle.enabled = true"
|
59
|
-
cockroach sql --insecure -e "SET CLUSTER SETTING sql.defaults.intervalstyle.enabled = true;"
|
60
55
|
}
|
61
56
|
|
62
57
|
# Install ruby dependencies.
|
63
|
-
gem install bundler:2.
|
58
|
+
gem install bundler:2.3.14
|
64
59
|
bundle install
|
65
60
|
|
66
61
|
run_cockroach
|
@@ -5,43 +5,7 @@ module ActiveRecord
|
|
5
5
|
module CockroachDB
|
6
6
|
class DatabaseTasks < ActiveRecord::Tasks::PostgreSQLDatabaseTasks
|
7
7
|
def structure_dump(filename, extra_flags=nil)
|
8
|
-
|
9
|
-
raise "No flag supported yet, please raise an issue if needed. " \
|
10
|
-
"https://github.com/cockroachdb/activerecord-cockroachdb-adapter/issues/new"
|
11
|
-
end
|
12
|
-
|
13
|
-
case ActiveRecord::Base.dump_schemas
|
14
|
-
when :all, String
|
15
|
-
raise "Custom schemas are not supported in CockroachDB. " \
|
16
|
-
"See https://github.com/cockroachdb/cockroach/issues/26443."
|
17
|
-
when :schema_search_path
|
18
|
-
if configuration_hash[:schema_search_path]
|
19
|
-
raise "Custom schemas are not supported in CockroachDB. " \
|
20
|
-
"See https://github.com/cockroachdb/cockroach/issues/26443."
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
conn = ActiveRecord::Base.connection
|
25
|
-
File.open(filename, "w") do |file|
|
26
|
-
%w(SCHEMAS TYPES).each do |object_kind|
|
27
|
-
ActiveRecord::Base.connection.execute("SHOW CREATE ALL #{object_kind}").each_row { file.puts _1 }
|
28
|
-
end
|
29
|
-
|
30
|
-
ignore_tables = ActiveRecord::SchemaDumper.ignore_tables.to_set
|
31
|
-
|
32
|
-
conn.execute("SHOW CREATE ALL TABLES").each_row do |(sql)|
|
33
|
-
if sql.start_with?("CREATE")
|
34
|
-
table_name = sql[/CREATE TABLE (?:.*?\.)?\"?(.*?)[\" ]/, 1]
|
35
|
-
next if ignore_tables.member?(table_name)
|
36
|
-
elsif sql.start_with?("ALTER")
|
37
|
-
table_name = sql[/ALTER TABLE (?:.*?\.)?\"?(.*?)[\" ]/, 1]
|
38
|
-
ref_table_name = sql[/REFERENCES (?:.*?\.)?\"?(.*?)[\" ]/, 1]
|
39
|
-
next if ignore_tables.member?(table_name) || ignore_tables.member?(ref_table_name)
|
40
|
-
end
|
41
|
-
|
42
|
-
file.puts sql
|
43
|
-
end
|
44
|
-
end
|
8
|
+
raise "db:structure:dump is unimplemented. See https://github.com/cockroachdb/activerecord-cockroachdb-adapter/issues/2"
|
45
9
|
end
|
46
10
|
|
47
11
|
def structure_load(filename, extra_flags=nil)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module CockroachDB
|
6
|
+
module OID
|
7
|
+
module DateTime
|
8
|
+
protected
|
9
|
+
|
10
|
+
# override
|
11
|
+
# Uses CockroachDBAdapter instead of PostgreSQLAdapter
|
12
|
+
def real_type_unless_aliased(real_type)
|
13
|
+
ActiveRecord::ConnectionAdapters::CockroachDBAdapter.datetime_type == real_type ? :datetime : real_type
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
PostgreSQL::OID::DateTime.prepend(DateTime)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -2,8 +2,6 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
3
3
|
module CockroachDB
|
4
4
|
module Quoting
|
5
|
-
private
|
6
|
-
|
7
5
|
# CockroachDB does not allow inserting integer values into string
|
8
6
|
# columns, but ActiveRecord expects this to work. CockroachDB will
|
9
7
|
# however allow inserting string values into integer columns. It will
|
@@ -19,7 +17,7 @@ module ActiveRecord
|
|
19
17
|
# (https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary)
|
20
18
|
# but when creating objects, using RGeo features is more convenient than
|
21
19
|
# converting to WKB, so this does it automatically.
|
22
|
-
def
|
20
|
+
def quote(value)
|
23
21
|
if value.is_a?(Numeric)
|
24
22
|
"'#{quote_string(value.to_s)}'"
|
25
23
|
elsif RGeo::Feature::Geometry.check_type(value)
|
@@ -20,17 +20,31 @@ module ActiveRecord
|
|
20
20
|
|
21
21
|
yield
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
# Prefixes and suffixes are added in add_foreign_key
|
24
|
+
# in AR7+ so we need to temporarily disable them here,
|
25
|
+
# otherwise prefixes/suffixes will be erroneously added.
|
26
|
+
old_prefix = ActiveRecord::Base.table_name_prefix
|
27
|
+
old_suffix = ActiveRecord::Base.table_name_suffix
|
28
|
+
|
29
|
+
ActiveRecord::Base.table_name_prefix = ""
|
30
|
+
ActiveRecord::Base.table_name_suffix = ""
|
31
|
+
|
32
|
+
begin
|
33
|
+
foreign_keys.each do |foreign_key|
|
34
|
+
begin
|
35
|
+
add_foreign_key(foreign_key.from_table, foreign_key.to_table, **foreign_key.options)
|
36
|
+
rescue ActiveRecord::StatementInvalid => error
|
37
|
+
if error.cause.class == PG::DuplicateObject
|
38
|
+
# This error is safe to ignore because the yielded caller
|
39
|
+
# already re-added the foreign key constraint.
|
40
|
+
else
|
41
|
+
raise error
|
42
|
+
end
|
32
43
|
end
|
33
44
|
end
|
45
|
+
ensure
|
46
|
+
ActiveRecord::Base.table_name_prefix = old_prefix
|
47
|
+
ActiveRecord::Base.table_name_suffix = old_suffix
|
34
48
|
end
|
35
49
|
end
|
36
50
|
end
|
@@ -18,7 +18,9 @@ require "active_record/connection_adapters/cockroachdb/setup"
|
|
18
18
|
require "active_record/connection_adapters/cockroachdb/oid/type_map_initializer"
|
19
19
|
require "active_record/connection_adapters/cockroachdb/oid/spatial"
|
20
20
|
require "active_record/connection_adapters/cockroachdb/oid/interval"
|
21
|
+
require "active_record/connection_adapters/cockroachdb/oid/date_time"
|
21
22
|
require "active_record/connection_adapters/cockroachdb/arel_tosql"
|
23
|
+
require_relative "../migration/cockroachdb/compatibility"
|
22
24
|
require_relative "../../version"
|
23
25
|
|
24
26
|
# Run to ignore spatial tables that will break schemna dumper.
|
@@ -215,6 +217,10 @@ module ActiveRecord
|
|
215
217
|
false
|
216
218
|
end
|
217
219
|
|
220
|
+
def supports_deferrable_constraints?
|
221
|
+
false
|
222
|
+
end
|
223
|
+
|
218
224
|
# This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
|
219
225
|
# migration from PostgreSQL to CockroachDB. In practice, this limitation
|
220
226
|
# is arbitrary since CockroachDB supports index name lengths and table alias
|
@@ -293,8 +299,20 @@ module ActiveRecord
|
|
293
299
|
false
|
294
300
|
end
|
295
301
|
|
296
|
-
|
302
|
+
# override
|
303
|
+
# The PostgreSQLAdapter uses syntax for an anonymous function
|
304
|
+
# (DO $$) that CockroachDB does not support.
|
305
|
+
#
|
306
|
+
# Given a name and an array of values, creates an enum type.
|
307
|
+
def create_enum(name, values)
|
308
|
+
sql_values = values.map { |s| "'#{s}'" }.join(", ")
|
309
|
+
query = <<~SQL
|
310
|
+
CREATE TYPE IF NOT EXISTS \"#{name}\" AS ENUM (#{sql_values});
|
311
|
+
SQL
|
312
|
+
exec_query(query)
|
313
|
+
end
|
297
314
|
|
315
|
+
class << self
|
298
316
|
def initialize_type_map(m = type_map)
|
299
317
|
%w(
|
300
318
|
geography
|
@@ -341,10 +359,13 @@ module ActiveRecord
|
|
341
359
|
# lookups on PG
|
342
360
|
Type::DecimalWithoutScale.new(precision: precision)
|
343
361
|
else
|
344
|
-
OID::Decimal.new(precision: precision, scale: scale)
|
362
|
+
ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Decimal.new(precision: precision, scale: scale)
|
345
363
|
end
|
346
364
|
end
|
347
365
|
end
|
366
|
+
end
|
367
|
+
|
368
|
+
private
|
348
369
|
|
349
370
|
# Configures the encoding, verbosity, schema search path, and time zone of the connection.
|
350
371
|
# This is called by #connect and should not be called manually.
|
@@ -366,7 +387,7 @@ module ActiveRecord
|
|
366
387
|
# If using Active Record's time zone support configure the connection to return
|
367
388
|
# TIMESTAMP WITH ZONE types in UTC.
|
368
389
|
unless variables["timezone"]
|
369
|
-
if ActiveRecord
|
390
|
+
if ActiveRecord.default_timezone == :utc
|
370
391
|
variables["timezone"] = "UTC"
|
371
392
|
elsif @local_tz
|
372
393
|
variables["timezone"] = @local_tz
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "active_record/migration"
|
2
|
+
require "active_record/migration/compatibility"
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
class Migration
|
6
|
+
module CockroachDB
|
7
|
+
module Compatibility
|
8
|
+
module V7_0Patch
|
9
|
+
# Override. Use "CockroachDB" instead of "PostgreSQL"
|
10
|
+
def compatible_timestamp_type(type, connection)
|
11
|
+
if connection.adapter_name == "CockroachDB"
|
12
|
+
# For Rails <= 6.1, :datetime was aliased to :timestamp
|
13
|
+
# See: https://github.com/rails/rails/blob/v6.1.3.2/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L108
|
14
|
+
# From Rails 7 onwards, you can define what :datetime resolves to (the default is still :timestamp)
|
15
|
+
# See `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type`
|
16
|
+
type.to_sym == :datetime ? :timestamp : type
|
17
|
+
else
|
18
|
+
type
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
prepend_mod = ActiveRecord::Migration::CockroachDB::Compatibility::V7_0Patch
|
28
|
+
ActiveRecord::Migration::Compatibility::V6_1::PostgreSQLCompat.singleton_class.prepend(prepend_mod)
|
data/lib/version.rb
CHANGED
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:
|
4
|
+
version: 7.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cockroach Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-06 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:
|
19
|
+
version: 7.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:
|
26
|
+
version: 7.0.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pg
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 7.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: benchmark-ips
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.9.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.9.1
|
55
69
|
description: Allows the use of CockroachDB as a backend for ActiveRecord and Rails
|
56
70
|
apps.
|
57
71
|
email:
|
@@ -82,6 +96,7 @@ files:
|
|
82
96
|
- lib/active_record/connection_adapters/cockroachdb/column_methods.rb
|
83
97
|
- lib/active_record/connection_adapters/cockroachdb/database_statements.rb
|
84
98
|
- lib/active_record/connection_adapters/cockroachdb/database_tasks.rb
|
99
|
+
- lib/active_record/connection_adapters/cockroachdb/oid/date_time.rb
|
85
100
|
- lib/active_record/connection_adapters/cockroachdb/oid/interval.rb
|
86
101
|
- lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
|
87
102
|
- lib/active_record/connection_adapters/cockroachdb/oid/type_map_initializer.rb
|
@@ -96,6 +111,7 @@ files:
|
|
96
111
|
- lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb
|
97
112
|
- lib/active_record/connection_adapters/cockroachdb/type.rb
|
98
113
|
- lib/active_record/connection_adapters/cockroachdb_adapter.rb
|
114
|
+
- lib/active_record/migration/cockroachdb/compatibility.rb
|
99
115
|
- lib/activerecord-cockroachdb-adapter.rb
|
100
116
|
- lib/version.rb
|
101
117
|
homepage: https://github.com/cockroachdb/activerecord-cockroachdb-adapter
|
@@ -118,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
134
|
- !ruby/object:Gem::Version
|
119
135
|
version: '0'
|
120
136
|
requirements: []
|
121
|
-
rubygems_version: 3.
|
137
|
+
rubygems_version: 3.1.6
|
122
138
|
signing_key:
|
123
139
|
specification_version: 4
|
124
140
|
summary: CockroachDB adapter for ActiveRecord.
|