]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_update.c
Eliminate complier warning
[bacula/bacula] / bacula / src / dird / ua_update.c
index f7e38bd5e66d1a3d00ea61e604f1987da30af766..44c2442ea5f3b8e2c033ccb2f361787781c4a210 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Bacula® is a registered trademark of John Walker.
+   Bacula® is a registered trademark of Kern Sibbald.
    The licensor of Bacula is the Free Software Foundation Europe
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
@@ -32,7 +32,6 @@
  *
  *     Kern Sibbald, September MM
  *
- *   Version $Id$
  */
 
 #include "bacula.h"
@@ -42,6 +41,7 @@
 static int update_volume(UAContext *ua);
 static bool update_pool(UAContext *ua);
 static bool update_job(UAContext *ua);
+static bool update_stats(UAContext *ua);
 
 /*
  * Update a Pool Record in the database.
@@ -53,6 +53,8 @@ static bool update_job(UAContext *ua);
  *         changes pool info for volume
  *    update slots [scan=...]
  *         updates autochanger slots
+ *    update stats [days=...]
+ *         updates long term statistics
  */
 int update_cmd(UAContext *ua, const char *cmd)
 {
@@ -61,7 +63,9 @@ int update_cmd(UAContext *ua, const char *cmd)
       NT_("volume"), /* 1 */
       NT_("pool"),   /* 2 */
       NT_("slots"),  /* 3 */
-      NT_("jobid"),  /* 4 */
+      NT_("slot"),   /* 4 */
+      NT_("jobid"),  /* 5 */
+      NT_("stats"),  /* 6 */
       NULL};
 
    if (!open_client_db(ua)) {
@@ -77,11 +81,15 @@ int update_cmd(UAContext *ua, const char *cmd)
       update_pool(ua);
       return 1;
    case 3:
+   case 4:
       update_slots(ua);
       return 1;
-   case 4:
+   case 5:
       update_job(ua);
       return 1;
+   case 6:
+      update_stats(ua);
+      return 1;
    default:
       break;
    }
@@ -90,6 +98,7 @@ int update_cmd(UAContext *ua, const char *cmd)
    add_prompt(ua, _("Volume parameters"));
    add_prompt(ua, _("Pool from resource"));
    add_prompt(ua, _("Slots from autochanger"));
+   add_prompt(ua, _("Long term statistics"));
    switch (do_prompt(ua, _("item"), _("Choose catalog item to update"), NULL, 0)) {
    case 0:
       update_volume(ua);
@@ -100,6 +109,9 @@ int update_cmd(UAContext *ua, const char *cmd)
    case 2:
       update_slots(ua);
       break;
+   case 3:
+      update_stats(ua);
+      break;
    default:
       break;
    }
@@ -333,15 +345,24 @@ void update_vol_recyclepool(UAContext *ua, char *val, MEDIA_DBR *mr)
 {
    POOL_DBR pr;
    POOL_MEM query(PM_MESSAGE);
-   char ed1[50], ed2[50];
-
-   memset(&pr, 0, sizeof(pr));
-   bstrncpy(pr.Name, val, sizeof(pr.Name));
-   if (!get_pool_dbr(ua, &pr, NT_("recyclepool"))) {
-      return;
-   }
-   /* pool = select_pool_resource(ua);  */
-   mr->RecyclePoolId = pr.PoolId;            /* get the PoolId */
+   char ed1[50], ed2[50], *poolname;
+
+   if(val && *val) { /* update volume recyclepool="Scratch" */
+     /* If a pool name is given, look up the PoolId */
+     memset(&pr, 0, sizeof(pr));
+     bstrncpy(pr.Name, val, sizeof(pr.Name));
+     if (!get_pool_dbr(ua, &pr, NT_("recyclepool"))) {
+        return;
+     }
+     /* pool = select_pool_resource(ua);  */
+     mr->RecyclePoolId = pr.PoolId;            /* get the PoolId */
+     poolname = pr.Name;
+
+  } else { /* update volume recyclepool="" */
+    /* If no pool name is given, set the PoolId to 0 (the default) */
+     mr->RecyclePoolId = 0;
+     poolname = _("*None*");
+  }
 
    db_lock(ua->db);
    Mmsg(query, "UPDATE Media SET RecyclePoolId=%s WHERE MediaId=%s",
@@ -349,7 +370,7 @@ void update_vol_recyclepool(UAContext *ua, char *val, MEDIA_DBR *mr)
    if (!db_sql_query(ua->db, query.c_str(), NULL, NULL)) {
       ua->error_msg("%s", db_strerror(ua->db));
    } else {
-      ua->info_msg(_("New RecyclePool is: %s\n"), pr.Name);
+      ua->info_msg(_("New RecyclePool is: %s\n"), poolname);
    }
    db_unlock(ua->db);
 }
@@ -445,13 +466,30 @@ static void update_volenabled(UAContext *ua, char *val, MEDIA_DBR *mr)
       return;
    }
    if (!db_update_media_record(ua->jcr, ua->db, mr)) {
-      ua->error_msg(_("Error updating media record Enabled: ERR=%s"), db_strerror(ua->db));
+      ua->error_msg(_("Error updating media record Enabled: ERR=%s"),
+                    db_strerror(ua->db));
    } else {
       ua->info_msg(_("New Enabled is: %d\n"), mr->Enabled);
    }
 }
 
