Files
2022-12-07 04:43:36 +01:00

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)
}
}