void append_filter(POOLMEM **buf, char *cond);
+/* Flags for find_next_volume_for_append() & sql_find */
+enum {
+ fnv_create_vol = true,
+ fnv_no_create_vol = false,
+ fnv_prune = true,
+ fnv_no_prune = false,
+ fnv_not_encrypted = false,
+ fnv_encrypted = true,
+ fnv_encrypted_any = -1 /* don't care if the volume is encrypted or not */
+};
+
/* ==============================================================
*
* What follows are definitions that are used "globally" for all
*/
int BDB::bdb_find_next_volume(JCR *jcr, int item, bool InChanger, MEDIA_DBR *mr)
{
+ POOL_MEM volencrypted(PM_FNAME);
SQL_ROW row = NULL;
int numrows;
const char *order;
if (item == -1) { /* find oldest volume */
/* Find oldest volume */
+ if (mr->VolEncrypted != fnv_encrypted_any) {
+ /* we have a requirement on VolEncrypted */
+ Mmsg(volencrypted, "AND (VolStatus!='Append' OR VolEncrypted=%d) ", mr->VolEncrypted);
+ }
Mmsg(cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,"
"VolBytes,VolMounts,VolErrors,VolWrites,MaxVolBytes,VolCapacityBytes,"
"MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,"
"FROM Media WHERE PoolId=%s AND MediaType='%s' "
" AND (VolStatus IN ('Full', 'Append', 'Used') OR (VolStatus IN ('Recycle', 'Purged', 'Used') AND Recycle=1)) "
" AND Enabled=1 "
- " AND (VolStatus != 'Append' OR VolEncrypted=%d) "
+ "%s" /* volencrypted */
"ORDER BY LastWritten LIMIT 1",
- edit_int64(mr->PoolId, ed1), esc_type, mr->VolEncrypted);
+ edit_int64(mr->PoolId, ed1), esc_type, volencrypted.c_str());
item = 1;
} else {
POOL_MEM changer(PM_FNAME);
POOL_MEM voltype(PM_FNAME);
POOL_MEM exclude(PM_FNAME);
- POOL_MEM volencrypted(PM_FNAME);
/* Find next available volume */
/* ***FIXME***
* replace switch with
order = sql_media_order_most_recently_written[bdb_get_type_index()]; /* take most recently written */
}
if (strcmp(mr->VolStatus, "Append") == 0) {
- Mmsg(volencrypted, " AND VolEncrypted=%d", mr->VolEncrypted);
+ Mmsg(volencrypted, "AND VolEncrypted=%d", mr->VolEncrypted);
}
if (mr->VolType == 0) {
Mmsg(voltype, "");
"VolEncrypted "
"FROM Media WHERE PoolId=%s AND MediaType='%s' AND Enabled=1 "
"AND VolStatus='%s' "
- "%s "
- "%s "
- "%s "
- "%s "
+ "%s " /* volencrypted */
+ "%s " /* voltype */
+ "%s " /* changer */
+ "%s " /* exclude */
"%s LIMIT %d",
edit_int64(mr->PoolId, ed1), esc_type,
esc_status, volencrypted.c_str(),
int tot_ids; /* total to process */
};
-/* Flags for find_next_volume_for_append() */
-enum {
- fnv_create_vol = true,
- fnv_no_create_vol = false,
- fnv_prune = true,
- fnv_no_prune = false
-};
-
typedef struct {
char *plugin_name;
POOLMEM *content;
/* Make sure we don't send two times the same volume in the same session */
set_volume_to_exclude_list(jcr, index, mr);
- if (vol_encrypted == 1) {
- mr->VolEncrypted = 1;
- } else {
- mr->VolEncrypted = 0;
- }
+ mr->VolEncrypted = vol_encrypted; /* 0=no, 1=yes, -1=any */
/*
* Find the Next Volume for Append
set_storageid_in_mr(store.store, &mr);
/* no need to set ScratchPoolId, since we use fnv_no_create_vol */
if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune,
- -1 /* no protect */, -1 /* vol_encrypted*/, errmsg)) {
+ -1 /* no protect */, fnv_encrypted_any, errmsg)) {
ua->error_msg(_("Could not find next Volume for Job %s (Pool=%s, Level=%s).%s\n"),
job->name(), pr.Name, level_to_str(edl, sizeof(edl), run->level), errmsg.c_str());
} else {
} else {
Dmsg0(250, "call find_next_volume_for_append\n");
/* no need to set ScratchPoolId, since we use fnv_no_create_vol */
- ok = find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_no_prune, -1, -1, tmp);
+ ok = find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol,
+ fnv_no_prune, -1, fnv_encrypted_any, tmp);
}
}
if (!ok) {
bash_spaces(dcr->pool_name);
dir->fsend(Find_media, jcr->JobId, vol_index, dcr->pool_name, dcr->media_type,
dcr->dev->dev_type, can_create, dcr->dev->use_protect(),
- dcr->dev->use_volume_encryption());
+ dcr->dev->use_volume_encryption()?1:0);
unbash_spaces(dcr->media_type);
unbash_spaces(dcr->pool_name);
Dmsg1(dbglvl, ">dird %s", dir->msg);