active_record_mutex 2.3.8 → 2.4.0

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: a8705fe3d190b75644675f7fc74d246da19f8a3b
4
- data.tar.gz: 2441f8fbca8fd0fca45e380341a9e0a924c49acd
3
+ metadata.gz: 868990d82f5cfc1f8948a56494b5264d67610031
4
+ data.tar.gz: 843d17dd76cfb98da16bce309f4b33a8595a65b9
5
5
  SHA512:
6
- metadata.gz: 5525469c28b82c0e6a4c78e2d5ae410a351df12a61b011acedb73f966604708b39a1e3a87ab9e25dd18a30b472d24e645318766540a18dff611dc12c0055f86f
7
- data.tar.gz: 6b6e0addf643c5db413aa1c21ae1f3f4963b46af08c12f7c78ed1b82e0123c02e2777b718da8754faebeefb06729581c86756f680621bbc5daf4d0798e81d165
6
+ metadata.gz: cbab372a12b534583abaede4466a91e99ec981670d73729f1282a80bd2f68f99af379781d47fb06523513af03b3a82e150da15ae6fe7c074b3032ad757628f06
7
+ data.tar.gz: 859681f8d7bbb4cf64544bf5a00adfd8007d929e028e06dd498ac8a501eef3f64637822006f548bb62da4287ca0c46a8635fff6b9a97d280aa580e13ae25997a
data/.travis.yml CHANGED
@@ -1,9 +1,6 @@
1
1
  rvm:
2
2
  - 2.0.0
3
3
  - 2.1
4
- - 2.2
5
- - 2.3.1
6
- - 2.4.0-preview1
7
4
  - ruby-head
8
5
  - jruby-head
9
6
  matrix:
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ GemHadar do
19
19
 
20
20
  dependency 'mysql2', '~>0.3.0'
21
21
  dependency 'activerecord', '~> 4.0'
22
- dependency 'tins', '~> 1.12.0'
22
+ dependency 'tins', '~> 1.12'
23
23
  development_dependency 'test-unit', '~>3.0'
24
24
  development_dependency 'byebug'
25
25
  development_dependency 'simplecov'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.8
1
+ 2.4.0
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: active_record_mutex 2.3.8 ruby lib
2
+ # stub: active_record_mutex 2.4.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "active_record_mutex".freeze
6
- s.version = "2.3.8"
6
+ s.version = "2.4.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2016-09-07"
11
+ s.date = "2016-11-23"
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.)".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.extra_rdoc_files = ["README.md".freeze, "lib/active_record/database_mutex.rb".freeze, "lib/active_record/database_mutex/implementation.rb".freeze, "lib/active_record/database_mutex/version.rb".freeze, "lib/active_record/mutex.rb".freeze, "lib/active_record_mutex.rb".freeze]
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.homepage = "http://github.com/flori/active_record_mutex".freeze
17
17
  s.licenses = ["GPL-2".freeze]
18
18
  s.rdoc_options = ["--title".freeze, "ActiveRecordMutex - Implementation of a Mutex for Active Record".freeze, "--main".freeze, "README.md".freeze]
19
- s.rubygems_version = "2.6.4".freeze
19
+ s.rubygems_version = "2.6.7".freeze
20
20
  s.summary = "Implementation of a Mutex for Active Record".freeze
21
21
  s.test_files = ["test/database_mutex_test.rb".freeze, "test/test_helper.rb".freeze]
22
22
 
@@ -30,7 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
31
31
  s.add_runtime_dependency(%q<mysql2>.freeze, ["~> 0.3.0"])
32
32
  s.add_runtime_dependency(%q<activerecord>.freeze, ["~> 4.0"])
33
- s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.12.0"])
33
+ s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.12"])
34
34
  else
35
35
  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.7.1"])
36
36
  s.add_dependency(%q<test-unit>.freeze, ["~> 3.0"])
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
39
39
  s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.0"])
40
40
  s.add_dependency(%q<activerecord>.freeze, ["~> 4.0"])
41
- s.add_dependency(%q<tins>.freeze, ["~> 1.12.0"])
41
+ s.add_dependency(%q<tins>.freeze, ["~> 1.12"])
42
42
  end
43
43
  else
44
44
  s.add_dependency(%q<gem_hadar>.freeze, ["~> 1.7.1"])
@@ -47,6 +47,6 @@ Gem::Specification.new do |s|
47
47
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
48
48
  s.add_dependency(%q<mysql2>.freeze, ["~> 0.3.0"])
49
49
  s.add_dependency(%q<activerecord>.freeze, ["~> 4.0"])
50
- s.add_dependency(%q<tins>.freeze, ["~> 1.12.0"])
50
+ s.add_dependency(%q<tins>.freeze, ["~> 1.12"])
51
51
  end
52
52
  end
@@ -6,29 +6,25 @@ module ActiveRecord
6
6
  class Implementation
7
7
 
8
8
  class << self
