示例#1
0
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