active_record_mutex 2.3.8 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
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