atomically 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +7 -0
- data/CHANGELOG.md +6 -0
- data/README.md +2 -2
- data/atomically.gemspec +2 -2
- data/gemfiles/6.0.makara.gemfile +17 -0
- data/lib/atomically/adapter_check_service.rb +18 -4
- data/lib/atomically/query_service.rb +5 -9
- data/lib/atomically/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4785f6bc399158f874395e862ef07c1f945e78490b18e56c06fc903bdf32e139
|
4
|
+
data.tar.gz: 6b14e38f5df25ffdb507c34a7b7fc099b42f112bb91c66f026a86e3302fe4169
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de8c068d9f094983f16893e7157302e3c053c5095929f0eec3a790bfefa81f49a0bdbc5da9f6d56ec6d8b1fb4dc96266fb68745aae473beabc93000b6c14222e
|
7
|
+
data.tar.gz: a963fbc7b93c3ccf240f0067b2e1355259076bcccb5e4caa22791f7ad515b468bd72d7d008fd5bdd1a59939f590e1dbc4e3b5dafcf3e20b2f0b592936486ada3
|
data/.travis.yml
CHANGED
@@ -21,6 +21,13 @@ gemfile:
|
|
21
21
|
- gemfiles/5.2.gemfile
|
22
22
|
- gemfiles/6.0.gemfile
|
23
23
|
matrix:
|
24
|
+
include:
|
25
|
+
- env: DB=makara_mysql
|
26
|
+
gemfile: gemfiles/6.0.makara.gemfile
|
27
|
+
rvm: 2.6
|
28
|
+
- env: DB=makara_pg
|
29
|
+
gemfile: gemfiles/6.0.makara.gemfile
|
30
|
+
rvm: 2.6
|
24
31
|
exclude:
|
25
32
|
- gemfile: gemfiles/3.2.gemfile
|
26
33
|
rvm: 2.6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## Change Log
|
2
2
|
|
3
|
+
### [v1.1.0](https://github.com/khiav223577/atomically/compare/v1.0.6...v1.1.0) 2019/10/23
|
4
|
+
- [#12](https://github.com/khiav223577/atomically/pull/12) Support pg (@khiav223577)
|
5
|
+
- [#14](https://github.com/khiav223577/atomically/pull/14) Support Rails 6.0 (@khiav223577)
|
6
|
+
- [#13](https://github.com/khiav223577/atomically/pull/13) Remove deprecated codeclimate-test-reporter gem (@khiav223577)
|
7
|
+
- [#11](https://github.com/khiav223577/atomically/pull/11) Fix: Non-attribute arguments will be disallowed in Rails 6.0 (@khiav223577)
|
8
|
+
|
3
9
|
### [v1.0.6](https://github.com/khiav223577/atomically/compare/v1.0.5...v1.0.6) 2019/01/28
|
4
10
|
- [#10](https://github.com/khiav223577/atomically/pull/10) `decrement_unsigned_counters` should be able to decrement the field to zero (@khiav223577)
|
5
11
|
|
data/README.md
CHANGED
@@ -263,11 +263,11 @@ arena.atomically_close!
|
|
263
263
|
# => false (if race condition occurs)
|
264
264
|
```
|
265
265
|
|
266
|
-
The return value can be used to prevent race condition and make sure some piece of code is executed once.
|
266
|
+
The return value can be used to prevent race condition and make sure some piece of code is executed only once.
|
267
267
|
|
268
268
|
```rb
|
269
269
|
if arena.atomically_close!
|
270
|
-
# Only one request can pass this check and
|
270
|
+
# Only one request can pass this check and execute the code here.
|
271
271
|
# You can send rewards, calculate ranking, or fire background job here.
|
272
272
|
# No need to worry about being invoked multiple times.
|
273
273
|
do_something
|
data/atomically.gemspec
CHANGED
@@ -9,8 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['khiav reoy']
|
10
10
|
spec.email = ['mrtmrt15xn@yahoo.com.tw']
|
11
11
|
|
12
|
-
spec.summary = '
|
13
|
-
spec.description = '
|
12
|
+
spec.summary = 'An ActiveRecord extension for writing commonly useful atomic SQL statements to avoid race condition.'
|
13
|
+
spec.description = 'An ActiveRecord extension for writing commonly useful atomic SQL statements to avoid race condition.'
|
14
14
|
spec.homepage = 'https://github.com/khiav223577/atomically'
|
15
15
|
spec.license = 'MIT'
|
16
16
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'activerecord', '~> 6.0.0'
|
4
|
+
|
5
|
+
group :test do
|
6
|
+
case ENV['DB']
|
7
|
+
when 'mysql' ; gem 'mysql2', '0.5.1'
|
8
|
+
when 'postgres' ; gem 'pg', '~> 0.18'
|
9
|
+
end
|
10
|
+
gem 'simplecov'
|
11
|
+
gem 'pluck_all', '>= 2.0.4'
|
12
|
+
gem 'timecop', '~> 0.9.1'
|
13
|
+
gem 'update_all_scope', '~> 0.1.0'
|
14
|
+
gem 'makara', '~> 0.4.1'
|
15
|
+
end
|
16
|
+
|
17
|
+
gemspec path: '../'
|
@@ -5,12 +5,26 @@ class Atomically::AdapterCheckService
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def pg?
|
8
|
-
|
9
|
-
return @klass.connection.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
8
|
+
possible_pg_klasses.any?{|s| @klass.connection.is_a?(s) }
|
10
9
|
end
|
11
10
|
|
12
11
|
def mysql?
|
13
|
-
|
14
|
-
|
12
|
+
possible_mysql_klasses.any?{|s| @klass.connection.is_a?(s) }
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def possible_pg_klasses
|
18
|
+
@possible_pg_klasses ||= [].tap do |result|
|
19
|
+
result << ActiveRecord::ConnectionAdapters::PostgreSQLAdapter if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
20
|
+
result << ActiveRecord::ConnectionAdapters::MakaraPostgreSQLAdapter if defined?(ActiveRecord::ConnectionAdapters::MakaraPostgreSQLAdapter)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def possible_mysql_klasses
|
25
|
+
@possible_mysql_klasses ||= [].tap do |result|
|
26
|
+
result << ActiveRecord::ConnectionAdapters::Mysql2Adapter if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
|
27
|
+
result << ActiveRecord::ConnectionAdapters::MakaraMysql2Adapter if defined?(ActiveRecord::ConnectionAdapters::MakaraMysql2Adapter)
|
28
|
+
end
|
15
29
|
end
|
16
30
|
end
|
@@ -34,7 +34,7 @@ class Atomically::QueryService
|
|
34
34
|
end
|
35
35
|
|
36
36
|
raw_when_sql = hash.map{|id, pay_count| "WHEN #{sanitize(id)} THEN #{sanitize(-pay_count)}" }.join("\n")
|
37
|
-
no_var_in_sql = true if update_columns.size == 1 or
|
37
|
+
no_var_in_sql = true if update_columns.size == 1 or adapter_check_service.pg?
|
38
38
|
update_sqls = update_columns.map.with_index do |column, idx|
|
39
39
|
if no_var_in_sql
|
40
40
|
value = "(\nCASE #{quote_column(primary_key)}\n#{raw_when_sql}\nEND)"
|
@@ -71,7 +71,7 @@ class Atomically::QueryService
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def update_all_and_get_ids(*args)
|
74
|
-
if
|
74
|
+
if adapter_check_service.pg?
|
75
75
|
scope = UpdateAllScope::UpdateAllScope.new(model: @model, relation: @relation.where(''))
|
76
76
|
scope.update(*args)
|
77
77
|
return @klass.connection.execute("#{scope.to_sql} RETURNING id", "#{@klass} Update All").map{|s| s['id'].to_i }
|
@@ -89,17 +89,13 @@ class Atomically::QueryService
|
|
89
89
|
|
90
90
|
private
|
91
91
|
|
92
|
-
def
|
93
|
-
Atomically::AdapterCheckService.new(@klass)
|
94
|
-
end
|
95
|
-
|
96
|
-
def db_is_mysql?
|
97
|
-
Atomically::AdapterCheckService.new(@klass).mysql?
|
92
|
+
def adapter_check_service
|
93
|
+
@adapter_check_service ||= Atomically::AdapterCheckService.new(@klass)
|
98
94
|
end
|
99
95
|
|
100
96
|
def on_duplicate_key_plus_sql(columns, conflict_target)
|
101
97
|
service = Atomically::OnDuplicateSqlService.new(@klass, columns)
|
102
|
-
return service.mysql_quote_columns_for_plus.join(', ') if
|
98
|
+
return service.mysql_quote_columns_for_plus.join(', ') if adapter_check_service.mysql?
|
103
99
|
return {
|
104
100
|
conflict_target: conflict_target,
|
105
101
|
columns: service.pg_quote_columns_for_plus.join(', ')
|
data/lib/atomically/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atomically
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -184,8 +184,8 @@ dependencies:
|
|
184
184
|
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
186
|
version: 0.1.0
|
187
|
-
description:
|
188
|
-
condition.
|
187
|
+
description: An ActiveRecord extension for writing commonly useful atomic SQL statements
|
188
|
+
to avoid race condition.
|
189
189
|
email:
|
190
190
|
- mrtmrt15xn@yahoo.com.tw
|
191
191
|
executables: []
|
@@ -210,6 +210,7 @@ files:
|
|
210
210
|
- gemfiles/5.1.gemfile
|
211
211
|
- gemfiles/5.2.gemfile
|
212
212
|
- gemfiles/6.0.gemfile
|
213
|
+
- gemfiles/6.0.makara.gemfile
|
213
214
|
- lib/atomically.rb
|
214
215
|
- lib/atomically/active_record/extension.rb
|
215
216
|
- lib/atomically/adapter_check_service.rb
|
@@ -243,10 +244,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
244
|
- !ruby/object:Gem::Version
|
244
245
|
version: '0'
|
245
246
|
requirements: []
|
246
|
-
|
247
|
-
rubygems_version: 2.6.14
|
247
|
+
rubygems_version: 3.0.3
|
248
248
|
signing_key:
|
249
249
|
specification_version: 4
|
250
|
-
summary:
|
251
|
-
condition.
|
250
|
+
summary: An ActiveRecord extension for writing commonly useful atomic SQL statements
|
251
|
+
to avoid race condition.
|
252
252
|
test_files: []
|