@@ -5,9 +5,9 @@ interface
55uses
66 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
77 Dialogs, StdCtrls, FileCtrl, ComCtrls, uStructs, DB, ExtCtrls,
8- Menus, uCommon, uDatabase, XPMan, uDataPage, Grids, DBGrids, DBClient,
8+ Menus, uCommon, XPMan, uDataPage, Grids, DBGrids, DBClient,
99 DBCtrls, Spin, Vcl.Buttons,
10- uPageAnalyzer, uDatabaseStats, uFlagManager;
10+ uPageAnalyzer, uDatabaseStats, uFlagManager, StrUtils ;
1111
1212type
1313 TfrmMain = class (TForm)
@@ -200,6 +200,7 @@ procedure TfrmMain.btnReWriteClick(Sender: TObject);
200200 PageInfo: TPageInfo;
201201 NewPageBuffer: TBytes;
202202 FileStream: TFileStream;
203+ ModifiedHeader: TPag; // --- ÄÎÁÀÂËÅÍÎ ---
203204begin
204205 // ReWriting page - ÂÍÈÌÀÍÈÅ: Ýòî ÎÏÀÑÍÀß îïåðàöèÿ!
205206 if Application.MessageBox(' Do You Want to Rewrite Database Page? THIS IS DANGEROUS!' ,
@@ -214,10 +215,18 @@ procedure TfrmMain.btnReWriteClick(Sender: TObject);
214215 PageInfo := FPageAnalyzer.GetPageInfo(PageNum);
215216 NewPageBuffer := Copy(PageInfo.Buffer); // Êîïèðóåì òåêóùèé áóôåð
216217
217- // Ìîäèôèöèðóåì çàãîëîâîê â áóôåðå
218- TPag(NewPageBuffer[0 ]).pag_checksum := UShort(NewChecksum);
218+ // --- ÈÑÏÐÀÂËÅÍÈÅ: Èñïîëüçóåì Move äëÿ áåçîïàñíîãî êîïèðîâàíèÿ è èçìåíåíèÿ çàãîëîâêà ---
219+ // Ñêîïèðóåì ñòàíäàðòíûé çàãîëîâîê èç áóôåðà â ëîêàëüíóþ ïåðåìåííóþ
220+ Move(NewPageBuffer[0 ], ModifiedHeader, SizeOf(TPag));
221+
222+ // Èçìåíèì ïîëÿ â ëîêàëüíîé ïåðåìåííîé
223+ ModifiedHeader.pag_checksum := UShort(NewChecksum);
219224 if (NewType >= 0 ) and (NewType <= $FF) then // Ïðîâåðÿåì äèàïàçîí
220- TPag(NewPageBuffer[0 ]).pag_type := SChar(NewType);
225+ ModifiedHeader.pag_type := SChar(NewType);
226+
227+ // Ñêîïèðóåì èçìåí¸ííóþ ëîêàëüíóþ ïåðåìåííóþ îáðàòíî â áóôåð
228+ Move(ModifiedHeader, NewPageBuffer[0 ], SizeOf(TPag));
229+ // --- ÊÎÍÅÖ ÈÑÏÐÀÂËÅÍÈß ---
221230
222231 // Çàïèñûâàåì èçìåí¸ííûé áóôåð îáðàòíî â ôàéë
223232 FileStream := TFileStream.Create(FPageAnalyzer.FileName, fmOpenReadWrite or fmShareExclusive);
@@ -290,20 +299,19 @@ procedure TfrmMain.btnGetHeaderFlagsClick(Sender: TObject);
290299 try
291300 Flags := FFlagManager.GetFlags;
292301
293- // Ôîðìèðóåì ñòðîêó äëÿ îòîáðàæåíèÿ (íàïðèìåð, áèíàðíîå ïðåäñòàâëåíèå èëè ïðîñòî ñïèñîê)
294- // Äëÿ ïðîñòîòû, âûâåäåì ñïèñîê àêòèâíûõ ôëàãîâ
302+
295303 edtFlags.text := ' Active flags: ' ;
296304 if Flags.ActiveShadow then edtFlags.text := edtFlags.text + ' ActiveShadow, ' ;
297305 if Flags.ForceWrite then edtFlags.text := edtFlags.text + ' ForceWrite, ' ;
298306 if Flags.NoChecksums then edtFlags.text := edtFlags.text + ' NoChecksums, ' ;
299307 if Flags.NoReserve then edtFlags.text := edtFlags.text + ' NoReserve, ' ;
300308 if Flags.SqlDialect3 then edtFlags.text := edtFlags.text + ' SqlDialect3, ' ;
301309 if Flags.ReadOnly then edtFlags.text := edtFlags.text + ' ReadOnly, ' ;
302- // Óáèðàåì ïîñëåäíþþ çàïÿòóþ
303- if edtFlags.text.EndsWith(' , ' ) then
304- edtFlags.text := edtFlags.text.Remove(edtFlags.text.Length - 2 );
305310
306- // Èëè ìîæíî âûâåñòè âñå ôëàãè ñ óêàçàíèåì ñòàòóñà
311+ if EndsStr(' , ' , edtFlags.text) then // Èñïîëüçóåì EndsStr èç StrUtils
312+ edtFlags.text := Copy(edtFlags.text, 1 , Length(edtFlags.text) - 2 ); // Óäàëÿåì ïîñëåäíèå 2 ñèìâîëà
313+
314+
307315 lstDBFlags.Items.Add(Format(' Active Shadow: %s' , [BoolToStr(Flags.ActiveShadow, True)]));
308316 lstDBFlags.Items.Add(Format(' Force Write: %s' , [BoolToStr(Flags.ForceWrite, True)]));
309317 lstDBFlags.Items.Add(Format(' No Checksums: %s' , [BoolToStr(Flags.NoChecksums, True)]));
@@ -348,28 +356,28 @@ procedure TfrmMain.checkDB;
348356 lstLog.Items.Add(' Database page size: ' + IntToStr(FPageAnalyzer.PageSize));
349357 lstLog.Items.Add(' Scanning pages...' );
350358
351- // Âû÷èñëÿåì ñòàòèñòèêó ÷åðåç FDatabaseStats
359+
352360 FDatabaseStats.CalculateStats;
353361
354- // Ïîëó÷àåì ðåçóëüòàòû
362+
355363 PageStats := FDatabaseStats.PageStats;
356364 TxStats := FDatabaseStats.TransactionStats;
357365 RelStats := FDatabaseStats.RelationStats;
358366
359- // Îáíîâëÿåì ïðîãðåññ áàð (äëÿ íàãëÿäíîñòè, õîòÿ òåïåðü ýòî áûñòðî)
367+
360368 pbDetectedPage.Min := 0 ;
361- pbDetectedPage.Max := 100 ; // Óñëîâíî
369+ pbDetectedPage.Max := 100 ;
362370 pbDetectedPage.Position := 100 ;
363371
364- // Âûâîäèì ðåçóëüòàòû ïîäñ÷åòà
372+
365373 lstLog.Items.Add(' --- Page Type Summary ---' );
366374 lstLog.Items.Add(' Count Header Pages: ' + IntToStr(PageStats.HeaderPages));
367375 lstLog.Items.Add(' Count Page Inventory Pages (PIP): ' + IntToStr(PageStats.PipPages));
368376 lstLog.Items.Add(' Count Transaction Inventory Pages (TIP): ' + IntToStr(PageStats.TipPages));
369377 lstLog.Items.Add(' Count Pointer Pages: ' + IntToStr(PageStats.PointerPages));
370378 lstLog.Items.Add(' Count Data Pages: ' + IntToStr(PageStats.DataPages));
371379 lstLog.Items.Add(' Count Index Root Pages: ' + IntToStr(PageStats.IndexRootPages));
372- lstLog.Items.Add(' Count Index B-Tree Pages: ' + IntToStr(PageStats.IndexBtreePages)); // Èñïðàâëåíî
380+ lstLog.Items.Add(' Count Index B-Tree Pages: ' + IntToStr(PageStats.IndexBtreePages));
373381 lstLog.Items.Add(' Count Blob Pages: ' + IntToStr(PageStats.BlobPages));
374382 lstLog.Items.Add(' Count Generator Pages: ' + IntToStr(PageStats.GeneratorPages));
375383 lstLog.Items.Add(' Count Write Ahead Log Pages: ' + IntToStr(PageStats.WalPages));
@@ -415,12 +423,10 @@ procedure TfrmMain.btnWriteFlagsClick(Sender: TObject);
415423 try
416424 NewFlags := FFlagManager.GetFlags;
417425
418- // Îáíîâëÿåì ôëàãè â ñîîòâåòñòâèè ñ ÷åêáîêñàìè
426+
419427 NewFlags.ForceWrite := chkSetFW.Checked;
420428 NewFlags.ReadOnly := chkReadOnly.Checked;
421- // Äîáàâüòå äðóãèå ôëàãè ïî íåîáõîäèìîñòè
422429
423- // Óñòàíàâëèâàåì ôëàãè ÷åðåç FFlagManager
424430 FFlagManager.SetFlags(NewFlags);
425431
426432 Application.MessageBox(' Header flags updated!' , ' Information' , MB_OK + MB_ICONINFORMATION);
@@ -452,14 +458,14 @@ procedure TfrmMain.UpdateFlagCheckboxesFromManager;
452458 end ;
453459end ;
454460
455- // tsFlagsShow - òåïåðü èñïîëüçóåò UpdateFlagCheckboxesFromManager
461+
456462procedure TfrmMain.tsFlagsShow (Sender: TObject);
457463begin
458- // Îáíîâëÿåì ÷åêáîêñû ïðè ïîêàçå âêëàäêè
464+
459465 UpdateFlagCheckboxesFromManager;
460466end ;
461467
462- // pgcServicesChange - îáíîâëÿåò MaxValue äëÿ sePosition
468+
463469procedure TfrmMain.pgcServicesChange (Sender: TObject);
464470begin
465471 if tsGenerateNewPage.Showing then
@@ -513,15 +519,13 @@ procedure TfrmMain.btnGotoPageClick(Sender: TObject);
513519 end ;
514520
515521 btnGotoPage.Enabled := False;
516- mmoData.Clear; // Î÷èùàåì Memo ïåðåä âûâîäîì
517-
518- // Èñïîëüçóåì ôóíêöèþ èç uDataPage äëÿ èçâëå÷åíèÿ ôðàãìåíòîâ
522+ mmoData.Clear;
519523 PageFragments := ExtractDataFragments(PageInfo.Buffer, PageInfo.Size);
520524
521525 pbDataProgress.Min := 0 ;
522- pbDataProgress.Max := Length(PageFragments) - 1 ; // Êîëè÷åñòâî ôðàãìåíòîâ
526+ pbDataProgress.Max := Length(PageFragments) - 1 ;
523527
524- for i := 0 to High(PageFragments) do // Èñïîëüçóåì High äëÿ ìàññèâà
528+ for i := 0 to High(PageFragments) do
525529 begin
526530 pbDataProgress.Position := i;
527531 mmoData.Lines.Add(' Fragment ' + IntToStr(i) + ' , Offset: ' + IntToStr(PageFragments[i].Offset));
0 commit comments