mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00

* Keep only one TRegistry object in memory instead of creating a new one in each routine. * Move out relevant functions and TRegistry object from main to helpers to make them usable globally.
316 lines
7.6 KiB
ObjectPascal
316 lines
7.6 KiB
ObjectPascal
unit optimizetables;
|
|
|
|
|
|
// -------------------------------------
|
|
// Table-diagnostics
|
|
// -------------------------------------
|
|
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
ExtCtrls, StdCtrls, CheckLst, comctrls, Buttons, ToolWin, Db,
|
|
WideStrings, TntCheckLst, TntStdCtrls, WideStrUtils;
|
|
|
|
type
|
|
Toptimize = class(TForm)
|
|
TablesCheckListBox: TTNTCheckListBox;
|
|
DBComboBox: TTnTComboBox;
|
|
lblSelect: TLabel;
|
|
btnClose: TButton;
|
|
cbxQuickRepair: TCheckBox;
|
|
cbxQuickCheck: TCheckBox;
|
|
btnOptimize: TButton;
|
|
btnCheck: TButton;
|
|
btnAnalyze: TButton;
|
|
btnRepair: TButton;
|
|
lblResults: TLabel;
|
|
ListResults: TListView;
|
|
tlbCheckToggle: TToolBar;
|
|
tlbCheckNone: TToolButton;
|
|
tlbCheckAll: TToolButton;
|
|
cbxExtendedCheck: TCheckBox;
|
|
cbxExtendedRepair: TCheckBox;
|
|
btnHelp: TButton;
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure DBComboBoxChange(Sender: TObject);
|
|
procedure CheckListToggle(Sender: TObject);
|
|
procedure Optimize(Sender: TObject);
|
|
procedure Check(Sender: TObject);
|
|
procedure Analyze(Sender: TObject);
|
|
procedure Repair(Sender: TObject);
|
|
procedure ClearResults;
|
|
procedure AddResults(ds: TDataSet);
|
|
procedure btnHelpClick(Sender: TObject);
|
|
procedure TablesCheckListBoxClickCheck(Sender: TObject);
|
|
procedure RunIterated(pseudoSql: WideString);
|
|
procedure ValidateControls;
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses helpers, main;
|
|
|
|
{$R *.DFM}
|
|
|
|
|
|
{**
|
|
FormCreate: Restore GUI setup
|
|
}
|
|
procedure Toptimize.FormCreate(Sender: TObject);
|
|
begin
|
|
Width := GetRegValue(REGNAME_MAINTWINWIDTH, Width);
|
|
Height := GetRegValue(REGNAME_MAINTWINHEIGHT, Height);
|
|
SetWindowSizeGrip( Self.Handle, True );
|
|
InheritFont(Font);
|
|
end;
|
|
|
|
|
|
{**
|
|
FormDestroy: Save GUI setup
|
|
}
|
|
procedure Toptimize.FormDestroy(Sender: TObject);
|
|
begin
|
|
OpenRegistry;
|
|
MainReg.WriteInteger( REGNAME_MAINTWINWIDTH, Width );
|
|
MainReg.WriteInteger( REGNAME_MAINTWINHEIGHT, Height );
|
|
Close;
|
|
end;
|
|
|
|
|
|
{**
|
|
FormShow: Fill DB combobox and tables list
|
|
}
|
|
procedure Toptimize.FormShow(Sender: TObject);
|
|
var
|
|
Selected: TWideStringList;
|
|
begin
|
|
// read dbs and Tables from treeview
|
|
DBComboBox.Items.Clear;
|
|
DBComboBox.Items.Assign(Mainform.Databases);
|
|
DBComboBox.ItemIndex := DBComboBox.Items.IndexOf( Mainform.ActiveDatabase );
|
|
if DBComboBox.ItemIndex = -1 then
|
|
DBComboBox.ItemIndex := 0;
|
|
DBComboBox.OnChange(self);
|
|
|
|
// Fetch selected tables in list and preselect them in the checkboxlist
|
|
Selected := GetVTCaptions( Mainform.ListTables, True );
|
|
if Selected.Count > 0 then
|
|
ToggleCheckListBox(TablesCheckListBox, True, Selected)
|
|
else // Select all in checkboxlist if no table is preselected
|
|
ToggleCheckListBox(TablesCheckListBox, True);
|
|
end;
|
|
|
|
|
|
{**
|
|
DB selected in pulldown
|
|
}
|
|
procedure Toptimize.DBComboBoxChange(Sender: TObject);
|
|
var
|
|
ds: TDataset;
|
|
begin
|
|
// read tables from db
|
|
ds := Mainform.FetchDbTableList(DBComboBox.Text);
|
|
TablesCheckListBox.Items.Clear;
|
|
while not ds.Eof do begin
|
|
TablesCheckListBox.Items.Add(ds.Fields[0].AsWideString);
|
|
ds.Next;
|
|
end;
|
|
// Check all
|
|
ToggleCheckListBox( TablesCheckListBox, True );
|
|
// Enable controls if there are tables in the database.
|
|
ValidateControls;
|
|
end;
|
|
|
|
|
|
{**
|
|
Check all/none
|
|
}
|
|
procedure Toptimize.CheckListToggle(Sender: TObject);
|
|
begin
|
|
// select all/none
|
|
ToggleCheckListBox(TablesCheckListBox, ((Sender as TControl).Tag = 1));
|
|
TablesCheckListBox.OnClickCheck(self);
|
|
end;
|
|
|
|
|
|
{**
|
|
Parse and run SQL template for all maintenance actions
|
|
}
|
|
procedure Toptimize.RunIterated(pseudoSql: WideString);
|
|
var
|
|
i: integer;
|
|
ds: TDataSet;
|
|
sql: WideString;
|
|
begin
|
|
Screen.Cursor := crHourglass;
|
|
Mainform.TemporaryDatabase := self.DBComboBox.Text;
|
|
ClearResults;
|
|
try
|
|
for i := 0 to TablesCheckListBox.Items.Count - 1 do begin
|
|
if TablesCheckListBox.Checked[i] then begin
|
|
sql := WideStringReplace(pseudoSql, '$table', mainform.mask(TablesCheckListBox.Items[i]), [rfReplaceAll]);
|
|
ds := Mainform.GetResults(sql);
|
|
AddResults(ds);
|
|
ds.Close;
|
|
FreeAndNil(ds);
|
|
TablesCheckListBox.Checked[i] := false;
|
|
end;
|
|
end;
|
|
finally
|
|
Screen.Cursor := crDefault;
|
|
Mainform.TemporaryDatabase := '';
|
|
ValidateControls;
|
|
end;
|
|
end;
|
|
|
|
|
|
{**
|
|
Optimize tables
|
|
}
|
|
procedure Toptimize.Optimize(Sender: TObject);
|
|
begin
|
|
RunIterated('OPTIMIZE TABLE $table');
|
|
end;
|
|
|
|
|
|
{**
|
|
Check tables
|
|
}
|
|
procedure Toptimize.Check(Sender: TObject);
|
|
var
|
|
querystr : WideString;
|
|
begin
|
|
querystr := 'CHECK TABLE $table';
|
|
if cbxQuickCheck.Checked then
|
|
querystr := querystr + ' QUICK';
|
|
if cbxExtendedCheck.Checked then
|
|
querystr := querystr + ' EXTENDED';
|
|
RunIterated(querystr);
|
|
end;
|
|
|
|
|
|
{**
|
|
Analyze tables
|
|
}
|
|
procedure Toptimize.Analyze(Sender: TObject);
|
|
begin
|
|
RunIterated('ANALYZE TABLE $table');
|
|
end;
|
|
|
|
|
|
{**
|
|
Repair tables
|
|
}
|
|
procedure Toptimize.Repair(Sender: TObject);
|
|
var
|
|
querystr : WideString;
|
|
begin
|
|
querystr := 'REPAIR TABLE $table';
|
|
if cbxQuickRepair.Checked then
|
|
querystr := querystr + ' QUICK';
|
|
if cbxExtendedRepair.Checked then
|
|
querystr := querystr + ' EXTENDED';
|
|
RunIterated(querystr);
|
|
end;
|
|
|
|
|
|
{**
|
|
Clear ListResults
|
|
}
|
|
procedure Toptimize.ClearResults;
|
|
begin
|
|
ListResults.Columns.BeginUpdate;
|
|
ListResults.Columns.Clear;
|
|
ListResults.Items.BeginUpdate;
|
|
ListResults.Items.Clear;
|
|
ListResults.Columns.EndUpdate;
|
|
ListResults.Items.EndUpdate;
|
|
end;
|
|
|
|
|
|
{**
|
|
Add results from maintenance action
|
|
}
|
|
procedure Toptimize.AddResults(ds: TDataSet);
|
|
var
|
|
i,j,fieldcount : Integer;
|
|
li : TListItem;
|
|
lc : TListColumn;
|
|
begin
|
|
fieldcount := ds.FieldCount;
|
|
if fieldcount > ListResults.Columns.Count then begin
|
|
ListResults.Columns.BeginUpdate();
|
|
for i := ListResults.Columns.Count to fieldcount - 1 do begin
|
|
lc := ListResults.Columns.Add;
|
|
lc.Caption := ds.Fields[i].Fieldname;
|
|
end;
|
|
ListResults.Columns.EndUpdate;
|
|
end;
|
|
|
|
ListResults.Items.BeginUpdate;
|
|
for i:=1 to ds.RecordCount do
|
|
begin
|
|
li := ListResults.Items.Add;
|
|
// Todo: TListView is not unicode safe, switch to VTree
|
|
li.Caption := ds.Fields[0].AsString;
|
|
for j := 1 to fieldcount -1 do // fill cells
|
|
li.SubItems.Add(ds.Fields[j].AsString);
|
|
ds.Next;
|
|
end;
|
|
|
|
for i := 0 to ListResults.Columns.Count-1 do
|
|
ListResults.Columns[i].Width := -2;
|
|
|
|
ListResults.Items[ListResults.Items.Count - 1].MakeVisible(false);
|
|
ListResults.Items.EndUpdate;
|
|
end;
|
|
|
|
procedure Toptimize.btnHelpClick(Sender: TObject);
|
|
begin
|
|
Mainform.CallSQLHelpWithKeyword('OPTIMIZE');
|
|
end;
|
|
|
|
|
|
{**
|
|
Table was (un-)checked: ensure correct state of buttons
|
|
}
|
|
procedure Toptimize.TablesCheckListBoxClickCheck(Sender: TObject);
|
|
begin
|
|
ValidateControls;
|
|
end;
|
|
|
|
|
|
{**
|
|
Check if at least one table is checked and dis/enable the buttons
|
|
}
|
|
procedure Toptimize.ValidateControls;
|
|
var
|
|
i : Integer;
|
|
somechecked : Boolean;
|
|
begin
|
|
somechecked := false;
|
|
for i:=0 to TablesCheckListBox.Items.Count-1 do begin
|
|
if TablesCheckListBox.Checked[i] then begin
|
|
somechecked := true;
|
|
break;
|
|
end;
|
|
end;
|
|
// en-/disable buttons/checkboxes:
|
|
btnOptimize.Enabled := somechecked;
|
|
btnCheck.Enabled := somechecked;
|
|
btnAnalyze.Enabled := somechecked;
|
|
btnRepair.Enabled := somechecked;
|
|
end;
|
|
|
|
|
|
end.
|