mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
199 lines
5.5 KiB
ObjectPascal
199 lines
5.5 KiB
ObjectPascal
unit editvar;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
|
|
dbconnection, mysql_structures, ComCtrls;
|
|
|
|
type
|
|
TVarType = (vtString, vtNumeric, vtBoolean, vtEnum);
|
|
EVariableError = class(Exception);
|
|
|
|
TfrmEditVariable = class(TForm)
|
|
btnOK: TButton;
|
|
btnCancel: TButton;
|
|
grpScope: TGroupBox;
|
|
radioScopeSession: TRadioButton;
|
|
radioScopeGlobal: TRadioButton;
|
|
gbValue: TGroupBox;
|
|
radioBooleanOn: TRadioButton;
|
|
radioBooleanOff: TRadioButton;
|
|
comboEnum: TComboBox;
|
|
editNumber: TEdit;
|
|
UpDownNumber: TUpDown;
|
|
editString: TEdit;
|
|
lblString: TLabel;
|
|
lblNumber: TLabel;
|
|
lblEnum: TLabel;
|
|
lblBoolean: TLabel;
|
|
btnHelp: TButton;
|
|
procedure btnOKClick(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure btnHelpClick(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
FVar: TServerVariable;
|
|
FVarType: TVarType;
|
|
FVarValue: String;
|
|
procedure SetVarName(Value: String);
|
|
public
|
|
{ Public declarations }
|
|
property VarName: String write SetVarName;
|
|
property VarValue: String write FVarValue;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses main, helpers;
|
|
|
|
{$R *.dfm}
|
|
|
|
|
|
procedure TfrmEditVariable.FormCreate(Sender: TObject);
|
|
begin
|
|
InheritFont(Font);
|
|
SetWindowSizeGrip(Handle, True);
|
|
Width := GetRegValue(REGNAME_EDITVARWINWIDTH, Width);
|
|
Height := GetRegValue(REGNAME_EDITVARWINHEIGHT, Height);
|
|
end;
|
|
|
|
|
|
procedure TfrmEditVariable.FormDestroy(Sender: TObject);
|
|
begin
|
|
OpenRegistry;
|
|
MainReg.WriteInteger(REGNAME_EDITVARWINWIDTH, Width);
|
|
MainReg.WriteInteger(REGNAME_EDITVARWINHEIGHT, Height);
|
|
end;
|
|
|
|
|
|
procedure TfrmEditVariable.SetVarName(Value: String);
|
|
var
|
|
i: Integer;
|
|
Found: Boolean;
|
|
begin
|
|
// Find var name in predefined documented list of variables
|
|
Found := False;
|
|
for i:=Low(MySQLVariables) to High(MySQLVariables) do begin
|
|
if MySQLVariables[i].Name = Value then begin
|
|
FVar := MySQLVariables[i];
|
|
Found := True;
|
|
if not FVar.IsDynamic then
|
|
raise EVariableError.Create(Value+' is a read only variable, not editable.');
|
|
break;
|
|
end;
|
|
end;
|
|
if not Found then
|
|
raise EVariableError.Create('Could not find '+Value+' variable in internal mapping.');
|
|
end;
|
|
|
|
|
|
procedure TfrmEditVariable.FormShow(Sender: TObject);
|
|
var
|
|
val: String;
|
|
begin
|
|
// Verify variable type by value
|
|
FVarType := vtString;
|
|
if IsNumeric(FVarValue) then
|
|
FVarType := vtNumeric;
|
|
if (FVar.EnumValues <> '') and (Pos(UpperCase(FVarValue), UpperCase(FVar.EnumValues))>0) then
|
|
FVarType := vtEnum;
|
|
if (FVarType <> vtEnum) and (Pos(UpperCase(FVarValue), 'ON,OFF,0,1,YES,NO')>0) then
|
|
FVarType := vtBoolean;
|
|
|
|
gbValue.Caption := FVar.Name;
|
|
|
|
lblString.Enabled := FVarType = vtString;
|
|
editString.Enabled := FVarType = vtString;
|
|
lblNumber.Enabled := FVarType = vtNumeric;
|
|
editNumber.Enabled := FVarType = vtNumeric;
|
|
UpDownNumber.Enabled := FVarType = vtNumeric;
|
|
lblEnum.Enabled := FVarType = vtEnum;
|
|
comboEnum.Enabled := FVarType = vtEnum;
|
|
lblBoolean.Enabled := FVarType = vtBoolean;
|
|
radioBooleanOn.Enabled := FVarType = vtBoolean;
|
|
radioBooleanOff.Enabled := FVarType = vtBoolean;
|
|
|
|
case FVarType of
|
|
vtString: begin
|
|
editString.Text := FVarValue;
|
|
editString.SelectAll;
|
|
editString.SetFocus;
|
|
end;
|
|
vtNumeric: begin
|
|
UpDownNumber.Position := MakeInt(FVarValue);
|
|
editNumber.SelectAll;
|
|
editNumber.SetFocus;
|
|
end;
|
|
vtBoolean: begin
|
|
val := UpperCase(FVarValue);
|
|
if (val='ON') or (val='1') or (val='YES') then begin
|
|
radioBooleanOn.Checked := True;
|
|
radioBooleanOn.SetFocus;
|
|
end else begin
|
|
radioBooleanOff.Checked := True;
|
|
radioBooleanOff.SetFocus;
|
|
end;
|
|
end;
|
|
vtEnum: begin
|
|
comboEnum.Items.CommaText := FVar.EnumValues;
|
|
comboEnum.ItemIndex := comboEnum.Items.IndexOf(UpperCase(FVarValue));
|
|
comboEnum.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
radioScopeSession.Enabled := FVar.VarScope in [vsSession, vsBoth];
|
|
radioScopeGlobal.Enabled := FVar.VarScope in [vsGlobal, vsBoth];
|
|
if radioScopeSession.Enabled then
|
|
radioScopeSession.Checked := True
|
|
else if radioScopeGlobal.Enabled then
|
|
radioScopeGlobal.Checked := True;
|
|
end;
|
|
|
|
|
|
{**
|
|
Compose SQL query and set the new variable value
|
|
}
|
|
procedure TfrmEditVariable.btnOKClick(Sender: TObject);
|
|
var
|
|
sql, val: String;
|
|
begin
|
|
// Syntax taken from http://dev.mysql.com/doc/refman/4.1/en/using-system-variables.html
|
|
sql := 'SET @@';
|
|
if radioScopeSession.Checked then
|
|
sql := sql + 'session'
|
|
else
|
|
sql := sql + 'global';
|
|
sql := sql + '.' + FVar.Name + ' = ';
|
|
|
|
case FVarType of
|
|
vtNumeric: val := IntToStr(UpDownNumber.Position);
|
|
vtString: val := MainForm.ActiveConnection.EscapeString(editString.Text);
|
|
vtBoolean: val := IntToStr(Integer(radioBooleanOn.Checked));
|
|
vtEnum: val := MainForm.ActiveConnection.EscapeString(comboEnum.Text);
|
|
end;
|
|
sql := sql + val;
|
|
|
|
// Set the value and keep the form open in any error case
|
|
try
|
|
MainForm.ActiveConnection.Query(sql);
|
|
except
|
|
on E:EDatabaseError do begin
|
|
ModalResult := mrNone;
|
|
ErrorDialog(E.Message);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TfrmEditVariable.btnHelpClick(Sender: TObject);
|
|
begin
|
|
ShellExec('http://dev.mysql.com/doc/refman/5.6/en/dynamic-system-variables.html');
|
|
end;
|
|
|
|
|
|
end.
|