summaryrefslogtreecommitdiff
path: root/bin/bbackupd/BackupClientInodeToIDMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bin/bbackupd/BackupClientInodeToIDMap.cpp')
-rwxr-xr-xbin/bbackupd/BackupClientInodeToIDMap.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/bin/bbackupd/BackupClientInodeToIDMap.cpp b/bin/bbackupd/BackupClientInodeToIDMap.cpp
index 7141d5f4..c3f20df0 100755
--- a/bin/bbackupd/BackupClientInodeToIDMap.cpp
+++ b/bin/bbackupd/BackupClientInodeToIDMap.cpp
@@ -65,7 +65,11 @@ BackupClientInodeToIDMap::~BackupClientInodeToIDMap()
#ifndef BACKIPCLIENTINODETOIDMAP_IN_MEMORY_IMPLEMENTATION
if(dbp != 0)
{
+#ifdef BERKELY_V4
+ dbp->close(0);
+#else
dbp->close(dbp);
+#endif
}
#endif
}
@@ -90,7 +94,14 @@ void BackupClientInodeToIDMap::Open(const char *Filename, bool ReadOnly, bool Cr
ASSERT(!mEmpty);
// Open the database file
+#ifdef BERKELY_V4
+ dbp = new Db(0,0);
+ dbp->set_pagesize(1024); /* Page size: 1K. */
+ dbp->set_cachesize(0, 32 * 1024, 0);
+ dbp->open(NULL, Filename, NULL, DB_HASH, DB_CREATE, 0664);
+#else
dbp = dbopen(Filename, (CreateNew?O_CREAT:0) | (ReadOnly?O_RDONLY:O_RDWR), S_IRUSR | S_IWUSR | S_IRGRP, TABLE_DATABASE_TYPE, NULL);
+#endif
if(dbp == NULL)
{
THROW_EXCEPTION(BackupStoreException, BerkelyDBFailure);
@@ -135,7 +146,11 @@ void BackupClientInodeToIDMap::Close()
#ifndef BACKIPCLIENTINODETOIDMAP_IN_MEMORY_IMPLEMENTATION
if(dbp != 0)
{
+#ifdef BERKELY_V4
+ if(dbp->close(0) != 0)
+#else
if(dbp->close(dbp) != 0)
+#endif
{
THROW_EXCEPTION(BackupStoreException, BerkelyDBFailure);
}
@@ -172,6 +187,15 @@ void BackupClientInodeToIDMap::AddToMap(InodeRefType InodeRef, int64_t ObjectID,
IDBRecord rec;
rec.mObjectID = ObjectID;
rec.mInDirectory = InDirectory;
+
+#ifdef BERKELY_V4
+ Dbt key(&InodeRef, sizeof(InodeRef));
+ Dbt data(&rec, sizeof(rec));
+
+ if (dbp->put(0, &key, &data, 0) != 0) {
+ THROW_EXCEPTION(BackupStoreException, BerkelyDBFailure);
+ }
+#else
DBT key;
key.data = &InodeRef;
@@ -187,6 +211,7 @@ void BackupClientInodeToIDMap::AddToMap(InodeRefType InodeRef, int64_t ObjectID,
THROW_EXCEPTION(BackupStoreException, BerkelyDBFailure);
}
#endif
+#endif
}
// --------------------------------------------------------------------------
@@ -225,6 +250,11 @@ bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, int64_t &rObjectIDO
THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen);
}
+#ifdef BERKELY_V4
+ Dbt key(&InodeRef, sizeof(InodeRef));
+ Dbt data(0, 0);
+ switch(dbp->get(NULL, &key, &data, 0))
+#else
DBT key;
key.data = &InodeRef;
key.size = sizeof(InodeRef);
@@ -234,6 +264,8 @@ bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, int64_t &rObjectIDO
data.size = 0;
switch(dbp->get(dbp, &key, &data, 0))
+#endif
+
{
case 1: // key not in file
return false;
@@ -248,6 +280,21 @@ bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, int64_t &rObjectIDO
}
// Check for sensible return
+#ifdef BERKELY_V4
+ if(key.get_data() == 0 || data.get_size() != sizeof(IDBRecord))
+ {
+ // Assert in debug version
+ ASSERT(key.get_data() == 0 || data.get_size() != sizeof(IDBRecord));
+
+ // Invalid entries mean it wasn't found
+ return false;
+ }
+
+ // Data alignment isn't guaranteed to be on a suitable boundary
+ IDBRecord rec;
+
+ ::memcpy(&rec, data.get_data(), sizeof(rec));
+#else
if(key.data == 0 || data.size != sizeof(IDBRecord))
{
// Assert in debug version
@@ -257,9 +304,11 @@ bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, int64_t &rObjectIDO
return false;
}
- // Data alignment isn't guarentted to be on a suitable bounday
+ // Data alignment isn't guaranteed to be on a suitable boundary
IDBRecord rec;
+
::memcpy(&rec, data.data, sizeof(rec));
+#endif
// Return data
rObjectIDOut = rec.mObjectID;