activerecord-cockroachdb-adapter 0.2.2 → 0.2.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c39398a79fef87dc0b0cde4cf0558ca1820005a5
4
- data.tar.gz: e18cf876bd4be4886a9429b55c5a82704c80d957
3
+ metadata.gz: 96a284c08e5798cc8b45332be543b14f60bdb8c0
4
+ data.tar.gz: ffa757e8b581788ba8d1880842d37eca7058695e
5
5
  SHA512:
6
- metadata.gz: 60bcfd758fad44e6f3922896301f2c750d53b310879d525b8f70274838a1639a722614a2b9ad5e6f2db2e9e429b0c2b1f80adfd9d3c69473e00b4c6b8dad481c
7
- data.tar.gz: 3ef108048920f4708465cebda053a2681420bf77da6b0a7ab036ff6a3f1c42060620d6c53bb21a4df9384e6b4f0ee2f0b0a14fadfef57e884c25bc1fb86d21b9
6
+ metadata.gz: 456d42bc6a8a973488a6c66a9631d8e78f7e4a35abb379b3958239b6fb474bce9a3503678be6a098d788bb09425c02d30732fb1ee546b3d4c2b8cb21b3a7fe57
7
+ data.tar.gz: 40ada5999c613d6d2f953ce7fc99b9fbb3793685d258fe9cef790e2421df96d218ee3684081a499571ed38cc129be6e65de6a87328d57297fdd62323430c61c6
@@ -0,0 +1,3 @@
1
+ [submodule "rails"]
2
+ path = rails
3
+ url = https://github.com/lego/ruby-on-rails.git
@@ -0,0 +1,248 @@
1
+ # Getting started
2
+
3
+
4
+ ## ActiveRecord adapters and you
5
+
6
+ There are two repositories for the ActiveRecord adapter. The one you're in
7
+ currently, [activerecord-cockroachdb-adapter], is the CockroachDB specific
8
+ ActiveRecord code. Users install this alongside ActiveRecord then use
9
+ CockroachDBAdapter to initialize ActiveRecord for their projects.
10
+
11
+ This adapter extends the PostgreSQL ActiveRecord adapter in order to
12
+ override and monkey-patch functionality.
13
+
14
+ The other repository is a fork of [Rails]. The tests have been modified
15
+ for the purposes of testing our CockroachDB adapter.
16
+
17
+ [activerecord-cockroachdb-adapter]: https://github.com/cockroachdb/activerecord-cockroachdb-adapter/
18
+ [Rails]: https://github.com/lego/ruby-on-rails
19
+
20
+
21
+ ## Setup and running tests
22
+
23
+ It is best to have a Ruby environment manager installed, such as
24
+ [rvm](https://rvm.io/), as Rails has varying Ruby version requirements.
25
+ If you are using rvm, you then install and use the required Ruby
26
+ version. The current tests use Rails 5.2.0 beta and Ruby >= 2.2.2.
27
+
28
+ (Alternatively, one can use `./docker.sh build/teamcity-test.sh` to run
29
+ tests similarily to TeamCity. The database is destroyed between each
30
+ test file.)
31
+
32
+
33
+ ```bash
34
+ rvm install 2.2.5
35
+ # This only makes Ruby 2.2.5 active for the length of the terminal session.
36
+ rvm use 2.2.5
37
+ ```
38
+
39
+ Using [bundler](http://bundler.io/), install the dependancies of Rails.
40
+ Additionally, make sure the Rails git submodule is loaded.
41
+
42
+ ```bash
43
+ # Ensure the rails fork is fetched.
44
+ git submodule update
45
+ # Install rails dependancies.
46
+ (cd rails && bundle install)
47
+ ```
48
+
49
+ Then, to run the test with an active CockroachDB instance:
50
+
51
+ ```bash
52
+ cp build/config.teamcity.yml rails/activerecord/test/config.yml
53
+ (cd rails/activerecord && BUNDLE_GEMFILE=../Gemfile bundle exec rake db:cockroachdb:rebuild)
54
+ (cd rails/activerecord && BUNDLE_GEMFILE=../Gemfile bundle exec rake test:cockroachdb)
55
+ ```
56
+
57
+ ### Test commands in detail
58
+
59
+ ```bash
60
+ cp build/config.teamcity.yml rails/activerecord/test/config.yml
61
+ ```
62
+
63
+ This copies the TeamCity ActiveRecord configuration for the application.
64
+ This configuration specifies:
65
+
66
+ - CockroachDB port and host the test suite uses.
67
+ - Database names used for the different test connections. (ActiveRecord
68
+ uses two separate connections for some tests.)
69
+
70
+ ```
71
+ (cd rails/activerecord && BUNDLE_GEMFILE=../Gemfile bundle exec rake db:cockroachdb:rebuild)
72
+ ```
73
+
74
+ This prepares CockroachDB for running tests. It only drops and
75
+ re-creates all of the databases needed.
76
+
77
+ - This command needs to be run from activerecord folder in order to use
78
+ the ActiveRecord `Rakefile`. The `Rakefile` defines scripts (called
79
+ tasks) such as executing tests.
80
+ - `BUNDLE_GEMFILE=../Gemfile` tells `bundle` to use the dependancies for
81
+ Rails that were previously installed.
82
+ - `bundle exec rake` uses `bundle` to execute the Ruby package `rake`.
83
+ - `rake db:cockroachdb:rebuild` runs the specified Rake task. All tasks
84
+ can be found in `rails/activerecord/Rakefile`.
85
+
86
+
87
+ ```
88
+ (cd rails/activerecord && BUNDLE_GEMFILE=../Gemfile bundle exec rake test:cockroachdb)
89
+ ```
90
+
91
+ This executes the CockroachDB tests.
92
+
93
+ - Like the previous command, this one uses the Activerecord Rakefile and
94
+ the Rails Gemfile. The task code can be found in the Rakefile.
95
+ - Running specific test files can be done by appending
96
+ `TESTFILES=test/cases/attribute_methods.rb` to the command. Globs are
97
+ used. Multiple individual files cannot be specified.
98
+
99
+
100
+ # Improvements
101
+
102
+
103
+ ## Support past Rails versions
104
+
105
+ Currently, only a beta version of Rails is tested. This means that the
106
+ adapter has been modified in to accomodate unreleased changes. In order
107
+ to run the tests for Rails 5.1 or 4.2, the test changes will need to be
108
+ cherry-picked back. Conflicts are mostly only expected for tests that
109
+ have not yet been added.
110
+
111
+ Sadly, this does mean that we will have to have multiple versions of the
112
+ driver for the multiple versions of Rails.
113
+
114
+ A proposal for the CockroachDB adapter versioning would be to follow
115
+ ActiveRecord minor versions. For example, if you use Rails 4.2.5, you
116
+ would specify the CockroachDB version `~> 4.2.0`.
117
+
118
+
119
+ ## Running CI automatically
120
+
121
+ Currently the fork is set up to run using TeamCity only on the current
122
+ master branch, with an alpha build of CockroachDB. it would be even
123
+ better to be able to test multiple versions of the adapter, and do so
124
+ against different versions of CockroachDB.
125
+
126
+
127
+ ## Adding feature support
128
+
129
+ As CockroachDB improves, so do the features that can be supported in
130
+ ActiveRecord. Many of them are gated by conditions the
131
+ CockroachDBAdapter has overrided. As these features are completed, these
132
+ gates should be toggled. Something that would help this process would be
133
+ linking those issues back to this adapter so that part of the feature
134
+ completing includes updating the adapter.
135
+
136
+
137
+ ## Execute only tests that run with a connection
138
+
139
+ I have not investigated if this is already possible, but I would assume
140
+ no.
141
+
142
+ A possible way to approach this would be to add a shim to cause any
143
+ tests that use it to fail, and grep the tests that pass and then skip
144
+ them.
145
+
146
+ # Cleanup
147
+
148
+ One of the earlier commits to the Rails repo did a big grep of
149
+ `PostgreSQLAdapter` -> `CockroachDBAdapter`. In order to better support
150
+ changes upstream, this modification should be changed to instead only
151
+ add `CockroachDBAdapter` alongside any `PostgreSQLAdapter`. The later
152
+ test cleanup commit will conflict on any further changes (like adding
153
+ back PostgreSQL, or removing CockroachDB for PostgreSQL).
154
+
155
+ ## Publishing to Rubygems
156
+
157
+ TODO: Expand on this. Jordan is likely the only person with publishing
158
+ credentials. I'm not sure if there is anything else other than:
159
+
160
+ ```
161
+ gem build ...
162
+ gem publish <output file>
163
+ ```
164
+
165
+
166
+ # Notes
167
+
168
+ When executing the test suite, each test file will reload fixtures. This
169
+ drops and creates about 200 tables (2 databases, 100 tables each).
170
+ Currently there are performance problems that rise from having lots of
171
+ table descriptors around, [cockroachdb/cockroach#20753]. At best, we can
172
+ run test files individually, clear out the CockroachDB data, and restart
173
+ the node to alleviate this.
174
+
175
+ Currently, annotations have been added to test files to indicate if it
176
+ is failing, and some brief details on why. Any annotated failures have
177
+ been skipped right now for further investigation. The pattern is the
178
+ following:
179
+
180
+ `# FILE(OK)` indicates that the file is currently passing, with no skips
181
+ required.
182
+
183
+ `# FILE(BAD)` indicates that there are failures that have been skipped.
184
+ These skips will look like `skip(reason) if current_adapter?(:CockroachDBAdapter)`.
185
+
186
+ `# FILE(BROKEN)` indicates that there are failures that have not been
187
+ skipped. This is often done if the entirety of a test file is
188
+ unsupported.
189
+
190
+ `# FILE(NOT DONE)` indicates files that have not yet been executed,
191
+ cleaned up, or skipped until passing.
192
+
193
+ The purpose of these was to make the tests grep-able while going through
194
+ all the failures.
195
+
196
+
197
+ [cockroachdb/cockroach#20753]: https://github.com/cockroachdb/cockroach/issues/20753#issuecomment-352810425
198
+
199
+
200
+ ## Tracked test failures
201
+
202
+ Some of the skipped failures are:
203
+
204
+ - `default:` key is not working for columns in table schema
205
+ definitions. This causes tests to fail due to unexpected data.
206
+
207
+ - `array:` key is not working for columns in table schema definitions.
208
+
209
+ - `"Salary is not appearing in list"` is being raised in a number of
210
+ places. Likely during fixture setup.
211
+
212
+ - `sum` function seems to result in a different type in ActiveRecord.
213
+ Instead of returning a Ruby `int`, it returns a Ruby `string`. It
214
+ appears that MySQL2 also does this. A suspected cause might be how
215
+ `Decimal` is handled if `sum` consumes integers and return a
216
+ decimal.
217
+
218
+ - Potentially fork the PostgreSQL::SchemaDumper to handle anything
219
+ specific to CockroachDB, like primary keys or bigints.
220
+
221
+ - You can call `@connection.create_table(..., id: :bigint)`, but this
222
+ will not changes things for CockroachDB (I think...), so it would be
223
+ not allowed. Even better, our adapter could interpret this and
224
+ generate the appropriate explicit pkey column. Not sure what string
225
+ pkeys look like...
226
+
227
+ - `string` types are introspected to `text` types.
228
+
229
+ - A user can do an update, delete, and insert on views.
230
+
231
+ - Postgres specific bit strings are not properly supported.
232
+
233
+ Grepping for `FIXME(joey)`, `TODO(joey)`, and `NOTE(joey)` will yeild
234
+ most of the touchpoints including test failures and temporary monkey
235
+ patches. Some monkey patches were made directly to Rails, which will
236
+ need to be cleaned up.
237
+
238
+
239
+ # Notes for the non-Rubyer
240
+
241
+ rvm is an environment manager that lets you manage and swap between
242
+ multiple verisons of Ruby and their dependancies.
243
+
244
+ bundle is dependancy manager that uses a projects `Gemfile` (and often
245
+ `<project>.gemspec`) to manage and load dependancies and their required
246
+ versions. When using projects commands are prefixed with
247
+ `bundle exec ...`. Bundle will ensure that all depenedncies are fetched
248
+ and used.
data/Gemfile CHANGED
@@ -1,4 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ # gem 'activerecord', git: 'https://github.com/lego/ruby-on-rails.git'
4
+
5
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
6
+
3
7
  # Specify your gem's dependencies in activerecord-cockroachdb-adapter.gemspec
4
8
  gemspec
9
+
10
+ # We need a newish Rake since Active Job sets its test tasks' descriptions.
11
+ gem "rake", ">= 11.1"
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ActiveRecord CockroachDB Adapter
2
2
 
3
- CockroachDB adapter for ActiveRecord 5. This is a lightweight extension of the PostgreSQL adapter that establishes compatibility with [CockroachDB](https://github.com/cockroachdb/cockroach).
3
+ CockroachDB adapter for ActiveRecord 4 and 5. 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
 
@@ -10,10 +10,20 @@ Add this line to your project's Gemfile:
10
10
  gem 'activerecord-cockroachdb-adapter', '~> 0.2.2'
11
11
  ```
12
12
 
13
+ If you're using Rails 4.x, use the `0.1.x` versions of this gem.
14
+
13
15
  In `database.yml`, use the following adapter setting:
14
16
 
15
17
  ```
16
18
  development:
17
19
  adapter: cockroachdb
18
20
  port: 26257
21
+ host: <hostname>
22
+ user: <username>
19
23
  ```
24
+
25
+
26
+ ## Modifying the adapter?
27
+
28
+ See [CONTRIBUTING.md](/CONTRIBUTING.md) for more details on setting up
29
+ the environment and making modifications.
@@ -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 = "0.2.2"
7
+ spec.version = "0.2.3"
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.1", ">= 5.1.1"
16
+ spec.add_dependency "activerecord", "~> 5.2"
17
17
  spec.add_dependency "pg", ">= 0.20", "< 0.22"
18
18
 
19
19
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
@@ -0,0 +1,17 @@
1
+ # This Dockerfile extends the Examples-ORM testing image in order to
2
+ # install specific dependencies required for ActiveRecord tests.
3
+
4
+ FROM cockroachdb/postgres-test:20170308-1644
5
+
6
+ # Native dependencies for libxml-ruby and sqlite3.
7
+ RUN apt-get update -y && apt-get install -y \
8
+ libxslt-dev \
9
+ libxml2-dev \
10
+ libsqlite3-dev \
11
+ && rm -rf /var/lib/apt/lists/*
12
+
13
+ # Ruby testing dependencies.
14
+ RUN gem install bundle rake
15
+
16
+ # Add global Gem binaries to the path.
17
+ ENV PATH /usr/local/lib/ruby/gems/2.4.0::$PATH
@@ -0,0 +1,28 @@
1
+ default_connection: cockroachdb
2
+
3
+ with_manual_interventions: false
4
+
5
+ connections:
6
+ cockroachdb:
7
+ arunit:
8
+ database: activerecord_unittest
9
+ host: localhost
10
+ port: 26257
11
+ user: root
12
+ requiressl: disable
13
+ min_messages: warning
14
+ arunit_without_prepared_statements:
15
+ database: activerecord_unittest
16
+ host: localhost
17
+ port: 26257
18
+ user: root
19
+ requiressl: disable
20
+ min_messages: warning
21
+ prepared_statements: false
22
+ arunit2:
23
+ database: activerecord_unittest2
24
+ host: localhost
25
+ port: 26257
26
+ user: root
27
+ requiressl: disable
28
+ min_messages: warning
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ readonly urlfile=cockroach-url
6
+
7
+ # Start a CockroachDB server, wait for it to become ready, and arrange for it to
8
+ # be force-killed when the script exits.
9
+ rm -f "$urlfile"
10
+ # Clean out a past CockroachDB instance. This happens if a build was
11
+ # canceled on an agent.
12
+ rm -rf $HOME/tmp/rails &
13
+ # Start CockroachDB.
14
+ cockroach quit --insecure || true
15
+ cockroach start --insecure --host=localhost --listening-url-file="$urlfile" --store=path=$HOME/tmp/rails &
16
+ trap "echo 'Exit routine: Killing CockroachDB.' && kill -9 $! &> /dev/null" EXIT
17
+ for i in {0..3}
18
+ do
19
+ [[ -f "$urlfile" ]] && break
20
+ backoff=$((2 ** i))
21
+ echo "server not yet available; sleeping for $backoff seconds"
22
+ sleep $backoff
23
+ done
24
+
25
+ # Target the Rails dependency file.
26
+ export BUNDLE_GEMFILE=$(pwd)/rails/Gemfile
27
+
28
+ # Run the tests.
29
+ cp build/config.teamcity.yml rails/activerecord/test/config.yml
30
+ echo "Rebuilding database"
31
+ (cd rails/activerecord && bundle exec rake db:cockroachdb:rebuild)
32
+ echo "Starting tests"
33
+ (cd rails/activerecord && bundle exec rake test:cockroachdb TESTFILES=$1)
34
+
35
+ # Attempt a clean shutdown for good measure. We'll force-kill in the atexit
36
+ # handler if this fails.
37
+ cockroach quit --insecure
38
+ trap - EXIT
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ # Download CockroachDB. NB: currently this uses an alpha, due to feature
6
+ # requirements.
7
+ VERSION=v2.0-alpha.20171218
8
+ wget -qO- https://binaries.cockroachdb.com/cockroach-$VERSION.linux-amd64.tgz | tar xvz
9
+ readonly COCKROACH=./cockroach-$VERSION.linux-amd64/cockroach
10
+
11
+ # Make sure cockroach can be found on the path. This is required for the
12
+ # ActiveRecord Rakefile that rebuilds the test database.
13
+ export PATH=$(pwd)/cockroach-$VERSION.linux-amd64/:$PATH
14
+ readonly urlfile=cockroach-url
15
+
16
+ run_cockroach() {
17
+ # Start a CockroachDB server, wait for it to become ready, and arrange
18
+ # for it to be force-killed when the script exits.
19
+ rm -f "$urlfile"
20
+ # Clean out a past CockroachDB instance. This will clean out leftovers
21
+ # from the build agent, and also between CockroachDB runs.
22
+ cockroach quit --insecure || true
23
+ rm -rf cockroach-data
24
+ # Start CockroachDB.
25
+ cockroach start --insecure --host=localhost --listening-url-file="$urlfile" >/dev/null 2>&1 &
26
+ # Ensure CockroachDB is stopped on script exit.
27
+ trap "echo 'Exit routine: Killing CockroachDB.' && kill -9 $! &> /dev/null" EXIT
28
+ # Wait until CockroachDB has started.
29
+ for i in {0..3}; do
30
+ [[ -f "$urlfile" ]] && break
31
+ backoff=$((2 ** i))
32
+ echo "server not yet available; sleeping for $backoff seconds"
33
+ sleep $backoff
34
+ done
35
+ }
36
+
37
+ # Target the Rails dependency file.
38
+ export BUNDLE_GEMFILE=$(pwd)/rails/Gemfile
39
+
40
+ # Install ruby dependencies.
41
+ bundle install
42
+
43
+ cp build/config.teamcity.yml rails/activerecord/test/config.yml
44
+
45
+ # 'Install' our adapter. This involves symlinking it inside of
46
+ # ActiveRecord. Normally the adapter will transitively install
47
+ # ActiveRecord, but we need to execute tests from inside the Rails
48
+ # context so we cannot rely on that. We also need previous links to make
49
+ # tests idempotent.
50
+ rm -f rails/activerecord/lib/active_record/connection_adapters/cockroachdb_adapter.rb
51
+ ln -s $(pwd)/lib/active_record/connection_adapters/cockroachdb_adapter.rb rails/activerecord/lib/active_record/connection_adapters/cockroachdb_adapter.rb
52
+ rm -rf rails/activerecord/lib/active_record/connection_adapters/cockroachdb
53
+ ln -s $(pwd)/lib/active_record/connection_adapters/cockroachdb rails/activerecord/lib/active_record/connection_adapters/cockroachdb
54
+
55
+ # Get the test files with "# FILE(OK)". These should pass.
56
+ TESTS=$(cd rails/activerecord && find test/cases -type f \( -name "*_test.rb" \) -exec grep -l "# FILE(OK)" {} +)
57
+
58
+ for TESTFILE in ${TESTS}; do
59
+ # Start CockroachDB
60
+ run_cockroach
61
+ # Run the tests.
62
+ echo "Rebuilding database"
63
+ (cd rails/activerecord && bundle exec rake db:cockroachdb:rebuild)
64
+ echo "Running test: $TESTFILE"
65
+ # Run the test. Continue testing even if this file fails.
66
+ if ! (cd rails/activerecord && bundle exec rake test:cockroachdb TESTFILES=$TESTFILE); then
67
+ echo "Test FAILED: $TESTFILE"
68
+ HAS_FAILED=1
69
+ else
70
+ echo "Test PASSED: $TESTFILE"
71
+ HAS_FAILED=0
72
+ fi
73
+ done
74
+
75
+ # Attempt a clean shutdown for good measure. We'll force-kill in the
76
+ # exit trap if this script fails.
77
+ cockroach quit --insecure
78
+ trap - EXIT
79
+
80
+ if [ $HAS_FAILED -eq 1 ]; then
81
+ exit 1
82
+ fi
@@ -0,0 +1,38 @@
1
+ #!/bin/bash
2
+ #
3
+ # This file is largely cargo-culted from cockroachdb/cockroach/build/builder.sh.
4
+
5
+ set -euo pipefail
6
+
7
+ DOCKER_IMAGE_TAG=activerecord_test_container
8
+
9
+ # Build the docker image to use.
10
+ docker build -t ${DOCKER_IMAGE_TAG} build/
11
+
12
+ # Absolute path to this repository.
13
+ repo_root=$(cd "$(dirname "${0}")" && pwd)
14
+
15
+ # Make a fake passwd file for the invoking user.
16
+ #
17
+ # This setup is so that files created from inside the container in a mounted
18
+ # volume end up being owned by the invoking user and not by root.
19
+ # We'll mount a fresh directory owned by the invoking user as /root inside the
20
+ # container because the container needs a $HOME (without one the default is /)
21
+ # and because various utilities (e.g. bash writing to .bash_history) need to be
22
+ # able to write to there.
23
+ username=$(id -un)
24
+ uid_gid=$(id -u):$(id -g)
25
+ container_root=${repo_root}/docker_root
26
+ mkdir -p "${container_root}"/{etc,home,home/"${username}"/activerecord-cockroachdb-adapter,home/.gems}
27
+ echo "${username}:x:${uid_gid}::/home/${username}:/bin/bash" > "${container_root}/etc/passwd"
28
+
29
+ docker run \
30
+ --volume="${container_root}/etc/passwd:/etc/passwd" \
31
+ --volume="${container_root}/home/${username}:/home/${username}" \
32
+ --volume="${repo_root}:/home/${username}/activerecord-cockroachdb-adapter" \
33
+ --workdir="/home/${username}/activerecord-cockroachdb-adapter" \
34
+ --env=PIP_USER=1 \
35
+ --env=GEM_HOME="/home/${username}/.gems" \
36
+ --user="${uid_gid}" \
37
+ "${DOCKER_IMAGE_TAG}" \
38
+ "$@"
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ # NOTE(joey): This is cradled from connection_adapters/postgresql/referential_integrity.rb
3
+ # It is commonly used for setting up fixtures during tests.
4
+ module ActiveRecord
5
+ module ConnectionAdapters
6
+ module CockroachDB
7
+ module ReferentialIntegrity # :nodoc:
8
+ def disable_referential_integrity # :nodoc:
9
+ original_exception = nil
10
+ fkeys = nil
11
+
12
+ begin
13
+ transaction do
14
+ tables.each do |table_name|
15
+ fkeys = foreign_keys(table_name)
16
+ fkeys.each do |fkey|
17
+ remove_foreign_key table_name, name: fkey.options[:name]
18
+ end
19
+ end
20
+ end
21
+ rescue ActiveRecord::ActiveRecordError => e
22
+ original_exception = e
23
+ end
24
+
25
+ begin
26
+ yield
27
+ rescue ActiveRecord::InvalidForeignKey => e
28
+ warn <<-WARNING
29
+ WARNING: Rails was not able to disable referential integrity.
30
+
31
+ Please go to https://github.com/cockroachdb/activerecord-cockroachdb-adapter
32
+ and report this issue.
33
+
34
+ cause: #{original_exception.try(:message)}
35
+
36
+ WARNING
37
+ raise e
38
+ end
39
+
40
+ begin
41
+ transaction do
42
+ if !fkeys.nil?
43
+ fkeys.each do |fkey|
44
+ add_foreign_key fkey.from_table, fkey.to_table, fkey.options
45
+ end
46
+ end
47
+ end
48
+ rescue ActiveRecord::ActiveRecordError
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,58 @@
1
+ require 'active_record/connection_adapters/postgresql/schema_statements'
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module CockroachDB
6
+ module SchemaStatements
7
+ include ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
8
+ # NOTE(joey): This was ripped from PostgresSQL::SchemaStatements, with a
9
+ # slight modification to change setval(string, int, bool) to just
10
+ # setval(string, int) for CockroachDB compatbility.
11
+ # See https://github.com/cockroachdb/cockroach/issues/19723
12
+ #
13
+ # Resets the sequence of a table's primary key to the maximum value.
14
+ def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
15
+ unless pk && sequence
16
+ default_pk, default_sequence = pk_and_sequence_for(table)
17
+
18
+ pk ||= default_pk
19
+ sequence ||= default_sequence
20
+ end
21
+
22
+ if @logger && pk && !sequence
23
+ @logger.warn "#{table} has primary key #{pk} with no default sequence."
24
+ end
25
+
26
+ if pk && sequence
27
+ quoted_sequence = quote_table_name(sequence)
28
+ max_pk = query_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}", "SCHEMA")
29
+ if max_pk.nil?
30
+ if postgresql_version >= 100000
31
+ minvalue = query_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass", "SCHEMA")
32
+ else
33
+ minvalue = query_value("SELECT min_value FROM #{quoted_sequence}", "SCHEMA")
34
+ end
35
+ end
36
+ if max_pk
37
+ # NOTE(joey): This is done to replace the call:
38
+ #
39
+ # SELECT setval(..., max_pk, false)
40
+ #
41
+ # with
42
+ #
43
+ # SELECT setval(..., max_pk-1)
44
+ #
45
+ # These two statements are semantically equivilant, but
46
+ # setval(string, int, bool) is not supported by CockroachDB.
47
+ #
48
+ # FIXME(joey): This is incorrect if the sequence is not 1
49
+ # incremented. We would need to pull out the custom increment value.
50
+ max_pk - 1
51
+ end
52
+ query_value("SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue})", "SCHEMA")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record/connection_adapters/abstract/transaction'
4
+
5
+ module ActiveRecord
6
+ module ConnectionAdapters
7
+
8
+ # NOTE(joey): This is a very sad monkey patch. Unfortunately, it is
9
+ # required in order to prevent doing more than 2 nested transactions
10
+ # while still allowing a single nested transaction. This is because
11
+ # CockroachDB only supports a single savepoint at the beginning of a
12
+ # transaction. Allowing this works for the common case of testing.
13
+ module CockroachDB
14
+ module TransactionManagerMonkeyPatch
15
+ def begin_transaction(options={})
16
+ @connection.lock.synchronize do
17
+ # If the transaction nesting is already 2 deep, raise an error.
18
+ if @connection.adapter_name == "CockroachDB" && @stack.is_a?(ActiveRecord::ConnectionAdapters::SavepointTransaction)
19
+ raise(ArgumentError, "cannot nest more than 1 transaction at a time. this is a CockroachDB limitation")
20
+ end
21
+ end
22
+ super(options)
23
+ end
24
+ end
25
+ end
26
+
27
+ class TransactionManager
28
+ prepend CockroachDB::TransactionManagerMonkeyPatch
29
+ end
30
+ end
31
+ end
@@ -1,4 +1,8 @@
1
1
  require 'active_record/connection_adapters/postgresql_adapter'
2
+ require "active_record/connection_adapters/postgresql/schema_statements"
3
+ require "active_record/connection_adapters/cockroachdb/schema_statements"
4
+ require "active_record/connection_adapters/cockroachdb/referential_integrity"
5
+ require "active_record/connection_adapters/cockroachdb/transaction_manager"
2
6
 
3
7
  module ActiveRecord
4
8
  module ConnectionHandling
@@ -13,7 +17,7 @@ module ActiveRecord
13
17
  conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database]
14
18
 
15
19
  # Forward only valid config params to PG::Connection.connect.
16
- valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
20
+ valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:sslmode, :application_name]
17
21
  conn_params.slice!(*valid_conn_param_keys)
18
22
 
19
23
  # The postgres drivers don't allow the creation of an unconnected
@@ -24,125 +28,275 @@ module ActiveRecord
24
28
  end
25
29
  end
26
30
 
27
- class ActiveRecord::ConnectionAdapters::CockroachDBAdapter < ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
28
- ADAPTER_NAME = "CockroachDB".freeze
31
+ module ActiveRecord
32
+ module ConnectionAdapters
33
+ class CockroachDBAdapter < PostgreSQLAdapter
34
+ ADAPTER_NAME = "CockroachDB".freeze
29
35
 
30
- # Note that in the migration from ActiveRecord 5.0 to 5.1, the
31
- # `extract_schema_qualified_name` method was aliased in the PostgreSQLAdapter.
32
- # To ensure backward compatibility with both <5.1 and 5.1, we rename it here
33
- # to use the same original `Utils` module.
34
- Utils = ActiveRecord::ConnectionAdapters::PostgreSQL::Utils
36
+ include CockroachDB::SchemaStatements
37
+ include CockroachDB::ReferentialIntegrity
35
38
 
36
- def supports_json?
37
- false
38
- end
39
39
 
40
- def supports_ddl_transactions?
41
- false
42
- end
40
+ # Note that in the migration from ActiveRecord 5.0 to 5.1, the
41
+ # `extract_schema_qualified_name` method was aliased in the PostgreSQLAdapter.
42
+ # To ensure backward compatibility with both <5.1 and 5.1, we rename it here
43
+ # to use the same original `Utils` module.
44
+ Utils = PostgreSQL::Utils
43
45
 
44
- def supports_extensions?
45
- false
46
- end
46
+ def supports_json?
47
+ # FIXME(joey): Add a version check.
48
+ true
49
+ end
47
50
 
48
- def supports_ranges?
49
- false
50
- end
51
+ def supports_ddl_transactions?
52
+ false
53
+ end
51
54
 
52
- def supports_materialized_views?
53
- false
54
- end
55
+ def supports_extensions?
56
+ false
57
+ end
55
58
 
56
- def supports_pg_crypto_uuid?
57
- false
58
- end
59
+ def supports_ranges?
60
+ # See cockroachdb/cockroach#17022
61
+ false
62
+ end
59
63
 
60
- def indexes(table_name, name = nil) # :nodoc:
61
- # The PostgreSQL adapter uses a correlated subquery in the following query,
62
- # which CockroachDB does not yet support. That portion of the query fetches
63
- # any non-standard opclasses that each index uses. CockroachDB also doesn't
64
- # support opclasses at this time, so the query is modified to just remove
65
- # the section about opclasses entirely.
66
- if name
67
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
68
- Passing name to #indexes is deprecated without replacement.
69
- MSG
70
- end
64
+ def supports_materialized_views?
65
+ false
66
+ end
67
+
68
+ def supports_pg_crypto_uuid?
69
+ false
70
+ end
71
+
72
+ def supports_partial_index?
73
+ # See cockroachdb/cockroach#9683
74
+ false
75
+ end
76
+
77
+ def supports_expression_index?
78
+ # See cockroachdb/cockroach#9682
79
+ false
80
+ end
81
+
82
+ def supports_datetime_with_precision?
83
+ false
84
+ end
85
+
86
+ def supports_comments?
87
+ # See cockroachdb/cockroach#19472.
88
+ false
89
+ end
90
+
91
+ def supports_comments_in_create?
92
+ # See cockroachdb/cockroach#19472.
93
+ false
94
+ end
95
+
96
+ def supports_advisory_locks?
97
+ # FIXME(joey): We may want to make this false.
98
+ true
99
+ end
100
+
101
+ def supports_virtual_columns?
102
+ # See cockroachdb/cockroach#20882.
103
+ false
104
+ end
71
105
 
72
- table = Utils.extract_schema_qualified_name(table_name.to_s)
73
-
74
- result = query(<<-SQL, "SCHEMA")
75
- SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
76
- pg_catalog.obj_description(i.oid, 'pg_class') AS comment
77
- FROM pg_class t
78
- INNER JOIN pg_index d ON t.oid = d.indrelid
79
- INNER JOIN pg_class i ON d.indexrelid = i.oid
80
- LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
81
- WHERE i.relkind = 'i'
82
- AND d.indisprimary = 'f'
83
- AND t.relname = '#{table.identifier}'
84
- AND n.nspname = #{table.schema ? "'#{table.schema}'" : 'ANY (current_schemas(false))'}
85
- ORDER BY i.relname
86
- SQL
87
-
88
- result.map do |row|
89
- index_name = row[0]
90
- unique = row[1]
91
- indkey = row[2].split(" ").map(&:to_i)
92
- inddef = row[3]
93
- oid = row[4]
94
- comment = row[5]
95
-
96
- expressions, where = inddef.scan(/\((.+?)\)(?: WHERE (.+))?\z/).flatten
97
-
98
- if indkey.include?(0)
99
- columns = expressions
100
- else
101
- columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact
102
- SELECT a.attnum, a.attname
103
- FROM pg_attribute a
104
- WHERE a.attrelid = #{oid}
105
- AND a.attnum IN (#{indkey.join(",")})
106
+ def supports_savepoints?
107
+ # See cockroachdb/cockroach#10735.
108
+ false
109
+ end
110
+
111
+ def transaction_isolation_levels
112
+ {
113
+ # Explicitly prevent READ UNCOMMITTED from being used. This
114
+ # was due to the READ UNCOMMITTED test failing.
115
+ # read_uncommitted: "READ UNCOMMITTED",
116
+ read_committed: "READ COMMITTED",
117
+ repeatable_read: "REPEATABLE READ",
118
+ serializable: "SERIALIZABLE"
119
+ }
120
+ end
121
+
122
+
123
+ # Sadly, we can only do savepoints at the beginning of
124
+ # transactions. This means that we cannot use them for most cases
125
+ # of transaction, so we just pretend they're usable.
126
+ def create_savepoint(name = "COCKROACH_RESTART"); end
127
+
128
+ def exec_rollback_to_savepoint(name = "COCKROACH_RESTART"); end
129
+
130
+ def release_savepoint(name = "COCKROACH_RESTART"); end
131
+
132
+ def indexes(table_name, name = nil) # :nodoc:
133
+ # The PostgreSQL adapter uses a correlated subquery in the following query,
134
+ # which CockroachDB does not yet support. That portion of the query fetches
135
+ # any non-standard opclasses that each index uses. CockroachDB also doesn't
136
+ # support opclasses at this time, so the query is modified to just remove
137
+ # the section about opclasses entirely.
138
+ if name
139
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
140
+ Passing name to #indexes is deprecated without replacement.
141
+ MSG
142
+ end
143
+
144
+ table = Utils.extract_schema_qualified_name(table_name.to_s)
145
+
146
+ result = query(<<-SQL, "SCHEMA")
147
+ SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
148
+ pg_catalog.obj_description(i.oid, 'pg_class') AS comment
149
+ FROM pg_class t
150
+ INNER JOIN pg_index d ON t.oid = d.indrelid
151
+ INNER JOIN pg_class i ON d.indexrelid = i.oid
152
+ LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
153
+ WHERE i.relkind = 'i'
154
+ AND d.indisprimary = 'f'
155
+ AND t.relname = '#{table.identifier}'
156
+ AND n.nspname = #{table.schema ? "'#{table.schema}'" : 'ANY (current_schemas(false))'}
157
+ ORDER BY i.relname
106
158
  SQL
107
159
 
108
- # add info on sort order for columns (only desc order is explicitly specified, asc is the default)
109
- orders = Hash[
110
- expressions.scan(/(\w+) DESC/).flatten.map { |order_column| [order_column, :desc] }
111
- ]
160
+ result.map do |row|
161
+ index_name = row[0]
162
+ unique = row[1]
163
+ indkey = row[2].split(" ").map(&:to_i)
164
+ inddef = row[3]
165
+ oid = row[4]
166
+ comment = row[5]
167
+
168
+ expressions, where = inddef.scan(/\((.+?)\)(?: WHERE (.+))?\z/).flatten
169
+
170
+ if indkey.include?(0)
171
+ columns = expressions
172
+ else
173
+ columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact
174
+ SELECT a.attnum, a.attname
175
+ FROM pg_attribute a
176
+ WHERE a.attrelid = #{oid}
177
+ AND a.attnum IN (#{indkey.join(",")})
178
+ SQL
179
+
180
+ # add info on sort order for columns (only desc order is explicitly specified, asc is the default)
181
+ orders = Hash[
182
+ expressions.scan(/(\w+) DESC/).flatten.map { |order_column| [order_column, :desc] }
183
+ ]
184
+ end
185
+
186
+ # FIXME(joey): This may be specific to ActiveRecord 5.2.
187
+ IndexDefinition.new(
188
+ table_name,
189
+ index_name,
190
+ unique,
191
+ columns,
192
+ orders: orders,
193
+ where: where,
194
+ comment: comment.presence
195
+ )
196
+ end.compact
112
197
  end
113
198
 
114
- ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, nil, comment.presence)
115
- end.compact
116
- end
117
199
 
200
+ def primary_keys(table_name)
201
+ name = Utils.extract_schema_qualified_name(table_name.to_s)
202
+ select_values(<<-SQL.strip_heredoc, "SCHEMA")
203
+ SELECT column_name
204
+ FROM information_schema.key_column_usage kcu
205
+ JOIN information_schema.table_constraints tc
206
+ ON kcu.table_name = tc.table_name
207
+ AND kcu.table_schema = tc.table_schema
208
+ AND kcu.constraint_name = tc.constraint_name
209
+ WHERE constraint_type = 'PRIMARY KEY'
210
+ AND kcu.table_name = #{quote(name.identifier)}
211
+ AND kcu.table_schema = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
212
+ ORDER BY kcu.ordinal_position
213
+ SQL
214
+ end
118
215
 
119
- def primary_keys(table_name)
120
- name = Utils.extract_schema_qualified_name(table_name.to_s)
121
- select_values(<<-SQL.strip_heredoc, "SCHEMA")
122
- SELECT column_name
123
- FROM information_schema.key_column_usage kcu
124
- JOIN information_schema.table_constraints tc
125
- ON kcu.table_name = tc.table_name
126
- AND kcu.table_schema = tc.table_schema
127
- AND kcu.constraint_name = tc.constraint_name
128
- WHERE constraint_type = 'PRIMARY KEY'
129
- AND kcu.table_name = #{quote(name.identifier)}
130
- AND kcu.table_schema = #{name.schema ? quote(name.schema) : "ANY (current_schemas(false))"}
131
- ORDER BY kcu.ordinal_position
132
- SQL
133
- end
216
+ # This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
217
+ # migration from PostgreSQL to CockroachDB. In practice, this limitation
218
+ # is arbitrary since CockroachDB supports index name lengths and table alias
219
+ # lengths far greater than this value. For the time being though, we match
220
+ # the original behavior for PostgreSQL to simplify migrations.
221
+ #
222
+ # Note that in the migration to ActiveRecord 5.1, this was changed in
223
+ # PostgreSQLAdapter to use `SHOW max_identifier_length` (which does not
224
+ # exist in CockroachDB). Therefore, we have to redefine this here.
225
+ def max_identifier_length
226
+ 63
227
+ end
228
+ alias index_name_length max_identifier_length
229
+ alias table_alias_length max_identifier_length
230
+
231
+ private
232
+
233
+ def initialize_type_map(m = type_map)
234
+ super(m)
235
+ # NOTE(joey): PostgreSQL intervals have a precision.
236
+ # CockroachDB intervals do not, so overide the type
237
+ # definition. Returning a ArgumentError may not be correct.
238
+ # This needs to be tested.
239
+ m.register_type "interval" do |_, _, sql_type|
240
+ precision = extract_precision(sql_type)
241
+ if precision
242
+ raise(ArgumentError, "CockroachDB does not support precision on intervals, but got precision: #{precision}")
243
+ end
244
+ OID::SpecializedString.new(:interval, precision: precision)
245
+ end
246
+ end
247
+
248
+ # Configures the encoding, verbosity, schema search path, and time zone of the connection.
249
+ # This is called by #connect and should not be called manually.
250
+ #
251
+ # NOTE(joey): This was cradled from postgresql_adapter.rb. This
252
+ # was due to needing to override configuration statements.
253
+ def configure_connection
254
+ if @config[:encoding]
255
+ @connection.set_client_encoding(@config[:encoding])
256
+ end
257
+ self.client_min_messages = @config[:min_messages] || "warning"
258
+ self.schema_search_path = @config[:schema_search_path] || @config[:schema_order]
259
+
260
+ # Use standard-conforming strings so we don't have to do the E'...' dance.
261
+ set_standard_conforming_strings
134
262
 
135
- # This is hardcoded to 63 (as previously was in ActiveRecord 5.0) to aid in
136
- # migration from PostgreSQL to Cockroachdb. In practice, this limitation
137
- # is arbitrary since CockroachDB supports index name lengths and table alias
138
- # lengths far greater than this value. For the time being though, we match
139
- # the original behavior for PostgreSQL to simplify migrations.
140
- #
141
- # Note that in the migration to ActiveRecord 5.1, this was changed in
142
- # PostgreSQLAdapter to use `SHOW max_identifier_length` (which does not
143
- # exist in CockroachDB). Therefore, we have to redefine this here.
144
- def table_alias_length
145
- 63
263
+ variables = @config.fetch(:variables, {}).stringify_keys
264
+
265
+ # If using Active Record's time zone support configure the connection to return
266
+ # TIMESTAMP WITH ZONE types in UTC.
267
+ unless variables["timezone"]
268
+ if ActiveRecord::Base.default_timezone == :utc
269
+ variables["timezone"] = "UTC"
270
+ elsif @local_tz
271
+ variables["timezone"] = @local_tz
272
+ end
273
+ end
274
+
275
+ # NOTE(joey): This is a workaround as CockroachDB 1.1.x
276
+ # supports SET TIME ZONE <...> and SET "time zone" = <...> but
277
+ # not SET timezone = <...>.
278
+ if variables.key?("timezone")
279
+ tz = variables.delete("timezone")
280
+ execute("SET TIME ZONE #{quote(tz)}", "SCHEMA")
281
+ end
282
+
283
+ # SET statements from :variables config hash
284
+ # https://www.postgresql.org/docs/current/static/sql-set.html
285
+ variables.map do |k, v|
286
+ if v == ":default" || v == :default
287
+ # Sets the value to the global or compile default
288
+
289
+ # NOTE(joey): I am not sure if simply commenting this out
290
+ # is technically correct.
291
+ # execute("SET #{k} = DEFAULT", "SCHEMA")
292
+ elsif !v.nil?
293
+ execute("SET SESSION #{k} = #{quote(v)}", "SCHEMA")
294
+ end
295
+ end
296
+ end
297
+
298
+
299
+ # end private
300
+ end
146
301
  end
147
- alias index_name_length table_alias_length
148
302
  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: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cockroach Labs
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-13 00:00:00.000000000 Z
11
+ date: 2018-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,20 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.1'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 5.1.1
19
+ version: '5.2'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '5.1'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 5.1.1
26
+ version: '5.2'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: pg
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +95,8 @@ extensions: []
101
95
  extra_rdoc_files: []
102
96
  files:
103
97
  - ".gitignore"
104
- - ".travis.yml"
98
+ - ".gitmodules"
99
+ - CONTRIBUTING.md
105
100
  - Gemfile
106
101
  - LICENSE
107
102
  - README.md
@@ -109,7 +104,15 @@ files:
109
104
  - activerecord-cockroachdb-adapter.gemspec
110
105
  - bin/console
111
106
  - bin/setup
107
+ - build/Dockerfile
108
+ - build/config.teamcity.yml
109
+ - build/local-test.sh
110
+ - build/teamcity-test.sh
111
+ - docker.sh
112
112
  - lib/active_record/connection_adapters/cockroachdb/database_tasks.rb
113
+ - lib/active_record/connection_adapters/cockroachdb/referential_integrity.rb
114
+ - lib/active_record/connection_adapters/cockroachdb/schema_statements.rb
115
+ - lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb
113
116
  - lib/active_record/connection_adapters/cockroachdb_adapter.rb
114
117
  - lib/activerecord-cockroachdb-adapter.rb
115
118
  homepage: https://github.com/cockroachdb/activerecord-cockroachdb-adapter
@@ -133,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
136
  version: '0'
134
137
  requirements: []
135
138
  rubyforge_project:
136
- rubygems_version: 2.6.11
139
+ rubygems_version: 2.5.2
137
140
  signing_key:
138
141
  specification_version: 4
139
142
  summary: CockroachDB adapter for ActiveRecord.
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.0
5
- before_install: gem install bundler -v 1.14.3