2 ===================================================================
3 --- src/dird/ua.h (revision 8163)
4 +++ src/dird/ua.h (working copy)
7 char ClientName[MAX_NAME_LENGTH]; /* backup client */
8 char RestoreClientName[MAX_NAME_LENGTH]; /* restore client */
9 + char MediaType[MAX_NAME_LENGTH]; /* mediatype filter */
11 POOLMEM *JobIds; /* User entered string of JobIds */
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
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);
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)
44 + "mediatype", /* 8 */
47 /* The keyword below are handled by individual arg lookups */
53 - "bootstrap", /* 13 */
55 - "strip_prefix", /* 15 */
56 - "add_prefix", /* 16 */
57 - "add_suffix", /* 17 */
58 - "regexwhere", /* 18 */
59 - "restoreclient", /* 19 */
65 + "bootstrap", /* 15 */
67 + "strip_prefix", /* 17 */
68 + "add_prefix", /* 18 */
69 + "add_suffix", /* 19 */
70 + "regexwhere", /* 20 */
71 + "restoreclient", /* 21 */
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())) {
87 + rx->store = select_storage_resource(ua);
90 + case 8: /* mediatype */
91 + if (has_value(ua, i)) {
92 + bstrncpy(rx->MediaType, ua->argv[i], sizeof(rx->MediaType));
94 + ua->error_msg(_("Invalid MediaType\n"));
97 + case 9: /* all specified */
101 @@ -1140,7 +1159,8 @@
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);
110 /* Create temp tables */
111 @@ -1196,23 +1216,43 @@
114 /* If Pool specified, add PoolId specification */
115 - pool_select[0] = 0;
117 + Dmsg1(0, "Use %s Pool filter\n",
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));
128 ua->warning_msg(_("Pool \"%s\" not found, using any pool.\n"), pr.Name);
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);
139 + if (rx->MediaType[0]) {
140 + Mmsg(temp_filter, " AND Media.MediaType='%s' ",
142 + pm_strcat(other_filter, temp_filter.c_str());
143 + Dmsg1(0, "Use mediatype filter (%s)\n", rx->MediaType);
145 + if (bstrcmp(other_filter.c_str(), "")) {
146 + Dmsg0(0, "Don't use copy jobs\n");
147 + pm_strcpy(other_filter, " AND Type='B' ");
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,
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));
159 @@ -1238,7 +1278,7 @@
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));
168 @@ -1254,7 +1294,7 @@
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));
178 ===================================================================
179 --- src/jcr.h (revision 8163)
180 +++ src/jcr.h (working copy)
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 */
189 Index: src/lib/util.c
190 ===================================================================
191 --- src/lib/util.c (revision 8163)
192 +++ src/lib/util.c (working copy)
198 + str = _("Job Copy");