diff --git a/source/exportsql.dfm b/source/exportsql.dfm index ce478b46..e604855f 100644 --- a/source/exportsql.dfm +++ b/source/exportsql.dfm @@ -177,6 +177,8 @@ object ExportSQLForm: TExportSQLForm Width = 304 Height = 21 Anchors = [akLeft, akTop, akRight] + ParentShowHint = False + ShowHint = True TabOrder = 1 OnDblClick = btnFileBrowseClick end diff --git a/source/exportsql.pas b/source/exportsql.pas index f31a794e..4c09016b 100644 --- a/source/exportsql.pas +++ b/source/exportsql.pas @@ -94,6 +94,7 @@ type procedure SaveSettings; private { Private declarations } + function InitFileStream(TableName: String; OldStream: TFileStream = nil): TFileStream; public { Public declarations } end; @@ -135,6 +136,9 @@ const // Default output compatibility SQL_VERSION_DEFAULT = SQL_VERSION_ANSI; + // Pattern for use in creating destination files + TABLENAME_PATTERN = ''; + var appHandles: array of THandle; cancelDialog: TForm = nil; @@ -279,6 +283,9 @@ begin if EditFileName.Text = '' then EditFileName.Text := ExtractFilePath(paramstr(0)) + 'export.sql'; + // Tell the user how to use the table pattern + EditFileName.Hint := 'Usage for generating one file per table: c:\foo\bar_'+TABLENAME_PATTERN+'.sql'; + validateControls(Sender); generateExampleSQL; end; @@ -426,6 +433,50 @@ begin end; +{** + Parse destination filename for variables like %table% and create the file + If an existing filestream is passed, check if it should be reused, depending on the "Part" + @return TFileStream|Nil +} +function TExportSQLForm.InitFileStream(TableName: String; OldStream: TFileStream = nil): TFileStream; +var + ParsedFileName, FileName, FilePath : String; +begin + Result := nil; + + // Parse filename + FilePath := ExtractFilePath(EditFileName.Text); + FileName := ExtractFileName(EditFileName.Text); + FileName := StringReplace(FileName, TABLENAME_PATTERN, TableName, [rfIgnoreCase]); + ParsedFileName := FilePath + GoodFileName(FileName); + + // Reuse the old stream if its filename has not changed + if (OldStream <> nil) and (OldStream.FileName = ParsedFileName) then + begin + Result := OldStream; + Exit; + end; + + // Filename has changed, so close the old file. + if OldStream <> nil then + OldStream.Free; + + // Warn about overwriting target file + if FileExists(ParsedFileName) then begin + if MessageDlg('Overwrite file "'+ParsedFileName+'" ?', mtConfirmation, [mbYes, mbCancel], 0 ) <> mrYes then + Exit; + end; + + // Create the file + try + Result := TFileStream.Create(ParsedFileName, fmCreate); + except + MessageDlg('File "'+ParsedFileName+'" could not be opened!' + CRLF + 'Maybe in use by another application?', mterror, [mbOK], 0); + Result.Free; + end; +end; + + procedure TExportSQLForm.btnExportClick(Sender: TObject); var f : TFileStream; @@ -487,12 +538,6 @@ begin todb := radioOtherDatabase.Checked; tohost := radioOtherHost.Checked; - // Warn about overwriting target file - if tofile and FileExists(EditFileName.Text) then begin - if MessageDlg('Overwrite file "'+EditFileName.Text+'" ?', mtConfirmation, [mbYes, mbCancel], 0 ) <> mrYes then - Exit; - end; - // export! pageControl1.ActivePageIndex := 0; Screen.Cursor := crHourGlass; @@ -523,13 +568,11 @@ begin // Extract name part of selected target version target_version := StrToIntDef( target_versions.Names[ comboTargetCompat.ItemIndex ], SQL_VERSION_DEFAULT ); max_allowed_packet := MakeInt( cwin.GetVar( 'SHOW VARIABLES LIKE ' + esc('max_allowed_packet'), 1 ) ); - try - f := TFileStream.Create(EditFileName.Text, fmCreate); - except - messagedlg('File "'+EditFileName.Text+'" could not be opened!' + crlf + 'Maybe in use by another application?', mterror, [mbOK], 0); - f.free; + f := InitFileStream('header'); + if f = nil then + begin Screen.Cursor := crDefault; - abort; + Abort; end; wfs(f, '# ' + APPNAME + ' Dump '); wfs(f, '#'); @@ -725,6 +768,16 @@ begin if exporttables then begin + if tofile then + begin + f := InitFileStream(checkListTables.Items[i], f); + if f = nil then + begin + Screen.Cursor := crDefault; + Abort; + end; + end; + dropquery := ''; if comboTables.ItemIndex = TAB_DROP_CREATE then begin if tofile then @@ -1131,6 +1184,16 @@ begin end; end; + if tofile then + begin + f := InitFileStream('footer', f); + if f = nil then + begin + Screen.Cursor := crDefault; + Abort; + end; + end; + // Restore old value for SQL_MODE if (tofile or tohost) and (target_version = SQL_VERSION_ANSI) then begin