diff options
Diffstat (limited to 'bin/bbackupd/BackupClientInodeToIDMap.cpp')
-rw-r--r-- | bin/bbackupd/BackupClientInodeToIDMap.cpp | 76 |
1 files changed, 50 insertions, 26 deletions
diff --git a/bin/bbackupd/BackupClientInodeToIDMap.cpp b/bin/bbackupd/BackupClientInodeToIDMap.cpp index 74d5f3cd..262e5bc2 100644 --- a/bin/bbackupd/BackupClientInodeToIDMap.cpp +++ b/bin/bbackupd/BackupClientInodeToIDMap.cpp @@ -10,7 +10,9 @@ #include "Box.h" #include <stdlib.h> -#include <depot.h> + +#define _PUBLIC_ +#include "tdb.h" #define BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION #include "BackupClientInodeToIDMap.h" @@ -26,7 +28,7 @@ typedef struct int64_t mInDirectory; } IDBRecord; -#define BOX_DBM_MESSAGE(stuff) stuff << " (qdbm): " << dperrmsg(dpecode) +#define BOX_DBM_MESSAGE(stuff) stuff << " (tdb): " << tdb_error(mpContext) #define BOX_LOG_DBM_ERROR(stuff) \ BOX_ERROR(BOX_DBM_MESSAGE(stuff)) @@ -36,21 +38,21 @@ typedef struct THROW_EXCEPTION_MESSAGE(exception, subtype, \ BOX_DBM_MESSAGE(message << ": " << filename)); -#define ASSERT_DBM_OK(operation, message, filename, exception, subtype) \ - if(!(operation)) \ +#define ASSERT_DBM(success, message, exception, subtype) \ + if(!(success)) \ { \ - THROW_DBM_ERROR(message, filename, exception, subtype); \ + THROW_DBM_ERROR(message, mFilename, exception, subtype); \ } #define ASSERT_DBM_OPEN() \ - if(mpDepot == 0) \ + if(mpContext == 0) \ { \ THROW_EXCEPTION_MESSAGE(BackupStoreException, InodeMapNotOpen, \ "Inode database not open"); \ } #define ASSERT_DBM_CLOSED() \ - if(mpDepot != 0) \ + if(mpContext != 0) \ { \ THROW_EXCEPTION_MESSAGE(CommonException, Internal, \ "Inode database already open: " << mFilename); \ @@ -67,7 +69,7 @@ typedef struct BackupClientInodeToIDMap::BackupClientInodeToIDMap() : mReadOnly(true), mEmpty(false), - mpDepot(0) + mpContext(NULL) { } @@ -81,7 +83,7 @@ BackupClientInodeToIDMap::BackupClientInodeToIDMap() // -------------------------------------------------------------------------- BackupClientInodeToIDMap::~BackupClientInodeToIDMap() { - if(mpDepot != 0) + if(mpContext != NULL) { Close(); } @@ -108,15 +110,15 @@ void BackupClientInodeToIDMap::Open(const char *Filename, bool ReadOnly, ASSERT(!mEmpty); // Open the database file - int mode = ReadOnly ? DP_OREADER : DP_OWRITER; + int mode = ReadOnly ? O_RDONLY : O_RDWR; if(CreateNew) { - mode |= DP_OCREAT; + mode |= O_CREAT; } - mpDepot = dpopen(Filename, mode, 0); + mpContext = tdb_open(Filename, 0, 0, mode, 0700); - ASSERT_DBM_OK(mpDepot, "Failed to open inode database", mFilename, + ASSERT_DBM(mpContext != NULL, "Failed to open inode database", BackupStoreException, BerkelyDBFailure); // Read only flag @@ -137,7 +139,7 @@ void BackupClientInodeToIDMap::Open(const char *Filename, bool ReadOnly, void BackupClientInodeToIDMap::OpenEmpty() { ASSERT_DBM_CLOSED(); - ASSERT(mpDepot == 0); + ASSERT(mpContext == NULL); mEmpty = true; mReadOnly = true; } @@ -153,11 +155,22 @@ void BackupClientInodeToIDMap::OpenEmpty() void BackupClientInodeToIDMap::Close() { ASSERT_DBM_OPEN(); - ASSERT_DBM_OK(dpclose(mpDepot), "Failed to close inode database", - mFilename, BackupStoreException, BerkelyDBFailure); - mpDepot = 0; + ASSERT_DBM(tdb_close(mpContext) == 0, "Failed to close inode database", + BackupStoreException, BerkelyDBFailure); + mpContext = NULL; } +static TDB_DATA GetDatum(void* dptr, size_t dsize) +{ + TDB_DATA datum; + datum.dptr = (unsigned char *)dptr; + datum.dsize = dsize; + return datum; +} + +#define GET_STRUCT_DATUM(structure) \ + GetDatum(&structure, sizeof(structure)) + // -------------------------------------------------------------------------- // // Function @@ -176,7 +189,7 @@ void BackupClientInodeToIDMap::AddToMap(InodeRefType InodeRef, int64_t ObjectID, THROW_EXCEPTION(BackupStoreException, InodeMapIsReadOnly); } - if(mpDepot == 0) + if(mpContext == 0) { THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen); } @@ -188,9 +201,9 @@ void BackupClientInodeToIDMap::AddToMap(InodeRefType InodeRef, int64_t ObjectID, rec.mObjectID = ObjectID; rec.mInDirectory = InDirectory; - ASSERT_DBM_OK(dpput(mpDepot, (const char *)&InodeRef, sizeof(InodeRef), - (const char *)&rec, sizeof(rec), DP_DOVER), - "Failed to add record to inode database", mFilename, + ASSERT_DBM(tdb_store(mpContext, GET_STRUCT_DATUM(InodeRef), + GET_STRUCT_DATUM(rec), 0) == 0, + "Failed to add record to inode database", BackupStoreException, BerkelyDBFailure); } @@ -214,22 +227,33 @@ bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, return false; } - if(mpDepot == 0) + if(mpContext == 0) { THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen); } ASSERT_DBM_OPEN(); - IDBRecord rec; - - if(dpgetwb(mpDepot, (const char *)&InodeRef, sizeof(InodeRef), - 0, sizeof(IDBRecord), (char *)&rec) == -1) + TDB_DATA datum = tdb_fetch(mpContext, GET_STRUCT_DATUM(InodeRef)); + if(datum.dptr == NULL) { // key not in file return false; } + + IDBRecord rec; + if(datum.dsize != sizeof(rec)) + { + THROW_EXCEPTION_MESSAGE(CommonException, Internal, + "Failed to get inode database entry: " + "record has wrong size: expected " << + sizeof(rec) << " but was " << datum.dsize << + " in " << mFilename); + } + rec = *(IDBRecord *)datum.dptr; + free(datum.dptr); + // Return data rObjectIDOut = rec.mObjectID; rInDirectoryOut = rec.mInDirectory; |