Bug 7143: Update about page for new dev - Pongtawat Chippimolchai
[koha.git] / C4 / BackgroundJob.pm
blobf607340f12cf410b983ab6c54dca8aca227c1dc1
1 package C4::BackgroundJob;
3 # Copyright (C) 2007 LibLime
4 # Galen Charlton <galen.charlton@liblime.com>
6 # This file is part of Koha.
8 # Koha is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 3 of the License, or
11 # (at your option) any later version.
13 # Koha is distributed in the hope that it will be useful, but
14 # WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with Koha; if not, see <http://www.gnu.org/licenses>.
21 use strict;
22 #use warnings; FIXME - Bug 2505
23 use C4::Context;
24 use C4::Auth qw/get_session/;
25 use Digest::MD5;
29 =head1 NAME
31 C4::BackgroundJob - manage long-running jobs
32 initiated from the web staff interface
34 =head1 SYNOPSIS
36 # start tracking a job
37 my $job = C4::BackgroundJob->new($sessionID, $job_name, $job_invoker, $num_work_units);
38 my $jobID = $job->id();
39 $job->progress($work_units_processed);
40 $job->finish($job_result_hashref);
42 # get status and results of a job
43 my $job = C4::BackgroundJob->fetch($sessionID, $jobID);
44 my $max_work_units = $job->size();
45 my $work_units_processed = $job->progress();
46 my $job_status = $job->status();
47 my $job_name = $job->name();
48 my $job_invoker = $job->invoker();
49 my $results_hashref = $job->results();
51 This module manages tracking the progress and results
52 of (potentially) long-running jobs initiated from
53 the staff user interface. Such jobs can include
54 batch MARC and patron record imports.
56 =head1 METHODS
58 =head2 new
60 my $job = C4::BackgroundJob->new($sessionID, $job_name, $job_invoker, $num_work_units);
62 Create a new job object and set its status to 'running'. C<$num_work_units>
63 should be a number representing the size of the job; the units of the
64 job size are up to the caller and could be number of records,
65 number of bytes, etc.
67 =cut
69 sub new {
70 my $class = shift;
71 my ($sessionID, $job_name, $job_invoker, $num_work_units) = @_;
73 my $self = {};
74 $self->{'sessionID'} = $sessionID;
75 $self->{'name'} = $job_name;
76 $self->{'invoker'} = $job_invoker;
77 $self->{'size'} = $num_work_units;
78 $self->{'progress'} = 0;
79 $self->{'status'} = "running";
80 $self->{'jobID'} = Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().{}.$$));
81 $self->{'extra_values'} = {};
83 bless $self, $class;
84 $self->_serialize();
86 return $self;
89 # store object in CGI session
90 sub _serialize {
91 my $self = shift;
93 my $prefix = "job_" . $self->{'jobID'};
94 my $session = get_session($self->{'sessionID'});
95 $session->param($prefix, $self);
96 $session->flush();
99 =head2 id
101 my $jobID = $job->id();
103 Read-only accessor for job ID.
105 =cut
107 sub id {
108 my $self = shift;
109 return $self->{'jobID'};
112 =head2 name
114 my $name = $job->name();
115 $job->name($name);
117 Read/write accessor for job name.
119 =cut
121 sub name {
122 my $self = shift;
123 if (@_) {
124 $self->{'name'} = shift;
125 $self->_serialize();
126 } else {
127 return $self->{'name'};
131 =head2 invoker
133 my $invoker = $job->invoker();
134 i $job->invoker($invoker);
136 Read/write accessor for job invoker.
138 =cut
140 sub invoker {
141 my $self = shift;
142 if (@_) {
143 $self->{'invoker'} = shift;
144 $self->_serialize();
145 } else {
146 return $self->{'invoker'};
150 =head2 progress
152 my $progress = $job->progress();
153 $job->progress($progress);
155 Read/write accessor for job progress.
157 =cut
159 sub progress {
160 my $self = shift;
161 if (@_) {
162 $self->{'progress'} = shift;
163 $self->_serialize();
164 } else {
165 return $self->{'progress'};
169 =head2 status
171 my $status = $job->status();
173 Read-only accessor for job status.
175 =cut
177 sub status {
178 my $self = shift;
179 return $self->{'status'};
182 =head2 size
184 my $size = $job->size();
185 $job->size($size);
187 Read/write accessor for job size.
189 =cut
191 sub size {
192 my $self = shift;
193 if (@_) {
194 $self->{'size'} = shift;
195 $self->_serialize();
196 } else {
197 return $self->{'size'};
201 =head2 finish
203 $job->finish($results_hashref);
205 Mark the job as finished, setting its status to 'completed'.
206 C<$results_hashref> should be a reference to a hash containing
207 the results of the job.
209 =cut
211 sub finish {
212 my $self = shift;
213 my $results_hashref = shift;
214 $self->{'status'} = 'completed';
215 $self->{'results'} = $results_hashref;
216 $self->_serialize();
219 =head2 results
221 my $results_hashref = $job->results();
223 Retrieve the results of the current job. Returns undef
224 if the job status is not 'completed'.
226 =cut
228 sub results {
229 my $self = shift;
230 return unless $self->{'status'} eq 'completed';
231 return $self->{'results'};
234 =head2 fetch
236 my $job = C4::BackgroundJob->fetch($sessionID, $jobID);
238 Retrieve a job that has been serialized to the database.
239 Returns C<undef> if the job does not exist in the current
240 session.
242 =cut
244 sub fetch {
245 my $class = shift;
246 my $sessionID = shift;
247 my $jobID = shift;
249 my $session = get_session($sessionID);
250 my $prefix = "job_$jobID";
251 unless (defined $session->param($prefix)) {
252 return;
254 my $self = $session->param($prefix);
255 bless $self, $class;
256 return $self;
259 =head2 set
261 =over 4
263 =item $job->set($hashref);
265 =back
267 Set some variables into the hashref.
268 These variables can be retrieved using the get method.
270 =cut
272 sub set {
273 my ($self, $hashref) = @_;
274 while ( my ($k, $v) = each %$hashref ) {
275 $self->{extra_values}->{$k} = $v;
277 $self->_serialize();
278 return;
281 =head2 get
283 =over 4
285 =item $value = $job->get($key);
287 =back
289 Get a variable which has been previously stored with the set method.
291 =cut
293 sub get {
294 my ($self, $key) = @_;
295 return $self->{extra_values}->{$key};
299 =head2 clear
301 =over 4
303 =item $job->clear();
305 =back
307 Clear the job from the current session.
309 =cut
311 sub clear {
312 my $self = shift;
313 get_session($self->{sessionID})->clear('job_' . $self->{jobID});
318 __END__
320 =head1 AUTHOR
322 Koha Development Team <http://koha-community.org/>
324 Galen Charlton <galen.charlton@liblime.com>
326 =cut