private void SplitPage() { #if DUMP_INSERTS System.Diagnostics.Trace.WriteLine("Split page #" + this.RecordNo); #endif var ndxFile = (NdxFile)mHolder.mFile; // split needed (on save) int mid = EntriesCount / 2; if (ParentPage == null) { ParentPage = (NdxPage)ndxFile.NewPage(null); var rootEntry = new NdxEntry(); var lastEntry = GetEntry(EntriesCount - 1); rootEntry.DbfRecordNo = lastEntry.DbfRecordNo; rootEntry.Fields = lastEntry.Fields.Clone(); rootEntry.LowerPageRecordNo = this.RecordNo; ParentPage.EntriesClear(); ParentPage.EntriesInsert(0, rootEntry); ndxFile.mNdxHeader.StartingPageRecordNo = ParentPage.RecordNo; //ParentPage.mNbChildEntries = mNbChildEntries; ParentPage.mIsModified = true; #if DUMP_INSERTS System.Diagnostics.Trace.WriteLine(" Create new parent page #" + mParentPage.RecordNo); mParentPage.Dump(" "); #endif } var newPage = (NdxPage)ndxFile.NewPage(ParentPage); newPage.EntriesClear(); newPage.mIsModified = true; newPage.ParentPage = ParentPage; for (int i = 0; i < mid; i++) { //mNbChildEntries = mNbChildEntries; newPage.EntriesInsert(i, GetEntry(i)); var lowerPageRecordNo = GetEntry(i).LowerPageRecordNo; if (lowerPageRecordNo != UInt32.MaxValue) { var ndxPage2 = ndxFile.InternalGetPage( ParentPage, lowerPageRecordNo, /* returnNullIfNotInCache */ true) as NdxPage; if (ndxPage2 != null) { ndxPage2.ParentPage = newPage; } } } EntriesRemoveRange(0, mid); var midEntry = newPage.GetEntry(mid - 1); var newMidEntry = new NdxEntry() { DbfRecordNo = midEntry.DbfRecordNo, LowerPageRecordNo = newPage.RecordNo, Fields = midEntry.Fields.Clone() }; #if DUMP_INSERTS System.Diagnostics.Trace.WriteLine(" newPage #" + newPage.RecordNo); newPage.Dump(" "); System.Diagnostics.Trace.WriteLine(" this page #" + RecordNo); Dump(" "); #endif int midEntryPos = ParentPage.FindInsertPos(newMidEntry, ndxFile); ParentPage.InsertInThisPage(newMidEntry, midEntryPos); }