-
+static void update_vol_actiononpurge(UAContext *ua, char *val, MEDIA_DBR *mr)
+{
+   POOL_MEM ret;
+   if (strcasecmp(val, "truncate") == 0) {
+      mr->ActionOnPurge = ON_PURGE_TRUNCATE;
+   } else {
+      mr->ActionOnPurge = 0;
+   }
+   
+   if (!db_update_media_record(ua->jcr, ua->db, mr)) {
+      ua->error_msg(_("Error updating media record ActionOnPurge: ERR=%s"),
+                    db_strerror(ua->db));
+   } else {
+      ua->info_msg(_("New ActionOnPurge is: %s\n"), 
+                   action_on_purge_to_string(mr->ActionOnPurge, ret));
+   }
+}
 
 /*
  * Update a media record -- allows you to change the
@@ -465,6 +503,7 @@ static int update_volume(UAContext *ua)
    POOL *pool;
    POOL_DBR pr;
    POOLMEM *query;
+   POOL_MEM ret;
    char buf[1000];
    char ed1[130];
    bool done = false;
@@ -484,6 +523,7 @@ static int update_volume(UAContext *ua)
       NT_("AllFromPool"),              /* 11 !!! see below !!! */
       NT_("Enabled"),                  /* 12 */
       NT_("RecyclePool"),              /* 13 */
+      NT_("ActionOnPurge"),            /* 14 */
       NULL };
 
 #define AllFromPool 11               /* keep this updated with above */
@@ -546,6 +586,9 @@ static int update_volume(UAContext *ua)
          case 13:
             update_vol_recyclepool(ua, ua->argv[j], &mr);
             break;
+         case 14:
+            update_vol_actiononpurge(ua, ua->argv[j], &mr);
+            break;
          }
          done = true;
       }
@@ -575,12 +618,13 @@ static int update_volume(UAContext *ua)
       add_prompt(ua, _("All Volumes from all Pools")); /* 13 */
       add_prompt(ua, _("Enabled")),                    /* 14 */
       add_prompt(ua, _("RecyclePool")),                /* 15 */
-      add_prompt(ua, _("Done"));                       /* 16 */
+      add_prompt(ua, _("Action On Purge")),            /* 16 */
+      add_prompt(ua, _("Done"));                       /* 17 */
       i = do_prompt(ua, "", _("Select parameter to modify"), NULL, 0);  
 
       /* For All Volumes, All Volumes from Pool, and Done, we don't need
            * a Volume record */
-      if ( i != 12 && i != 13 && i != 16) {
+      if ( i != 12 && i != 13 && i != 17) {
          if (!select_media_dbr(ua, &mr)) {  /* Get Volume record */
             return 0;
          }
@@ -763,14 +807,25 @@ static int update_volume(UAContext *ua)
          if (db_get_pool_record(ua->jcr, ua->db, &pr)) {
             ua->info_msg(_("Current RecyclePool is: %s\n"), pr.Name);
          } else {
-            ua->warning_msg(_("No current RecyclePool\n"));
+            ua->info_msg(_("No current RecyclePool\n"));
          }
-         if (!get_cmd(ua, _("Enter new RecyclePool name: "))) {
+         if (!select_pool_dbr(ua, &pr, NT_("recyclepool"))) {
             return 0;
          }
-         update_vol_recyclepool(ua, ua->cmd, &mr);
+         update_vol_recyclepool(ua, pr.Name, &mr);
          return 1;
 
+      case 16:
+         pm_strcpy(ret, "");
+         ua->info_msg(_("Current ActionOnPurge is: %s\n"), 
+                      action_on_purge_to_string(mr.ActionOnPurge, ret));
+         if (!get_cmd(ua, _("Enter new ActionOnPurge (one of: Truncate, None): "))) {
+            return 0;
+         }
+
+         update_vol_actiononpurge(ua, ua->cmd, &mr);
+         break;
+
       default:                        /* Done or error */
          ua->info_msg(_("Selection terminated.\n"));
          return 1;
@@ -779,6 +834,24 @@ static int update_volume(UAContext *ua)
    return 1;
 }
 
+/*
+ * Update long term statistics
+ */
+static bool update_stats(UAContext *ua)
+{
+   int i = find_arg_with_value(ua, NT_("days"));
+   utime_t since=0;
+
+   if (i >= 0) {
+      since = atoi(ua->argv[i]) * 24*60*60;
+   }
+
+   int nb = db_update_stats(ua->jcr, ua->db, since);
+   ua->info_msg(_("Updating %i job(s).\n"), nb);
+
+   return true;
+}
+
 /*
  * Update pool record -- pull info from current POOL resource
  */
@@ -802,7 +875,7 @@ static bool update_pool(UAContext *ua)
    }
 
    set_pooldbr_from_poolres(&pr, pool, POOL_OP_UPDATE); /* update */
-   set_pooldbr_recyclepoolid(ua->jcr, ua->db, &pr, pool);
+   set_pooldbr_references(ua->jcr, ua->db, &pr, pool);
 
    id = db_update_pool_record(ua->jcr, ua->db, &pr);
    if (id <= 0) {
@@ -883,8 +956,8 @@ static bool update_job(UAContext *ua)
          return false;
       }
       delta_start = StartTime - jr.StartTime;
-      Dmsg3(200, "ST=%d jr.ST=%d delta=%d\n", (time_t)StartTime, 
-            (time_t)jr.StartTime, (time_t)delta_start);
+      Dmsg3(200, "ST=%lld jr.ST=%lld delta=%lld\n", StartTime, 
+            (utime_t)jr.StartTime, delta_start);
       jr.StartTime = (time_t)StartTime;
       jr.SchedTime += (time_t)delta_start;
       jr.EndTime += (time_t)delta_start;