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.cpp320
1 files changed, 0 insertions, 320 deletions
diff --git a/bin/bbackupd/BackupClientInodeToIDMap.cpp b/bin/bbackupd/BackupClientInodeToIDMap.cpp
deleted file mode 100644
index 6eaf7394..00000000
--- a/bin/bbackupd/BackupClientInodeToIDMap.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-// --------------------------------------------------------------------------
-//
-// File
-// Name: BackupClientInodeToIDMap.cpp
-// Purpose: Map of inode numbers to file IDs on the store
-// Created: 11/11/03
-//
-// --------------------------------------------------------------------------
-
-#include "Box.h"
-
-#include <stdlib.h>
-#include <depot.h>
-
-#define BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION
-#include "BackupClientInodeToIDMap.h"
-#undef BACKIPCLIENTINODETOIDMAP_IMPLEMENTATION
-
-#include "Archive.h"
-#include "BackupStoreException.h"
-#include "CollectInBufferStream.h"
-#include "MemBlockStream.h"
-#include "autogen_CommonException.h"
-
-#include "MemLeakFindOn.h"
-
-#define BOX_DBM_INODE_DB_VERSION_KEY "BackupClientInodeToIDMap.Version"
-#define BOX_DBM_INODE_DB_VERSION_CURRENT 2
-
-#define BOX_DBM_MESSAGE(stuff) stuff << " (qdbm): " << dperrmsg(dpecode)
-
-#define BOX_LOG_DBM_ERROR(stuff) \
- BOX_ERROR(BOX_DBM_MESSAGE(stuff))
-
-#define THROW_DBM_ERROR(message, filename, exception, subtype) \
- BOX_LOG_DBM_ERROR(message << ": " << filename); \
- THROW_EXCEPTION_MESSAGE(exception, subtype, \
- BOX_DBM_MESSAGE(message << ": " << filename));
-
-#define ASSERT_DBM_OK(operation, message, filename, exception, subtype) \
- if(!(operation)) \
- { \
- THROW_DBM_ERROR(message, filename, exception, subtype); \
- }
-
-#define ASSERT_DBM_OPEN() \
- if(mpDepot == 0) \
- { \
- THROW_EXCEPTION_MESSAGE(BackupStoreException, InodeMapNotOpen, \
- "Inode database not open"); \
- }
-
-#define ASSERT_DBM_CLOSED() \
- if(mpDepot != 0) \
- { \
- THROW_EXCEPTION_MESSAGE(CommonException, Internal, \
- "Inode database already open: " << mFilename); \
- }
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::BackupClientInodeToIDMap()
-// Purpose: Constructor
-// Created: 11/11/03
-//
-// --------------------------------------------------------------------------
-BackupClientInodeToIDMap::BackupClientInodeToIDMap()
- : mReadOnly(true),
- mEmpty(false),
- mpDepot(0)
-{
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::~BackupClientInodeToIDMap()
-// Purpose: Destructor
-// Created: 11/11/03
-//
-// --------------------------------------------------------------------------
-BackupClientInodeToIDMap::~BackupClientInodeToIDMap()
-{
- if(mpDepot != 0)
- {
- Close();
- }
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::Open(const char *, bool, bool)
-// Purpose: Open the database map, creating a file on disc to store everything
-// Created: 20/11/03
-//
-// --------------------------------------------------------------------------
-void BackupClientInodeToIDMap::Open(const char *Filename, bool ReadOnly,
- bool CreateNew)
-{
- mFilename = Filename;
-
- // Correct arguments?
- ASSERT(!(CreateNew && ReadOnly));
-
- // Correct usage?
- ASSERT_DBM_CLOSED();
- ASSERT(!mEmpty);
-
- // Open the database file
- int mode = ReadOnly ? DP_OREADER : DP_OWRITER;
- if(CreateNew)
- {
- mode |= DP_OCREAT;
- }
-
- mpDepot = dpopen(Filename, mode, 0);
-
- if(!mpDepot)
- {
- THROW_EXCEPTION_MESSAGE(BackupStoreException, BerkelyDBFailure,
- BOX_DBM_MESSAGE("Failed to open inode database: " <<
- mFilename));
- }
-
- const char* version_key = BOX_DBM_INODE_DB_VERSION_KEY;
- int32_t version = 0;
-
- if(CreateNew)
- {
- version = BOX_DBM_INODE_DB_VERSION_CURRENT;
-
- int ret = dpput(mpDepot, version_key, strlen(version_key),
- (char *)(&version), sizeof(version), DP_DKEEP);
-
- if(!ret)
- {
- THROW_EXCEPTION_MESSAGE(BackupStoreException, BerkelyDBFailure,
- BOX_DBM_MESSAGE("Failed to write version number to inode "
- "database: " << mFilename));
- }
- }
- else
- {
- int ret = dpgetwb(mpDepot, version_key, strlen(version_key), 0,
- sizeof(version), (char *)(&version));
-
- if(ret == -1)
- {
- THROW_EXCEPTION_MESSAGE(BackupStoreException, BerkelyDBFailure,
- "Missing version number in inode database. Perhaps it "
- "needs to be recreated: " << mFilename);
- }
-
- if(ret != sizeof(version))
- {
- THROW_EXCEPTION_MESSAGE(BackupStoreException, BerkelyDBFailure,
- "Wrong size version number in inode database: expected "
- << sizeof(version) << " bytes but found " << ret);
- }
-
- if(version != BOX_DBM_INODE_DB_VERSION_CURRENT)
- {
- THROW_EXCEPTION_MESSAGE(BackupStoreException, BerkelyDBFailure,
- "Wrong version number in inode database: expected " <<
- BOX_DBM_INODE_DB_VERSION_CURRENT << " but found " <<
- version << ". Perhaps it needs to be recreated: " <<
- mFilename);
- }
-
- // By this point the version number has been checked and is OK.
- }
-
- // Read only flag
- mReadOnly = ReadOnly;
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::OpenEmpty()
-// Purpose: 'Open' this map. Not associated with a disc file.
-// Useful for when a map is required, but is against
-// an empty file on disc which shouldn't be created.
-// Implies read only.
-// Created: 20/11/03
-//
-// --------------------------------------------------------------------------
-void BackupClientInodeToIDMap::OpenEmpty()
-{
- ASSERT_DBM_CLOSED();
- ASSERT(mpDepot == 0);
- mEmpty = true;
- mReadOnly = true;
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::Close()
-// Purpose: Close the database file
-// Created: 20/11/03
-//
-// --------------------------------------------------------------------------
-void BackupClientInodeToIDMap::Close()
-{
- ASSERT_DBM_OPEN();
- ASSERT_DBM_OK(dpclose(mpDepot), "Failed to close inode database",
- mFilename, BackupStoreException, BerkelyDBFailure);
- mpDepot = 0;
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::AddToMap(InodeRefType,
-// int64_t, int64_t)
-// Purpose: Adds an entry to the map. Overwrites any existing
-// entry.
-// Created: 11/11/03
-//
-// --------------------------------------------------------------------------
-void BackupClientInodeToIDMap::AddToMap(InodeRefType InodeRef, int64_t ObjectID,
- int64_t InDirectory, const std::string& LocalPath)
-{
- if(mReadOnly)
- {
- THROW_EXCEPTION(BackupStoreException, InodeMapIsReadOnly);
- }
-
- if(mpDepot == 0)
- {
- THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen);
- }
-
- ASSERT_DBM_OPEN();
-
- // Setup structures
- CollectInBufferStream buf;
- Archive arc(buf, IOStream::TimeOutInfinite);
- arc.WriteExact((uint64_t)ObjectID);
- arc.WriteExact((uint64_t)InDirectory);
- arc.Write(LocalPath);
- buf.SetForReading();
-
- ASSERT_DBM_OK(dpput(mpDepot, (const char *)&InodeRef, sizeof(InodeRef),
- (const char *)buf.GetBuffer(), buf.GetSize(), DP_DOVER),
- "Failed to add record to inode database", mFilename,
- BackupStoreException, BerkelyDBFailure);
-}
-
-// --------------------------------------------------------------------------
-//
-// Function
-// Name: BackupClientInodeToIDMap::Lookup(InodeRefType,
-// int64_t &, int64_t &) const
-// Purpose: Looks up an inode in the map, returning true if it
-// exists, and the object ids of it and the directory
-// it's in the reference arguments.
-// Created: 11/11/03
-//
-// --------------------------------------------------------------------------
-bool BackupClientInodeToIDMap::Lookup(InodeRefType InodeRef, int64_t &rObjectIDOut,
- int64_t &rInDirectoryOut, std::string* pLocalPathOut) const
-{
- if(mEmpty)
- {
- // Map is empty
- return false;
- }
-
- if(mpDepot == 0)
- {
- THROW_EXCEPTION(BackupStoreException, InodeMapNotOpen);
- }
-
- ASSERT_DBM_OPEN();
- int size;
- char* data = dpget(mpDepot, (const char *)&InodeRef, sizeof(InodeRef),
- 0, -1, &size);
- if(data == NULL)
- {
- // key not in file
- return false;
- }
-
- // Free data automatically when the guard goes out of scope.
- MemoryBlockGuard<char *> guard(data);
- MemBlockStream stream(data, size);
- Archive arc(stream, IOStream::TimeOutInfinite);
-
- // Return data
- try
- {
- arc.Read(rObjectIDOut);
- arc.Read(rInDirectoryOut);
- if(pLocalPathOut)
- {
- arc.Read(*pLocalPathOut);
- }
- }
- catch(CommonException &e)
- {
- if(e.GetSubType() == CommonException::ArchiveBlockIncompleteRead)
- {
- THROW_FILE_ERROR("Failed to lookup record in inode database: "
- << InodeRef << ": not enough data in record", mFilename,
- BackupStoreException, BerkelyDBFailure);
- // Need to throw precisely that exception to ensure that the
- // invalid database is deleted, so that we don't hit the same
- // error next time.
- }
-
- throw;
- }
-
- // Found
- return true;
-}