diff --git a/tools/lazdatadesktop/fraquery.lfm b/tools/lazdatadesktop/fraquery.lfm index 960a683427..5a039584b5 100644 --- a/tools/lazdatadesktop/fraquery.lfm +++ b/tools/lazdatadesktop/fraquery.lfm @@ -112,14 +112,506 @@ object QueryFrame: TQueryFrame Caption = 'Result' ClientHeight = 214 ClientWidth = 630 - object MResult: TMemo + inline MResult: TSynEdit Left = 0 Height = 214 Top = 0 Width = 630 Align = alClient - ScrollBars = ssAutoBoth + Font.Height = 13 + Font.Name = 'DejaVu Sans Mono' + Font.Pitch = fpFixed + Font.Quality = fqNonAntialiased + ParentColor = False + ParentFont = False TabOrder = 0 + Gutter.Visible = False + Gutter.Width = 57 + Gutter.MouseActions = <> + RightGutter.Width = 0 + RightGutter.MouseActions = <> + Keystrokes = < + item + Command = ecUp + ShortCut = 38 + end + item + Command = ecSelUp + ShortCut = 8230 + end + item + Command = ecScrollUp + ShortCut = 16422 + end + item + Command = ecDown + ShortCut = 40 + end + item + Command = ecSelDown + ShortCut = 8232 + end + item + Command = ecScrollDown + ShortCut = 16424 + end + item + Command = ecLeft + ShortCut = 37 + end + item + Command = ecSelLeft + ShortCut = 8229 + end + item + Command = ecWordLeft + ShortCut = 16421 + end + item + Command = ecSelWordLeft + ShortCut = 24613 + end + item + Command = ecRight + ShortCut = 39 + end + item + Command = ecSelRight + ShortCut = 8231 + end + item + Command = ecWordRight + ShortCut = 16423 + end + item + Command = ecSelWordRight + ShortCut = 24615 + end + item + Command = ecPageDown + ShortCut = 34 + end + item + Command = ecSelPageDown + ShortCut = 8226 + end + item + Command = ecPageBottom + ShortCut = 16418 + end + item + Command = ecSelPageBottom + ShortCut = 24610 + end + item + Command = ecPageUp + ShortCut = 33 + end + item + Command = ecSelPageUp + ShortCut = 8225 + end + item + Command = ecPageTop + ShortCut = 16417 + end + item + Command = ecSelPageTop + ShortCut = 24609 + end + item + Command = ecLineStart + ShortCut = 36 + end + item + Command = ecSelLineStart + ShortCut = 8228 + end + item + Command = ecEditorTop + ShortCut = 16420 + end + item + Command = ecSelEditorTop + ShortCut = 24612 + end + item + Command = ecLineEnd + ShortCut = 35 + end + item + Command = ecSelLineEnd + ShortCut = 8227 + end + item + Command = ecEditorBottom + ShortCut = 16419 + end + item + Command = ecSelEditorBottom + ShortCut = 24611 + end + item + Command = ecToggleMode + ShortCut = 45 + end + item + Command = ecCopy + ShortCut = 16429 + end + item + Command = ecPaste + ShortCut = 8237 + end + item + Command = ecDeleteChar + ShortCut = 46 + end + item + Command = ecCut + ShortCut = 8238 + end + item + Command = ecDeleteLastChar + ShortCut = 8 + end + item + Command = ecDeleteLastChar + ShortCut = 8200 + end + item + Command = ecDeleteLastWord + ShortCut = 16392 + end + item + Command = ecUndo + ShortCut = 32776 + end + item + Command = ecRedo + ShortCut = 40968 + end + item + Command = ecLineBreak + ShortCut = 13 + end + item + Command = ecSelectAll + ShortCut = 16449 + end + item + Command = ecCopy + ShortCut = 16451 + end + item + Command = ecBlockIndent + ShortCut = 24649 + end + item + Command = ecLineBreak + ShortCut = 16461 + end + item + Command = ecInsertLine + ShortCut = 16462 + end + item + Command = ecDeleteWord + ShortCut = 16468 + end + item + Command = ecBlockUnindent + ShortCut = 24661 + end + item + Command = ecPaste + ShortCut = 16470 + end + item + Command = ecCut + ShortCut = 16472 + end + item + Command = ecDeleteLine + ShortCut = 16473 + end + item + Command = ecDeleteEOL + ShortCut = 24665 + end + item + Command = ecUndo + ShortCut = 16474 + end + item + Command = ecRedo + ShortCut = 24666 + end + item + Command = ecGotoMarker0 + ShortCut = 16432 + end + item + Command = ecGotoMarker1 + ShortCut = 16433 + end + item + Command = ecGotoMarker2 + ShortCut = 16434 + end + item + Command = ecGotoMarker3 + ShortCut = 16435 + end + item + Command = ecGotoMarker4 + ShortCut = 16436 + end + item + Command = ecGotoMarker5 + ShortCut = 16437 + end + item + Command = ecGotoMarker6 + ShortCut = 16438 + end + item + Command = ecGotoMarker7 + ShortCut = 16439 + end + item + Command = ecGotoMarker8 + ShortCut = 16440 + end + item + Command = ecGotoMarker9 + ShortCut = 16441 + end + item + Command = ecSetMarker0 + ShortCut = 24624 + end + item + Command = ecSetMarker1 + ShortCut = 24625 + end + item + Command = ecSetMarker2 + ShortCut = 24626 + end + item + Command = ecSetMarker3 + ShortCut = 24627 + end + item + Command = ecSetMarker4 + ShortCut = 24628 + end + item + Command = ecSetMarker5 + ShortCut = 24629 + end + item + Command = ecSetMarker6 + ShortCut = 24630 + end + item + Command = ecSetMarker7 + ShortCut = 24631 + end + item + Command = ecSetMarker8 + ShortCut = 24632 + end + item + Command = ecSetMarker9 + ShortCut = 24633 + end + item + Command = EcFoldLevel1 + ShortCut = 41009 + end + item + Command = EcFoldLevel2 + ShortCut = 41010 + end + item + Command = EcFoldLevel3 + ShortCut = 41011 + end + item + Command = EcFoldLevel4 + ShortCut = 41012 + end + item + Command = EcFoldLevel5 + ShortCut = 41013 + end + item + Command = EcFoldLevel6 + ShortCut = 41014 + end + item + Command = EcFoldLevel7 + ShortCut = 41015 + end + item + Command = EcFoldLevel8 + ShortCut = 41016 + end + item + Command = EcFoldLevel9 + ShortCut = 41017 + end + item + Command = EcFoldLevel0 + ShortCut = 41008 + end + item + Command = EcFoldCurrent + ShortCut = 41005 + end + item + Command = EcUnFoldCurrent + ShortCut = 41003 + end + item + Command = EcToggleMarkupWord + ShortCut = 32845 + end + item + Command = ecNormalSelect + ShortCut = 24654 + end + item + Command = ecColumnSelect + ShortCut = 24643 + end + item + Command = ecLineSelect + ShortCut = 24652 + end + item + Command = ecTab + ShortCut = 9 + end + item + Command = ecShiftTab + ShortCut = 8201 + end + item + Command = ecMatchBracket + ShortCut = 24642 + end + item + Command = ecColSelUp + ShortCut = 40998 + end + item + Command = ecColSelDown + ShortCut = 41000 + end + item + Command = ecColSelLeft + ShortCut = 40997 + end + item + Command = ecColSelRight + ShortCut = 40999 + end + item + Command = ecColSelPageDown + ShortCut = 40994 + end + item + Command = ecColSelPageBottom + ShortCut = 57378 + end + item + Command = ecColSelPageUp + ShortCut = 40993 + end + item + Command = ecColSelPageTop + ShortCut = 57377 + end + item + Command = ecColSelLineStart + ShortCut = 40996 + end + item + Command = ecColSelLineEnd + ShortCut = 40995 + end + item + Command = ecColSelEditorTop + ShortCut = 57380 + end + item + Command = ecColSelEditorBottom + ShortCut = 57379 + end> + MouseActions = <> + MouseTextActions = <> + MouseSelActions = <> + Lines.Strings = ( + 'MResult' + ) + VisibleSpecialChars = [vscSpace, vscTabAtLast] + ReadOnly = True + SelectedColor.BackPriority = 50 + SelectedColor.ForePriority = 50 + SelectedColor.FramePriority = 50 + SelectedColor.BoldPriority = 50 + SelectedColor.ItalicPriority = 50 + SelectedColor.UnderlinePriority = 50 + SelectedColor.StrikeOutPriority = 50 + BracketHighlightStyle = sbhsBoth + BracketMatchColor.Background = clNone + BracketMatchColor.Foreground = clNone + BracketMatchColor.Style = [fsBold] + FoldedCodeColor.Background = clNone + FoldedCodeColor.Foreground = clGray + FoldedCodeColor.FrameColor = clGray + MouseLinkColor.Background = clNone + MouseLinkColor.Foreground = clBlue + LineHighlightColor.Background = clNone + LineHighlightColor.Foreground = clNone + inline SynLeftGutterPartList1: TSynGutterPartList + object SynGutterMarks1: TSynGutterMarks + Width = 24 + MouseActions = <> + end + object SynGutterLineNumber1: TSynGutterLineNumber + Width = 17 + MouseActions = <> + MarkupInfo.Background = clBtnFace + MarkupInfo.Foreground = clNone + DigitCount = 2 + ShowOnlyLineNumbersMultiplesOf = 1 + ZeroStart = False + LeadingZeros = False + end + object SynGutterChanges1: TSynGutterChanges + Width = 4 + MouseActions = <> + ModifiedColor = 59900 + SavedColor = clGreen + end + object SynGutterSeparator1: TSynGutterSeparator + Width = 2 + MouseActions = <> + MarkupInfo.Background = clWhite + MarkupInfo.Foreground = clGray + end + object SynGutterCodeFolding1: TSynGutterCodeFolding + MouseActions = <> + MarkupInfo.Background = clNone + MarkupInfo.Foreground = clGray + MouseActionsExpanded = <> + MouseActionsCollapsed = <> + end + end end end object TSData: TTabSheet diff --git a/tools/lazdatadesktop/fraquery.pp b/tools/lazdatadesktop/fraquery.pp index 097282f5d5..48dce4d1cf 100644 --- a/tools/lazdatadesktop/fraquery.pp +++ b/tools/lazdatadesktop/fraquery.pp @@ -56,7 +56,6 @@ type MIExecuteScript: TMenuItem; MIExecuteSelection: TMenuItem; MIExecuteSingle: TMenuItem; - MResult: TMemo; ODSQL: TOpenDialog; PCResult: TPageControl; FMSQL: TSynEdit; @@ -65,6 +64,7 @@ type SDSQL: TSaveDialog; SQuery: TSplitter; SQLSyn: TSynSQLSyn; + MResult: TSynEdit; TBExecute: TToolButton; TBSep1: TToolButton; TBPrevious: TToolButton; @@ -121,6 +121,7 @@ type FSQLConstName: String; FSQLQuoteOptions: TQuoteOptions; FAbortScript : Boolean; + procedure AddToResult(const Msg: String; SetCursorPos : Boolean = false); procedure ClearResults; function CountStatements(const S: String): Integer; function DetermineExecuteMode: TExecuteMode; @@ -129,7 +130,7 @@ type procedure DoDirective(Sender: TObject; Directive, Argument: AnsiString; var StopExecution: Boolean); procedure DoSQLStatement(Sender: TObject; Statement: TStrings; var StopExecution: Boolean); // Execute SQL - procedure DoExecuteQuery(Const Qry: String; ACount : Integer = 0); + procedure DoExecuteQuery(const Qry: TStrings; ACount: Integer); function GetTransaction: TSQLTransaction; procedure LocalizeFrame; function SelectionHint: Boolean; @@ -145,7 +146,7 @@ type Public Constructor Create(AOwner : TComponent); override; Destructor Destroy; override; - Function ExecuteQuery(Const Qry: String; ACount : Integer = 0) : Boolean; + function ExecuteQuery(const Qry: TStrings; ACount: Integer = 0): Boolean; procedure ExecuteScript(AScript: String); procedure SaveQuery(AFileName: String); procedure LoadQuery(AFileName: String); @@ -393,7 +394,7 @@ begin RetryStatement:=False; Inc(FStatementCount); Repeat - If not ExecuteQuery(Statement.Text,FStatementCount) then + If not ExecuteQuery(Statement,FStatementCount) then begin If not RetryStatement then Inc(FErrorCount); @@ -419,7 +420,10 @@ end; procedure TQueryFrame.DoCommit(Sender: TObject); begin - MResult.Append(SErrCommitNotSupported); + if not HaveTransaction then + AddToResult(SErrCommitNotSupported) + else + Transaction.Commit; end; procedure TQueryFrame.DoDirective(Sender: TObject; Directive, Argument: AnsiString; var StopExecution: Boolean); @@ -465,7 +469,6 @@ begin FMSQL.Lines:=Dest else FMSQL.SelText:=Dest.Text - finally Dest.Free; Src.Free; @@ -530,9 +533,19 @@ begin end; procedure TQueryFrame.AExecuteSelectionExecute(Sender: TObject); + +Var + SQL : TStrings; + begin ClearResults; - ExecuteQuery(Trim(FMSQL.SelText)); + SQL:=TStringList.Create; + try + SQL.Text:=FMSQL.SelText; + ExecuteQuery(SQL); + finally + SQL.Free; + end; end; procedure TQueryFrame.AExecuteSelectionScriptExecute(Sender: TObject); @@ -544,7 +557,7 @@ end; procedure TQueryFrame.AExecuteSingleExecute(Sender: TObject); begin ClearResults; - ExecuteQuery(Trim(FMSQL.Lines.Text)); + ExecuteQuery(FMSQL.Lines); end; procedure TQueryFrame.aRollBackExecute(Sender: TObject); @@ -694,11 +707,11 @@ begin FMSQL.Lines.SaveToFile(AFileName); end; -procedure TQueryFrame.DoExecuteQuery(const Qry: String; ACount: Integer); +procedure TQueryFrame.DoExecuteQuery(const Qry: TStrings; ACount: Integer); Var DS : TDataset; - S,RowsAff : String; + SQL,S,RowsAff : String; N : Integer; TS,TE : TDateTime; @@ -706,16 +719,18 @@ begin RowsAff:=''; TS:=Now; if ACount<>0 then - MResult.Append(Format(SExecutingSQLStatementCount,[DateTimeToStr(TS),ACount])) + AddToResult(Format(SExecutingSQLStatementCount,[DateTimeToStr(TS),ACount])) else - MResult.Append(Format(SExecutingSQLStatement,[DateTimeToStr(TS)])); - MResult.Append(Qry); + AddToResult(Format(SExecutingSQLStatement,[DateTimeToStr(TS)])); + For S in Qry do + AddToResult(S,False); If Not assigned(FEngine) then Raise Exception.Create(SErrNoEngine); - S:=ExtractDelimited(1,Trim(Qry),[' ',#9,#13,#10]); + SQL:=Qry.Text; + S:=ExtractDelimited(1,Trim(SQL),[' ',#9,#13,#10]); If (IndexText(S,['With','SELECT'])=-1) then begin - N:=FEngine.RunQuery(Qry); + N:=FEngine.RunQuery(SQL); TE:=Now; If ecRowsAffected in FEngine.EngineCapabilities then RowsAff:=Format(SRowsAffected,[N]); @@ -726,10 +741,10 @@ begin begin DS:=Dataset; If Assigned(DS) then - FEngine.SetQueryStatement(Qry,DS) + FEngine.SetQueryStatement(SQL,DS) else begin - DS:=FEngine.CreateQuery(Qry,Self); + DS:=FEngine.CreateQuery(SQL,Self); FData.Dataset:=DS; end; TSData.TabVisible:=true; @@ -739,15 +754,11 @@ begin TE:=Now; RowsAff:=Format(SRecordsFetched,[DS.RecordCount]); end; - MResult.Append(Format(SSQLExecutedOK,[DateTimeToStr(TE)])); -{$IFDEF VER2_6} - MResult.Append(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS)])); -{$ELSE} - MResult.Append(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS,[fdoInterval])])); -{$ENDIF} + AddToResult(Format(SSQLExecutedOK,[DateTimeToStr(TE)])); + AddToResult(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS,[fdoInterval])]),RowsAff=''); if (RowsAff<>'') then - MResult.Append(RowsAff); - AddToHistory(Qry); + AddToResult(RowsAff,True); + AddToHistory(SQL); ACloseQuery.Update; end; @@ -761,8 +772,27 @@ begin Result:=TSQLDBDDEngine(FEngine).Transaction; end; +Procedure TQueryFrame.AddToResult(const Msg : String; SetCursorPos : Boolean = false); -function TQueryFrame.ExecuteQuery(const Qry: String; ACount: Integer): Boolean; +var + MsgLines : TStringList; + +begin + MsgLines:=TStringList.Create; + try + MsgLines.Text:=Msg; + MResult.Lines.AddStrings(MsgLines); + if SetCursorPos then + begin + MResult.SelStart:=Length(MResult.Text); + MResult.EnsureCursorPosVisible; + end; + finally + MsgLines.Free; + end; +end; + +function TQueryFrame.ExecuteQuery(const Qry: TStrings; ACount: Integer): Boolean; Var Msg : String; @@ -796,8 +826,7 @@ begin if (Msg<>'') then begin PCResult.ActivePage:=TSResult; - MResult.Append(SErrorExecutingSQL); - MResult.Append(Msg); + AddToResult(Msg,True); end; Finally if ACount<=0 then