// -------------------------------------------------------------------------- // // Function // Name: BackupStoreCheck::DumpObjectInfo() // Purpose: Debug only. Trace out all object info. // Created: 22/4/04 // // -------------------------------------------------------------------------- void BackupStoreCheck::DumpObjectInfo() { for(Info_t::const_iterator i(mInfo.begin()); i != mInfo.end(); ++i) { IDBlock *pblock = i->second; int32_t bentries = (pblock == mpInfoLastBlock)?mInfoLastBlockEntries:BACKUPSTORECHECK_BLOCK_SIZE; BOX_TRACE("BLOCK @ " << BOX_FORMAT_HEX32(pblock) << ", " << bentries << " entries"); for(int e = 0; e < bentries; ++e) { uint8_t flags = GetFlags(pblock, e); BOX_TRACE(std::hex << "id " << pblock->mID[e] << ", c " << pblock->mContainer[e] << ", " << ((flags & Flags_IsDir)?"dir":"file") << ", " << ((flags & Flags_IsContained) ? "contained":"unattached")); } } }
std::auto_ptr<BackupStoreInfo> BackupStoreInfo::Load(IOStream& rStream, const std::string FileName, bool ReadOnly) { // Read in format and version int32_t magic; if(!rStream.ReadFullBuffer(&magic, sizeof(magic), 0)) { THROW_FILE_ERROR("Failed to read store info file: " "short read of magic number", FileName, BackupStoreException, CouldNotLoadStoreInfo); } bool v1 = false, v2 = false; if(ntohl(magic) == INFO_MAGIC_VALUE_1) { v1 = true; } else if(ntohl(magic) == INFO_MAGIC_VALUE_2) { v2 = true; } else { THROW_FILE_ERROR("Failed to read store info file: " "unknown magic " << BOX_FORMAT_HEX32(ntohl(magic)), FileName, BackupStoreException, BadStoreInfoOnLoad); } // Make new object std::auto_ptr<BackupStoreInfo> info(new BackupStoreInfo); // Put in basic location info info->mFilename = FileName; info->mReadOnly = ReadOnly; int64_t numDelObj = 0; if (v1) { // Read in a header info_StreamFormat_1 hdr; rStream.Seek(0, IOStream::SeekType_Absolute); if(!rStream.ReadFullBuffer(&hdr, sizeof(hdr), 0 /* not interested in bytes read if this fails */)) { THROW_FILE_ERROR("Failed to read store info header", FileName, BackupStoreException, CouldNotLoadStoreInfo); } // Insert info from file info->mAccountID = ntohl(hdr.mAccountID); info->mClientStoreMarker = box_ntoh64(hdr.mClientStoreMarker); info->mLastObjectIDUsed = box_ntoh64(hdr.mLastObjectIDUsed); info->mBlocksUsed = box_ntoh64(hdr.mBlocksUsed); info->mBlocksInOldFiles = box_ntoh64(hdr.mBlocksInOldFiles); info->mBlocksInDeletedFiles = box_ntoh64(hdr.mBlocksInDeletedFiles); info->mBlocksInDirectories = box_ntoh64(hdr.mBlocksInDirectories); info->mBlocksSoftLimit = box_ntoh64(hdr.mBlocksSoftLimit); info->mBlocksHardLimit = box_ntoh64(hdr.mBlocksHardLimit); // Load up array of deleted objects numDelObj = box_ntoh64(hdr.mNumberDeletedDirectories); } else if(v2) { Archive archive(rStream, IOStream::TimeOutInfinite); // Check it archive.Read(info->mAccountID); archive.Read(info->mAccountName); archive.Read(info->mClientStoreMarker); archive.Read(info->mLastObjectIDUsed); archive.Read(info->mBlocksUsed); archive.Read(info->mBlocksInCurrentFiles); archive.Read(info->mBlocksInOldFiles); archive.Read(info->mBlocksInDeletedFiles); archive.Read(info->mBlocksInDirectories); archive.Read(info->mBlocksSoftLimit); archive.Read(info->mBlocksHardLimit); archive.Read(info->mNumCurrentFiles); archive.Read(info->mNumOldFiles); archive.Read(info->mNumDeletedFiles); archive.Read(info->mNumDirectories); archive.Read(numDelObj); } // Then load the list of deleted directories if(numDelObj > 0) { int64_t objs[NUM_DELETED_DIRS_BLOCK]; int64_t toload = numDelObj; while(toload > 0) { // How many in this one? int b = (toload > NUM_DELETED_DIRS_BLOCK)?NUM_DELETED_DIRS_BLOCK:((int)(toload)); if(!rStream.ReadFullBuffer(objs, b * sizeof(int64_t), 0 /* not interested in bytes read if this fails */)) { THROW_EXCEPTION(BackupStoreException, CouldNotLoadStoreInfo) } // Add them for(int t = 0; t < b; ++t) { info->mDeletedDirectories.push_back(box_ntoh64(objs[t])); } // Number loaded toload -= b; } }