]> git.sur5r.net Git - bacula/bacula/commitdiff
- Turn on transactions for SQLite and PostgreSQL if
authorKern Sibbald <kern@sibbald.com>
Wed, 22 Sep 2004 21:36:58 +0000 (21:36 +0000)
committerKern Sibbald <kern@sibbald.com>
Wed, 22 Sep 2004 21:36:58 +0000 (21:36 +0000)
  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

12 files changed:
bacula/ReleaseNotes
bacula/src/cats/cats.h
bacula/src/cats/postgresql.c
bacula/src/cats/sql.c
bacula/src/cats/sql_create.c
bacula/src/cats/sqlite.c
bacula/src/cats/update_mysql_tables.in
bacula/src/cats/update_postgresql_tables.in
bacula/src/cats/update_sqlite_tables.in
bacula/src/dird/ua_restore.c
bacula/src/dird/ua_tree.c
bacula/src/findlib/bfile.c

index 8490f444d3f7a5b761e870263e86d692e0d1f563..5a024f2a11613b3798346c36de6c4e4b821721a5 100644 (file)
@@ -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"
index 981d0671b57a513bccf48fe18cb0120e2340001e..62125549c7b6260002b929ffea8a8fdcffe25acc 100644 (file)
@@ -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 */
index d6b1a6567b52d15cc1f272849b2091b9cc83534a..270d1b14eb9e3c43d3c95ec9fea94aad8ae3b0d5 100644 (file)
@@ -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;
index 92d4a17254e1ad0ae9cb2d582c07f3de1460f4a6..4566917da25d6691455759803647303d32cb2a50 100644 (file)
@@ -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);
index 937df6dab0e4c80ed4bff8d4923f7fdf4bd4de7a..cc3078a8f89d15f8fb1a00a350e16dbedc5e43d7 100644 (file)
@@ -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"));
index 1df4ae151cfaeb8ebc1317f150d0994599ce3f2b..f65414bf4a77a62c0fc78227539d6923ddf83ce9 100644 (file)
@@ -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;
index fcffada2af4fb642fe35a2509f18e791ed238f27..380ba8b8b187b6bc23d44dcba636afa54889a81f 100755 (executable)
@@ -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);
 
index d78bdca9e795ead68a9b0dbf0f342389e9fe4f6c..0a42f018778555fd1ed607d6463152b2b1bae047 100755 (executable)
@@ -15,6 +15,8 @@ if $bindir/psql $* -f - <<END-OF-DATA
 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);
 
index c17478767a7a55db2deeb14290cf1987c1363e4f..ae6090a34411bb99950cff74ea2e3131296ad150 100755 (executable)
@@ -111,6 +111,8 @@ DROP TABLE Media_backup;
 
 COMMIT;
 
+UPDATE Filename SET Name='' WHERE Name=' ';
+
 DELETE FROM Version;
 INSERT INTO Version (VersionId) VALUES (8);
 
index 5065c39f160dd0543a8da9874157ebc5132311da..ec5fa60fef6c21fa324a418af0cc0100fa15a270 100644 (file)
@@ -687,9 +687,8 @@ static void split_path_and_filename(RESTORE_CTX *rx, char *name)
       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;   
@@ -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);
index 9b12f1110883d483211eeb3272769755a325b896..da926e1fcda370e8c187723c321cab164a37986d 100644 (file)
@@ -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
index cb56294937b6a6496a043b6674349e07fc66bf14..9c50c4beef2b3cc12c3a7e96a05991cff6e795bf 100644 (file)
@@ -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;
 }