Пример #1
0
  public void Commit( CommitStage c )
  {
    if ( Saved ) return;

    if ( c == CommitStage.Prepare )
    {
      // Save the pages to the underlying stream.
      foreach ( G.KeyValuePair<long,IndexPage> pair in PageMap )
      {
        IndexPage p = pair.Value;
        if ( !p.Saved )
        {
          p.WriteHeader();
          F.Position = (long)p.PageId * IndexPage.PageSize;
        
          // For last page, only write the amount actually used (so file size is minimised)
          F.Write( p.Data, 0, p.PageId == PageAlloc-1 ? p.Size() : IndexPage.PageSize );
          p.Saved = true;
        }
      }
    }
    else if ( c == CommitStage.Rollback )
    {
      PageMap.Clear();
      Initialise();
    }
    else F.Commit( c );
    if ( c >= CommitStage.Flush ) Saved = true;
  }
Пример #2
0
 public void Commit( CommitStage c )
 {
   if ( c == CommitStage.Rollback )
   {
     Buffers.Clear();
     UnsavedPageNums.Clear();
     UnsavedAdded = false;
     ReadAvail = 0;
     WriteAvail = 0;   
     CurBufferNum = -1;
   }
   else if ( c == CommitStage.Write )
   {
     foreach ( long bufferNum in UnsavedPageNums )
     {
       byte [] b = GetBuffer( bufferNum );
       long pos = bufferNum << BufferShift;
       long n = Len - pos;
       if ( n > BufferSize ) n = BufferSize;
       if ( BaseStream.Position != pos ) BaseStream.Position = pos;
       BaseStream.Write( b, 0, (int)n );
     }
     UnsavedPageNums.Clear();
     UnsavedAdded = false;
     BaseStream.SetLength( Len );
   }
   else if ( c == CommitStage.Flush )
   {
     BaseStream.Flush( true );
   }
 }
 public void Rollback()
 {
   Buffers.Clear();
   UnsavedPageNums.Clear();
   UnsavedAdded = false;
   ReadAvail = 0;
   WriteAvail = 0;   
   CurBufferNum = -1;
 }
 public void Rollback()
 {
   if ( Saved ) return;
   PageMap.Clear();
   Initialise();
 }