mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
157 lines
4.1 KiB
ObjectPascal
157 lines
4.1 KiB
ObjectPascal
unit runsqlfile;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, SysUtils, Classes, Controls, Forms, Dialogs, ComCtrls, StdCtrls;
|
|
|
|
type
|
|
TRunSQLFileForm = class(TForm)
|
|
btnClose: TButton;
|
|
lblFilenameValue: TLabel;
|
|
lblFilenameName: TLabel;
|
|
lblQueryName: TLabel;
|
|
lblPositionName: TLabel;
|
|
lblPositionValue: TLabel;
|
|
prbarRun: TProgressBar;
|
|
memoQueryValue: TMemo;
|
|
lblQueryCountName: TLabel;
|
|
lblQueryCountValue: TLabel;
|
|
lblTimeName: TLabel;
|
|
lblTimeValue: TLabel;
|
|
lblAffectedRowsName: TLabel;
|
|
lblAffectedRowsValue: TLabel;
|
|
procedure FormActivate(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
Running : Boolean;
|
|
public
|
|
{ Public declarations }
|
|
SQLFileName : String;
|
|
FileEncoding: TEncoding;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
helpers,
|
|
main;
|
|
|
|
{$R *.dfm}
|
|
|
|
|
|
|
|
{**
|
|
Startup - run the sql file
|
|
}
|
|
procedure TRunSQLFileForm.FormActivate(Sender: TObject);
|
|
var
|
|
Stream : TFileStream;
|
|
lines : String;
|
|
filesize,
|
|
querycount,
|
|
rowsaffected : Int64;
|
|
starttime : Cardinal;
|
|
SQL : TSQLBatch;
|
|
i : Integer;
|
|
lines_remaining : String;
|
|
begin
|
|
if Running then
|
|
abort;
|
|
Running := True;
|
|
|
|
// Initialize various variables
|
|
lblFilenameValue.Caption := SQLFileName;
|
|
lblTimeValue.Caption := FormatTimeNumber( 0 );
|
|
memoQueryValue.Lines.Clear;
|
|
lines := '';
|
|
querycount := 0;
|
|
rowsaffected := 0;
|
|
lines_remaining := '';
|
|
starttime := GetTickCount;
|
|
|
|
Screen.Cursor := crHourGlass;
|
|
|
|
try
|
|
// Start file operations
|
|
filesize := _GetFileSize( SQLFileName );
|
|
|
|
OpenTextfile(SQLFileName, Stream, FileEncoding);
|
|
lblPositionValue.Caption := FormatNumber( Stream.Position ) + ' / ' + FormatNumber( filesize );
|
|
Repaint;
|
|
|
|
while Stream.Position < Stream.Size do
|
|
begin
|
|
// Read lines from SQL file until buffer reaches a limit of some MB
|
|
// This strategy performs vastly better than looping through each line
|
|
lines := ReadTextfileChunk(Stream, FileEncoding, 5*SIZE_MB);
|
|
|
|
// Display position in file
|
|
lblPositionValue.Caption := FormatByteNumber( Stream.Position ) + ' / ' + FormatByteNumber( filesize );
|
|
|
|
// Time
|
|
lblTimeValue.Caption := FormatTimeNumber( (GetTickCount - starttime) DIV 1000 );
|
|
|
|
// Step progressbar's position
|
|
prbarRun.Position := Trunc( prbarRun.Max / filesize * Stream.Position );
|
|
|
|
Repaint;
|
|
|
|
// Split buffer into single queries
|
|
SQL := SplitSQL( lines_remaining + lines );
|
|
lines := '';
|
|
lines_remaining := '';
|
|
|
|
// Execute detected queries
|
|
for i := 0 to SQL.Count - 1 do
|
|
begin
|
|
// Last line has to be processed in next loop if end of file is not reached
|
|
if (i = SQL.Count-1) and (Stream.Position < Stream.Size) then
|
|
begin
|
|
lines_remaining := SQL[i].SQL;
|
|
break;
|
|
end;
|
|
|
|
// Count queries
|
|
querycount := querycount + 1;
|
|
lblQueryCountValue.Caption := FormatNumber( querycount );
|
|
|
|
// Display part of query
|
|
memoQueryValue.Text := sstr( SQL[i].SQL, 100 );
|
|
|
|
// Time
|
|
lblTimeValue.Caption := FormatTimeNumber( (GetTickCount - starttime) DIV 1000 );
|
|
|
|
// Execute single query and display affected rows
|
|
Mainform.ActiveConnection.Query(SQL[i].SQL);
|
|
rowsaffected := rowsaffected + Mainform.ActiveConnection.RowsAffected;
|
|
lblAffectedRowsValue.Caption := FormatNumber( rowsaffected );
|
|
|
|
Repaint;
|
|
end;
|
|
SQL.Free;
|
|
|
|
end;
|
|
Stream.Free;
|
|
except
|
|
on E: Exception do
|
|
begin
|
|
MessageDLG( 'Error while reading file ' + SQLFileName + ':' + CRLF + CRLF + E.Message, mtError, [mbOK], 0);
|
|
Mainform.AddOrRemoveFromQueryLoadHistory(SQLFileName, False, True);
|
|
Mainform.FillPopupQueryLoad;
|
|
end;
|
|
end;
|
|
Screen.Cursor := crDefault;
|
|
btnClose.Enabled := True;
|
|
end;
|
|
|
|
|
|
procedure TRunSQLFileForm.FormCreate(Sender: TObject);
|
|
begin
|
|
InheritFont(Font);
|
|
end;
|
|
|
|
end.
|