summaryrefslogtreecommitdiff
path: root/bin/bbackupd/BackupClientInodeToIDMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bin/bbackupd/BackupClientInodeToIDMap.cpp')
-rw-r--r--bin/bbackupd/BackupClientInodeToIDMap.cpp76
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;