Files
HeidiSQL/source/view.pas
Ansgar Becker a4652d39a4 * Fix compiler warnings due to implicit AnsiString to (Unicode)String or vice versa
* Remove workaround for Unicode text to and from clipboard
* Fix writing/reading wrong encoded text into/from registry - no need to use Utf8Encode() any longer
* Implement TMySQLQuery.ColAsAnsi() for cases in which we read binary data.
2010-01-07 00:00:56 +00:00

203 lines
5.3 KiB
ObjectPascal

unit view;
interface
uses
Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SynEdit, SynMemo,
ExtCtrls, SynRegExpr,
mysql_connection, helpers, mysql_api;
type
TFrame = TDBObjectEditor;
TfrmView = class(TFrame)
editName: TEdit;
lblName: TLabel;
rgAlgorithm: TRadioGroup;
SynMemoSelect: TSynMemo;
lblSelect: TLabel;
btnDiscard: TButton;
btnSave: TButton;
rgCheck: TRadioGroup;
btnHelp: TButton;
procedure btnHelpClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure editNameChange(Sender: TObject);
procedure btnDiscardClick(Sender: TObject);
procedure Modification(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
procedure Init(ObjectName: String=''; ObjectType: TListNodeType=lntNone); override;
procedure ApplyModifications; override;
end;
implementation
uses main;
{$R *.dfm}
{**
Create: Restore GUI setup
}
constructor TfrmView.Create(AOwner: TComponent);
begin
inherited;
SynMemoSelect.Highlighter := Mainform.SynSQLSyn1;
Mainform.SynCompletionProposal.AddEditor(SynMemoSelect);
editName.MaxLength := NAME_LEN;
end;
{**
FormShow: Fill controls with content in edit mode
}
procedure TfrmView.Init(ObjectName: String=''; ObjectType: TListNodeType=lntNone);
var
Results: TMySQLQuery;
db: String;
rx: TRegExpr;
begin
inherited;
if FEditObjectName <> '' then begin
// Edit mode
editName.Text := FEditObjectName;
db := Mainform.ActiveDatabase;
Results := Mainform.Connection.GetResults('SELECT * FROM '+Mainform.mask(DBNAME_INFORMATION_SCHEMA)+'.VIEWS ' +
'WHERE TABLE_SCHEMA = '+esc(db)+' AND TABLE_NAME = '+esc(FEditObjectName));
if Results.RecordCount = 0 then
raise Exception.Create('Can''t find view definition for "'+FEditObjectName+'" in '+DBNAME_INFORMATION_SCHEMA);
// Algorithm is not changeable as we cannot look up its current state!
rgAlgorithm.Enabled := False;
rgAlgorithm.ItemIndex := 0;
rgCheck.ItemIndex := rgCheck.Items.IndexOf(Results.Col('CHECK_OPTION'));
rgCheck.Enabled := Results.Col('IS_UPDATABLE') = 'YES';
rx := TRegExpr.Create;
rx.ModifierG := True;
rx.ModifierI := True;
rx.Expression := '\s+WITH\s+\w+\s+CHECK\s+OPTION$';
SynMemoSelect.Text := rx.Replace(Results.Col('VIEW_DEFINITION'), '', false);
rx.Free;
end else begin
// Create mode
editName.Text := 'Enter view name';
rgAlgorithm.Enabled := True;
rgAlgorithm.ItemIndex := 0;
rgCheck.Enabled := True;
rgCheck.ItemIndex := 0;
SynMemoSelect.Text := 'SELECT ';
end;
// Ensure name is validated
editNameChange(Self);
Modified := False;
btnSave.Enabled := Modified;
btnDiscard.Enabled := Modified;
Mainform.showstatus;
Screen.Cursor := crDefault;
end;
{**
View name has changed: Check for valid naming
}
procedure TfrmView.editNameChange(Sender: TObject);
begin
try
ensureValidIdentifier( editName.Text );
editName.Font.Color := clWindowText;
editName.Color := clWindow;
except
editName.Font.Color := clRed;
editName.Color := clYellow;
end;
Modification(Sender);
end;
{**
Lookup "Create|Alter View" in SQL help
}
procedure TfrmView.btnHelpClick(Sender: TObject);
var
keyword: String;
begin
if FEditObjectName = '' then
keyword := 'CREATE VIEW'
else
keyword := 'ALTER VIEW';
Mainform.CallSQLHelpWithKeyword(keyword);
end;
procedure TfrmView.btnDiscardClick(Sender: TObject);
begin
// Reinit editor, discarding changes
Modified := False;
Init(FEditObjectName);
end;
{**
Apply changes
}
procedure TfrmView.btnSaveClick(Sender: TObject);
begin
ApplyModifications;
end;
procedure TfrmView.ApplyModifications;
var
sql, viewname, renamed: String;
begin
// Save changes
if FEditObjectName = '' then begin
sql := 'CREATE ';
viewname := editName.Text;
end else begin
sql := 'ALTER ';
viewname := FEditObjectName;
end;
viewname := Mainform.mask(viewname);
if rgAlgorithm.Enabled and (rgAlgorithm.ItemIndex > -1) then
sql := sql + 'ALGORITHM = '+Uppercase(rgAlgorithm.Items[rgAlgorithm.ItemIndex])+' ';
sql := sql + 'VIEW ' + viewname+' AS '+SynMemoSelect.Text+' ';
if rgCheck.Enabled and (rgCheck.ItemIndex > 0) then
sql := sql + 'WITH '+Uppercase(rgCheck.Items[rgCheck.ItemIndex])+' CHECK OPTION';
try
Mainform.Connection.Query(sql);
// Probably rename view
if (FEditObjectName <> '') and (FEditObjectName <> editName.Text) then begin
renamed := Mainform.mask(editName.Text);
Mainform.Connection.Query('RENAME TABLE '+viewname + ' TO '+renamed);
end;
FEditObjectName := editName.Text;
Mainform.SetEditorTabCaption(Self, FEditObjectName);
Mainform.RefreshTreeDB(Mainform.ActiveDatabase);
Mainform.ParseSelectedTableStructure;
Modified := False;
btnSave.Enabled := Modified;
btnDiscard.Enabled := Modified;
except
on E:Exception do
MessageDlg(E.Message, mtError, [mbOk], 0);
end;
end;
procedure TfrmView.Modification(Sender: TObject);
begin
Modified := True;
btnSave.Enabled := Modified;
btnDiscard.Enabled := Modified;
end;
end.