9
- attr_accessor :table_name
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
10
22
  end
11
- self.table_name = 'active_record_mutex_counters'
12
23
 
13
24
  # Creates a mutex with the name given with the option :name.
14
25
  def initialize(opts = {})
15
26
  @name = opts[:name] or raise ArgumentError, "mutex requires a :name argument"
16
- query %{
17
- CREATE TABLE IF NOT EXISTS #{table_name}
18
- (
19
- name CHAR(255) NOT NULL,
20
- counter INT UNSIGNED NOT NULL DEFAULT 1,
21
- PRIMARY KEY (name(128))
22
- ) DEFAULT CHARSET=utf8mb4
23
- }
24
- end
25
-
26
- def table_name
27
- self.class.table_name
28
- end
29
-
30
- def db
31
- ActiveRecord::Base.connection
27
+ counter or raise ArgumentError, 'argument :name is too long'
32
28
  end
33
29
 
34
30
  # Returns the name of this mutex as given as a constructor argument.
@@ -86,7 +82,7 @@ module ActiveRecord
86
82
  if aquired_lock?
87
83
  decrease_counter
88
84
  if counter_zero?
89
- case query %{ SELECT RELEASE_LOCK(#{quote(name)}) }
85
+ case query("SELECT RELEASE_LOCK(#{quote(name)})")
90
86
  when 1
91
87
  true
92
88
  when 0, nil
@@ -109,7 +105,7 @@ module ActiveRecord
109
105
 
110
106
  # Returns true if this mutex is unlocked at the moment.
111
107
  def unlocked?
112
- query(%{ SELECT IS_FREE_LOCK(#{quote(name)}) }).to_i == 1
108
+ query("SELECT IS_FREE_LOCK(#{quote(name)})") == 1
113
109
  end
114
110
 
115
111
  # Returns true if this mutex is locked at the moment.
@@ -140,26 +136,24 @@ module ActiveRecord
140
136
  ActiveRecord::Base.connection.quote(value)
141
137
  end
142
138
 
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
+
143
147
  def increase_counter
144
- query %{
145
- INSERT INTO #{table_name} (name)
146
- VALUES (#{quote(@name)})
147
- ON DUPLICATE KEY UPDATE counter = counter + 1
148
- }
148
+ query("SET #{counter} = IF(#{counter} IS NULL OR #{counter} = 0, 1, #{counter} + 1)")
149
149
  end
150
150
 
151
151
  def decrease_counter
152
- query %{
153
- UPDATE #{table_name} SET counter = counter - 1
154
- WHERE name = #{quote(@name)}
155
- }
152
+ query("SET #{counter} = #{counter} - 1")
156
153
  end
157
154
 
158
155
  def counter_value
159
- query(%{
160
- SELECT counter FROM #{table_name}
161
- WHERE name = #{quote(@name)}
162
- }).to_i
156
+ query("SELECT #{counter}").to_i
163
157
  end
164
158
 
165
159
  def counter_zero?
@@ -172,7 +166,7 @@ module ActiveRecord
172
166
  true
173
167
  else
174
168
  timeout = opts[:timeout] || 1
175
- case query %{ SELECT GET_LOCK(#{quote(name)}, #{timeout}) }
169
+ case query("SELECT GET_LOCK(#{quote(name)}, #{timeout})")
176
170
  when 1
177
171
  increase_counter
178
172
  true
@@ -184,13 +178,16 @@ module ActiveRecord
184
178
  end
185
179
  end
186
180
 
187
- def query(sql, index: 0)
188
- if row = db.select_rows(sql).first
189
- value = index ? row[index] : row
190
- $DEBUG and warn %{query("#{sql}", #{index.inspect}) = #{value.inspect}}
191
- value
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}}
192
185
  end
186
+ result
187
+ rescue ActiveRecord::StatementInvalid
188
+ nil
193
189
  end
194
190
  end
195
191
  end
196
192
  end
193
+
@@ -1,6 +1,6 @@
1
1
  module ActiveRecord::DatabaseMutex
2
2
  # ActiveRecord::DatabaseMutex version
3
- VERSION = '2.3.8'
3
+ VERSION = '2.4.0'
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,4 +146,9 @@ 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
149
154
  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.8
4
+ version: 2.4.0
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-09-07 00:00:00.000000000 Z
11
+ date: 2016-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 1.12.0
103
+ version: '1.12'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 1.12.0
110
+ version: '1.12'
111
111
  description: Mutex that can be used to synchronise ruby processes via an ActiveRecord
112
112
  datababase connection. (Only Mysql is supported at the moment.)
113
113
  email: flori@ping.de
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
160
  version: '0'
161
161
  requirements: []
162
162
  rubyforge_project:
163
- rubygems_version: 2.6.4
163
+ rubygems_version: 2.6.7
164
164
  signing_key:
165
165
  specification_version: 4
166
166
  summary: Implementation of a Mutex for Active Record