]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/restore_mediatype_storage_filter.patch
Cleanup patches a bit
[bacula/bacula] / bacula / patches / testing / restore_mediatype_storage_filter.patch
1 Index: src/dird/ua.h
2 ===================================================================
3 --- src/dird/ua.h       (revision 8163)
4 +++ src/dird/ua.h       (working copy)
5 @@ -104,6 +104,7 @@
6     JobId_t JobId;
7     char ClientName[MAX_NAME_LENGTH];  /* backup client */
8     char RestoreClientName[MAX_NAME_LENGTH];  /* restore client */
9 +   char MediaType[MAX_NAME_LENGTH];          /* mediatype filter */
10     char last_jobid[20];
11     POOLMEM *JobIds;                   /* User entered string of JobIds */
12     STORE  *store;
13 Index: src/dird/migrate.c
14 ===================================================================
15 --- src/dird/migrate.c  (revision 8168)
16 +++ src/dird/migrate.c  (working copy)
17 @@ -1160,13 +1160,14 @@
18         *   - copy any Log records to the new JobId
19         */
20        if (jcr->get_JobType() == JT_COPY && jcr->JobStatus == JS_Terminated) {
21 -         UAContext *ua = new_ua_context(jcr);
22 +         Mmsg(query, "UPDATE Job SET Type='%c' WHERE JobId=%s",
23 +              (char)JT_JOBCOPY, edit_uint64(jcr->jr.JobId, ec1);
24 +         db_sql_query(mig_jcr->db, query.c_str(), NULL, NULL);
25           /* Copy JobLog to new JobId */
26           Mmsg(query, "INSERT INTO Log (JobId, Time, LogText ) " 
27                        "SELECT %s, Time, LogText FROM Log WHERE JobId=%s",
28                new_jobid, old_jobid);
29           db_sql_query(mig_jcr->db, query.c_str(), NULL, NULL);
30 -         free_ua_context(ua);
31        } 
32  
33        if (!db_get_job_record(jcr, jcr->db, &jcr->jr)) {
34 Index: src/dird/ua_restore.c
35 ===================================================================
36 --- src/dird/ua_restore.c       (revision 8163)
37 +++ src/dird/ua_restore.c       (working copy)
38 @@ -429,21 +429,23 @@
39        "directory",   /* 4 */
40        "select",      /* 5 */
41        "pool",        /* 6 */
42 -      "all",         /* 7 */
43 +      "storage",     /* 7 */
44 +      "mediatype",   /* 8 */
45 +      "all",         /* 9 */
46  
47        /* The keyword below are handled by individual arg lookups */
48 -      "client",       /* 8 */
49 -      "storage",      /* 9 */
50 -      "fileset",      /* 10 */
51 -      "where",        /* 11 */
52 -      "yes",          /* 12 */
53 -      "bootstrap",    /* 13 */
54 -      "done",         /* 14 */
55 -      "strip_prefix", /* 15 */
56 -      "add_prefix",   /* 16 */
57 -      "add_suffix",   /* 17 */
58 -      "regexwhere",   /* 18 */
59 -      "restoreclient", /* 19 */
60 +      "client",       /* 10 */
61 +      "storage",      /* 11 */
62 +      "fileset",      /* 12 */
63 +      "where",        /* 13 */
64 +      "yes",          /* 14 */
65 +      "bootstrap",    /* 15 */
66 +      "done",         /* 16 */
67 +      "strip_prefix", /* 17 */
68 +      "add_prefix",   /* 18 */
69 +      "add_suffix",   /* 19 */
70 +      "regexwhere",   /* 20 */
71 +      "restoreclient", /* 21 */
72        NULL
73     };
74  
75 @@ -531,7 +533,24 @@
76              return 0;
77           }
78           break;
79 -      case 7:                         /* all specified */
80 +      case 7:                   /* storage */
81 +         if (has_value(ua, i)) {
82 +            rx->store = (STORE *)GetResWithName(R_STORAGE, ua->argv[i]);
83 +            if (rx->store && !acl_access_ok(ua,Storage_ACL,rx->store->name())) {
84 +               rx->store = NULL;
85 +            }
86 +         } else {
87 +            rx->store = select_storage_resource(ua);
88 +         }
89 +         break;
90 +      case 8:                   /* mediatype */
91 +         if (has_value(ua, i)) {
92 +            bstrncpy(rx->MediaType, ua->argv[i], sizeof(rx->MediaType));
93 +         } else {
94 +            ua->error_msg(_("Invalid MediaType\n"));
95 +         }
96 +         break;
97 +      case 9:                   /* all specified */
98           rx->all = true;
99           break;
100        /*
101 @@ -1140,7 +1159,8 @@
102     CLIENT_DBR cr;
103     char fileset_name[MAX_NAME_LENGTH];
104     char ed1[50], ed2[50];
105 -   char pool_select[MAX_NAME_LENGTH];
106 +   POOL_MEM other_filter(PM_MESSAGE);
107 +   POOL_MEM temp_filter(PM_MESSAGE);
108     int i;
109  
110     /* Create temp tables */
111 @@ -1196,23 +1216,43 @@
112     }
113  
114     /* If Pool specified, add PoolId specification */
115 -   pool_select[0] = 0;
116     if (rx->pool) {
117 +      Dmsg1(0, "Use %s Pool filter\n",
118 +            rx->pool->name());
119        POOL_DBR pr;
120        memset(&pr, 0, sizeof(pr));
121        bstrncpy(pr.Name, rx->pool->name(), sizeof(pr.Name));
122        if (db_get_pool_record(ua->jcr, ua->db, &pr)) {
123 -         bsnprintf(pool_select, sizeof(pool_select), "AND Media.PoolId=%s ", 
124 -            edit_int64(pr.PoolId, ed1));
125 +         Mmsg(other_filter, "AND Media.PoolId=%s ", 
126 +              edit_int64(pr.PoolId, ed1));
127        } else {
128           ua->warning_msg(_("Pool \"%s\" not found, using any pool.\n"), pr.Name);
129        }
130     }
131 +   /* use a storage filter */
132 +   if (rx->store) {             /* or use storageid ? */
133 +      Mmsg(temp_filter, " AND Media.StorageId=%s ", 
134 +           edit_int64(rx->store->StorageId, ed1));
135 +      pm_strcat(other_filter, temp_filter.c_str());
136 +      Dmsg2(0, "Use %s StorageId filter (%s)\n",
137 +            rx->store->name(), ed1);
138 +   }
139 +   if (rx->MediaType[0]) {
140 +      Mmsg(temp_filter, " AND Media.MediaType='%s' ", 
141 +           rx->MediaType);
142 +      pm_strcat(other_filter, temp_filter.c_str());
143 +      Dmsg1(0, "Use mediatype filter (%s)\n", rx->MediaType);
144 +   }
145 +   if (bstrcmp(other_filter.c_str(), "")) {
146 +      Dmsg0(0, "Don't use copy jobs\n");
147 +      pm_strcpy(other_filter, " AND Type='B' ");
148 +   }
149  
150     /* Find JobId of last Full backup for this client, fileset */
151     edit_int64(cr.ClientId, ed1);
152     Mmsg(rx->query, uar_last_full, ed1, ed1, date, fsr.FileSet,
153 -         pool_select);
154 +        other_filter.c_str());
155 +   Dmsg1(0, "q=%s\n", rx->query);
156     if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
157        ua->error_msg("%s\n", db_strerror(ua->db));
158        goto bail_out;
159 @@ -1238,7 +1278,7 @@
160  
161     /* Now find most recent Differental Job after Full save, if any */
162     Mmsg(rx->query, uar_dif, edit_uint64(rx->JobTDate, ed1), date,
163 -        edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
164 +        edit_int64(cr.ClientId, ed2), fsr.FileSet, other_filter.c_str());
165     if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
166        ua->warning_msg("%s\n", db_strerror(ua->db));
167     }
168 @@ -1254,7 +1294,7 @@
169  
170     /* Now find all Incremental Jobs after Full/dif save */
171     Mmsg(rx->query, uar_inc, edit_uint64(rx->JobTDate, ed1), date,
172 -        edit_int64(cr.ClientId, ed2), fsr.FileSet, pool_select);
173 +        edit_int64(cr.ClientId, ed2), fsr.FileSet, other_filter.c_str());
174     if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
175        ua->warning_msg("%s\n", db_strerror(ua->db));
176     }
177 Index: src/jcr.h
178 ===================================================================
179 --- src/jcr.h   (revision 8163)
180 +++ src/jcr.h   (working copy)
181 @@ -65,6 +65,7 @@
182  #define JT_ADMIN                 'D'  /* admin job */
183  #define JT_ARCHIVE               'A'  /* Archive Job */
184  #define JT_COPY                  'C'  /* Copy Job */
185 +#define JT_JOBCOPY               'J'  /* Copy Job */
186  #define JT_MIGRATE               'g'  /* Migration Job */
187  #define JT_SCAN                  'S'  /* Scan Job */
188  
189 Index: src/lib/util.c
190 ===================================================================
191 --- src/lib/util.c      (revision 8163)
192 +++ src/lib/util.c      (working copy)
193 @@ -361,6 +361,9 @@
194     case JT_COPY:
195        str = _("Copy");
196        break;
197 +   case JT_JOBCOPY:
198 +      str = _("Job Copy");
199 +      break;
200     case JT_CONSOLE:
201        str = _("Console");
202        break;