120 lines
3.4 KiB
JavaScript
120 lines
3.4 KiB
JavaScript
const debug = require('debug')('app:batch')
|
|
// const db = require('../models/db')
|
|
|
|
function update(dbc, report, status, done) {
|
|
const reps = JSON.stringify(report)
|
|
debug('update', status, reps.length)
|
|
if (status === 'D' || status === 'F') {
|
|
dbc.query(
|
|
'UPDATE batch SET report=$1, job_state=$2, ended=now(), changed=now() WHERE id=$3',
|
|
[reps, status, report.id],
|
|
err => {
|
|
done(err)
|
|
}
|
|
)
|
|
} else {
|
|
dbc.query(
|
|
'UPDATE batch SET report=$1, changed=now() WHERE id=$2',
|
|
[reps, report.id],
|
|
err => {
|
|
done(err)
|
|
}
|
|
)
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
Report: function (jobName, threadId) {
|
|
this.id = 0
|
|
this.name = jobName
|
|
this.thread = threadId
|
|
this.warnings = 0
|
|
this.progress = {
|
|
total_percent: 0,
|
|
phase_name: '',
|
|
phase_percent: 0,
|
|
item_name: ''
|
|
}
|
|
this.trace = [] // here we push messages and errors
|
|
},
|
|
|
|
/**
|
|
* initializes batch tracker by adding a record to batch table
|
|
* @param job_name name of the job
|
|
* @param done (err, BatchId)
|
|
*/
|
|
init: function (dbc, report, done) {
|
|
debug('initializing', report)
|
|
dbc.query(
|
|
'INSERT INTO batch (job_name, job_state, thread, report) VALUES($1,$2,$3,$4) RETURNING id',
|
|
[report.name, 'R', report.thread, JSON.stringify(report)],
|
|
(err, result) => {
|
|
if (err) return done(err)
|
|
debug(result)
|
|
report.id = result.rows[0].id
|
|
done()
|
|
}
|
|
)
|
|
},
|
|
|
|
/**
|
|
* Close the batch by marking its status as completed and setting end_time.
|
|
* @param report object containing full batch report
|
|
* @param msg final message
|
|
* @param done
|
|
*/
|
|
finalize: function (dbc, report, msg, done) {
|
|
debug('finalizing', msg)
|
|
if (msg) report.trace.push(msg)
|
|
else report.trace.push('done')
|
|
update(dbc, report, 'D', done)
|
|
},
|
|
|
|
/**
|
|
* Report on phase. If phase name changes add new phase message to trace.
|
|
* @param report object containing full batch report
|
|
* @param phase name of phase
|
|
* @param percentJob percent (total for job)
|
|
* @param done
|
|
*/
|
|
reportPhase: function (dbc, report, phase, percentJob, done) {
|
|
debug('phase', phase, percentJob)
|
|
if (report.progress.phase_name !== phase) {
|
|
report.trace.push('starting phase ' + phase)
|
|
report.progress.phase_percent = 0
|
|
report.progress.item_name = ''
|
|
}
|
|
report.progress.phase_name = phase
|
|
report.progress.total_percent = percentJob
|
|
update(dbc, report, '', done)
|
|
},
|
|
|
|
/**
|
|
* Report on item processed. This is sublevel of phase
|
|
* @param report object containing full batch report
|
|
* @param item name of item
|
|
* @param percentPhase percent of current phase done
|
|
* @param done
|
|
*/
|
|
reportItem: function (dbc, report, item, percentPhase, done) {
|
|
debug('item', item, percentPhase)
|
|
report.progress.item_name = item
|
|
report.progress.phase_percent = percentPhase
|
|
update(dbc, report, '', done)
|
|
},
|
|
|
|
/**
|
|
* Report error during process and close batch with status Failed and setting end_time.
|
|
* @param report object containing full batch report
|
|
* @param err the error. If it contains stack it will be included in trace
|
|
* @param done
|
|
*/
|
|
fail: function (dbc, report, err, done) {
|
|
debug('fail', err)
|
|
if (err.stack) report.trace.push(err.stack)
|
|
else if (err.message) report.trace.push(err.message)
|
|
else report.trace.push(JSON.stringify(err))
|
|
update(dbc, report, 'F', done)
|
|
}
|
|
}
|