Implement rfe #602: Explicitely apply collation to all fields if table collation has changed. Generates a "CONVERT TO CHARSET" clause.

This commit is contained in:
Ansgar Becker
2009-05-20 21:10:02 +00:00
parent cde5558bbc
commit b3750421b2
2 changed files with 82 additions and 21 deletions

View File

@@ -267,14 +267,14 @@ object frmTableEditor: TfrmTableEditor
Caption = 'Average row length:'
end
object lblInsertMethod: TLabel
Left = 315
Left = 258
Top = 98
Width = 79
Height = 13
Caption = 'INSERT method:'
end
object lblUnion: TLabel
Left = 315
Left = 258
Top = 52
Width = 63
Height = 13
@@ -295,14 +295,14 @@ object frmTableEditor: TfrmTableEditor
Caption = 'Row format:'
end
object lblCollation: TLabel
Left = 315
Left = 258
Top = 6
Width = 81
Height = 13
Caption = 'Default collation:'
end
object lblEngine: TLabel
Left = 315
Left = 258
Top = 29
Width = 36
Height = 13
@@ -311,7 +311,7 @@ object frmTableEditor: TfrmTableEditor
object editAvgRowLen: TEdit
Left = 136
Top = 26
Width = 153
Width = 110
Height = 21
TabOrder = 1
OnChange = editNumEditChange
@@ -319,7 +319,7 @@ object frmTableEditor: TfrmTableEditor
object editMaxRows: TEdit
Left = 136
Top = 49
Width = 153
Width = 110
Height = 21
TabOrder = 2
OnChange = editNumEditChange
@@ -337,7 +337,7 @@ object frmTableEditor: TfrmTableEditor
object comboRowFormat: TComboBox
Left = 136
Top = 95
Width = 153
Width = 110
Height = 21
Style = csDropDownList
ItemHeight = 0
@@ -345,9 +345,9 @@ object frmTableEditor: TfrmTableEditor
OnChange = Modification
end
object memoUnionTables: TTntMemo
Left = 411
Left = 354
Top = 49
Width = 160
Width = 217
Height = 44
Anchors = [akLeft, akTop, akRight]
Lines.Strings = (
@@ -356,9 +356,9 @@ object frmTableEditor: TfrmTableEditor
OnChange = Modification
end
object comboInsertMethod: TComboBox
Left = 411
Left = 354
Top = 95
Width = 160
Width = 217
Height = 21
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
@@ -369,27 +369,27 @@ object frmTableEditor: TfrmTableEditor
object editAutoInc: TEdit
Left = 136
Top = 3
Width = 152
Width = 110
Height = 21
TabOrder = 0
OnChange = editNumEditChange
end
object comboCollation: TComboBox
Left = 411
Left = 354
Top = 3
Width = 160
Width = 104
Height = 21
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
ItemHeight = 0
Sorted = True
TabOrder = 5
OnChange = Modification
OnChange = chkCharsetConvertClick
end
object comboEngine: TComboBox
Left = 411
Left = 354
Top = 26
Width = 160
Width = 217
Height = 21
Style = csDropDownList
Anchors = [akLeft, akTop, akRight]
@@ -398,6 +398,16 @@ object frmTableEditor: TfrmTableEditor
OnChange = Modification
OnSelect = comboEngineSelect
end
object chkCharsetConvert: TCheckBox
Left = 464
Top = 5
Width = 107
Height = 17
Anchors = [akTop, akRight]
Caption = 'Convert data'
TabOrder = 9
OnClick = chkCharsetConvertClick
end
end
object tabIndexes: TTabSheet
Caption = 'Indexes'

View File

@@ -71,6 +71,7 @@ type
menuClearColumns: TMenuItem;
menuMoveUpColumn: TMenuItem;
menuMoveDownColumn: TMenuItem;
chkCharsetConvert: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure editNameChange(Sender: TObject);
@@ -127,6 +128,7 @@ type
procedure btnRemoveIndexClick(Sender: TObject);
procedure menuAddIndexColumnClick(Sender: TObject);
procedure PageControlMainChange(Sender: TObject);
procedure chkCharsetConvertClick(Sender: TObject);
private
{ Private declarations }
FModified: Boolean;
@@ -331,6 +333,8 @@ end;
procedure TfrmTableEditor.btnApplyClick(Sender: TObject);
var
sql: WideString;
i: Integer;
Props: TWideStringlist;
begin
// Create or alter table
if AlterTableName = '' then
@@ -339,9 +343,20 @@ begin
sql := ComposeAlterStatement;
try
Mainform.ExecUpdateQuery(sql, False, True);
ResetModificationFlags;
// Set table name for altering if Apply was clicked
AlterTableName := editName.Text;
if chkCharsetConvert.Checked then begin
// Autoadjust column collations
for i:=0 to Columns.Count-1 do begin
Props := TWideStringlist(Columns.Objects[i]);
if Props[6] <> '' then begin
Props.OnChange := nil;
Props[6] := comboCollation.Text;
Props.OnChange := ColumnsChange;
end;
end;
end;
ResetModificationFlags;
except
ModalResult := mrNone;
end;
@@ -367,6 +382,10 @@ begin
Parts.Assign(TWideStringlist(Indexes.Objects[i]));
OldIndexes.AddObject(Indexes[i], Parts);
end;
// Enable converting data for an existing table
chkCharsetConvert.Enabled := AlterTablename <> '';
// Assist the user in auto unchecking this checkbox so data doesn't get converted more than once accidently
chkCharsetConvert.Checked := False;
Modified := False;
end;
@@ -389,6 +408,7 @@ var
AddIt, DropIt: Boolean;
dt: TMySQLDataTypeRecord;
DefaultType: TColumnDefaultType;
ds: TDataset;
begin
// Compose ALTER query, called by buttons and for SQL code tab
SetStatus('Composing ALTER statement ...');
@@ -397,7 +417,7 @@ begin
Specs.Add('RENAME TO ' + Mainform.mask(editName.Text));
if memoComment.Tag = ModifiedFlag then
Specs.Add('COMMENT = ' + esc(memoComment.Text));
if comboCollation.Tag = ModifiedFlag then
if (comboCollation.Tag = ModifiedFlag) or (chkCharsetConvert.Checked) then
Specs.Add('COLLATE = ' + comboCollation.Text);
if comboEngine.Tag = ModifiedFlag then
Specs.Add('ENGINE = ' + comboEngine.Text);
@@ -415,6 +435,17 @@ begin
Specs.Add('UNION = ('+memoUnionTables.Text+')');
if comboInsertMethod.Enabled and (comboInsertMethod.Tag = ModifiedFlag) and (comboInsertMethod.Text <> '') then
Specs.Add('INSERT_METHOD = '+comboInsertMethod.Text);
if chkCharsetConvert.Checked then begin
ds := Mainform.GetCollations;
while not ds.Eof do begin
if ds.FieldByName('Collation').AsWideString = comboCollation.Text then begin
Specs.Add('CONVERT TO CHARSET '+ds.FieldByName('Charset').AsString);
break;
end;
ds.Next;
end;
end;
// Update columns
for i:=0 to Columns.Count - 1 do begin
AddIt := True;
@@ -441,8 +472,13 @@ begin
end;
if Props[5] <> '' then
ColSpec := ColSpec + ' COMMENT '+esc(Props[5]);
if Props[6] <> '' then
ColSpec := ColSpec + ' COLLATE '+Props[6];
if Props[6] <> '' then begin
ColSpec := ColSpec + ' COLLATE ';
if chkCharsetConvert.Checked then
ColSpec := ColSpec + comboCollation.Text
else
ColSpec := ColSpec + Props[6];
end;
if i = 0 then
ColSpec := ColSpec + ' FIRST'
else
@@ -792,6 +828,8 @@ procedure TfrmTableEditor.listColumnsEditing(Sender: TBaseVirtualTree;
begin
// No editor for very first column and checkbox columns
Allowed := not (Column in [0, 4, 5]);
// No editing of collation allowed if "Convert data" was checked
Allowed := Allowed and ((Column = 8) and (not chkCharsetConvert.Checked));
end;
@@ -809,6 +847,8 @@ begin
else begin
Properties := TWideStringList(Columns.Objects[Node.Index]);
CellText := Properties[Column-2];
if (Column = 8) and (CellText <> '') and (chkCharsetConvert.Checked) then
CellText := comboCollation.Text;
end;
end;
if Column = 6 then
@@ -1436,6 +1476,17 @@ begin
end;
procedure TfrmTableEditor.chkCharsetConvertClick(Sender: TObject);
begin
if chkCharsetConvert.Checked then
listColumns.Header.Columns[8].Color := clBtnFace
else
listColumns.Header.Columns[8].Color := clWindow;
listColumns.Repaint;
Modification(Sender);
end;
procedure TfrmTableEditor.btnHelpClick(Sender: TObject);
begin
// Help button