q4m 0.0.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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/q4m.rb +130 -0
- data/test/helper.rb +10 -0
- data/test/test_q4m.rb +7 -0
- metadata +90 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 kazuyoshi tlacaelel
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= q4m
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 kazuyoshi tlacaelel. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "q4m"
|
8
|
+
gem.summary = %Q{Queue job for the Q4M MySQL engine}
|
9
|
+
gem.description = %Q{Interface to pragmatically setup a queue job for Q4M!}
|
10
|
+
gem.email = "kazu.dev@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/ktlacaelel/q4m"
|
12
|
+
gem.authors = ["kazuyoshi tlacaelel"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "q4m #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/lib/q4m.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mysql'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Q4m
|
6
|
+
|
7
|
+
module Queue
|
8
|
+
|
9
|
+
class Job
|
10
|
+
|
11
|
+
# Job initializer.
|
12
|
+
#
|
13
|
+
# ::mysql:: a Mysql instance
|
14
|
+
# ::log:: a Logger instance
|
15
|
+
#
|
16
|
+
def initialize mysql, log
|
17
|
+
@mysql, @log = mysql, log
|
18
|
+
look_for_jobs!
|
19
|
+
end
|
20
|
+
|
21
|
+
# Job runner.
|
22
|
+
#
|
23
|
+
# - Locks the queue.
|
24
|
+
# - Executes the latest job.
|
25
|
+
# - Restores the queue so other worker can execute a process.
|
26
|
+
#
|
27
|
+
def run
|
28
|
+
return unless @has_jobs
|
29
|
+
queue_wait
|
30
|
+
execute latest_job
|
31
|
+
queue_end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Job availability checker.
|
37
|
+
#
|
38
|
+
# Check if queue has any jobs.
|
39
|
+
#
|
40
|
+
def look_for_jobs!
|
41
|
+
@has_jobs = true
|
42
|
+
@mysql.query("select count(*) from #{table_name}").each do |queue|
|
43
|
+
if queue == ['0']
|
44
|
+
@has_jobs = false
|
45
|
+
@log.warn 'No job in queue'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
# Latest job fetcher.
|
53
|
+
#
|
54
|
+
# Retrives one mysql record representing a queue-job.
|
55
|
+
#
|
56
|
+
def latest_job
|
57
|
+
@mysql.query("select * from #{table_name}").each do |job|
|
58
|
+
return job
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Job locker.
|
63
|
+
#
|
64
|
+
# Tells the queue to operate in locked mode. By pulling out the
|
65
|
+
# latest job, and locking the whole queue-stack.
|
66
|
+
#
|
67
|
+
# When anyone tries to pull jobs from the queue the very same
|
68
|
+
# job will be returned until the queue status is changed with
|
69
|
+
# one of the following options:
|
70
|
+
#
|
71
|
+
# - terminated (queue_end)
|
72
|
+
# - aborted (queue_abort)
|
73
|
+
#
|
74
|
+
def queue_wait
|
75
|
+
@mysql.query "select queue_wait('#{table_name}')"
|
76
|
+
end
|
77
|
+
|
78
|
+
# Job unlocker.
|
79
|
+
#
|
80
|
+
# Tells the q4m engine that this job is terminated. Then mysql
|
81
|
+
# will internally delete the job from the queue/database.
|
82
|
+
#
|
83
|
+
# Once this is done all jobs will be available until someone
|
84
|
+
# locks the queue again.
|
85
|
+
#
|
86
|
+
def queue_end
|
87
|
+
@mysql.query 'select queue_end()'
|
88
|
+
end
|
89
|
+
|
90
|
+
# Job rollback.
|
91
|
+
#
|
92
|
+
# This method should be executed after the queue has been locked
|
93
|
+
# only!
|
94
|
+
#
|
95
|
+
# If executed, it'll tell the engine that the job failed to be
|
96
|
+
# terminated and should stay in the queue for later processing.
|
97
|
+
#
|
98
|
+
# When this happens the job is restored to the queue for later
|
99
|
+
# processing. But you should still unlock the queue so it can
|
100
|
+
# start serving other workers
|
101
|
+
#
|
102
|
+
def queue_abort
|
103
|
+
@mysql.query 'select queue_abort()'
|
104
|
+
end
|
105
|
+
|
106
|
+
# Job table name.
|
107
|
+
#
|
108
|
+
# This method is here so child classes should define the tablename
|
109
|
+
# that they pull out jobs from!
|
110
|
+
#
|
111
|
+
# TODO: resolve tablename by underscoring child-class name.
|
112
|
+
#
|
113
|
+
def table_name
|
114
|
+
raise 'Must implement in a child class!'
|
115
|
+
end
|
116
|
+
|
117
|
+
# Job execution.
|
118
|
+
#
|
119
|
+
# Child classes should define how exactly the job is to be
|
120
|
+
# executed!
|
121
|
+
#
|
122
|
+
def execute job
|
123
|
+
raise 'Must implement in a child class!'
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
data/test/helper.rb
ADDED
data/test/test_q4m.rb
ADDED
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: q4m
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- kazuyoshi tlacaelel
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-04 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: thoughtbot-shoulda
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
description: Interface to pragmatically setup a queue job for Q4M!
|
36
|
+
email: kazu.dev@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.rdoc
|
44
|
+
files:
|
45
|
+
- .document
|
46
|
+
- .gitignore
|
47
|
+
- LICENSE
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- lib/q4m.rb
|
52
|
+
- test/helper.rb
|
53
|
+
- test/test_q4m.rb
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://github.com/ktlacaelel/q4m
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --charset=UTF-8
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 3
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
version: "0"
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
requirements: []
|
82
|
+
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 1.3.7
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Queue job for the Q4M MySQL engine
|
88
|
+
test_files:
|
89
|
+
- test/helper.rb
|
90
|
+
- test/test_q4m.rb
|