*/
/*
- Copyright (C) 2002 Kern Sibbald and John Walker
+ Copyright (C) 2002-2003 Kern Sibbald and John Walker
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
#include "bacula.h"
#include "dird.h"
-#include "ua.h"
/* Imported functions */
int mark_media_purged(UAContext *ua, MEDIA_DBR *mr);
CLIENT *client;
POOL_DBR pr;
MEDIA_DBR mr;
+ int kw;
static char *keywords[] = {
N_("Files"),
N_("Jobs"),
N_("Volume"),
NULL};
+
if (!open_db(ua)) {
return 01;
}
- switch (find_arg_keyword(ua, keywords)) {
- case 0:
- client = select_client_resource(ua);
+
+ /* First search args */
+ kw = find_arg_keyword(ua, keywords);
+ if (kw < 0 || kw > 2) {
+ /* no args, so ask user */
+ kw = do_keyword_prompt(ua, _("Choose item to prune"), keywords);
+ }
+
+ switch (kw) {
+ case 0: /* prune files */
+ client = get_client_resource(ua);
if (!client || !confirm_retention(ua, &client->FileRetention, "File")) {
return 0;
}
prune_files(ua, client);
return 1;
- case 1:
- client = select_client_resource(ua);
+ case 1: /* prune jobs */
+ client = get_client_resource(ua);
if (!client || !confirm_retention(ua, &client->JobRetention, "Job")) {
return 0;
}
/* ****FIXME**** allow user to select JobType */
prune_jobs(ua, client, JT_BACKUP);
return 1;
- case 2:
+ case 2: /* prune volume */
if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
return 0;
}
default:
break;
}
- switch (do_keyword_prompt(ua, _("Choose item to prune"), keywords)) {
- case 0:
- client = select_client_resource(ua);
- if (!client || !confirm_retention(ua, &client->FileRetention, "File")) {
- return 0;
- }
- prune_files(ua, client);
- break;
- case 1:
- client = select_client_resource(ua);
- if (!client || !confirm_retention(ua, &client->JobRetention, "Job")) {
- return 0;
- }
- /* ****FIXME**** allow user to select JobType */
- prune_jobs(ua, client, JT_BACKUP);
- break;
- case 2:
- if (!select_pool_and_media_dbr(ua, &pr, &mr)) {
- return 0;
- }
- if (!confirm_retention(ua, &mr.VolRetention, "Volume")) {
- return 0;
- }
- prune_volume(ua, &pr, &mr);
- return 1;
- }
+
return 1;
}
db_lock(ua->db);
memset(&cr, 0, sizeof(cr));
memset(&del, 0, sizeof(del));
- strcpy(cr.Name, client->hdr.name);
- if (!db_create_client_record(ua->db, &cr)) {
+ bstrncpy(cr.Name, client->hdr.name, sizeof(cr.Name));
+ if (!db_create_client_record(ua->jcr, ua->db, &cr)) {
db_unlock(ua->db);
return 0;
}
db_lock(ua->db);
memset(&cr, 0, sizeof(cr));
memset(&del, 0, sizeof(del));
- strcpy(cr.Name, client->hdr.name);
- if (!db_create_client_record(ua->db, &cr)) {
+ bstrncpy(cr.Name, client->hdr.name, sizeof(cr.Name));
+ if (!db_create_client_record(ua->jcr, ua->db, &cr)) {
db_unlock(ua->db);
return 0;
}
}
/* Count Files to be deleted */
- strcpy(query, cnt_DelCand);
+ pm_strcpy(&query, cnt_DelCand);
Dmsg1(100, "select sql=%s\n", query);
+ cnt.count = 0;
if (!db_sql_query(ua->db, query, count_handler, (void *)&cnt)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
Dmsg0(050, "Count failed\n");
db_lock(ua->db);
memset(&jr, 0, sizeof(jr));
memset(&del, 0, sizeof(del));
+
+ /*
+ * Find out how many Jobs remain on this Volume by
+ * counting the JobMedia records.
+ */
cnt.count = 0;
Mmsg(&query, cnt_JobMedia, mr->MediaId);
if (!db_sql_query(ua->db, query, count_handler, (void *)&cnt)) {
del.max_ids = MAX_DEL_LIST_LEN;
}
+ /*
+ * Now get a list of JobIds for Jobs written to this Volume
+ * Could optimize here by adding JobTDate > (now - period).
+ */
del.JobId = (JobId_t *)malloc(sizeof(JobId_t) * del.max_ids);
-
- /* ***FIXME*** could make this do JobTDate check too */
Mmsg(&query, sel_JobMedia, mr->MediaId);
if (!db_sql_query(ua->db, query, file_delete_handler, (void *)&del)) {
if (ua->verbose) {
goto bail_out;
}
- /* Use Volume Retention to prune Jobs and Files */
+ /* Use Volume Retention to prune Jobs and their Files */
period = mr->VolRetention;
now = (utime_t)time(NULL);
Dmsg3(200, "Now=%d period=%d now-period=%d\n", (int)now, (int)period,
(int)(now-period));
+
for (i=0; i < del.num_ids; i++) {
jr.JobId = del.JobId[i];
- if (!db_get_job_record(ua->db, &jr)) {
+ if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
continue;
}
Dmsg2(200, "Looking at %s JobTdate=%d\n", jr.Job, (int)jr.JobTDate);