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
- License as published by the Free Software Foundation plus additions
- that are listed in the file LICENSE.
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
#include "bacula.h"
#include "cats.h"
-#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
+#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI
/* -----------------------------------------------------------------------
*
int FilenameId = 0;
mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2);
- db_escape_string(mdb->esc_name, mdb->fname, mdb->fnl);
+ db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
Mmsg(mdb->cmd, "SELECT FilenameId FROM Filename WHERE Name='%s'", mdb->esc_name);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
uint32_t PathId = 0;
mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2);
- db_escape_string(mdb->esc_name, mdb->path, mdb->pnl);
+ db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl);
if (mdb->cached_path_id != 0 && mdb->cached_path_len == mdb->pnl &&
strcmp(mdb->cached_path, mdb->path) == 0) {
if (jr->JobId == 0) {
Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
-"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId "
+"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
+"SchedTime,RealEndTime "
"FROM Job WHERE Job='%s'", jr->Job);
} else {
Mmsg(mdb->cmd, "SELECT VolSessionId,VolSessionTime,"
"PoolId,StartTime,EndTime,JobFiles,JobBytes,JobTDate,Job,JobStatus,"
-"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId "
+"Type,Level,ClientId,Name,PriorJobId,RealEndTime,JobId,FileSetId,"
+"SchedTime,RealEndTime "
"FROM Job WHERE JobId=%s",
edit_int64(jr->JobId, ed1));
}
jr->JobBytes = str_to_int64(row[6]);
jr->JobTDate = str_to_int64(row[7]);
bstrncpy(jr->Job, row[8]!=NULL?row[8]:"", sizeof(jr->Job));
- jr->JobStatus = (int)*row[9];
- jr->JobType = (int)*row[10];
- jr->JobLevel = (int)*row[11];
+ jr->JobStatus = row[9]!=NULL?(int)*row[9]:JS_FatalError;
+ jr->JobType = row[10]!=NULL?(int)*row[10]:JT_BACKUP;
+ jr->JobLevel = row[11]!=NULL?(int)*row[11]:L_NONE;
jr->ClientId = str_to_uint64(row[12]!=NULL?row[12]:(char *)"");
bstrncpy(jr->Name, row[13]!=NULL?row[13]:"", sizeof(jr->Name));
jr->PriorJobId = str_to_uint64(row[14]!=NULL?row[14]:(char *)"");
if (jr->JobId == 0) {
jr->JobId = str_to_int64(row[16]);
}
+ jr->FileSetId = str_to_int64(row[17]);
+ bstrncpy(jr->cSchedTime, row[3]!=NULL?row[18]:"", sizeof(jr->cSchedTime));
+ bstrncpy(jr->cRealEndTime, row[3]!=NULL?row[19]:"", sizeof(jr->cRealEndTime));
+ jr->StartTime = str_to_utime(jr->cStartTime);
+ jr->SchedTime = str_to_utime(jr->cSchedTime);
+ jr->EndTime = str_to_utime(jr->cEndTime);
+ jr->RealEndTime = str_to_utime(jr->cRealEndTime);
sql_free_result(mdb);
db_unlock(mdb);
Mmsg(mdb->cmd, "SELECT Name from Storage WHERE StorageId=%s",
edit_int64(SId[i], ed1));
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- if ((row = sql_fetch_row(mdb)) != NULL) {
+ if ((row = sql_fetch_row(mdb)) && row[0]) {
bstrncpy(Vols[i].Storage, row[0], MAX_NAME_LENGTH);
}
}
/*
* This function returns a list of all the Media record ids for
- * the current Pool.
+ * the current Pool with the correct Media Type.
* The caller must free ids if non-NULL.
*
* Returns false: on failure
* true: on success
*/
-bool db_get_media_ids(JCR *jcr, B_DB *mdb, uint32_t PoolId, int *num_ids, uint32_t *ids[])
+bool db_get_media_ids(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr, int *num_ids, uint32_t *ids[])
{
SQL_ROW row;
int i = 0;
db_lock(mdb);
*ids = NULL;
- Mmsg(mdb->cmd, "SELECT MediaId FROM Media WHERE PoolId=%s",
- edit_int64(PoolId, ed1));
+ Mmsg(mdb->cmd, "SELECT DISTINCT MediaId FROM Media WHERE PoolId=%s "
+ " AND MediaType='%s'",
+ edit_int64(mr->PoolId, ed1), mr->MediaType);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
*num_ids = sql_num_rows(mdb);
if (*num_ids > 0) {
}
+/*
+ * This function returns a list of all the DBIds that are returned
+ * for the query.
+ *
+ * Returns false: on failure
+ * true: on success
+ */
+bool db_get_query_dbids(JCR *jcr, B_DB *mdb, POOL_MEM &query, dbid_list &ids)
+{
+ SQL_ROW row;
+ int i = 0;
+ bool ok = false;
+
+ db_lock(mdb);
+ ids.num_ids = 0;
+ if (QUERY_DB(jcr, mdb, query.c_str())) {
+ ids.num_ids = sql_num_rows(mdb);
+ if (ids.num_ids > 0) {
+ if (ids.max_ids < ids.num_ids) {
+ free(ids.DBId);
+ ids.DBId = (DBId_t *)malloc(ids.num_ids * sizeof(DBId_t));
+ }
+ while ((row = sql_fetch_row(mdb)) != NULL) {
+ ids.DBId[i++] = str_to_uint64(row[0]);
+ }
+ }
+ sql_free_result(mdb);
+ ok = true;
+ } else {
+ Mmsg(mdb->errmsg, _("query dbids failed: ERR=%s\n"), sql_strerror(mdb));
+ Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
+ ok = false;
+ }
+ db_unlock(mdb);
+ return ok;
+}
+
+
+
/* Get Media Record
*
* Returns: false: on failure
}
-#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/
+#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI */