Get trigger code from SHOW CREATE TRIGGER instead of using SHOW TRIGGERS, to fix a single quote escaping bug. See http://www.heidisql.com/forum.php?t=16501

This commit is contained in:
Ansgar Becker
2014-10-03 12:22:38 +00:00
parent c22258ec92
commit a36c92d2f2

View File

@ -4,7 +4,7 @@ interface
uses uses
Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, SynEdit, SynMemo, Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, SynEdit, SynMemo,
SynCompletionProposal, SynCompletionProposal, SynRegExpr,
dbconnection, mysql_structures, helpers, gnugettext, ComCtrls; dbconnection, mysql_structures, helpers, gnugettext, ComCtrls;
type type
@ -88,6 +88,8 @@ var
DBObjects: TDBObjectList; DBObjects: TDBObjectList;
i: Integer; i: Integer;
Found: Boolean; Found: Boolean;
Body: String;
rx: TRegExpr;
begin begin
inherited; inherited;
editName.Text := ''; editName.Text := '';
@ -117,7 +119,24 @@ begin
comboTable.ItemIndex := comboTable.Items.IndexOf(Definitions.Col('Table')); comboTable.ItemIndex := comboTable.Items.IndexOf(Definitions.Col('Table'));
comboTiming.ItemIndex := comboTiming.Items.IndexOf(UpperCase(Definitions.Col('Timing'))); comboTiming.ItemIndex := comboTiming.Items.IndexOf(UpperCase(Definitions.Col('Timing')));
comboEvent.ItemIndex := comboEvent.Items.IndexOf(UpperCase(Definitions.Col('Event'))); comboEvent.ItemIndex := comboEvent.Items.IndexOf(UpperCase(Definitions.Col('Event')));
SynMemoBody.Text := Definitions.Col('Statement'); rx := TRegExpr.Create;
rx.ModifierI := True;
rx.Expression := 'FOR\s+EACH\s+ROW\s+(.+)$';
try
// "Statement" column from SHOW TRIGGERS does not escape single quotes where required.
// See http://www.heidisql.com/forum.php?t=16501
Body := DBObject.Connection.GetCreateCode(DBObject.Database, DBObject.Schema, DBObject.Name, lntTrigger);
if rx.Exec(Body) then
Body := rx.Match[1]
else
raise EDatabaseError.CreateFmt(_('Result from previous query does not contain expected pattern: %s'), [rx.Expression]);
except
on E:EDatabaseError do begin
DBObject.Connection.Log(lcError, E.Message);
Body := Definitions.Col('Statement');
end;
end;
SynMemoBody.Text := Body;
Found := True; Found := True;
break; break;
end; end;