diff --git a/checkin_notes b/checkin_notes
index 23ee235dec..82665733e0 100644
--- a/checkin_notes
+++ b/checkin_notes
@@ -6007,3 +6007,11 @@ David 20 Sept 2012
MainDocument.cpp
client/
makefile_sim
+
+David 20 Sept 2012
+ - cancel_jobs tool: add --name option to cancel job by name.
+ From David Coss.
+
+ tools/
+ backend_lib.cpp,h
+ cancel_jobs.cpp
diff --git a/tools/backend_lib.cpp b/tools/backend_lib.cpp
index 4f79c48021..fa0073b7a6 100644
--- a/tools/backend_lib.cpp
+++ b/tools/backend_lib.cpp
@@ -517,6 +517,8 @@ int create_delete_file_msg(int host_id, const char* file_name) {
return 0;
}
+// cancel jobs in a range of workunit IDs
+//
int cancel_jobs(int min_id, int max_id) {
DB_WORKUNIT wu;
DB_RESULT result;
@@ -541,4 +543,32 @@ int cancel_jobs(int min_id, int max_id) {
return 0;
}
+// cancel a particular job
+//
+int cancel_job(DB_WORKUNIT& wu) {
+ DB_RESULT result;
+ char set_clause[256], where_clause[256];
+ int retval;
+
+ // cancel unsent results
+ //
+ sprintf(set_clause, "server_state=%d, outcome=%d",
+ RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_DIDNT_NEED
+ );
+ sprintf(where_clause, "server_state=%d and workunitid=%d",
+ RESULT_SERVER_STATE_UNSENT, wu.id
+ );
+ retval = result.update_fields_noid(set_clause, where_clause);
+ if (retval) return retval;
+
+ // cancel the workunit
+ //
+ sprintf(set_clause, "error_mask=error_mask|%d, transition_time=%d",
+ WU_ERROR_CANCELLED, (int)(time(0))
+ );
+ retval = wu.update_field(set_clause);
+ if (retval) return retval;
+ return 0;
+}
+
const char *BOINC_RCSID_b5f8b10eb5 = "$Id$";
diff --git a/tools/backend_lib.h b/tools/backend_lib.h
index c223956a8b..edb4480549 100644
--- a/tools/backend_lib.h
+++ b/tools/backend_lib.h
@@ -121,4 +121,8 @@ extern int create_delete_file_msg(
//
extern int cancel_jobs(int min_id, int max_id);
+// cancel a particular job
+//
+extern int cancel_job(DB_WORKUNIT&);
+
#endif
diff --git a/tools/cancel_jobs.cpp b/tools/cancel_jobs.cpp
index c2e1588c70..fe401df7f4 100644
--- a/tools/cancel_jobs.cpp
+++ b/tools/cancel_jobs.cpp
@@ -16,8 +16,9 @@
// along with BOINC. If not, see .
// cancel_jobs min-ID max-ID
-//
-// cancel jobs from min-ID to max-ID inclusive
+// cancel jobs from min-ID to max-ID inclusive
+// cancel_jobs --name wuname
+// cancel the job with the given name
#include
@@ -26,14 +27,12 @@
void usage() {
fprintf(stderr, "Usage: cancel_jobs min-ID max-ID\n");
+ fprintf(stderr, "or cancel_jobs --name wuname\n");
exit(1);
}
int main(int argc, char** argv) {
if (argc != 3) usage();
- int min_id = atoi(argv[1]);
- int max_id = atoi(argv[2]);
- if (!min_id || !max_id) usage();
int retval = config.parse_file();
if (retval) exit(1);
@@ -45,10 +44,24 @@ int main(int argc, char** argv) {
printf("boinc_db.open: %s\n", boincerror(retval));
exit(1);
}
-
- retval = cancel_jobs(min_id, max_id);
+ if (!strcmp(argv[1], "--name")) {
+ DB_WORKUNIT wu;
+ char buf[256];
+ sprintf(buf, "where name='%s'", argv[2]);
+ retval = wu.lookup(buf);
+ if (retval) {
+ fprintf(stderr, "No workunit named '%s'\n", argv[2]);
+ exit(1);
+ }
+ retval = cancel_job(wu);
+ } else {
+ int min_id = atoi(argv[1]);
+ int max_id = atoi(argv[2]);
+ if (!min_id || !max_id) usage();
+ retval = cancel_jobs(min_id, max_id);
+ }
if (retval) {
- fprintf(stderr, "cancel_jobs() failed: %s\n", boincerror(retval));
+ fprintf(stderr, "cancel job failed: %s\n", boincerror(retval));
exit(retval);
}
}