Skip to content

Commit 681b012

Browse files
committed
[MySQL] Support metadata management, build a database, specify character sets & collation rules #180
1 parent 6a44ae6 commit 681b012

23 files changed

Lines changed: 351 additions & 40 deletions

src/renderer/app/layout/layout.module.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ import { PluginFactory } from "@renderer/factory/plugin.factory";
2121
import { PluginToken } from "@renderer/token/plugin.token";
2222
import { ClickHousePlugin } from "@renderer/plugin/clickhouse.plugin";
2323
import { ElasticsearchPlugin } from "@renderer/plugin/elasticsearch.plugin";
24+
import { MysqlPlugin } from "@renderer/plugin/mysql.plugin";
25+
import { ConfigFactory } from "@renderer/factory/config.factory";
26+
import { ConfigToken } from "@renderer/token/config.token";
27+
import { MysqlConfig } from "@renderer/config/mysql.config";
2428

2529
const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader =>
2630
new TranslateHttpLoader(http, './renderer/assets/i18n/', '.json');
@@ -55,7 +59,11 @@ const httpLoaderFactory = (http: HttpClient): TranslateHttpLoader =>
5559
PostgresqlService,
5660
PluginFactory,
5761
{provide: PluginToken, useClass: ClickHousePlugin, multi: true},
58-
{provide: PluginToken, useClass: ElasticsearchPlugin, multi: true}
62+
{provide: PluginToken, useClass: ElasticsearchPlugin, multi: true},
63+
{provide: PluginToken, useClass: MysqlPlugin, multi: true},
64+
/* Config */
65+
ConfigFactory,
66+
{provide: ConfigToken, useClass: MysqlConfig, multi: true}
5967
]
6068
})
6169
export class LayoutModule {

src/renderer/app/pages/management/metadata/metadata.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import { ColumnCreateComponent } from '@renderer/components/column/create/column
4242
import { CommentColumnComponent } from '@renderer/components/column/comment/column.comment.component';
4343
import { DatabaseFilterComponent } from '@renderer/components/database/filter/database.filter.component';
4444
import { TableFilterComponent } from '@renderer/components/table/filter/table.filter.component';
45+
import { CollationService } from "@renderer/services/management/collation.service";
4546

4647
const MANAGEMENT_METADATA_ROUTES: Routes = [
4748
{path: '', component: MetadataComponent}
@@ -96,7 +97,8 @@ const MANAGEMENT_METADATA_ROUTES: Routes = [
9697
EditorService,
9798
TableService,
9899
ColumnService,
99-
DatabaseService
100+
DatabaseService,
101+
CollationService
100102
]
101103
})
102104
export class MetadataModule {

src/renderer/assets/i18n/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,9 @@
167167
"failed": "Failed",
168168
"druid": "Druid",
169169
"materialized_postgresql": "MaterializePostgreSQL",
170-
"elasticsearch": "ElasticSearch"
170+
"elasticsearch": "ElasticSearch",
171+
"character": "Character",
172+
"collation": "Collation"
171173
},
172174
"language": {
173175
"english": "English",

src/renderer/assets/i18n/zh.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@
166166
"failed": "失败",
167167
"druid": "Druid",
168168
"materialized_postgresql": "MaterializePostgreSQL",
169-
"elasticsearch": "ElasticSearch"
169+
"elasticsearch": "ElasticSearch",
170+
"character": "字符集",
171+
"collation": "排序规则"
170172
},
171173
"language": {
172174
"english": "英语",

src/renderer/components/database/basic/database.basic.component.html

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,27 +41,65 @@
4141
</div>
4242
<div [nzSpan]="24" class="gutter-row" nz-col>
4343
<form nz-form>
44-
<nz-divider nzOrientation="left" nzPlain nzText="{{'common.basic'|translate}}"></nz-divider>
45-
<nz-form-item>
46-
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.engine'|translate}}</nz-form-label>
47-
<nz-form-control [nzSm]="14" [nzXs]="24">
48-
<nz-tag [nzColor]="'#2db7f5'">{{configure.type}}</nz-tag>
49-
</nz-form-control>
50-
</nz-form-item>
51-
<nz-form-item>
52-
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.name'|translate}}</nz-form-label>
53-
<nz-form-control [nzSm]="14" [nzXs]="24">
54-
<input (change)="handlerValidate()" [(ngModel)]="configure.name" name="name" nz-input type="text"/>
55-
</nz-form-control>
56-
</nz-form-item>
57-
<nz-divider nzOrientation="left" nzPlain nzText="{{'common.property'|translate}}"></nz-divider>
58-
<app-component-database-engine-lazy *ngIf="configure.type === databaseType.lazy"
59-
(emitter)="handlerComponentEmitter($event)">
60-
</app-component-database-engine-lazy>
61-
<app-component-property [properties]="properties"
62-
[experimental]="configure.experimental"
63-
(emitter)="handlerComponentEmitter($event)">
64-
</app-component-property>
44+
<nz-tabset nzAnimated="false">
45+
<!-- Basic Settings -->
46+
<nz-tab [nzTitle]="basicSettingTemplate">
47+
<ng-template #basicSettingTemplate>
48+
<i nz-icon nzType="build"></i>
49+
{{'common.basic'|translate}}
50+
</ng-template>
51+
<nz-form-item>
52+
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.engine'|translate}}</nz-form-label>
53+
<nz-form-control [nzSm]="14" [nzXs]="24">
54+
<nz-tag [nzColor]="'#2db7f5'">{{configure.type}}</nz-tag>
55+
</nz-form-control>
56+
</nz-form-item>
57+
<nz-form-item>
58+
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.name'|translate}}</nz-form-label>
59+
<nz-form-control [nzSm]="14" [nzXs]="24">
60+
<input (change)="handlerValidate()" [(ngModel)]="configure.name" name="name" nz-input type="text"/>
61+
</nz-form-control>
62+
</nz-form-item>
63+
<nz-divider nzOrientation="left" nzPlain nzText="{{'common.property'|translate}}"></nz-divider>
64+
<app-component-database-engine-lazy *ngIf="configure.type === databaseType.lazy"
65+
(emitter)="handlerComponentEmitter($event)">
66+
</app-component-database-engine-lazy>
67+
<app-component-property [properties]="properties"
68+
[experimental]="configure.experimental"
69+
(emitter)="handlerComponentEmitter($event)">
70+
</app-component-property>
71+
</nz-tab>
72+
<!-- CharacterSet and Collation Settings -->
73+
<nz-tab *ngIf="configure.characterAndCollationConfigure.enable"
74+
[nzTitle]="characterSetAndCollationSettingTemplate"
75+
(nzClick)="handlerLoadCharacterAndCollation()">
76+
<ng-template #characterSetAndCollationSettingTemplate>
77+
<i nz-icon nzType="block"></i>
78+
{{'common.character'|translate}} & {{'common.collation'|translate}}
79+
</ng-template>
80+
<nz-form-item *ngIf="configure.characterAndCollationConfigure.characterSetConfigure.enable">
81+
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.character'|translate}}</nz-form-label>
82+
<nz-form-control [nzSm]="14" [nzXs]="24">
83+
<nz-select name="characterValue" nzShowSearch
84+
[(ngModel)]="configure.characterAndCollationConfigure.characterSetConfigure.value"
85+
(ngModelChange)="handlerChangeCharacter($event)">
86+
<nz-option *ngFor="let character of collationConfigure.characters" [nzValue]="character"
87+
[nzLabel]="character"></nz-option>
88+
</nz-select>
89+
</nz-form-control>
90+
</nz-form-item>
91+
<nz-form-item *ngIf="configure.characterAndCollationConfigure.collationConfigure.enable">
92+
<nz-form-label [nzSm]="6" [nzXs]="24">{{'common.collation'|translate}}</nz-form-label>
93+
<nz-form-control [nzSm]="14" [nzXs]="24">
94+
<nz-select name="collationValue" nzShowSearch
95+
[(ngModel)]="configure.characterAndCollationConfigure.collationConfigure.value">
96+
<nz-option *ngFor="let collation of collationConfigure.collations" [nzValue]="collation"
97+
[nzLabel]="collation"></nz-option>
98+
</nz-select>
99+
</nz-form-control>
100+
</nz-form-item>
101+
</nz-tab>
102+
</nz-tabset>
65103
</form>
66104
</div>
67105
</div>

src/renderer/components/database/basic/database.basic.component.ts

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import * as cloneDeep from 'lodash/cloneDeep';
1313
import { PropertyModel } from '@renderer/model/property.model';
1414
import { NzTreeNode } from 'ng-zorro-antd/core/tree/nz-tree-base-node';
1515
import { MenuModel } from '@renderer/model/menu.model';
16+
import { CollationService } from "@renderer/services/management/collation.service";
1617

1718
@Component({
1819
selector: 'app-component-database',
@@ -35,9 +36,15 @@ export class DatabaseBasicComponent extends BaseComponent implements AfterViewIn
3536
configure: DatabaseModel;
3637
databaseType = DatabaseEnum;
3738
properties: PropertyModel[];
39+
collationConfigure = {
40+
elements: [],
41+
characters: [],
42+
collations: []
43+
};
3844

3945
constructor(private dataSourceService: DatasourceService,
4046
private metadataService: MetadataService,
47+
private collationService: CollationService,
4148
private messageService: NzMessageService) {
4249
super();
4350
this.configure = new DatabaseModel();
@@ -97,19 +104,53 @@ export class DatabaseBasicComponent extends BaseComponent implements AfterViewIn
97104
this.handlerValidate();
98105
}
99106

100-
async handlerComplete() {
101-
const request = new RequestModel();
102-
request.config = await this.dataSourceService.getByAliasAsync(this.config.value);
103-
this.metadataService.createDatabase(request, this.configure).then(response => {
104-
if (response.status) {
105-
this.messageService.success(response.message);
106-
this.config.status = true;
107-
this.config.menu = this.menu;
108-
this.config.currentNode = this.node;
109-
this.emitter.emit(this.config);
110-
} else {
111-
this.messageService.error(response.message);
112-
}
113-
});
107+
handlerComplete() {
108+
this.dataSourceService.getByAliasAsync(this.config.value)
109+
.then(dataSource => {
110+
const request = new RequestModel();
111+
request.config = dataSource;
112+
this.metadataService.createDatabase(request, this.configure)
113+
.then(response => {
114+
if (response.status) {
115+
this.messageService.success(response.message);
116+
this.config.status = true;
117+
this.config.menu = this.menu;
118+
this.config.currentNode = this.node;
119+
this.emitter.emit(this.config);
120+
} else {
121+
this.messageService.error(response.message);
122+
}
123+
});
124+
});
125+
126+
}
127+
128+
handlerLoadCharacterAndCollation() {
129+
if (this.collationConfigure.characters.length <= 0) {
130+
this.dataSourceService.getByAliasAsync(this.config.value)
131+
.then(dataSource => {
132+
const request = new RequestModel();
133+
request.config = dataSource;
134+
this.collationService.getCharacterAndCollation(request)
135+
.then(response => {
136+
response.data.columns.forEach(v => {
137+
const collation = {
138+
name: v['name'],
139+
values: v['values'].split(',')
140+
};
141+
this.collationConfigure.characters.push(v['name']);
142+
this.collationConfigure.elements.push(collation);
143+
});
144+
})
145+
});
146+
}
147+
}
148+
149+
handlerChangeCharacter(value: string) {
150+
this.configure.characterAndCollationConfigure.collationConfigure.value = null;
151+
if (this.configure.characterAndCollationConfigure.collationConfigure.enable) {
152+
this.collationConfigure.collations = this.collationConfigure.elements
153+
.filter(item => item.name === value)[0].values;
154+
}
114155
}
115156
}

src/renderer/config/base.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ export interface BaseConfig {
2525
stopProcessor: string;
2626
showCreateDatabase: string;
2727
showTableWithSize: string;
28+
getCharacterAndCollation: string;
2829
}

src/renderer/config/database.config.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DatabaseModel } from '@renderer/model/database.model';
44
import { StringUtils } from '@renderer/utils/string.utils';
55
import { TranslateUtils } from '@renderer/utils/translate.utils';
66
import { PropertyModel } from '@renderer/model/property.model';
7+
import { DefaultEngine } from "@renderer/config/engine/database/mysql/engine.database.mysql.default.config";
78

89
@Injectable()
910
export class DatabaseConfig {
@@ -21,8 +22,12 @@ export class DatabaseConfig {
2122
TranslateUtils.getValue('tooltip.database.default'),
2223
DatabaseEnum.none,
2324
null);
24-
defaultEngine.supportedSource.push(DatabaseEnum.presto, DatabaseEnum.trino, DatabaseEnum.mysql, DatabaseEnum.postgresql);
25+
defaultEngine.supportedSource.push(DatabaseEnum.presto, DatabaseEnum.trino, DatabaseEnum.postgresql);
2526
defaultEngines.push(defaultEngine);
27+
28+
// MySQL
29+
defaultEngines.push(DefaultEngine);
30+
2631
defaultEngines.push(DatabaseModel.builder(TranslateUtils.getValue('common.atomic'),
2732
TranslateUtils.getValue('tooltip.database.atomic'),
2833
DatabaseEnum.atomic,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { DatabaseModel } from "@renderer/model/database.model";
2+
import { TranslateUtils } from "@renderer/utils/translate.utils";
3+
import { DatabaseEnum } from "@renderer/enum/database.enum";
4+
5+
const DefaultEngine = DatabaseModel.builder(TranslateUtils.getValue('common.default'),
6+
TranslateUtils.getValue('tooltip.database.default'),
7+
DatabaseEnum.none,
8+
null);
9+
DefaultEngine.supportedSource = [DatabaseEnum.mysql];
10+
11+
DefaultEngine.characterAndCollationConfigure.enable = true;
12+
DefaultEngine.characterAndCollationConfigure.characterSetConfigure.enable = true;
13+
DefaultEngine.characterAndCollationConfigure.collationConfigure.enable = true;
14+
15+
export {
16+
DefaultEngine
17+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { ConfigInterface } from "@renderer/interfaces/config.interface";
2+
import { DatabaseEnum } from "@renderer/enum/database.enum";
3+
import { Injectable } from "@angular/core";
4+
import { Factory } from "@renderer/factory";
5+
import { MySQLConfig } from "@renderer/config/plugin/mysql.config";
6+
7+
@Injectable()
8+
export class MysqlConfig implements ConfigInterface {
9+
private readonly config: MySQLConfig;
10+
11+
constructor() {
12+
this.config = Factory.create(MySQLConfig);
13+
}
14+
15+
getName(): DatabaseEnum {
16+
return DatabaseEnum.mysql;
17+
}
18+
19+
getStatement(key: string): string {
20+
return this.config[key];
21+
}
22+
}

0 commit comments

Comments
 (0)