/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
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
+ modify it under the terms of version three of the GNU Affero General Public
License as published by the Free Software Foundation and included
in the file LICENSE.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Affero General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
*
* Kern Sibbald, March 2000
*
- * Version $Id$
*/
/* The following is necessary so that we do not include
#include "bacula.h"
#include "cats.h"
-static const int dbglevel = 10;
+static const int dbglevel = 100;
-#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI
+#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI
/* -----------------------------------------------------------------------
*
#endif /* HAVE_BATCH_FILE_INSERT */
-/* Create a new record for the Job
- * Returns: false on failure
+/** Create a new record for the Job
+ * Returns: false on failure
* true on success
*/
bool
db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
{
+ POOL_MEM buf;
char dt[MAX_TIME_LENGTH];
time_t stime;
struct tm tm;
bool ok;
+ int len;
utime_t JobTDate;
char ed1[30],ed2[30];
strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm);
JobTDate = (utime_t)stime;
+ len = strlen(jcr->comment);
+ buf.check_size(len*2+1);
+ db_escape_string(jcr, mdb, buf.c_str(), jcr->comment, len);
+
/* Must create it */
Mmsg(mdb->cmd,
-"INSERT INTO Job (Job,Name,Type,Level,JobStatus,SchedTime,JobTDate,ClientId) "
-"VALUES ('%s','%s','%c','%c','%c','%s',%s,%s)",
+"INSERT INTO Job (Job,Name,Type,Level,JobStatus,SchedTime,JobTDate,"
+ "ClientId,Comment) "
+"VALUES ('%s','%s','%c','%c','%c','%s',%s,%s,'%s')",
jr->Job, jr->Name, (char)(jr->JobType), (char)(jr->JobLevel),
(char)(jr->JobStatus), dt, edit_uint64(JobTDate, ed1),
- edit_int64(jr->ClientId, ed2));
+ edit_int64(jr->ClientId, ed2), buf.c_str());
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ jr->JobId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Job"));
+ if (jr->JobId == 0) {
Mmsg2(&mdb->errmsg, _("Create DB Job record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- jr->JobId = 0;
ok = false;
} else {
- jr->JobId = sql_insert_id(mdb, NT_("Job"));
ok = true;
}
db_unlock(mdb);
}
-/* Create a JobMedia record for medium used this job
- * Returns: false on failure
+/** Create a JobMedia record for medium used this job
+ * Returns: false on failure
* true on success
*/
bool
}
count++;
- /* Note, jm->Strip is not used and is not likely to be used
- * in the near future, so I have removed it from the insert
- * to save space in the DB. KES June 2006.
- */
Mmsg(mdb->cmd,
"INSERT INTO JobMedia (JobId,MediaId,FirstIndex,LastIndex,"
- "StartFile,EndFile,StartBlock,EndBlock,VolIndex,Copy) "
- "VALUES (%s,%s,%u,%u,%u,%u,%u,%u,%u,%u)",
+ "StartFile,EndFile,StartBlock,EndBlock,VolIndex) "
+ "VALUES (%s,%s,%u,%u,%u,%u,%u,%u,%u)",
edit_int64(jm->JobId, ed1),
edit_int64(jm->MediaId, ed2),
jm->FirstIndex, jm->LastIndex,
- jm->StartFile, jm->EndFile, jm->StartBlock, jm->EndBlock,count,
- jm->Copy);
+ jm->StartFile, jm->EndFile, jm->StartBlock, jm->EndBlock,count);
Dmsg0(300, mdb->cmd);
if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
return ok;
}
-/* Create Unique Pool record
- * Returns: false on failure
+/** Create Unique Pool record
+ * Returns: false on failure
* true on success
*/
bool
"INSERT INTO Pool (Name,NumVols,MaxVols,UseOnce,UseCatalog,"
"AcceptAnyVolume,AutoPrune,Recycle,VolRetention,VolUseDuration,"
"MaxVolJobs,MaxVolFiles,MaxVolBytes,PoolType,LabelType,LabelFormat,"
-"RecyclePoolId,ScratchPoolId) "
-"VALUES ('%s',%u,%u,%d,%d,%d,%d,%d,%s,%s,%u,%u,%s,'%s',%d,'%s',%s,%s)",
+"RecyclePoolId,ScratchPoolId,ActionOnPurge) "
+"VALUES ('%s',%u,%u,%d,%d,%d,%d,%d,%s,%s,%u,%u,%s,'%s',%d,'%s',%s,%s,%d)",
pr->Name,
pr->NumVols, pr->MaxVols,
pr->UseOnce, pr->UseCatalog,
edit_uint64(pr->MaxVolBytes, ed3),
pr->PoolType, pr->LabelType, pr->LabelFormat,
edit_int64(pr->RecyclePoolId,ed4),
- edit_int64(pr->ScratchPoolId,ed5));
+ edit_int64(pr->ScratchPoolId,ed5),
+ pr->ActionOnPurge
+ );
Dmsg1(200, "Create Pool: %s\n", mdb->cmd);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ pr->PoolId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Pool"));
+ if (pr->PoolId == 0) {
Mmsg2(&mdb->errmsg, _("Create db Pool record %s failed: ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- pr->PoolId = 0;
stat = false;
} else {
- pr->PoolId = sql_insert_id(mdb, NT_("Pool"));
stat = true;
}
db_unlock(mdb);
+ Dmsg0(500, "Create Pool: done\n");
return stat;
}
-/*
+/**
* Create Unique Device record
* Returns: false on failure
* true on success
edit_uint64(dr->MediaTypeId, ed1),
edit_int64(dr->StorageId, ed2));
Dmsg1(200, "Create Device: %s\n", mdb->cmd);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ dr->DeviceId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Device"));
+ if (dr->DeviceId == 0) {
Mmsg2(&mdb->errmsg, _("Create db Device record %s failed: ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- dr->DeviceId = 0;
ok = false;
} else {
- dr->DeviceId = sql_insert_id(mdb, NT_("Device"));
ok = true;
}
db_unlock(mdb);
-/*
+/**
* Create a Unique record for Storage -- no duplicates
* Returns: false on failure
* true on success with id in sr->StorageId
sr->StorageId = 0;
sr->created = false;
+ /* Check if it already exists */
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
mdb->num_rows = sql_num_rows(mdb);
/* If more than one, report error, but return first row */
Mmsg(mdb->cmd, "INSERT INTO Storage (Name,AutoChanger)"
" VALUES ('%s',%d)", sr->Name, sr->AutoChanger);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ sr->StorageId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Storage"));
+ if (sr->StorageId == 0) {
Mmsg2(&mdb->errmsg, _("Create DB Storage record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
ok = false;
} else {
- sr->StorageId = sql_insert_id(mdb, NT_("Storage"));
sr->created = true;
ok = true;
}
}
-/*
+/**
* Create Unique MediaType record
* Returns: false on failure
* true on success
mr->MediaType,
mr->ReadOnly);
Dmsg1(200, "Create mediatype: %s\n", mdb->cmd);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ mr->MediaTypeId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("MediaType"));
+ if (mr->MediaTypeId == 0) {
Mmsg2(&mdb->errmsg, _("Create db mediatype record %s failed: ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- mr->MediaTypeId = 0;
stat = false;
} else {
- mr->MediaTypeId = sql_insert_id(mdb, NT_("MediaType"));
stat = true;
}
db_unlock(mdb);
}
-/*
+/**
* Create Media record. VolumeName and non-zero Slot must be unique
*
* Returns: 0 on failure
"VolCapacityBytes,Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,"
"VolStatus,Slot,VolBytes,InChanger,VolReadTime,VolWriteTime,VolParts,"
"EndFile,EndBlock,LabelType,StorageId,DeviceId,LocationId,"
-"ScratchPoolId,RecyclePoolId,Enabled)"
+"ScratchPoolId,RecyclePoolId,Enabled,ActionOnPurge)"
"VALUES ('%s','%s',0,%u,%s,%s,%d,%s,%s,%u,%u,'%s',%d,%s,%d,%s,%s,%d,0,0,%d,%s,"
-"%s,%s,%s,%s,%d)",
+"%s,%s,%s,%s,%d,%d)",
mr->VolumeName,
mr->MediaType, mr->PoolId,
edit_uint64(mr->MaxVolBytes,ed1),
edit_int64(mr->LocationId, ed10),
edit_int64(mr->ScratchPoolId, ed11),
edit_int64(mr->RecyclePoolId, ed12),
- mr->Enabled
+ mr->Enabled, mr->ActionOnPurge
);
Dmsg1(500, "Create Volume: %s\n", mdb->cmd);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ mr->MediaId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Media"));
+ if (mr->MediaId == 0) {
Mmsg2(&mdb->errmsg, _("Create DB Media record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
stat = 0;
} else {
- mr->MediaId = sql_insert_id(mdb, NT_("Media"));
stat = 1;
if (mr->set_label_date) {
char dt[MAX_TIME_LENGTH];
return stat;
}
-/*
+/**
* Create a Unique record for the client -- no duplicates
* Returns: 0 on failure
* 1 on success with id in cr->ClientId
edit_uint64(cr->FileRetention, ed1),
edit_uint64(cr->JobRetention, ed2));
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ cr->ClientId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Client"));
+ if (cr->ClientId == 0) {
Mmsg2(&mdb->errmsg, _("Create DB Client record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
- cr->ClientId = 0;
stat = 0;
} else {
- cr->ClientId = sql_insert_id(mdb, NT_("Client"));
stat = 1;
}
db_unlock(mdb);
}
-/* Create a Unique record for the Path -- no duplicates */
+/** Create a Unique record for the Path -- no duplicates */
int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
{
SQL_ROW row;
Mmsg(mdb->cmd, "INSERT INTO Path (Path) VALUES ('%s')", mdb->esc_name);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ ar->PathId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Path"));
+ if (ar->PathId == 0) {
Mmsg2(&mdb->errmsg, _("Create db Path record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
ar->PathId = 0;
stat = 0;
} else {
- ar->PathId = sql_insert_id(mdb, NT_("Path"));
stat = 1;
}
return stat;
}
-/*
+/**
* Create a Unique record for the counter -- no duplicates
* Returns: 0 on failure
* 1 on success with counter filled in
}
/* Must create it */
- Mmsg(mdb->cmd, "INSERT INTO Counters (Counter,MinValue,MaxValue,CurrentValue,"
+ Mmsg(mdb->cmd, "INSERT INTO Counters (Counter,\"MinValue\",\"MaxValue\",CurrentValue,"
"WrapCounter) VALUES ('%s','%d','%d','%d','%s')",
cr->Counter, cr->MinValue, cr->MaxValue, cr->CurrentValue,
cr->WrapCounter);
}
-/*
+/**
* Create a FileSet record. This record is unique in the
* name and the MD5 signature of the include/exclude sets.
* Returns: 0 on failure
Mmsg(mdb->cmd, "INSERT INTO FileSet (FileSet,MD5,CreateTime) "
"VALUES ('%s','%s','%s')", fsr->FileSet, fsr->MD5, fsr->cCreateTime);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ fsr->FileSetId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("FileSet"));
+ if (fsr->FileSetId == 0) {
Mmsg2(&mdb->errmsg, _("Create DB FileSet record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
- fsr->FileSetId = 0;
stat = false;
} else {
- fsr->FileSetId = sql_insert_id(mdb, NT_("FileSet"));
fsr->created = true;
stat = true;
}
}
-/*
+/**
* struct stat
* {
* dev_t st_dev; * device *
#ifdef HAVE_BATCH_FILE_INSERT
-/* All sql_batch_* functions are used to do bulk batch insert in File/Filename/Path
+/** All sql_batch_* functions are used to do bulk batch insert in File/Filename/Path
* tables. This code can be activated by adding "#define HAVE_BATCH_FILE_INSERT 1"
* in baconfig.h
*
}
/*
- * Returns 1 if OK
- * 0 if failed
+ * Returns true if OK
+ * false if failed
*/
bool db_write_batch_file_records(JCR *jcr)
{
+ bool retval = false;
int JobStatus = jcr->JobStatus;
if (!jcr->batch_started) { /* no files to backup ? */
return true;
}
if (job_canceled(jcr)) {
- return false;
+ goto bail_out;
}
Dmsg1(50,"db_create_file_record changes=%u\n",jcr->db_batch->changes);
jcr->JobStatus = JS_AttrInserting;
if (!sql_batch_end(jcr, jcr->db_batch, NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Batch end %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
if (job_canceled(jcr)) {
- return false;
+ goto bail_out;
}
-
- /* we have to lock tables */
+ /*
+ * We have to lock tables
+ */
if (!db_sql_query(jcr->db_batch, sql_batch_lock_path_query, NULL, NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Lock Path table %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
if (!db_sql_query(jcr->db_batch, sql_batch_fill_path_query, NULL, NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Fill Path table %s\n",jcr->db_batch->errmsg);
db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query, NULL, NULL);
- return false;
+ goto bail_out;
}
if (!db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query,NULL,NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Unlock Path table %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
- /* we have to lock tables */
+ /*
+ * We have to lock tables
+ */
if (!db_sql_query(jcr->db_batch,sql_batch_lock_filename_query,NULL, NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Lock Filename table %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
if (!db_sql_query(jcr->db_batch,sql_batch_fill_filename_query, NULL,NULL)) {
Jmsg1(jcr,M_FATAL,0,"Fill Filename table %s\n",jcr->db_batch->errmsg);
db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query, NULL, NULL);
- return false;
+ goto bail_out;
}
if (!db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query,NULL,NULL)) {
Jmsg1(jcr, M_FATAL, 0, "Unlock Filename table %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
if (!db_sql_query(jcr->db_batch,
- "INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5)"
+ "INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5) "
"SELECT batch.FileIndex, batch.JobId, Path.PathId, "
"Filename.FilenameId,batch.LStat, batch.MD5 "
"FROM batch "
NULL,NULL))
{
Jmsg1(jcr, M_FATAL, 0, "Fill File table %s\n", jcr->db_batch->errmsg);
- return false;
+ goto bail_out;
}
+ jcr->JobStatus = JobStatus; /* reset entry status */
+ retval = true;
+
+bail_out:
db_sql_query(jcr->db_batch, "DROP TABLE batch", NULL,NULL);
- jcr->JobStatus = JobStatus; /* reset entry status */
- return true;
+ return retval;
}
-/*
+/**
* Create File record in B_DB
*
* In order to reduce database size, we store the File attributes,
* is a single FileName record and a single Path record, no matter
* how many times it occurs. This is this subroutine, we separate
* the file and the path and fill temporary tables with this three records.
+ *
+ * Note: all routines that call this expect to be able to call
+ * db_strerror(mdb) to get the error message, so the error message
+ * MUST be edited into mdb->errmsg before returning an error status.
*/
bool db_create_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
{
/* Open the dedicated connexion */
if (!jcr->batch_started) {
-
if (!db_open_batch_connexion(jcr, mdb)) {
- return false;
+ return false; /* error already printed */
}
if (!sql_batch_start(jcr, jcr->db_batch)) {
Mmsg1(&mdb->errmsg,
"Can't start batch mode: ERR=%s", db_strerror(jcr->db_batch));
- Jmsg1(jcr, M_FATAL, 0, "%s", mdb->errmsg);
+ Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
return false;
}
jcr->batch_started = true;
#else /* ! HAVE_BATCH_FILE_INSERT */
-/*
+/**
* Create File record in B_DB
*
* In order to reduce database size, we store the File attributes,
}
-/*
+/**
* This is the master File entry containing the attributes.
* The filename and path records have already been created.
*/
ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId,
ar->attr, digest);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ ar->FileId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("File"));
+ if (ar->FileId == 0) {
Mmsg2(&mdb->errmsg, _("Create db File record %s failed. ERR=%s"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
- ar->FileId = 0;
stat = 0;
} else {
- ar->FileId = sql_insert_id(mdb, NT_("File"));
stat = 1;
}
return stat;
}
-/* Create a Unique record for the filename -- no duplicates */
+/** Create a Unique record for the filename -- no duplicates */
static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
{
SQL_ROW row;
Mmsg(mdb->cmd, "INSERT INTO Filename (Name) VALUES ('%s')", mdb->esc_name);
- if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
+ ar->FilenameId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Filename"));
+ if (ar->FilenameId == 0) {
Mmsg2(&mdb->errmsg, _("Create db Filename record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
- ar->FilenameId = 0;
- } else {
- ar->FilenameId = sql_insert_id(mdb, NT_("Filename"));
}
return ar->FilenameId > 0;
}
#endif /* ! HAVE_BATCH_FILE_INSERT */
-
-/* List of SQL commands to create temp table and indicies */
-const char *create_temp_basefile[4] = {
- /* MySQL */
- "CREATE TEMPORARY TABLE basefile%lld ("
- "Path BLOB NOT NULL,"
- "Name BLOB NOT NULL)",
-
- /* Postgresql */
- "CREATE TEMPORARY TABLE basefile%lld ("
-// "CREATE TABLE basefile%lld ("
- "Path TEXT,"
- "Name TEXT)",
-
- /* SQLite */
- "CREATE TEMPORARY TABLE basefile%lld ("
- "Path TEXT,"
- "Name TEXT)",
-
- /* SQLite3 */
- "CREATE TEMPORARY TABLE basefile%lld ("
- "Path TEXT,"
- "Name TEXT)"
-};
-
-/*
+/**
* Create file attributes record, or base file attributes record
*/
bool db_create_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
return ret;
}
-/*
+/**
* Create Base File record in B_DB
*
*/
return ret;
}
-/*
+/**
* Cleanup the base file temporary tables
*/
static void db_cleanup_base_file(JCR *jcr, B_DB *mdb)
db_sql_query(mdb, buf.c_str(), NULL, NULL);
}
-/*
+/**
* Put all base file seen in the backup to the BaseFile table
* and cleanup temporary tables
*/
db_lock(mdb);
Mmsg(mdb->cmd,
- "INSERT INTO BaseFiles (BaseJobId, JobId, FileId, FileIndex) ( "
+ "INSERT INTO BaseFiles (BaseJobId, JobId, FileId, FileIndex) "
"SELECT B.JobId AS BaseJobId, %s AS JobId, "
"B.FileId, B.FileIndex "
"FROM basefile%s AS A, new_basefile%s AS B "
"WHERE A.Path = B.Path "
"AND A.Name = B.Name "
- "ORDER BY B.FileId)",
+ "ORDER BY B.FileId",
edit_uint64(jcr->JobId, ed1), ed1, ed1);
- ret = QUERY_DB(jcr, mdb, mdb->cmd);
+ ret = db_sql_query(mdb, mdb->cmd, NULL, NULL);
jcr->nb_base_files_used = sql_affected_rows(mdb);
db_cleanup_base_file(jcr, mdb);
return ret;
}
-/*
+/**
* Find the last "accurate" backup state with Base jobs
* 1) Get all files with jobid in list (F subquery)
* 2) Take only the last version of each file (Temp subquery) => accurate list is ok
*/
bool db_create_base_file_list(JCR *jcr, B_DB *mdb, char *jobids)
{
+ POOL_MEM buf;
bool ret=false;
db_lock(mdb);
}
Mmsg(mdb->cmd, create_temp_basefile[db_type], (uint64_t) jcr->JobId);
- if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
+ if (!db_sql_query(mdb, mdb->cmd, NULL, NULL)) {
goto bail_out;
}
-
- Mmsg(mdb->cmd,
-"CREATE TEMPORARY TABLE new_basefile%lld AS ( "
-//"CREATE TABLE new_basefile%lld AS ( "
- "SELECT Path.Path AS Path, Filename.Name AS Name, File.FileIndex AS FileIndex,"
- "File.JobId AS JobId, File.LStat AS LStat, File.FileId AS FileId, "
- "File.MD5 AS MD5 "
- "FROM ( "
- "SELECT max(FileId) as FileId, PathId, FilenameId "
- "FROM (SELECT FileId, PathId, FilenameId FROM File WHERE JobId IN (%s)) AS F "
- "GROUP BY PathId, FilenameId "
- ") AS Temp "
- "JOIN Filename ON (Filename.FilenameId = Temp.FilenameId) "
- "JOIN Path ON (Path.PathId = Temp.PathId) "
- "JOIN File ON (File.FileId = Temp.FileId) "
- "WHERE File.FileIndex > 0)",
- (uint64_t)jcr->JobId, jobids);
- ret = QUERY_DB(jcr, mdb, mdb->cmd);
+ Mmsg(buf, select_recent_version[db_type], jobids, jobids);
+ Mmsg(mdb->cmd, create_temp_new_basefile[db_type], (uint64_t)jcr->JobId, buf.c_str());
+
+ ret = db_sql_query(mdb, mdb->cmd, NULL, NULL);
bail_out:
db_unlock(mdb);
return ret;
}
-#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI */
+/**
+ * Create Restore Object record in B_DB
+ *
+ */
+bool db_create_restore_object_record(JCR *jcr, B_DB *mdb, ROBJECT_DBR *ro)
+{
+ bool stat;
+ int plug_name_len;
+ POOLMEM *esc_plug_name = get_pool_memory(PM_MESSAGE);
+
+ db_lock(mdb);
+
+ Dmsg1(dbglevel, "Oname=%s\n", ro->object_name);
+ Dmsg0(dbglevel, "put_object_into_catalog\n");
+
+ mdb->fnl = strlen(ro->object_name);
+ mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1);
+ db_escape_string(jcr, mdb, mdb->esc_name, ro->object_name, mdb->fnl);
+
+ db_escape_object(jcr, mdb, ro->object, ro->object_len);
+
+ plug_name_len = strlen(ro->plugin_name);
+ esc_plug_name = check_pool_memory_size(esc_plug_name, plug_name_len*2+1);
+ db_escape_string(jcr, mdb, esc_plug_name, ro->plugin_name, plug_name_len);
+
+ Mmsg(mdb->cmd,
+ "INSERT INTO RestoreObject (ObjectName,PluginName,RestoreObject,"
+ "ObjectLength,ObjectFullLength,ObjectIndex,ObjectType,"
+ "ObjectCompression,FileIndex,JobId) "
+ "VALUES ('%s','%s','%s',%d,%d,%d,%d,%d,%d,%u)",
+ mdb->esc_name, esc_plug_name, mdb->esc_obj,
+ ro->object_len, ro->object_full_len, ro->object_index,
+ FT_RESTORE_FIRST, ro->object_compression, ro->FileIndex, ro->JobId);
+
+ ro->RestoreObjectId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("RestoreObject"));
+ if (ro->RestoreObjectId == 0) {
+ Mmsg2(&mdb->errmsg, _("Create db Object record %s failed. ERR=%s"),
+ mdb->cmd, sql_strerror(mdb));
+ Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
+ stat = false;
+ } else {
+ stat = true;
+ }
+ db_unlock(mdb);
+ free_pool_memory(esc_plug_name);
+ return stat;
+}
+
+
+#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI */