active_record_mutex 2.3.3 → 2.3.4
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60ad881c3d0757d14d5ec9c12ac3740b95ba0d32
|
4
|
+
data.tar.gz: e0f2cc67ac0407f5652f40931d17e9785757bcd3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 690678e820f5849c845fd5c992832e561cecc4e8341ede697c7cdac0cd5b34ba551f4b5f7f4911d7f948c24d3f3890b7acc36227dfa395ccc046e33fd1b54b21
|
7
|
+
data.tar.gz: 6c0feddd0d11bd30893842b129c51ca8deea17a1c8dfb19bb1ed1a732389051d27ef036ebd0ac2b4cadfb3da4db6721fc443d1323359cdba656dfa738bcd03b5
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.3.
|
1
|
+
2.3.4
|
data/active_record_mutex.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: active_record_mutex 2.3.
|
2
|
+
# stub: active_record_mutex 2.3.4 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "active_record_mutex"
|
6
|
-
s.version = "2.3.
|
6
|
+
s.version = "2.3.4"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Florian Frank"]
|
11
|
-
s.date = "2016-08-
|
11
|
+
s.date = "2016-08-25"
|
12
12
|
s.description = "Mutex that can be used to synchronise ruby processes via an ActiveRecord datababase connection. (Only Mysql is supported at the moment.)"
|
13
13
|
s.email = "flori@ping.de"
|
14
14
|
s.extra_rdoc_files = ["README.md", "lib/active_record/database_mutex.rb", "lib/active_record/database_mutex/implementation.rb", "lib/active_record/database_mutex/version.rb", "lib/active_record/mutex.rb", "lib/active_record_mutex.rb"]
|
@@ -5,26 +5,21 @@ module ActiveRecord
|
|
5
5
|
module DatabaseMutex
|
6
6
|
class Implementation
|
7
7
|
|
8
|
-
class << self
|
9
|
-
def db
|
10
|
-
ActiveRecord::Base.connection
|
11
|
-
end
|
12
|
-
|
13
|
-
def check_size?
|
14
|
-
if defined? @check_size
|
15
|
-
@check_size
|
16
|
-
else
|
17
|
-
version = db.execute("SHOW VARIABLES LIKE 'version'").first.last.
|
18
|
-
delete('^0-9.').version
|
19
|
-
@check_size = version >= '5.7'.version
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
8
|
# Creates a mutex with the name given with the option :name.
|
25
9
|
def initialize(opts = {})
|
26
10
|
@name = opts[:name] or raise ArgumentError, "mutex requires a :name argument"
|
27
|
-
|
11
|
+
query %{
|
12
|
+
CREATE TEMPORARY TABLE IF NOT EXISTS mutex_counters
|
13
|
+
(
|
14
|
+
name CHAR(255) NOT NULL,
|
15
|
+
counter INT UNSIGNED NOT NULL DEFAULT 1,
|
16
|
+
PRIMARY KEY (name)
|
17
|
+
)
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def db
|
22
|
+
ActiveRecord::Base.connection
|
28
23
|
end
|
29
24
|
|
30
25
|
# Returns the name of this mutex as given as a constructor argument.
|
@@ -82,7 +77,7 @@ module ActiveRecord
|
|
82
77
|
if aquired_lock?
|
83
78
|
decrease_counter
|
84
79
|
if counter_zero?
|
85
|
-
case query
|
80
|
+
case query %{ SELECT RELEASE_LOCK(#{quote(name)}) }
|
86
81
|
when 1
|
87
82
|
true
|
88
83
|
when 0, nil
|
@@ -105,7 +100,7 @@ module ActiveRecord
|
|
105
100
|
|
106
101
|
# Returns true if this mutex is unlocked at the moment.
|
107
102
|
def unlocked?
|
108
|
-
query(
|
103
|
+
query(%{ SELECT IS_FREE_LOCK(#{quote(name)}) }).to_i == 1
|
109
104
|
end
|
110
105
|
|
111
106
|
# Returns true if this mutex is locked at the moment.
|
@@ -136,24 +131,26 @@ module ActiveRecord
|
|
136
131
|
ActiveRecord::Base.connection.quote(value)
|
137
132
|
end
|
138
133
|
|
139
|
-
def counter
|
140
|
-
encoded_name = ?$ + Base64.encode64(name).delete('^A-Za-z0-9+/').
|
141
|
-
gsub(/[+\/]/, ?+ => ?_, ?/ => ?.)
|
142
|
-
if !self.class.check_size? || encoded_name.size <= 64 # mysql 5.7 only allows size <=64 variable names
|
143
|
-
"@#{encoded_name}"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
134
|
def increase_counter
|
148
|
-
query
|
135
|
+
query %{
|
136
|
+
INSERT INTO mutex_counters (name)
|
137
|
+
VALUES (#{quote(@name)})
|
138
|
+
ON DUPLICATE KEY UPDATE counter = counter + 1
|
139
|
+
}
|
149
140
|
end
|
150
141
|
|
151
142
|
def decrease_counter
|
152
|
-
query
|
143
|
+
query %{
|
144
|
+
UPDATE mutex_counters SET counter = counter - 1
|
145
|
+
WHERE name = #{quote(@name)}
|
146
|
+
}
|
153
147
|
end
|
154
148
|
|
155
149
|
def counter_value
|
156
|
-
query(
|
150
|
+
query(%{
|
151
|
+
SELECT counter FROM mutex_counters
|
152
|
+
WHERE name = #{quote(@name)}
|
153
|
+
}).to_i
|
157
154
|
end
|
158
155
|
|
159
156
|
def counter_zero?
|
@@ -166,7 +163,7 @@ module ActiveRecord
|
|
166
163
|
true
|
167
164
|
else
|
168
165
|
timeout = opts[:timeout] || 1
|
169
|
-
case query
|
166
|
+
case query %{ SELECT GET_LOCK(#{quote(name)}, #{timeout}) }
|
170
167
|
when 1
|
171
168
|
increase_counter
|
172
169
|
true
|
@@ -178,16 +175,13 @@ module ActiveRecord
|
|
178
175
|
end
|
179
176
|
end
|
180
177
|
|
181
|
-
def query(sql)
|
182
|
-
if
|
183
|
-
|
184
|
-
$DEBUG and warn %{query("#{sql}") = #{
|
178
|
+
def query(sql, index: 0)
|
179
|
+
if row = db.select_rows(sql).first
|
180
|
+
value = index ? row[index] : row
|
181
|
+
$DEBUG and warn %{query("#{sql}", #{index.inspect}) = #{value.inspect}}
|
182
|
+
value
|
185
183
|
end
|
186
|
-
result
|
187
|
-
rescue ActiveRecord::StatementInvalid
|
188
|
-
nil
|
189
184
|
end
|
190
185
|
end
|
191
186
|
end
|
192
187
|
end
|
193
|
-
|
data/test/database_mutex_test.rb
CHANGED
@@ -146,9 +146,4 @@ class DatabaseMutexTest < Test::Unit::TestCase
|
|
146
146
|
end
|
147
147
|
assert_nil mutex.synchronize {}
|
148
148
|
end
|
149
|
-
|
150
|
-
def test_counter_name
|
151
|
-
mutex = Implementation.new(:name => (250..255).map(&:chr) * '')
|
152
|
-
assert_equal '@$_vv8.f7.', mutex.send(:counter)
|
153
|
-
end
|
154
149
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_mutex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.
|
4
|
+
version: 2.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|