- Improved conf scanning code allowing FileSet components to
be put on a single line (previously everything had to be on
a different line).
+- Win32 files restored to an alternate directory will have the
+ colon following the drive letter turned into a / e.g. c:
+ becomes c/. Previously the c: was stripped. This applies only
+ to files written to an alternate directory (i.e. using a where=).
New Directives:
- Added "Ignore FileSet Changes = yes"
POOLMEM *cached_path; /* cached path name */
int cached_path_len; /* length of cached path */
uint32_t cached_path_id; /* cached path id */
- int transaction; /* transaction started */
+ bool allow_transactions; /* transactions allowed */
+ bool transaction; /* transaction started */
int changes; /* changes during transaction */
POOLMEM *fname; /* Filename only */
POOLMEM *path; /* Path only */
POOLMEM *cached_path;
int cached_path_len; /* length of cached path */
uint32_t cached_path_id;
- int transaction; /* transaction started */
+ bool allow_transactions; /* transactions allowed */
+ bool transaction; /* transaction started */
int changes; /* changes made to db */
POOLMEM *fname; /* Filename only */
POOLMEM *path; /* Path only */
mdb->have_insert_id = TRUE;
mdb->errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */
*mdb->errmsg = 0;
- mdb->cmd = get_pool_memory(PM_EMSG); /* get command buffer */
+ mdb->cmd = get_pool_memory(PM_EMSG); /* get command buffer */
mdb->cached_path = get_pool_memory(PM_FNAME);
mdb->cached_path_id = 0;
mdb->ref_count = 1;
mdb->fname = get_pool_memory(PM_FNAME);
mdb->path = get_pool_memory(PM_FNAME);
mdb->esc_name = get_pool_memory(PM_FNAME);
+ mdb->allow_transactions = mult_db_connections;
qinsert(&db_list, &mdb->bq); /* put db in list */
V(mutex);
return mdb;
{
int errstat;
if ((errstat=rwl_writelock(&mdb->lock)) != 0) {
+ berrno be;
e_msg(file, line, M_ABORT, 0, "rwl_writelock failure. ERR=%s\n",
- strerror(errstat));
+ be.strerror(errstat));
}
}
{
int errstat;
if ((errstat=rwl_writeunlock(&mdb->lock)) != 0) {
+ berrno be;
e_msg(file, line, M_ABORT, 0, "rwl_writeunlock failure. ERR=%s\n",
- strerror(errstat));
+ be.strerror(errstat));
}
}
*/
void db_start_transaction(JCR *jcr, B_DB *mdb)
{
-#ifdef xAVE_SQLITE
+#ifdef HAVE_SQLITE
+ if (!mdb->allow_transactions) {
+ return;
+ }
db_lock(mdb);
/* Allow only 10,000 changes per transaction */
if (mdb->transaction && mdb->changes > 10000) {
* This is turned off because transactions break
* if multiple simultaneous jobs are run.
*/
-#ifdef xAVE_POSTGRESQL
+#ifdef HAVE_POSTGRESQL
+ if (!mdb->allow_transactions) {
+ return;
+ }
db_lock(mdb);
/* Allow only 25,000 changes per transaction */
if (mdb->transaction && mdb->changes > 25000) {
void db_end_transaction(JCR *jcr, B_DB *mdb)
{
-#ifdef xAVE_SQLITE
+#ifdef HAVE_SQLITE
+ if (!mdb->allow_transactions) {
+ return;
+ }
db_lock(mdb);
if (mdb->transaction) {
my_sqlite_query(mdb, "COMMIT"); /* end transaction */
db_unlock(mdb);
#endif
-#ifdef xAVE_POSTGRESQL
+#ifdef HAVE_POSTGRESQL
+ if (!mdb->allow_transactions) {
+ return;
+ }
db_lock(mdb);
if (mdb->transaction) {
db_sql_query(mdb, "COMMIT", NULL, NULL); /* end transaction */
memcpy(mdb->fname, f, mdb->fnl); /* copy filename */
mdb->fname[mdb->fnl] = 0;
} else {
- mdb->fname[0] = ' '; /* blank filename */
- mdb->fname[1] = 0;
- mdb->fnl = 1;
+ mdb->fname[0] = 0;
+ mdb->fnl = 0;
}
mdb->pnl = f - fname;
} else {
Mmsg1(&mdb->errmsg, _("Path length is zero. File=%s\n"), fname);
Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
- mdb->path[0] = ' ';
- mdb->path[1] = 0;
- mdb->pnl = 1;
+ mdb->path[0] = 0;
+ mdb->pnl = 0;
}
Dmsg2(500, "split path=%s file=%s\n", mdb->path, mdb->fname);
int count;
db_lock(mdb);
-#ifdef not_used_in_new_code
- Mmsg(mdb->cmd, "SELECT JobId, MediaId FROM JobMedia WHERE \
-JobId=%d AND MediaId=%d", jm->JobId, jm->MediaId);
-
- Dmsg0(300, mdb->cmd);
- if (QUERY_DB(jcr, mdb, mdb->cmd)) {
- mdb->num_rows = sql_num_rows(mdb);
- if (mdb->num_rows > 0) {
- Mmsg0(&mdb->errmsg, _("Create JobMedia failed. Record already exists.\n"));
- sql_free_result(mdb);
- db_unlock(mdb);
- Dmsg0(0, "Already have JobMedia record\n");
- return false;
- }
- sql_free_result(mdb);
- }
-#endif
/* Now get count for VolIndex */
Mmsg(mdb->cmd, "SELECT count(*) from JobMedia");
}
count++;
- /* Must create it */
Mmsg(mdb->cmd,
"INSERT INTO JobMedia (JobId,MediaId,FirstIndex,LastIndex,"
"StartFile,EndFile,StartBlock,EndBlock,VolIndex) "
sql_strerror(mdb));
ok = false;
} else {
+ /* Worked, now update the Media record with the EndFile and EndBlock */
Mmsg(mdb->cmd,
"UPDATE Media SET EndFile=%u, EndBlock=%u WHERE MediaId=%u",
jm->EndFile, jm->EndBlock, jm->MediaId);
/* Must create it */
Mmsg(mdb->cmd,
-"INSERT INTO File (FileIndex,JobId,PathId,FilenameId,"
-"LStat,MD5) VALUES (%u,%u,%u,%u,'%s','0')",
- ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId,
- ar->attr);
+ "INSERT INTO File (FileIndex,JobId,PathId,FilenameId,"
+ "LStat,MD5) VALUES (%u,%u,%u,%u,'%s','0')",
+ ar->FileIndex, ar->JobId, ar->PathId, ar->FilenameId,
+ ar->attr);
if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
Mmsg2(&mdb->errmsg, _("Create db File record %s failed. ERR=%s"),
mdb->cmd, sql_strerror(mdb));
- Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
+ Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
ar->FileId = 0;
stat = 0;
} else {
if (ar->PathId != mdb->cached_path_id) {
mdb->cached_path_id = ar->PathId;
mdb->cached_path_len = mdb->pnl;
- pm_strcpy(&mdb->cached_path, mdb->path);
+ pm_strcpy(mdb->cached_path, mdb->path);
}
ASSERT(ar->PathId);
return 1;
if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
Mmsg2(&mdb->errmsg, _("Create db Path record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
+ Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
ar->PathId = 0;
stat = 0;
} else {
if (stat && ar->PathId != mdb->cached_path_id) {
mdb->cached_path_id = ar->PathId;
mdb->cached_path_len = mdb->pnl;
- pm_strcpy(&mdb->cached_path, mdb->path);
+ pm_strcpy(mdb->cached_path, mdb->path);
}
return stat;
}
if (!INSERT_DB(jcr, mdb, mdb->cmd)) {
Mmsg2(&mdb->errmsg, _("Create db Filename record %s failed. ERR=%s\n"),
mdb->cmd, sql_strerror(mdb));
- Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
+ Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
ar->FilenameId = 0;
} else {
ar->FilenameId = sql_insert_id(mdb, _("Filename"));
mdb->fname = get_pool_memory(PM_FNAME);
mdb->path = get_pool_memory(PM_FNAME);
mdb->esc_name = get_pool_memory(PM_FNAME);
+ mdb->allow_transactions = mult_db_connections;
qinsert(&db_list, &mdb->bq); /* put db in list */
V(mutex);
return mdb;
ALTER TABLE Media ADD COLUMN EndFile INTEGER UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE Media ADD COLUMN EndBlock INTEGER UNSIGNED NOT NULL DEFAULT 0;
+UPDATE Filename SET Name='' WHERE Name=' ';
+
DELETE FROM Version;
INSERT INTO Version (VersionId) VALUES (8);
ALTER TABLE Media ADD COLUMN EndFile integer not null default 0;
ALTER TABLE Media ADD COLUMN EndBlock integer not null default 0;
+UPDATE Filename SET Name='' WHERE Name=' ';
+
DELETE FROM Version;
INSERT INTO Version (VersionId) VALUES (8);
COMMIT;
+UPDATE Filename SET Name='' WHERE Name=' ';
+
DELETE FROM Version;
INSERT INTO Version (VersionId) VALUES (8);
memcpy(rx->fname, f, rx->fnl); /* copy filename */
rx->fname[rx->fnl] = 0;
} else {
- rx->fname[0] = ' '; /* blank filename */
- rx->fname[1] = 0;
- rx->fnl = 1;
+ rx->fname[0] = 0;
+ rx->fnl = 0;
}
rx->pnl = f - name;
memcpy(rx->path, name, rx->pnl);
rx->path[rx->pnl] = 0;
} else {
- rx->path[0] = ' ';
- rx->path[1] = 0;
- rx->pnl = 1;
+ rx->path[0] = 0;
+ rx->pnl = 0;
}
Dmsg2(100, "sllit path=%s file=%s\n", rx->path, rx->fname);
int FileIndex;
JobId_t JobId;
- strip_trailing_junk(row[1]);
if (*row[1] == 0) { /* no filename => directory */
if (*row[0] != '/') { /* Must be Win32 directory */
type = TN_DIR_NLS;
hard_link = (decode_LinkFI(row[4], &statp) != 0);
node = insert_tree_node(row[0], row[1], type, tree->root, NULL);
JobId = (JobId_t)str_to_int64(row[3]);
- FileIndex = atoi(row[2]);
+ FileIndex = str_to_int64(row[2]);
/*
* - The first time we see a file (node->inserted==true), we accept it.
* - In the same JobId, we accept only the first copy of a
if (!bfd->errmsg) {
bfd->errmsg = get_pool_memory(PM_FNAME);
}
- pm_strcpy(&bfd->errmsg, msg);
+ pm_strcpy(bfd->errmsg, msg);
LocalFree(msg);
return bfd->errmsg;
}