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; }
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(); }