diff --git a/packages/delphi10/heidisql.bdsproj b/packages/delphi10/heidisql.bdsproj index c176b03e..9b26db7d 100644 --- a/packages/delphi10/heidisql.bdsproj +++ b/packages/delphi10/heidisql.bdsproj @@ -50,10 +50,10 @@ True True - True + False True True - True + False True True True diff --git a/packages/delphi11/heidisql.dproj b/packages/delphi11/heidisql.dproj index daf57539..450dccce 100644 --- a/packages/delphi11/heidisql.dproj +++ b/packages/delphi11/heidisql.dproj @@ -46,6 +46,8 @@ $(BDS)\RaveReports\Lib;$(BDS)\lib\Debug;$(BDS)\Lib\Debug\Indy10;..\..\components\compilerdetection\include;..\..\components\heidisql\include;..\..\components\edbimage\build;..\..\components\heidisql\build;..\..\components\synedit\build;..\..\components\synedit\resources;..\..\components\zeosdbo\build;..\..\components\virtualtreeview\build;..\..\components\virtualtreeview\resources;..\..\components\tntunictrls\build DEBUG HeidiSQL + False + False Delphi.Personality diff --git a/source/exportsql.dfm b/source/exportsql.dfm index e604855f..84d2b27f 100644 --- a/source/exportsql.dfm +++ b/source/exportsql.dfm @@ -146,16 +146,16 @@ object ExportSQLForm: TExportSQLForm Left = 235 Top = 0 Width = 376 - Height = 169 + Height = 200 Anchors = [akLeft, akTop, akRight] Caption = 'Output' TabOrder = 0 DesignSize = ( 376 - 169) + 200) object btnFileBrowse: TBitBtn - Left = 338 - Top = 43 + Left = 344 + Top = 42 Width = 22 Height = 22 Anchors = [akTop, akRight] @@ -165,16 +165,16 @@ object ExportSQLForm: TExportSQLForm F6000000424DF600000000000000760000002800000010000000100000000100 0400000000008000000000000000000000001000000010000000000000000000 80000080000000808000800000008000800080800000C0C0C000808080000000 - FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00777777777777 - 777777777777777777777000000000007777700333333333077770B033333333 - 307770FB03333333330770BFB0333333333070FBFB000000000070BFBFBFBFB0 - 777770FBFBFBFBF0777770BFB000000077777700077777777000777777777777 - 7700777777777077707077777777770007777777777777777777} + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00DDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDD00000000000DDDDD003333333330DDDD0B0333333333 + 0DDD0FB03333333330DD0BFB03333333330D0FBFB000000000000BFBFBFBFB0D + DDDD0FBFBFBFBF0DDDDD0BFB0000000DDDDDD000DDDDDDDD000DDDDDDDDDDDDD + D00DDDDDDDDD0DDD0D0DDDDDDDDDD000DDDDDDDDDDDDDDDDDDDD} end object editFileName: TEdit - Left = 32 + Left = 26 Top = 42 - Width = 304 + Width = 318 Height = 21 Anchors = [akLeft, akTop, akRight] ParentShowHint = False @@ -183,62 +183,30 @@ object ExportSQLForm: TExportSQLForm OnDblClick = btnFileBrowseClick end object radioOtherDatabase: TRadioButton - Left = 16 - Top = 69 + Left = 9 + Top = 110 Width = 113 Height = 17 Caption = 'Another database:' - TabOrder = 3 + TabOrder = 6 OnClick = radioOtherDatabaseClick end object radioFile: TRadioButton - Left = 16 - Top = 24 + Left = 9 + Top = 25 Width = 49 Height = 17 Caption = 'File:' Checked = True TabOrder = 0 TabStop = True - OnClick = radioFileClick + OnClick = radioFileOrDirClick + OnDblClick = btnFileBrowseClick end object comboOtherDatabase: TComboBox - Left = 32 - Top = 87 - Width = 328 - Height = 21 - Style = csDropDownList - Anchors = [akLeft, akTop, akRight] - Color = clBtnFace - Enabled = False - ItemHeight = 13 - TabOrder = 4 - end - object radioOtherHost: TRadioButton - Left = 16 - Top = 116 - Width = 161 - Height = 17 - Caption = 'Another host and database' - TabOrder = 5 - OnClick = radioOtherHostClick - end - object comboOtherHost: TComboBox - Left = 32 - Top = 131 - Width = 137 - Height = 21 - Style = csDropDownList - Color = clBtnFace - Enabled = False - ItemHeight = 13 - TabOrder = 6 - OnSelect = comboOtherHostSelect - end - object comboOtherHostDatabase: TComboBox - Left = 175 - Top = 131 - Width = 183 + Left = 26 + Top = 127 + Width = 340 Height = 21 Style = csDropDownList Anchors = [akLeft, akTop, akRight] @@ -247,12 +215,85 @@ object ExportSQLForm: TExportSQLForm ItemHeight = 13 TabOrder = 7 end + object radioOtherHost: TRadioButton + Left = 9 + Top = 152 + Width = 161 + Height = 17 + Caption = 'Another host and database' + TabOrder = 8 + OnClick = radioOtherHostClick + end + object comboOtherHost: TComboBox + Left = 26 + Top = 169 + Width = 137 + Height = 21 + Style = csDropDownList + Color = clBtnFace + Enabled = False + ItemHeight = 13 + TabOrder = 9 + OnSelect = comboOtherHostSelect + end + object comboOtherHostDatabase: TComboBox + Left = 168 + Top = 169 + Width = 198 + Height = 21 + Style = csDropDownList + Anchors = [akLeft, akTop, akRight] + Color = clBtnFace + Enabled = False + ItemHeight = 13 + TabOrder = 10 + end + object radioDirectory: TRadioButton + Left = 9 + Top = 67 + Width = 352 + Height = 17 + Caption = 'Directory (one .sql-file per object)' + TabOrder = 3 + OnClick = radioFileOrDirClick + OnDblClick = btnDirectoryBrowseClick + end + object editDirectory: TEdit + Left = 26 + Top = 85 + Width = 318 + Height = 21 + Anchors = [akLeft, akTop, akRight] + Color = clBtnFace + Enabled = False + TabOrder = 4 + OnDblClick = btnDirectoryBrowseClick + end + object btnDirectoryBrowse: TBitBtn + Left = 344 + Top = 85 + Width = 22 + Height = 22 + Anchors = [akTop, akRight] + Enabled = False + TabOrder = 5 + OnClick = btnDirectoryBrowseClick + Glyph.Data = { + F6000000424DF600000000000000760000002800000010000000100000000100 + 0400000000008000000000000000000000001000000010000000000000000000 + 80000080000000808000800000008000800080800000C0C0C000808080000000 + FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00DDDDDDDDDDDD + DDDDDDDDDDDDDDDDDDDD00000000000DDDDD003333333330DDDD0B0333333333 + 0DDD0FB03333333330DD0BFB03333333330D0FBFB000000000000BFBFBFBFB0D + DDDD0FBFBFBFBF0DDDDD0BFB0000000DDDDDD000DDDDDDDD000DDDDDDDDDDDDD + D00DDDDDDDDD0DDD0D0DDDDDDDDDD000DDDDDDDDDDDDDDDDDDDD} + end end object groupExampleSql: TGroupBox Left = 235 - Top = 175 + Top = 206 Width = 376 - Height = 138 + Height = 107 Anchors = [akLeft, akTop, akRight, akBottom] Caption = 'Example SQL' TabOrder = 1 @@ -260,7 +301,7 @@ object ExportSQLForm: TExportSQLForm Left = 2 Top = 15 Width = 372 - Height = 121 + Height = 90 Align = alClient Color = clBtnFace Font.Charset = DEFAULT_CHARSET diff --git a/source/exportsql.pas b/source/exportsql.pas index 4c09016b..dc4528a4 100644 --- a/source/exportsql.pas +++ b/source/exportsql.pas @@ -28,7 +28,8 @@ uses DB, SynEdit, SynMemo, - ZDataSet; + ZDataSet, + FileCtrl; type TExportSQLForm = class(TForm) @@ -67,6 +68,9 @@ type cbxData: TCheckBox; comboData: TComboBox; comboTargetCompat: TComboBox; + radioDirectory: TRadioButton; + editDirectory: TEdit; + btnDirectoryBrowse: TBitBtn; procedure comboTargetCompatChange(Sender: TObject); procedure comboOtherHostSelect(Sender: TObject); procedure comboDataChange(Sender: TObject); @@ -75,13 +79,14 @@ type procedure cbxTablesClick(Sender: TObject); procedure cbxDatabaseClick(Sender: TObject); procedure btnCancelClick(Sender: TObject); + procedure btnDirectoryBrowseClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure comboSelectDatabaseChange(Sender: TObject); procedure CheckListToggle(Sender: TObject); procedure btnFileBrowseClick(Sender: TObject); procedure btnExportClick(Sender: TObject); procedure radioOtherDatabaseClick(Sender: TObject); - procedure radioFileClick(Sender: TObject); + procedure radioFileOrDirClick(Sender: TObject); procedure fillcombo_anotherdb(Sender: TObject); procedure generateExampleSQL; procedure validateRadioControls(Sender: TObject); @@ -132,6 +137,7 @@ const OUTPUT_FILE = 1; OUTPUT_DB = 2; OUTPUT_HOST = 3; + OUTPUT_DIR = 4; // Default output compatibility SQL_VERSION_DEFAULT = SQL_VERSION_ANSI; @@ -246,6 +252,7 @@ begin if Valueexists('CreateDataHow') then comboData.ItemIndex := ReadInteger('CreateDataHow'); if Valueexists('Compatibility') then comboTargetCompat.ItemIndex := ReadInteger('Compatibility'); if Valueexists('exportfilename') then editFileName.Text := ReadString('exportfilename'); + if Valueexists('ExportDirectory') then editDirectory.Text := ReadString('ExportDirectory'); if Valueexists('ExportSQL_OutputTo') then begin OutputTo := ReadInteger('ExportSQL_OutputTo'); @@ -266,11 +273,12 @@ begin CheckForCrashedWindows; // Fetch list of heidisql windows. list := GetWindowList; - if Length(list) < 2 then + if (Length(list) < 2) and (OutputTo = OUTPUT_HOST) then OutputTo := OUTPUT_FILE; case OutputTo of OUTPUT_FILE : radioFile.Checked := true; + OUTPUT_DIR : radioDirectory.Checked := true; OUTPUT_DB : radioOtherDatabase.Checked := true; OUTPUT_HOST : radioOtherHost.Checked := true; end; @@ -440,13 +448,30 @@ end; } function TExportSQLForm.InitFileStream(TableName: String; OldStream: TFileStream = nil): TFileStream; var - ParsedFileName, FileName, FilePath : String; + UnparsedFileName, ParsedFileName, FileName, FilePath : String; begin Result := nil; + // File or directory ? + if radioFile.Checked then + UnparsedFileName := EditFileName.Text + else if radioDirectory.Checked then begin + UnparsedFileName := EditDirectory.Text; + // Ensure directory ends with a slash. + // ExtractFilePath() expects a slash at the very end, otherwise the last segment + // will be identified as filename and therefore stripped from the return value + if UnparsedFileName[Length(UnparsedFileName)] <> '\' then + UnparsedFileName := UnparsedFileName + '\'; + UnparsedFileName := ExtractFilePath(UnparsedFileName); + UnparsedFileName := UnparsedFileName + TABLENAME_PATTERN + '.sql'; + end else begin + Screen.Cursor := crDefault; + Raise Exception.Create('Internal error: InitFileStream called in wrong context.'); + end; + // Parse filename - FilePath := ExtractFilePath(EditFileName.Text); - FileName := ExtractFileName(EditFileName.Text); + FilePath := ExtractFilePath(UnparsedFileName); + FileName := ExtractFileName(UnparsedFileName); FileName := StringReplace(FileName, TABLENAME_PATTERN, TableName, [rfIgnoreCase]); ParsedFileName := FilePath + GoodFileName(FileName); @@ -533,8 +558,17 @@ begin end; begin + // Check for valid directory + if radioDirectory.Checked then begin + if not DirectoryExists(EditDirectory.Text) then begin + MessageDlg('The selected directory "'+EditDirectory.Text+'" does not exist.', mtError, [mbOk], 0); + EditDirectory.SetFocus; + Exit; + end; + end; + // to where? - tofile := radioFile.Checked; + tofile := radioFile.Checked or radioDirectory.Checked; todb := radioOtherDatabase.Checked; tohost := radioOtherHost.Checked; @@ -1239,7 +1273,7 @@ begin generateExampleSql; end; -procedure TExportSQLForm.radioFileClick(Sender: TObject); +procedure TExportSQLForm.radioFileOrDirClick(Sender: TObject); begin validateRadioControls(Sender); validateControls(Sender); @@ -1313,48 +1347,61 @@ begin end; procedure TExportSQLForm.validateRadioControls(Sender: TObject); +const + EnabledColor = clWindow; + DisabledColor = clBtnFace; +var + ControlToFocus : TWinControl; begin + // Disable all controls ... + EditFileName.Enabled := False; + EditFileName.Color := DisabledColor; + btnFileBrowse.Enabled := False; + EditDirectory.Enabled := False; + EditDirectory.Color := DisabledColor; + btnDirectoryBrowse.Enabled := False; + comboOtherDatabase.Enabled := False; + comboOtherDatabase.Color := DisabledColor; + comboOtherHost.Enabled := False; + comboOtherHost.Color := DisabledColor; + comboOtherHostDatabase.Enabled := False; + comboOtherHostDatabase.Color := DisabledColor; + + // Silence compiler warning + ControlToFocus := EditFileName; + + // ... and re-enable the selected controlset if radioFile.Checked then begin - EditFileName.Enabled := true; - EditFileName.Color := clWindow; - btnFileBrowse.Enabled := true; - EditFileName.SetFocus; - end else begin - EditFileName.Enabled := false; - EditFileName.Color := clBtnFace; - btnFileBrowse.Enabled := false; - end; - - if radioOtherDatabase.Checked then begin - comboOtherDatabase.Enabled := true; - comboOtherDatabase.Color := clWindow; - if comboOtherDatabase.CanFocus then comboOtherDatabase.SetFocus; - end else begin - comboOtherDatabase.Enabled := false; - comboOtherDatabase.Color := clBtnFace; - end; - - if radioOtherHost.Checked then begin - comboOtherHost.Enabled := true; - comboOtherHost.Color := clWindow; + EditFileName.Enabled := True; + EditFileName.Color := EnabledColor; + btnFileBrowse.Enabled := True; + end else if radioDirectory.Checked then begin + EditDirectory.Enabled := True; + EditDirectory.Color := EnabledColor; + btnDirectoryBrowse.Enabled := True; + ControlToFocus := EditDirectory; + end else if radioOtherDatabase.Checked then begin + comboOtherDatabase.Enabled := True; + comboOtherDatabase.Color := EnabledColor; + ControlToFocus := comboOtherDatabase; + end else if radioOtherHost.Checked then begin + comboOtherHost.Enabled := True; + comboOtherHost.Color := EnabledColor; comboOtherHostDatabase.Enabled := not (cbxStructure.Checked and cbxDatabase.Checked); - comboOtherHostDatabase.Color := clWindow; - if comboOtherHost.CanFocus then comboOtherHost.SetFocus; - end else begin - comboOtherHost.Enabled := false; - comboOtherHost.Color := clBtnFace; - comboOtherHostDatabase.Enabled := false; - comboOtherHostDatabase.Color := clBtnFace; + comboOtherHostDatabase.Color := EnabledColor; + ControlToFocus := comboOtherHost; end; + if ControlToFocus.CanFocus then + ControlToFocus.SetFocus; // Disable target selection if exporting to known session. - comboTargetCompat.Enabled := radioFile.Checked; + comboTargetCompat.Enabled := radioFile.Checked or radioDirectory.Checked; end; procedure TExportSQLForm.validateControls(Sender: TObject); begin - cbxDatabase.Enabled := cbxStructure.Checked and ( radioFile.Checked or radioOtherHost.Checked ); - comboDatabase.Enabled := cbxStructure.Checked and ( radioFile.Checked or radioOtherHost.Checked ) and cbxDatabase.Checked; + cbxDatabase.Enabled := cbxStructure.Checked and ( radioFile.Checked or radioDirectory.Checked or radioOtherHost.Checked ); + comboDatabase.Enabled := cbxStructure.Checked and ( radioFile.Checked or radioDirectory.Checked or radioOtherHost.Checked ) and cbxDatabase.Checked; comboOtherHostDatabase.Enabled := not cbxDatabase.Checked; cbxTables.Enabled := cbxStructure.Checked; @@ -1529,8 +1576,11 @@ begin WriteInteger('CreateDataHow', comboData.ItemIndex); WriteInteger('Compatibility', comboTargetCompat.ItemIndex); WriteString('exportfilename', EditFileName.Text); + WriteString('ExportDirectory', EditDirectory.Text); OutputTo := OUTPUT_FILE; - if radioOtherDatabase.checked then + if radioDirectory.checked then + OutputTo := OUTPUT_DIR + else if radioOtherDatabase.checked then OutputTo := OUTPUT_DB else if radioOtherHost.checked then OutputTo := OUTPUT_HOST; @@ -1542,6 +1592,19 @@ begin end; end; + +{** + Browse for a directory +} +procedure TExportSQLForm.btnDirectoryBrowseClick(Sender: TObject); +var + chosenDirectory : String; +begin + if SelectDirectory('Select output directory', EditDirectory.Text, chosenDirectory) then + EditDirectory.Text := chosenDirectory; +end; + + end.