From c43848bb90365a3504890c3bf6d92be25d10d382 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 22 Sep 2004 21:36:58 +0000 Subject: [PATCH] - Turn on transactions for SQLite and PostgreSQL if multiple connections are turned on. - Removed stripping of filename in ua_tree insertion routine. - Fix split_path_and_filename() routines to return zero length path and files. - Modify update_tables scripts to convert a single blank filename into an empty filename. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1607 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/ReleaseNotes | 4 +++ bacula/src/cats/cats.h | 6 ++-- bacula/src/cats/postgresql.c | 3 +- bacula/src/cats/sql.c | 36 +++++++++++++------- bacula/src/cats/sql_create.c | 37 ++++++--------------- bacula/src/cats/sqlite.c | 1 + bacula/src/cats/update_mysql_tables.in | 2 ++ bacula/src/cats/update_postgresql_tables.in | 2 ++ bacula/src/cats/update_sqlite_tables.in | 2 ++ bacula/src/dird/ua_restore.c | 10 +++--- bacula/src/dird/ua_tree.c | 3 +- bacula/src/findlib/bfile.c | 2 +- 12 files changed, 57 insertions(+), 51 deletions(-) diff --git a/bacula/ReleaseNotes b/bacula/ReleaseNotes index 8490f444d3..5a024f2a11 100644 --- a/bacula/ReleaseNotes +++ b/bacula/ReleaseNotes @@ -17,6 +17,10 @@ Major Changes: - 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" diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 981d0671b5..62125549c7 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -102,7 +102,8 @@ typedef struct s_db { 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 */ @@ -260,7 +261,8 @@ typedef struct s_db { 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 */ diff --git a/bacula/src/cats/postgresql.c b/bacula/src/cats/postgresql.c index d6b1a6567b..270d1b14eb 100644 --- a/bacula/src/cats/postgresql.c +++ b/bacula/src/cats/postgresql.c @@ -98,13 +98,14 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char 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; diff --git a/bacula/src/cats/sql.c b/bacula/src/cats/sql.c index 92d4a17254..4566917da2 100644 --- a/bacula/src/cats/sql.c +++ b/bacula/src/cats/sql.c @@ -236,8 +236,9 @@ void _db_lock(const char *file, int line, B_DB *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)); } } @@ -250,8 +251,9 @@ void _db_unlock(const char *file, int line, B_DB *mdb) { 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)); } } @@ -262,7 +264,10 @@ void _db_unlock(const char *file, int line, B_DB *mdb) */ 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) { @@ -280,7 +285,10 @@ void db_start_transaction(JCR *jcr, B_DB *mdb) * 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) { @@ -297,7 +305,10 @@ void db_start_transaction(JCR *jcr, B_DB *mdb) 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 */ @@ -308,7 +319,10 @@ void db_end_transaction(JCR *jcr, B_DB *mdb) 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 */ @@ -357,9 +371,8 @@ void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname) 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; @@ -370,9 +383,8 @@ void split_path_and_file(JCR *jcr, B_DB *mdb, const char *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); diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index 937df6dab0..cc3078a8f8 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -112,23 +112,6 @@ db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm) 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"); @@ -138,7 +121,6 @@ JobId=%d AND MediaId=%d", jm->JobId, jm->MediaId); } count++; - /* Must create it */ Mmsg(mdb->cmd, "INSERT INTO JobMedia (JobId,MediaId,FirstIndex,LastIndex," "StartFile,EndFile,StartBlock,EndBlock,VolIndex) " @@ -152,6 +134,7 @@ JobId=%d AND MediaId=%d", jm->JobId, jm->MediaId); 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); @@ -572,15 +555,15 @@ static int db_create_file_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) /* 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 { @@ -631,7 +614,7 @@ static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) 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; @@ -644,7 +627,7 @@ static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) 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 { @@ -656,7 +639,7 @@ static int db_create_path_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) 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; } @@ -699,7 +682,7 @@ static int db_create_filename_record(JCR *jcr, B_DB *mdb, ATTR_DBR *ar) 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")); diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 1df4ae151c..f65414bf4a 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -91,6 +91,7 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char 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; diff --git a/bacula/src/cats/update_mysql_tables.in b/bacula/src/cats/update_mysql_tables.in index fcffada2af..380ba8b8b1 100755 --- a/bacula/src/cats/update_mysql_tables.in +++ b/bacula/src/cats/update_mysql_tables.in @@ -15,6 +15,8 @@ USE bacula; 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); diff --git a/bacula/src/cats/update_postgresql_tables.in b/bacula/src/cats/update_postgresql_tables.in index d78bdca9e7..0a42f01877 100755 --- a/bacula/src/cats/update_postgresql_tables.in +++ b/bacula/src/cats/update_postgresql_tables.in @@ -15,6 +15,8 @@ if $bindir/psql $* -f - <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; @@ -698,9 +697,8 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *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); diff --git a/bacula/src/dird/ua_tree.c b/bacula/src/dird/ua_tree.c index 9b12f11108..da926e1fcd 100644 --- a/bacula/src/dird/ua_tree.c +++ b/bacula/src/dird/ua_tree.c @@ -158,7 +158,6 @@ int insert_tree_handler(void *ctx, int num_fields, char **row) 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; @@ -171,7 +170,7 @@ int insert_tree_handler(void *ctx, int num_fields, char **row) 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 diff --git a/bacula/src/findlib/bfile.c b/bacula/src/findlib/bfile.c index cb56294937..9c50c4beef 100644 --- a/bacula/src/findlib/bfile.c +++ b/bacula/src/findlib/bfile.c @@ -335,7 +335,7 @@ char *xberror(BFILE *bfd) 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; } -- 2.39.5