diff sciworkerd/sciworkerd.c @ 20:f98ea578b1ef

misc: revamp database
author David Demelier <markand@malikania.fr>
date Tue, 19 Jul 2022 21:52:42 +0200
parents de4bf839b565
children 2cb228f23f53
line wrap: on
line diff
--- a/sciworkerd/sciworkerd.c	Fri Jul 15 11:11:48 2022 +0200
+++ b/sciworkerd/sciworkerd.c	Tue Jul 19 21:52:42 2022 +0200
@@ -78,24 +78,18 @@
 }
 
 static void
-merge(json_t *doc)
+merge(const struct job *jobs, size_t jobsz)
 {
-	struct job jobs[SCI_JOB_LIST_MAX];
-	ssize_t jobsz;
 	size_t total = 0;
 
-	if ((jobsz = job_from(jobs, UTIL_SIZE(jobs), doc)) < 0)
-		log_warn(TAG "error while parsing jobs: %s", strerror(errno));
-	else {
-		for (ssize_t i = 0; i < jobsz; ++i) {
-			if (!pending(jobs[i].id)) {
-				queue(&jobs[i]);
-				total++;
-			}
+	for (ssize_t i = 0; i < jobsz; ++i) {
+		if (!pending(jobs[i].id)) {
+			queue(&jobs[i]);
+			total++;
 		}
+	}
 
-		log_info(TAG "added %zu new pending tasks", total);
-	}
+	log_info(TAG "added %zu new pending tasks", total);
 }
 
 /*
@@ -106,7 +100,9 @@
 {
 	static time_t startup;
 	time_t now;
-	struct apicreq req;
+	struct apic req;
+	struct job todo[SCI_JOB_LIST_MAX];
+	ssize_t todosz;
 
 	if (!startup)
 		startup = time(NULL);
@@ -114,12 +110,12 @@
 	if (difftime((now = time(NULL)), startup) >= sciworkerd.fetchinterval) {
 		startup = now;
 
-		if (apic_get(&req, "%s/api/v1/%s", sciworkerd.url, sciworkerd.name) < 0)
+		if ((todosz = apic_job_todo(&req, todo, UTIL_SIZE(todo), worker.id)) < 0)
 			log_warn(TAG "unable to fetch jobs: %s", req.error);
-		if (req.doc) {
-			merge(req.doc);
-			json_decref(req.doc);
-		}
+		else
+			merge(todo, todosz);
+
+		apic_finish(&req);
 	}
 }
 
@@ -129,20 +125,18 @@
 static void
 fetch_worker(void)
 {
-	struct apicreq req;
+	struct apic req;
 
-	if (apic_get(&req, "%s/api/v1/workers/%s", sciworkerd.url, sciworkerd.name) < 0)
-		log_warn(TAG "unable to fetch worker info: %s", req.error);
-	if (!req.doc)
-		log_die(TAG "empty worker response");
-	if (worker_from(&worker, 1, req.doc) < 0)
-		log_die(TAG "unable to parse worker", strerror(errno));
+	util_strlcpy(&worker.name, sciworkerd.name);
+
+	if (apic_worker_find(&req, &worker) < 0)
+		log_die(TAG, "unable to fetch worker info: %s", req.error);
 
 	log_info("worker id: %d", worker.id);
 	log_info("worker name: %s", worker.name);
 	log_info("worker description: %s", worker.desc);
 
-	json_decref(req.doc);
+	apic_finish(&req);
 }
 
 /*
@@ -151,14 +145,18 @@
 static int
 fetch_project(struct project *project, int id)
 {
-	struct apicreq req;
+	struct apic req;
 
+	if (apic_project_find_id(&req, project, id) < 0)
+		return -1;
+#if 0
 	if (apic_get(&req, "%s/api/v1/projects/%d", id) < 0)
 		return log_warn(TAG "unable to fetch project info: %s", req.error), -1;
 	if (!req.doc)
 		return log_warn(TAG "empty project response"), -1;
 	if (project_from(project, 1, req.doc) < 0)
 		return log_warn(TAG "unable to parse project: %s", strerror(errno)), -1;
+#endif
 
 	return 0;
 }
@@ -182,10 +180,11 @@
 static int
 start(struct taskentry *entry)
 {
+	struct apic;
 	struct project project;
 	pid_t pid;
 
-	if (fetch_project(&project, entry->job.project_id) < 0)
+	if (apic_project_find_id(&project, entry->job.project_id) < 0)
 		return log_warn(TAG "unable to fetch project, dropping task"), -1;
 	if (task_setup(entry->task, project.script) < 0)
 		return log_warn(TAG "unable to setup script code: %s, dropping task", strerror(errno)), -1;