/*
*
* Bacula Director -- migrate.c -- responsible for doing
- * migration jobs.
+ * migration and copy jobs.
+ *
+ * Also handles Copy jobs (March MMVIII)
*
* Kern Sibbald, September MMIV
*
apply_pool_overrides(jcr);
+ if (!allow_duplicate_job(jcr)) {
+ return false;
+ }
+
jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->name());
if (jcr->jr.PoolId == 0) {
Dmsg1(dbglevel, "JobId=%d no PoolId\n", (int)jcr->JobId);
}
/* Print Job Start message */
- Jmsg(jcr, M_INFO, 0, _("Start Migration JobId %s, Job=%s\n"),
+ Jmsg(jcr, M_INFO, 0, _("Start %s JobId %s, Job=%s\n"),
+ jcr->JobType == JT_MIGRATE ? "Migration" : "Copy",
edit_uint64(jcr->JobId, ed1), jcr->Job);
* to avoid two threads from using the BSOCK structure at
* the same time.
*/
- if (!bnet_fsend(sd, "run")) {
+ if (!sd->fsend("run")) {
return false;
}
}
migration_cleanup(jcr, jcr->JobStatus);
- if (mig_jcr) {
+ if (jcr->JobType == JT_MIGRATE && mig_jcr) {
char jobid[50];
UAContext *ua = new_ua_context(jcr);
edit_uint64(jcr->previous_jr.JobId, jobid);
/* Add an item to the list if it is unique */
static void add_unique_id(idpkt *ids, char *item)
{
- char id[30];
+ const int maxlen = 30;
+ char id[maxlen+1];
char *q = ids->list;
/* Walk through current list to see if each item is the same as item */
for ( ; *q; ) {
id[0] = 0;
- for (int i=0; i<(int)sizeof(id); i++) {
+ for (int i=0; i<maxlen; i++) {
if (*q == 0) {
break;
} else if (*q == ',') {
/* Get JobIds when we have selected MediaId */
const char *sql_jobids_from_mediaid =
"SELECT DISTINCT Job.JobId,Job.StartTime FROM JobMedia,Job"
- " WHERE JobMedia.JobId=Job.JobId AND JobMedia.MediaId=%s"
+ " WHERE JobMedia.JobId=Job.JobId AND JobMedia.MediaId IN (%s)"
" AND Job.Type='B'"
" ORDER by Job.StartTime";
" Build OS: %s %s %s\n"
" Prev Backup JobId: %s\n"
" New Backup JobId: %s\n"
-" Migration JobId: %s\n"
-" Migration Job: %s\n"
+" Current JobId: %s\n"
+" Current Job: %s\n"
" Backup Level: %s%s\n"
" Client: %s\n"
" FileSet: \"%s\" %s\n"
*/
static int get_next_dbid_from_list(char **p, DBId_t *DBId)
{
- char id[30];
+ const int maxlen = 30;
+ char id[maxlen+1];
char *q = *p;
id[0] = 0;
- for (int i=0; i<(int)sizeof(id); i++) {
+ for (int i=0; i<maxlen; i++) {
if (*q == 0) {
break;
} else if (*q == ',') {