db_lock 0.8.0 → 0.8.1
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 +4 -4
- data/lib/db_lock.rb +1 -38
- data/lib/db_lock/lock.rb +49 -0
- data/lib/db_lock/version.rb +1 -1
- metadata +19 -6
- data/config/database_mssql_example.yml +0 -17
- data/config/database_mysql_example.yml +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a421d9ec42cc7b443b198621952641959bb9726af41c3e76a7d5ce5e5e974fc0
|
4
|
+
data.tar.gz: d4b509db240d13dc43d1125b3ce57a868f8e2b812aca3b42d8939ddbf2c71503
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 627cb66c61e7af78f1a8ace1e1eff8722561e7d8a9704ad0443ca9a7aeb774ec2cf83747598dcbca429fe9bd3e83841b6a2ff1eeb0a95834d319e35108e46fd4
|
7
|
+
data.tar.gz: 23cc2e806437a6b745391e1eedb4fb930bc8d32a5557426b5e4bb950934dd6b3229d2e2ed38f74bff4f453f457ae91ec2d73020e14867cbf04a8059eb86472ad
|
data/lib/db_lock.rb
CHANGED
@@ -4,6 +4,7 @@ module DBLock
|
|
4
4
|
extend self
|
5
5
|
|
6
6
|
autoload :Adapter, 'db_lock/adapter'
|
7
|
+
autoload :Lock, 'db_lock/lock'
|
7
8
|
|
8
9
|
class AlreadyLocked < StandardError; end
|
9
10
|
|
@@ -13,42 +14,4 @@ module DBLock
|
|
13
14
|
# this must be an active record base object or subclass
|
14
15
|
@db_handler || ActiveRecord::Base
|
15
16
|
end
|
16
|
-
|
17
|
-
module Lock
|
18
|
-
extend self
|
19
|
-
def get(name, timeout = 0)
|
20
|
-
timeout = timeout.to_f # catches nil
|
21
|
-
timeout = 0 if timeout.negative?
|
22
|
-
raise "Invalid lock name: #{name.inspect}" if name.empty?
|
23
|
-
raise AlreadyLocked, 'Already lock in progress' if locked?
|
24
|
-
|
25
|
-
name = generate_lock_name(name)
|
26
|
-
|
27
|
-
if Adapter.lock(name, timeout)
|
28
|
-
@locked = true
|
29
|
-
yield
|
30
|
-
else
|
31
|
-
raise AlreadyLocked, "Unable to obtain lock '#{name}' within #{timeout} seconds" unless locked?
|
32
|
-
end
|
33
|
-
ensure
|
34
|
-
Adapter.release(name) if locked?
|
35
|
-
@locked = false
|
36
|
-
end
|
37
|
-
|
38
|
-
def locked?
|
39
|
-
@locked ||= false
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def generate_lock_name(name)
|
45
|
-
name = "#{Rails.application.class.parent_name}.#{Rails.env}#{name}" if name[0] == '.' && defined? Rails
|
46
|
-
# reduce lock names of > 64 chars in size
|
47
|
-
# MySQL 5.7 only supports 64 chars max, there might be similar limitations elsewhere
|
48
|
-
if name.length > 64
|
49
|
-
name = "#{name.chars.first(15).join}-#{Digest::MD5.hexdigest(name)}-#{name.chars.last(15).join}"
|
50
|
-
end
|
51
|
-
name
|
52
|
-
end
|
53
|
-
end
|
54
17
|
end
|
data/lib/db_lock/lock.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module DBLock
|
4
|
+
module Lock
|
5
|
+
extend self
|
6
|
+
def get(name, timeout = 0)
|
7
|
+
timeout = timeout.to_f # catches nil
|
8
|
+
timeout = 0 if timeout.negative?
|
9
|
+
raise "Invalid lock name: #{name.inspect}" if name.empty?
|
10
|
+
raise AlreadyLocked, 'Already lock in progress' if locked?
|
11
|
+
|
12
|
+
name = generate_lock_name(name)
|
13
|
+
|
14
|
+
if Adapter.lock(name, timeout)
|
15
|
+
@locked = true
|
16
|
+
yield
|
17
|
+
else
|
18
|
+
raise AlreadyLocked, "Unable to obtain lock '#{name}' within #{timeout} seconds" unless locked?
|
19
|
+
end
|
20
|
+
ensure
|
21
|
+
Adapter.release(name) if locked?
|
22
|
+
@locked = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def locked?
|
26
|
+
@locked ||= false
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def generate_lock_name(name)
|
32
|
+
name = "#{rails_app_name}.#{Rails.env}#{name}" if name[0] == '.' && defined? Rails
|
33
|
+
# reduce lock names of > 64 chars in size
|
34
|
+
# MySQL 5.7 only supports 64 chars max, there might be similar limitations elsewhere
|
35
|
+
if name.length > 64
|
36
|
+
name = "#{name.chars.first(15).join}-#{Digest::MD5.hexdigest(name)}-#{name.chars.last(15).join}"
|
37
|
+
end
|
38
|
+
name
|
39
|
+
end
|
40
|
+
|
41
|
+
def rails_app_name
|
42
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('6.0.0')
|
43
|
+
Rails.application.class.module_parent_name
|
44
|
+
else
|
45
|
+
Rails.application.class.parent_name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/db_lock/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db_lock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mkon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - '='
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
53
|
+
version: 0.81.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - '='
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
60
|
+
version: 0.81.0
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rubocop-rspec
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - '='
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 1.37.1
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: simplecov
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
75
89
|
description: Obtain manual db locks to guard blocks of code from parallel execution.Currently
|
76
90
|
only supports mysql and ms-sql-server.
|
77
91
|
email:
|
@@ -82,13 +96,12 @@ extra_rdoc_files: []
|
|
82
96
|
files:
|
83
97
|
- MIT-LICENSE
|
84
98
|
- README.md
|
85
|
-
- config/database_mssql_example.yml
|
86
|
-
- config/database_mysql_example.yml
|
87
99
|
- lib/db_lock.rb
|
88
100
|
- lib/db_lock/adapter.rb
|
89
101
|
- lib/db_lock/adapter/base.rb
|
90
102
|
- lib/db_lock/adapter/mysql.rb
|
91
103
|
- lib/db_lock/adapter/sqlserver.rb
|
104
|
+
- lib/db_lock/lock.rb
|
92
105
|
- lib/db_lock/version.rb
|
93
106
|
homepage: https://github.com/mkon/db_lock
|
94
107
|
licenses:
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# rename/copy to database.yml and adjust to your local settings
|
2
|
-
|
3
|
-
base: &base
|
4
|
-
adapter: sqlserver
|
5
|
-
host: 192.168.99.100
|
6
|
-
port: 50012
|
7
|
-
encoding: utf8
|
8
|
-
reconnect: false
|
9
|
-
pool: 5
|
10
|
-
username: root
|
11
|
-
password: dummy
|
12
|
-
|
13
|
-
development:
|
14
|
-
<<: *base
|
15
|
-
|
16
|
-
test:
|
17
|
-
<<: *base
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# rename/copy to database.yml and adjust to your local settings
|
2
|
-
|
3
|
-
base: &base
|
4
|
-
adapter: mysql2
|
5
|
-
host: localhost
|
6
|
-
encoding: utf8
|
7
|
-
reconnect: false
|
8
|
-
pool: 5
|
9
|
-
username: root
|
10
|
-
password: dummy
|
11
|
-
|
12
|
-
development:
|
13
|
-
<<: *base
|
14
|
-
|
15
|
-
test:
|
16
|
-
<<: *base
|