bool CMvDatabaseEx::AreItemsEqual(int i1, int i2) { const CMvItem *p1 = &Items[i1]; const CMvItem *p2 = &Items[i2]; const CDatabaseEx &db1 = Volumes[p1->VolumeIndex]; const CDatabaseEx &db2 = Volumes[p2->VolumeIndex]; const CItem &item1 = db1.Items[p1->ItemIndex]; const CItem &item2 = db2.Items[p2->ItemIndex];; return GetFolderIndex(p1) == GetFolderIndex(p2) && item1.Offset == item2.Offset && item1.Size == item2.Size && item1.Name == item2.Name; }
bool CMvDatabaseEx::Check() { for (int v = 1; v < Volumes.Size(); v++) { const CDatabaseEx &db1 = Volumes[v]; if (db1.IsTherePrevFolder()) { const CDatabaseEx &db0 = Volumes[v - 1]; if (db0.Folders.IsEmpty() || db1.Folders.IsEmpty()) return false; const CFolder &f0 = db0.Folders.Back(); const CFolder &f1 = db1.Folders.Front(); if (f0.CompressionTypeMajor != f1.CompressionTypeMajor || f0.CompressionTypeMinor != f1.CompressionTypeMinor) return false; } } UInt64 maxPos = 0; int prevFolder = -2; for(int i = 0; i < Items.Size(); i++) { const CMvItem &mvItem = Items[i]; int fIndex = GetFolderIndex(&mvItem); if (fIndex >= FolderStartFileIndex.Size()) return false; const CItem &item = Volumes[mvItem.VolumeIndex].Items[mvItem.ItemIndex]; if (item.IsDir()) continue; int folderIndex = GetFolderIndex(&mvItem); if (folderIndex != prevFolder) { prevFolder = folderIndex; maxPos = 0; continue; } if (item.Offset < maxPos) return false; maxPos = item.GetEndOffset(); if (maxPos < item.Offset) return false; } return true; }
bool CMvDatabaseEx::AreItemsEqual(int i1, int i2) { const CMvItem *p1 = &Items[i1]; const CMvItem *p2 = &Items[i2]; const CDatabaseEx &db1 = Volumes[p1->VolumeIndex]; const CDatabaseEx &db2 = Volumes[p2->VolumeIndex]; const CItem &item1 = db1.Items[p1->ItemIndex]; const CItem &item2 = db2.Items[p2->ItemIndex];; int f1 = GetFolderIndex(p1); int f2 = GetFolderIndex(p2); if (f1 != f2) return false; if (item1.Offset != item2.Offset) return false; if (item1.Size != item2.Size) return false; return true; }
void CMvDatabaseEx::FillSortAndShrink() { Items.Clear(); StartFolderOfVol.Clear(); FolderStartFileIndex.Clear(); int offset = 0; for (int v = 0; v < Volumes.Size(); v++) { const CDatabaseEx &db = Volumes[v]; int curOffset = offset; if (db.IsTherePrevFolder()) curOffset--; StartFolderOfVol.Add(curOffset); offset += db.GetNumberOfNewFolders(); CMvItem mvItem; mvItem.VolumeIndex = v; for (int i = 0 ; i < db.Items.Size(); i++) { mvItem.ItemIndex = i; Items.Add(mvItem); } } Items.Sort(CompareMvItems, (void *)this); int j = 1; int i; for (i = 1; i < Items.Size(); i++) if (!AreItemsEqual(i, i -1)) Items[j++] = Items[i]; Items.DeleteFrom(j); for (i = 0; i < Items.Size(); i++) { const CMvItem &mvItem = Items[i]; int folderIndex = GetFolderIndex(&mvItem); if (folderIndex >= FolderStartFileIndex.Size()) FolderStartFileIndex.Add(i); } }