/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2010 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2012 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.
*
*/
-/* The following is necessary so that we do not include
- * the dummy external definition of DB.
- */
-#define __SQL_C /* indicate that this is sql.c */
-
#include "bacula.h"
-#include "cats.h"
static const int dbglevel = 100;
-#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI
+#if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI
+
+#include "cats.h"
+#include "bdb_priv.h"
+#include "sql_glue.h"
/* -----------------------------------------------------------------------
*
*/
/* Forward referenced subroutines */
-#ifndef HAVE_BATCH_FILE_INSERT
static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
-#endif /* HAVE_BATCH_FILE_INSERT */
-
/** Create a new record for the Job
* Returns: false on failure
int len;
utime_t JobTDate;
char ed1[30],ed2[30];
+ char esc_job[MAX_ESCAPE_NAME_LENGTH];
+ char esc_name[MAX_ESCAPE_NAME_LENGTH];
db_lock(mdb);
strftime(dt, sizeof(dt), "%Y-%m-%d %H:%M:%S", &tm);
JobTDate = (utime_t)stime;
- len = strlen(jcr->comment);
+ len = strlen(jcr->comment); /* TODO: use jr instead of jcr to get comment */
buf.check_size(len*2+1);
- db_escape_string(jcr, mdb, buf.c_str(), jcr->comment, len);
+ mdb->db_escape_string(jcr, buf.c_str(), jcr->comment, len);
+
+ mdb->db_escape_string(jcr, esc_job, jr->Job, strlen(jr->Job));
+ mdb->db_escape_string(jcr, esc_name, jr->Name, strlen(jr->Name));
/* Must create it */
Mmsg(mdb->cmd,
"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),
+ esc_job, esc_name, (char)(jr->JobType), (char)(jr->JobLevel),
(char)(jr->JobStatus), dt, edit_uint64(JobTDate, ed1),
edit_int64(jr->ClientId, ed2), buf.c_str());
{
bool stat;
char ed1[30], ed2[30], ed3[50], ed4[50], ed5[50];
+ char esc_name[MAX_ESCAPE_NAME_LENGTH];
+ char esc_lf[MAX_ESCAPE_NAME_LENGTH];
+
+ int num_rows;
+
Dmsg0(200, "In create pool\n");
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT PoolId,Name FROM Pool WHERE Name='%s'", pr->Name);
+ mdb->db_escape_string(jcr, esc_name, pr->Name, strlen(pr->Name));
+ mdb->db_escape_string(jcr, esc_lf, pr->LabelFormat, strlen(pr->LabelFormat));
+ Mmsg(mdb->cmd, "SELECT PoolId,Name FROM Pool WHERE Name='%s'", esc_name);
Dmsg1(200, "selectpool: %s\n", mdb->cmd);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 0) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 0) {
Mmsg1(&mdb->errmsg, _("pool record %s already exists\n"), pr->Name);
sql_free_result(mdb);
db_unlock(mdb);
"MaxVolJobs,MaxVolFiles,MaxVolBytes,PoolType,LabelType,LabelFormat,"
"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,
+ esc_name,
pr->NumVols, pr->MaxVols,
pr->UseOnce, pr->UseCatalog,
pr->AcceptAnyVolume,
edit_uint64(pr->VolUseDuration, ed2),
pr->MaxVolJobs, pr->MaxVolFiles,
edit_uint64(pr->MaxVolBytes, ed3),
- pr->PoolType, pr->LabelType, pr->LabelFormat,
+ pr->PoolType, pr->LabelType, esc_lf,
edit_int64(pr->RecyclePoolId,ed4),
edit_int64(pr->ScratchPoolId,ed5),
pr->ActionOnPurge
{
bool ok;
char ed1[30], ed2[30];
+ char esc[MAX_ESCAPE_NAME_LENGTH];
+ int num_rows;
Dmsg0(200, "In create Device\n");
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT DeviceId,Name FROM Device WHERE Name='%s'", dr->Name);
+ mdb->db_escape_string(jcr, esc, dr->Name, strlen(dr->Name));
+ Mmsg(mdb->cmd, "SELECT DeviceId,Name FROM Device WHERE Name='%s'", esc);
Dmsg1(200, "selectdevice: %s\n", mdb->cmd);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 0) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 0) {
Mmsg1(&mdb->errmsg, _("Device record %s already exists\n"), dr->Name);
sql_free_result(mdb);
db_unlock(mdb);
/* Must create it */
Mmsg(mdb->cmd,
"INSERT INTO Device (Name,MediaTypeId,StorageId) VALUES ('%s',%s,%s)",
- dr->Name,
+ esc,
edit_uint64(dr->MediaTypeId, ed1),
edit_int64(dr->StorageId, ed2));
Dmsg1(200, "Create Device: %s\n", mdb->cmd);
{
SQL_ROW row;
bool ok;
+ int num_rows;
+ char esc[MAX_ESCAPE_NAME_LENGTH];
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT StorageId,AutoChanger FROM Storage WHERE Name='%s'", sr->Name);
+ mdb->db_escape_string(jcr, esc, sr->Name, strlen(sr->Name));
+ Mmsg(mdb->cmd, "SELECT StorageId,AutoChanger FROM Storage WHERE Name='%s'",esc);
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);
+ num_rows = sql_num_rows(mdb);
/* If more than one, report error, but return first row */
- if (mdb->num_rows > 1) {
- Mmsg1(&mdb->errmsg, _("More than one Storage record!: %d\n"), (int)(mdb->num_rows));
+ if (num_rows > 1) {
+ Mmsg1(&mdb->errmsg, _("More than one Storage record!: %d\n"), num_rows);
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
}
- if (mdb->num_rows >= 1) {
+ if (num_rows >= 1) {
if ((row = sql_fetch_row(mdb)) == NULL) {
Mmsg1(&mdb->errmsg, _("error fetching Storage row: %s\n"), sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
/* Must create it */
Mmsg(mdb->cmd, "INSERT INTO Storage (Name,AutoChanger)"
- " VALUES ('%s',%d)", sr->Name, sr->AutoChanger);
+ " VALUES ('%s',%d)", esc, sr->AutoChanger);
sr->StorageId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("Storage"));
if (sr->StorageId == 0) {
db_create_mediatype_record(JCR *jcr, B_DB *mdb, MEDIATYPE_DBR *mr)
{
bool stat;
+ int num_rows;
+ char esc[MAX_ESCAPE_NAME_LENGTH];
Dmsg0(200, "In create mediatype\n");
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT MediaTypeId,MediaType FROM MediaType WHERE MediaType='%s'", mr->MediaType);
+ mdb->db_escape_string(jcr, esc, mr->MediaType, strlen(mr->MediaType));
+ Mmsg(mdb->cmd, "SELECT MediaTypeId,MediaType FROM MediaType WHERE MediaType='%s'", esc);
Dmsg1(200, "selectmediatype: %s\n", mdb->cmd);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 0) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 0) {
Mmsg1(&mdb->errmsg, _("mediatype record %s already exists\n"), mr->MediaType);
sql_free_result(mdb);
db_unlock(mdb);
char ed1[50], ed2[50], ed3[50], ed4[50], ed5[50], ed6[50], ed7[50], ed8[50];
char ed9[50], ed10[50], ed11[50], ed12[50];
struct tm tm;
+ int num_rows;
+ char esc_name[MAX_ESCAPE_NAME_LENGTH];
+ char esc_mtype[MAX_ESCAPE_NAME_LENGTH];
+ char esc_status[MAX_ESCAPE_NAME_LENGTH];
+
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT MediaId FROM Media WHERE VolumeName='%s'",
- mr->VolumeName);
+ mdb->db_escape_string(jcr, esc_name, mr->VolumeName, strlen(mr->VolumeName));
+ mdb->db_escape_string(jcr, esc_mtype, mr->MediaType, strlen(mr->MediaType));
+ mdb->db_escape_string(jcr, esc_status, mr->VolStatus, strlen(mr->VolStatus));
+
+ Mmsg(mdb->cmd, "SELECT MediaId FROM Media WHERE VolumeName='%s'", esc_name);
Dmsg1(500, "selectpool: %s\n", mdb->cmd);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 0) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 0) {
Mmsg1(&mdb->errmsg, _("Volume \"%s\" already exists.\n"), mr->VolumeName);
sql_free_result(mdb);
db_unlock(mdb);
"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,%d)",
- mr->VolumeName,
- mr->MediaType, mr->PoolId,
+ esc_name,
+ esc_mtype, mr->PoolId,
edit_uint64(mr->MaxVolBytes,ed1),
edit_uint64(mr->VolCapacityBytes, ed2),
mr->Recycle,
edit_uint64(mr->VolUseDuration, ed4),
mr->MaxVolJobs,
mr->MaxVolFiles,
- mr->VolStatus,
+ esc_status,
mr->Slot,
edit_uint64(mr->VolBytes, ed5),
mr->InChanger,
SQL_ROW row;
int stat;
char ed1[50], ed2[50];
+ int num_rows;
+ char esc_name[MAX_ESCAPE_NAME_LENGTH];
+ char esc_uname[MAX_ESCAPE_NAME_LENGTH];
db_lock(mdb);
- Mmsg(mdb->cmd, "SELECT ClientId,Uname FROM Client WHERE Name='%s'", cr->Name);
+ mdb->db_escape_string(jcr, esc_name, cr->Name, strlen(cr->Name));
+ mdb->db_escape_string(jcr, esc_uname, cr->Uname, strlen(cr->Uname));
+ Mmsg(mdb->cmd, "SELECT ClientId,Uname FROM Client WHERE Name='%s'",esc_name);
cr->ClientId = 0;
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
+ num_rows = sql_num_rows(mdb);
/* If more than one, report error, but return first row */
- if (mdb->num_rows > 1) {
- Mmsg1(&mdb->errmsg, _("More than one Client!: %d\n"), (int)(mdb->num_rows));
+ if (num_rows > 1) {
+ Mmsg1(&mdb->errmsg, _("More than one Client!: %d\n"), num_rows);
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
}
- if (mdb->num_rows >= 1) {
+ if (num_rows >= 1) {
if ((row = sql_fetch_row(mdb)) == NULL) {
Mmsg1(&mdb->errmsg, _("error fetching Client row: %s\n"), sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
/* Must create it */
Mmsg(mdb->cmd, "INSERT INTO Client (Name,Uname,AutoPrune,"
"FileRetention,JobRetention) VALUES "
-"('%s','%s',%d,%s,%s)", cr->Name, cr->Uname, cr->AutoPrune,
+"('%s','%s',%d,%s,%s)", esc_name, esc_uname, cr->AutoPrune,
edit_uint64(cr->FileRetention, ed1),
edit_uint64(cr->JobRetention, ed2));
{
SQL_ROW row;
int stat;
+ int num_rows;
mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->pnl+2);
db_escape_string(jcr, mdb, mdb->esc_name, mdb->path, mdb->pnl);
Mmsg(mdb->cmd, "SELECT PathId FROM Path WHERE Path='%s'", mdb->esc_name);
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 1) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 1) {
char ed1[30];
Mmsg2(&mdb->errmsg, _("More than one Path!: %s for path: %s\n"),
- edit_uint64(mdb->num_rows, ed1), mdb->path);
+ edit_uint64(num_rows, ed1), mdb->path);
Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg);
}
/* Even if there are multiple paths, take the first one */
- if (mdb->num_rows >= 1) {
+ if (num_rows >= 1) {
if ((row = sql_fetch_row(mdb)) == NULL) {
Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
*/
int db_create_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr)
{
+ char esc[MAX_ESCAPE_NAME_LENGTH];
COUNTER_DBR mcr;
int stat;
db_unlock(mdb);
return 1;
}
-
+ mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter));
/* Must create it */
- Mmsg(mdb->cmd, "INSERT INTO Counters (Counter,MinValue,MaxValue,CurrentValue,"
+ Mmsg(mdb->cmd, "INSERT INTO Counters (Counter,Counters.MinValue,Counters.MaxValue,CurrentValue,"
"WrapCounter) VALUES ('%s','%d','%d','%d','%s')",
- cr->Counter, cr->MinValue, cr->MaxValue, cr->CurrentValue,
- cr->WrapCounter);
+ esc, cr->MinValue, cr->MaxValue, cr->CurrentValue,
+ cr->WrapCounter);
if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
Mmsg2(&mdb->errmsg, _("Create DB Counters record %s failed. ERR=%s\n"),
SQL_ROW row;
bool stat;
struct tm tm;
+ int num_rows;
+ char esc_fs[MAX_ESCAPE_NAME_LENGTH];
+ char esc_md5[MAX_ESCAPE_NAME_LENGTH];
+ /* TODO: Escape FileSet and MD5 */
db_lock(mdb);
fsr->created = false;
+ mdb->db_escape_string(jcr, esc_fs, fsr->FileSet, strlen(fsr->FileSet));
+ mdb->db_escape_string(jcr, esc_md5, fsr->MD5, strlen(fsr->MD5));
Mmsg(mdb->cmd, "SELECT FileSetId,CreateTime FROM FileSet WHERE "
-"FileSet='%s' AND MD5='%s'", fsr->FileSet, fsr->MD5);
+ "FileSet='%s' AND MD5='%s'", esc_fs, esc_md5);
fsr->FileSetId = 0;
if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 1) {
- Mmsg1(&mdb->errmsg, _("More than one FileSet!: %d\n"), (int)(mdb->num_rows));
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 1) {
+ Mmsg1(&mdb->errmsg, _("More than one FileSet!: %d\n"), num_rows);
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
}
- if (mdb->num_rows >= 1) {
+ if (num_rows >= 1) {
if ((row = sql_fetch_row(mdb)) == NULL) {
Mmsg1(&mdb->errmsg, _("error fetching FileSet row: ERR=%s\n"), sql_strerror(mdb));
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
/* Must create it */
Mmsg(mdb->cmd, "INSERT INTO FileSet (FileSet,MD5,CreateTime) "
-"VALUES ('%s','%s','%s')", fsr->FileSet, fsr->MD5, fsr->cCreateTime);
+"VALUES ('%s','%s','%s')", esc_fs, esc_md5, fsr->cCreateTime);
fsr->FileSetId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("FileSet"));
if (fsr->FileSetId == 0) {
* };
*/
-#ifdef HAVE_BATCH_FILE_INSERT
-
-/** 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
+/**
+ * All sql_batch_* functions are used to do bulk batch insert in File/Filename/Path
+ * tables.
*
* To sum up :
* - bulk load a temp table
*/
/*
- * Returns 1 if OK
- * 0 if failed
- */
-bool my_batch_start(JCR *jcr, B_DB *mdb)
-{
- bool ok;
-
- db_lock(mdb);
- ok = db_sql_query(mdb,
- "CREATE TEMPORARY TABLE batch ("
- "FileIndex integer,"
- "JobId integer,"
- "Path blob,"
- "Name blob,"
- "LStat tinyblob,"
- "MD5 tinyblob)",NULL, NULL);
- db_unlock(mdb);
- return ok;
-}
-
-/*
- * Returns 1 if OK
- * 0 if failed
- */
-bool my_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
-{
- size_t len;
- const char *digest;
- char ed1[50];
-
- mdb->esc_name = check_pool_memory_size(mdb->esc_name, mdb->fnl*2+1);
- db_escape_string(jcr, mdb, mdb->esc_name, mdb->fname, mdb->fnl);
-
- mdb->esc_path = check_pool_memory_size(mdb->esc_path, mdb->pnl*2+1);
- db_escape_string(jcr, mdb, mdb->esc_path, mdb->path, mdb->pnl);
-
- if (ar->Digest == NULL || ar->Digest[0] == 0) {
- digest = "0";
- } else {
- digest = ar->Digest;
- }
-
- len = Mmsg(mdb->cmd, "INSERT INTO batch VALUES (%u,%s,'%s','%s','%s','%s')",
- ar->FileIndex, edit_int64(ar->JobId,ed1), mdb->esc_path,
- mdb->esc_name, ar->attr, digest);
-
- return INSERT_DB(jcr, mdb, mdb->cmd);
-}
-
-/* set error to something to abort operation */
-/*
- * Returns 1 if OK
- * 0 if failed
- */
-bool my_batch_end(JCR *jcr, B_DB *mdb, const char *error)
-{
-
- Dmsg0(50, "sql_batch_end started\n");
-
- if (mdb) {
-#ifdef HAVE_DBI
- mdb->status = (dbi_error_flag)0;
-#else
- mdb->status = 0;
-#endif
- }
- return true;
-}
-
-/*
- * 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 */
- if (!db_sql_query(jcr->db_batch, sql_batch_lock_path_query, NULL, NULL)) {
+ /*
+ * We have to lock tables
+ */
+ if (!db_sql_query(jcr->db_batch, batch_lock_path_query[db_get_type_index(jcr->db_batch)], 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)) {
+ if (!db_sql_query(jcr->db_batch, batch_fill_path_query[db_get_type_index(jcr->db_batch)], 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;
+ db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], NULL, NULL);
+ goto bail_out;
}
- if (!db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query,NULL,NULL)) {
+ if (!db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], 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 */
- if (!db_sql_query(jcr->db_batch,sql_batch_lock_filename_query,NULL, NULL)) {
+ /*
+ * We have to lock tables
+ */
+ if (!db_sql_query(jcr->db_batch, batch_lock_filename_query[db_get_type_index(jcr->db_batch)], 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)) {
+ if (!db_sql_query(jcr->db_batch, batch_fill_filename_query[db_get_type_index(jcr->db_batch)], 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;
+ db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], NULL, NULL);
+ goto bail_out;
}
- if (!db_sql_query(jcr->db_batch, sql_batch_unlock_tables_query,NULL,NULL)) {
+ if (!db_sql_query(jcr->db_batch, batch_unlock_tables_query[db_get_type_index(jcr->db_batch)], 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)"
- "SELECT batch.FileIndex, batch.JobId, Path.PathId, "
- "Filename.FilenameId,batch.LStat, batch.MD5 "
- "FROM batch "
- "JOIN Path ON (batch.Path = Path.Path) "
- "JOIN Filename ON (batch.Name = Filename.Name)",
- NULL,NULL))
+"INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) "
+ "SELECT batch.FileIndex, batch.JobId, Path.PathId, "
+ "Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq "
+ "FROM batch "
+ "JOIN Path ON (batch.Path = Path.Path) "
+ "JOIN Filename ON (batch.Name = Filename.Name)",
+ 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->batch_started = false;
- jcr->JobStatus = JobStatus; /* reset entry status */
- return true;
+ return retval;
}
/**
* 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)
+bool db_create_batch_file_attributes_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
{
ASSERT(ar->FileType != FT_BASE);
return sql_batch_insert(jcr, bdb, ar);
}
-#else /* ! HAVE_BATCH_FILE_INSERT */
-
/**
* Create File record in B_DB
*
db_unlock(mdb);
return false;
}
-
-
/**
* This is the master File entry containing the attributes.
* The filename and path records have already been created.
/* Must create it */
Mmsg(mdb->cmd,
"INSERT INTO File (FileIndex,JobId,PathId,FilenameId,"
- "LStat,MD5) VALUES (%u,%u,%u,%u,'%s','%s')",
+ "LStat,MD5,DeltaSeq) VALUES (%u,%u,%u,%u,'%s','%s',%u)",
ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId,
- ar->attr, digest);
+ ar->attr, digest, ar->DeltaSeq);
ar->FileId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("File"));
if (ar->FileId == 0) {
static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar)
{
SQL_ROW row;
+ int num_rows;
mdb->esc_name = check_pool_memory_size(mdb->esc_name, 2*mdb->fnl+2);
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)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 1) {
+ num_rows = sql_num_rows(mdb);
+ if (num_rows > 1) {
char ed1[30];
Mmsg2(&mdb->errmsg, _("More than one Filename! %s for file: %s\n"),
- edit_uint64(mdb->num_rows, ed1), mdb->fname);
+ edit_uint64(num_rows, ed1), mdb->fname);
Jmsg(jcr, M_WARNING, 0, "%s", mdb->errmsg);
}
- if (mdb->num_rows >= 1) {
+ if (num_rows >= 1) {
if ((row = sql_fetch_row(mdb)) == NULL) {
Mmsg2(&mdb->errmsg, _("Error fetching row for file=%s: ERR=%s\n"),
mdb->fname, sql_strerror(mdb));
return ar->FilenameId > 0;
}
-bool db_write_batch_file_records(JCR *jcr)
-{
- return true;
-}
-
-#endif /* ! HAVE_BATCH_FILE_INSERT */
-
/**
* Create file attributes record, or base file attributes record
*/
}
if (ar->FileType != FT_BASE) {
- ret = db_create_file_attributes_record(jcr, mdb, ar);
-
+ if (mdb->batch_insert_available()) {
+ ret = db_create_batch_file_attributes_record(jcr, mdb, ar);
+ } else {
+ ret = db_create_file_attributes_record(jcr, mdb, ar);
+ }
} else if (jcr->HasBase) {
ret = db_create_base_file_attributes_record(jcr, mdb, ar);
-
} else {
- Jmsg0(jcr, M_FATAL, 0, _("Can't Copy/Migrate job using BaseJob"));
+ Jmsg0(jcr, M_FATAL, 0, _("Cannot Copy/Migrate job using BaseJob"));
ret = true; /* in copy/migration what do we do ? */
}
goto bail_out;
}
- Mmsg(mdb->cmd, create_temp_basefile[db_type], (uint64_t) jcr->JobId);
+ Mmsg(mdb->cmd, create_temp_basefile[db_get_type_index(mdb)], (uint64_t) jcr->JobId);
if (!db_sql_query(mdb, mdb->cmd, NULL, NULL)) {
goto bail_out;
}
- 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());
+ Mmsg(buf, select_recent_version[db_get_type_index(mdb)], jobids, jobids);
+ Mmsg(mdb->cmd, create_temp_new_basefile[db_get_type_index(mdb)], (uint64_t)jcr->JobId, buf.c_str());
ret = db_sql_query(mdb, mdb->cmd, NULL, NULL);
bail_out:
bool db_create_restore_object_record(JCR *jcr, B_DB *mdb, ROBJECT_DBR *ro)
{
bool stat;
- POOLMEM *esc_obj = get_pool_memory(PM_MESSAGE);
+ int plug_name_len;
+ POOLMEM *esc_plug_name = get_pool_memory(PM_MESSAGE);
+
db_lock(mdb);
Dmsg1(dbglevel, "Oname=%s\n", 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);
- esc_obj = check_pool_memory_size(esc_obj, ro->object_len*2+1);
- db_escape_string(jcr, mdb, esc_obj, ro->object, ro->object_len);
+ 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,RestoreObject,"
- "ObjectLength,ObjectIndex,ObjectType,ObjectCompression,FileIndex,JobId) "
- "VALUES ('%s','%s',%d,%d,%d,%d,%d,%u)",
- mdb->esc_name, esc_obj, ro->object_len, ro->object_index,
- FT_RESTORE_FIRST, ro->object_compression, ro->FileIndex, ro->JobId);
+ "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,
+ ro->FileType, ro->object_compression, ro->FileIndex, ro->JobId);
ro->RestoreObjectId = sql_insert_autokey_record(mdb, mdb->cmd, NT_("RestoreObject"));
if (ro->RestoreObjectId == 0) {
stat = true;
}
db_unlock(mdb);
- free_pool_memory(esc_obj);
+ free_pool_memory(esc_plug_name);
return stat;
}
-
-#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI */
+#endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL || HAVE_INGRES || HAVE_DBI */