private IndexTablePage QueueExtractFirst() { if (this.m_queueFirstPage == null) { return(null); } IndexTablePage queueFirstPage = this.m_queueFirstPage; this.m_queueFirstPage = queueFirstPage.NextPage; queueFirstPage.NextPage = null; if (this.m_queueFirstPage == null) { this.m_queueLastPage = null; } else { this.m_queueFirstPage.PreviousPage = null; } return(queueFirstPage); }
private IndexTablePage GetPage(long id) { int num = this.CalcPageNum(id); IndexTablePage indexTablePage = null; if (!this.m_pageCache.TryGetValue(num, out indexTablePage)) { if (this.m_pageCache.Count == this.m_cacheSize) { if (this.m_stream == null) { this.m_stream = this.m_streamCreator.OpenStream(); this.m_streamCreator = null; if (!this.m_stream.CanSeek || !this.m_stream.CanRead || !this.m_stream.CanWrite) { Global.Tracer.Assert(false, "Must be able to Seek, Read, and Write stream"); } } indexTablePage = this.QueueExtractFirst(); int pageNumber = indexTablePage.PageNumber; this.m_pageCache.Remove(pageNumber); if (indexTablePage.Dirty) { long offset = this.CalcPageOffset(pageNumber); this.m_stream.Seek(offset, SeekOrigin.Begin); indexTablePage.Write(this.m_stream); } long offset2 = this.CalcPageOffset(num); this.m_stream.Seek(offset2, SeekOrigin.Begin); indexTablePage.Read(this.m_stream); } else { indexTablePage = new IndexTablePage(this.m_pageSize); } indexTablePage.PageNumber = num; this.m_pageCache[num] = indexTablePage; this.QueueAppendPage(indexTablePage); } return(indexTablePage); }
public long Retrieve(ReferenceID id) { IndexTablePage page = this.GetPage(id.Value); return(this.ReadValue(id.Value, page)); }
public void Update(ReferenceID id, long value) { IndexTablePage page = this.GetPage(id.Value); this.WriteValue(id.Value, page, value); }