bool StorageChunkWriter::Write(StorageEnvironment* env_, StorageFileChunk* file_) { env = env_; file = file_; if (fd.Open(file->GetFilename().GetBuffer(), FS_CREATE | FS_WRITEONLY | FS_APPEND) == INVALID_FD) return false; FS_FileTruncate(fd.GetFD(), 0); if (!WriteHeaderPage()) return false; if (!WriteDataPages()) return false; if (!WriteIndexPage()) return false; if (file->headerPage.UseBloomFilter()) { if (!WriteBloomPage()) return false; } StorageEnvironment::Sync(fd.GetFD()); fd.Close(); return true; }
//------------------------------------------------------------------------------ stPlainDiskPageManager::~stPlainDiskPageManager(){ // Free resources delete pageInstanceCache; // Save header page info. WriteHeaderPage(headerPage); // Delete header page. delete this->headerPage; // Close file close(fd); }//end stPlainDiskPageManager::~stPlainDiskPageManager
//------------------------------------------------------------------------------ void stPlainDiskPageManager::DisposePage(stPage * page){ stPageID * next; // Append to free list next = (stPageID *)page->GetData(); *next = header->Available; header->Available = page->GetPageID(); WritePage(page); // Update header header->UsedPages--; WriteHeaderPage(headerPage); // Free resources ReleasePage(page); }//end stPlainDiskPageManager::DisposePage
//============================================================================== // stPlainDiskPageManager //------------------------------------------------------------------------------ stPlainDiskPageManager::stPlainDiskPageManager(const char * fName, stSize pagesize){ // Open file fd = open(fName, O_CREAT|O_TRUNC|O_RDWR|O_BINARY, S_IREAD|S_IWRITE); // New file with 0 bytes if (fd < 0){ throw io_error("Unable to create file."); }//end if // Initialize fields. this->headerPage = new stLockablePage(pagesize, sizeof(tHeader), 0); this->header = (tHeader *)(this->headerPage->GetTrueData()); NewHeader(this->header, pagesize); WriteHeaderPage(headerPage); // Page cache pageInstanceCache = new stPageInstanceCache(STDISKPAGEMANAGER_INSTANCECACHESIZE, new stPageAllocator(pagesize)); }//end stPlainDiskPageManager::stPlainDiskPageManager
//------------------------------------------------------------------------------ stPage * stPlainDiskPageManager::GetNewPage(){ stPageID * next; stPage * page; if (header->Available == 0){ // Get instance from cache page = pageInstanceCache->Get(); // Creating the new page header->PageCount++; page->SetPageID(header->PageCount); }else{ // Remove from free list page = GetPage(header->Available); next = (stPageID *)(page->GetData()); header->Available = * next; }//end if // Update header header->UsedPages++; WriteHeaderPage(headerPage); return page; }//end stPlainDiskPageManager::GetNewPage