diff options
Diffstat (limited to 'bin/bbackupd/BackupClientInodeToIDMap.cpp')
-rwxr-xr-x | bin/bbackupd/BackupClientInodeToIDMap.cpp | 51 |
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; |