From 782839751b27bb9954a18d1f24857d5b5ecf0628 Mon Sep 17 00:00:00 2001
From: Donald Buczek <buczek@molgen.mpg.de>
Date: Sun, 18 Aug 2024 16:54:53 +0200
Subject: [PATCH] mxqkill: Factor out some common code

---
 mxqkill.c | 83 +++++++++++++++++++++----------------------------------
 1 file changed, 32 insertions(+), 51 deletions(-)

diff --git a/mxqkill.c b/mxqkill.c
index 87225f4..2615866 100644
--- a/mxqkill.c
+++ b/mxqkill.c
@@ -81,14 +81,31 @@ static void print_usage(void)
     );
 }
 
+static struct mx_mysql_stmt *mysql_prepare_or_die(struct mx_mysql *mysql, char *sql) {
+    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql, sql);
+    if (stmt == NULL)
+        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
+    return stmt;
+}
+
+static unsigned long long int mysql_execute_or_die(struct mx_mysql_stmt *stmt) {
+    unsigned long long num_rows;
+    if (mx_mysql_statement_execute(stmt, &num_rows) < 0)
+        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
+    mx_mysql_statement_close(&stmt);
+    return num_rows;
+}
+
+static unsigned long long int mysql_prepare_and_execute_or_die(struct mx_mysql *mysql, char *sql) {
+    return mysql_execute_or_die(mysql_prepare_or_die(mysql, sql));
+}
+
 static void verify_job_owner(struct mx_mysql *mysql, uint64_t job_id, uint64_t user_uid) {
-    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql,
+    struct mx_mysql_stmt *stmt = mysql_prepare_or_die(mysql,
         "SELECT user_uid FROM mxq_job, mxq_group"
         " WHERE mxq_job.group_id = mxq_group.group_id"
         " AND job_id = ?"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
 
     mx_mysql_statement_param_bind(stmt, 0, uint64, &job_id);
 
@@ -114,23 +131,16 @@ static void verify_job_owner(struct mx_mysql *mysql, uint64_t job_id, uint64_t u
 }
 
 static void set_job_cancelled(struct mx_mysql *mysql, uint64_t job_id) {
-    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql,
+    struct mx_mysql_stmt *stmt = mysql_prepare_or_die(mysql,
             "UPDATE mxq_job SET job_cancelled = TRUE"
             " WHERE job_id = ?"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
 
     mx_mysql_statement_param_bind(stmt, 0, uint64, &job_id);
 
-    unsigned long long num_rows;
-    int res = mx_mysql_statement_execute(stmt, &num_rows);
-    if (res < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
+    unsigned long long num_rows = mysql_execute_or_die(stmt);
     if (num_rows == 0)
         mx_die("no such job_id %lu\n", job_id);
-
-    mx_mysql_statement_close(&stmt);
 }
 
 static void cancel_job(struct mx_mysql *mysql, uint64_t job_id, uint64_t user_uid) {
@@ -140,12 +150,10 @@ static void cancel_job(struct mx_mysql *mysql, uint64_t job_id, uint64_t user_ui
 }
 
 static void verify_group_owner(struct mx_mysql *mysql, uint64_t group_id, uint64_t user_uid) {
-    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql,
+    struct mx_mysql_stmt *stmt = mysql_prepare_or_die(mysql,
         "SELECT user_uid FROM mxq_group"
         "  WHERE group_id = ?"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
 
     mx_mysql_statement_param_bind(stmt, 0, uint64, &group_id);
 
@@ -171,43 +179,30 @@ static void verify_group_owner(struct mx_mysql *mysql, uint64_t group_id, uint64
 }
 
 static void set_group_cancelled(struct mx_mysql *mysql, uint64_t group_id) {
-    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql,
+    struct mx_mysql_stmt *stmt = mysql_prepare_or_die(mysql,
             "UPDATE mxq_group SET group_status = " status_str(MXQ_GROUP_STATUS_CANCELLED)
             " WHERE group_id = ?"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
 
     mx_mysql_statement_param_bind(stmt, 0, uint64, &group_id);
 
-    unsigned long long num_rows;
-    int res = mx_mysql_statement_execute(stmt, &num_rows);
-    if (res < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
+    unsigned long long num_rows = mysql_execute_or_die(stmt);
     if (num_rows == 0)
         mx_die("no such group_id %lu\n", group_id);
-
-    mx_mysql_statement_close(&stmt);
 }
 
 static void cancel_pending_jobs(struct mx_mysql *mysql, uint64_t group_id) {
-    struct mx_mysql_stmt *stmt = mx_mysql_statement_prepare(mysql,
+    struct mx_mysql_stmt *stmt = mysql_prepare_or_die(mysql,
             "UPDATE mxq_job SET job_cancelled = TRUE"
             "  WHERE group_id = ?"
             "  AND job_status = " status_str(MXQ_JOB_STATUS_INQ)
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
 
     mx_mysql_statement_param_bind(stmt, 0, uint64, &group_id);
 
-    unsigned long long num_rows;
-    int res = mx_mysql_statement_execute(stmt, &num_rows);
-    if (res < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
+    unsigned long long num_rows = mysql_execute_or_die(stmt);
     if (num_rows)
         mx_log_notice("cancelled %llu jobs in group with group_id=%lu", num_rows, group_id);
-    mx_mysql_statement_close(&stmt);
 }
 
 static void cancel_group(struct mx_mysql *mysql, uint64_t group_id, uint64_t user_uid) {
@@ -229,16 +224,11 @@ static void cancel_all_jobs(struct mx_mysql *mysql, uint64_t user_uid) {
      * statement. mxq_group is implicitly updated by the triggers when we
      * update mxq_job. */
 
-    stmt = mx_mysql_statement_prepare(mysql,
+    mysql_prepare_and_execute_or_die(mysql,
             "CREATE TEMPORARY TABLE j (job_id INT8 UNSIGNED NOT NULL PRIMARY KEY)"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
-    if (mx_mysql_statement_execute(stmt, NULL) < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
-    mx_mysql_statement_close(&stmt);
 
-    stmt = mx_mysql_statement_prepare(mysql,
+    stmt = mysql_prepare_or_die(mysql,
             "INSERT INTO j(job_id)"
             "  SELECT mxq_job.job_id FROM mxq_job,mxq_group"
             "  WHERE mxq_job.group_id = mxq_group.group_id"
@@ -250,17 +240,14 @@ static void cancel_all_jobs(struct mx_mysql *mysql, uint64_t user_uid) {
                      status_str(MXQ_JOB_STATUS_RUNNING)
             "  )"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
     mx_mysql_statement_param_bind(stmt, 0, uint64, &user_uid);
-    if (mx_mysql_statement_execute(stmt, &num_rows) < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
-    mx_mysql_statement_close(&stmt);
+    num_rows = mysql_execute_or_die(stmt);
     if (num_rows == 0) {
         mx_log_notice("no running or pending jobs");
         return;
     }
-    stmt = mx_mysql_statement_prepare(mysql,
+
+    num_rows = mysql_prepare_and_execute_or_die(mysql,
             "UPDATE mxq_job"
             "  SET job_cancelled=TRUE"
             "  WHERE job_id in (SELECT * from j)"
@@ -271,12 +258,6 @@ static void cancel_all_jobs(struct mx_mysql *mysql, uint64_t user_uid) {
                      status_str(MXQ_JOB_STATUS_RUNNING)
             "  )"
     );
-    if (!stmt)
-        mx_die("mx_mysql_statement_prepare(): %s\n", mx_mysql_error());
-    if (mx_mysql_statement_execute(stmt, &num_rows) < 0)
-        mx_die("mx_mysql_statement_execute(): %s\n", mx_mysql_error());
-    mx_mysql_statement_close(&stmt);
-
     if (num_rows == 0)
         mx_log_notice("no running or pending jobs");
     else