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: 624916896cfdc77c6a74fde8700a9b07ff587250
4
- data.tar.gz: dea7261a14573e0202de967869d123b473785d86
3
+ metadata.gz: 60ad881c3d0757d14d5ec9c12ac3740b95ba0d32
4
+ data.tar.gz: e0f2cc67ac0407f5652f40931d17e9785757bcd3
5
5
  SHA512:
6
- metadata.gz: fa68c4dd7ba5c49f7a17fabdb17afbbdf7943e994fea75c1d6b61aeed001a1793326b69bc24b5422987c84dfe573a803d87642539516050607bd141a70f7ea57
7
- data.tar.gz: 4d86b6ebca7510b1f9f4276c1380a7a16655404ed57f91b6c1f3038a827d8e260daa2407dceddf63e309fa22230a37f062586f2ac3dd9e92eee850cad25602c2
6
+ metadata.gz: 690678e820f5849c845fd5c992832e561cecc4e8341ede697c7cdac0cd5b34ba551f4b5f7f4911d7f948c24d3f3890b7acc36227dfa395ccc046e33fd1b54b21
7
+ data.tar.gz: 6c0feddd0d11bd30893842b129c51ca8deea17a1c8dfb19bb1ed1a732389051d27ef036ebd0ac2b4cadfb3da4db6721fc443d1323359cdba656dfa738bcd03b5
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.3
1
+ 2.3.4
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: active_record_mutex 2.3.3 ruby lib
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.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-24"
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
- counter or raise ArgumentError, 'argument :name is too long'
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("SELECT RELEASE_LOCK(#{quote(name)})")
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("SELECT IS_FREE_LOCK(#{quote(name)})") == 1
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("SET #{counter} = IF(#{counter} IS NULL OR #{counter} = 0, 1, #{counter} + 1)")
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("SET #{counter} = #{counter} - 1")
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("SELECT #{counter}").to_i
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("SELECT GET_LOCK(#{quote(name)}, #{timeout})")
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 result = self.class.db.execute(sql)
183
- result = result.first.first.to_i
184
- $DEBUG and warn %{query("#{sql}") = #{result}}
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
-
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord::DatabaseMutex
2
2
  # ActiveRecord::DatabaseMutex version
3
- VERSION = '2.3.3'
3
+ VERSION = '2.3.4'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -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.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-24 00:00:00.000000000 Z
11
+ date: 2016-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar