summaryrefslogtreecommitdiff
path: root/api.js
diff options
context:
space:
mode:
Diffstat (limited to 'api.js')
-rw-r--r--api.js34
1 files changed, 12 insertions, 22 deletions
diff --git a/api.js b/api.js
index be754db..f141a17 100644
--- a/api.js
+++ b/api.js
@@ -161,9 +161,8 @@ async function playerById(id) {
return undefined;
}
/* returns true if a player has pending jobs */
-async function anyJobsRunningFor(name, id) {
- var raw = await pool_raw.connect();
- result = await raw.query(`
+async function anyJobsRunningFor(con, name, id) {
+ result = await con.query(`
SELECT COUNT(*)>0 AS jobs_running FROM jobs
WHERE
(
@@ -172,7 +171,6 @@ async function anyJobsRunningFor(name, id) {
(type='compile' AND payload->>'type'='player' AND payload->>'id'=$2)
) AND status<>'finished' AND status<>'failed'
`, [name, id]); // TODO improve dependency tracking
- raw.release();
return result.rows[0].jobs_running;
}
@@ -181,23 +179,13 @@ async function anyJobsRunningFor(name, id) {
/* upsert a job */
async function upsertGrabjob(payload) {
var raw = await pool_raw.connect(),
- job;
+ job, jobs_running;
- // find and prioritize existing jobs
- job = await db_serialized(raw, `
- UPDATE jobs SET priority=0
- WHERE
- (
- (type='grab' AND payload=$1) OR
- (type='process' AND payload->>'playername'=$1->'params'->>'filter[playerNames]') OR
- (type='compile' AND payload->>'type'='player' AND payload->>'id'=$1->'params'->>'filter[playerIds]')
- ) AND status<>'finished' AND status<>'failed'
- RETURNING id
- `, [payload]);
- // TODO job dependency information format on jobs is shit
- // (2.0)
+ jobs_running = await anyJobsRunningFor(raw,
+ [payload.params["filter[playerNames]"],
+ payload.params["filter[playerIds]"]])
- if (job.rows.length == 0) {
+ if (!jobs_running) {
// this job is currently not running, insert it
job = await db_serialized(raw, `
INSERT INTO jobs(type, payload, priority)
@@ -210,7 +198,6 @@ async function upsertGrabjob(payload) {
}
raw.release();
- return job.rows[0];
}
async function playerRequestUpdate(name, id) {
@@ -294,6 +281,7 @@ async function listen() {
var raw = await pool_raw.connect(),
jobs;
+ await raw.query("BEGIN"); // TODO catch error & rollback
// find all interesting jobs, delete them & forward their notification
if (msg.channel == "grab_failed") {
jobs = await raw.query(`
@@ -328,7 +316,6 @@ async function listen() {
`);
}
- raw.release();
if (jobs == undefined) return; // nothing to do
// forward notification to all playername / playerid channels
@@ -345,11 +332,14 @@ async function listen() {
if (player == undefined) throw "player had a job, but doesn't exist";
io.emit(player.name, msg.channel);
io.emit(player.id, msg.channel);
- if (!await anyJobsRunningFor(player.name, player.id)) {
+ if (!await anyJobsRunningFor(raw, player.name, player.id)) {
io.emit(player.name, "done");
io.emit(player.id, "done");
}
}
+
+ await raw.query("COMMIT");
+ raw.release();
});
client.query("LISTEN process_finished");
client.query("LISTEN compile_finished");