Skip to content

Commit b661071

Browse files
committed
feat: support Dameng local database clients
1 parent 607c51c commit b661071

15 files changed

Lines changed: 149 additions & 4 deletions

File tree

‎electron/src/apps/local-app-launcher.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ function dbxUrl(payload) {
4747
}
4848

4949
function valuesFor(payload): Record<string, string> {
50+
const dmConnection = `${username(payload)}/${String(payload.token?.value || "")}@${String(payload.endpoint?.host || "")}:${String(payload.endpoint?.port || "")}`;
5051
return {
5152
name: sanitizedName(payload.name),
5253
protocol: payload.protocol,
@@ -55,6 +56,7 @@ function valuesFor(payload): Record<string, string> {
5556
host: String(payload.endpoint?.host || ""),
5657
port: String(payload.endpoint?.port || ""),
5758
dbname: payload.protocol === "oracle" ? username(payload) : String(payload.asset?.info?.db_name || ""),
59+
dameng_disql: shellQuote(dmConnection),
5860
dbeaver_protocol: payload.protocol === "sqlserver" ? "mssql_jdbc_ms_new" : payload.protocol,
5961
dbx_url: dbxUrl(payload),
6062
url: navicatUrl(payload)

‎electron/tests/application-config.test.ts‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,89 @@ for (const platform of ["macos", "linux", "windows"]) {
139139
});
140140
}
141141

142+
for (const platform of ["macos", "linux", "windows"]) {
143+
test(`${platform} offers DBeaver for Dameng and launches its native driver`, async (context) => {
144+
const appData = await mkdtemp(path.join(os.tmpdir(), "jms-dameng-dbeaver-"));
145+
context.after(() => rm(appData, { recursive: true, force: true }));
146+
const app = { getPath: () => appData, isPackaged: false };
147+
const service = new ApplicationConfigService(app, projectRoot);
148+
service.builtInDir = async () => path.join(projectRoot, "plugins", platform);
149+
await service.initialize();
150+
await service.updateSelection({
151+
category: "databases",
152+
protocol: "dameng",
153+
name: "dbeaver",
154+
pluginId: undefined,
155+
path: process.execPath
156+
});
157+
await service.updateSelection({
158+
category: "databases",
159+
protocol: "dameng",
160+
name: "dbeaver",
161+
pluginId: undefined,
162+
path: undefined,
163+
makeDefault: true
164+
});
165+
const application = (await service.getConfig()).databases.find((item) => item.name === "dbeaver");
166+
assert.ok(application?.protocol.includes("dameng"));
167+
assert.ok(application.match_first.includes("dameng"));
168+
169+
const launcher = new LocalApplicationLauncher(app, projectRoot, service, null);
170+
let launched = false;
171+
launcher.launchExecutable = async (selected, argumentString) => {
172+
assert.equal(selected.name, "dbeaver");
173+
assert.deepEqual(localAppLauncherInternals.splitArguments(argumentString), [
174+
"-con",
175+
"name=Dameng|driver=dameng|user=token-id|password=secret|host=gateway.example.com|port=5525|save=false|connect=true"
176+
]);
177+
launched = true;
178+
};
179+
const payload = {
180+
protocol: "dameng",
181+
name: "Dameng",
182+
endpoint: { host: "gateway.example.com", port: 5525 },
183+
token: { id: "token-id", value: "secret" },
184+
asset: { info: { db_name: "business" } }
185+
};
186+
await launcher.launch(`jms2://${Buffer.from(JSON.stringify(payload)).toString("base64")}`);
187+
assert.equal(launched, true);
188+
});
189+
}
190+
191+
for (const platform of ["macos", "linux"]) {
192+
test(`${platform} offers a shell-safe Dameng disql launch`, async (context) => {
193+
const appData = await mkdtemp(path.join(os.tmpdir(), "jms-dameng-disql-"));
194+
context.after(() => rm(appData, { recursive: true, force: true }));
195+
const app = { getPath: () => appData, isPackaged: false };
196+
const service = new ApplicationConfigService(app, projectRoot);
197+
service.builtInDir = async () => path.join(projectRoot, "plugins", platform);
198+
await service.initialize();
199+
await service.updateSelection({
200+
category: "databases",
201+
protocol: "dameng",
202+
name: "terminal",
203+
pluginId: undefined,
204+
path: undefined,
205+
makeDefault: true
206+
});
207+
const launcher = new LocalApplicationLauncher(app, projectRoot, service, null);
208+
let launched = false;
209+
launcher.launchTerminal = async (selected, command) => {
210+
assert.equal(selected.name, "terminal");
211+
assert.equal(command, "disql 'token-id/p'\\''a&b@gateway.example.com:5525'");
212+
launched = true;
213+
};
214+
const payload = {
215+
protocol: "dameng",
216+
name: "Dameng",
217+
endpoint: { host: "gateway.example.com", port: 5525 },
218+
token: { id: "token-id", value: "p'a&b" }
219+
};
220+
await launcher.launch(`jms2://${Buffer.from(JSON.stringify(payload)).toString("base64")}`);
221+
assert.equal(launched, true);
222+
});
223+
}
224+
142225
for (const [platform, protocol, expectedClient] of [
143226
["macos", "ssh", "terminal"],
144227
["linux", "ssh", "terminal"],

‎plugins/linux/linux.dbeaver/connect.json‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
},
1212
"launch": {
1313
"type": "args",
14-
"template": "-con name={name}|driver={dbeaver_protocol}|user={username}|password={value}|database={dbname}|host={host}|port={port}|save=false|connect=true"
14+
"template": "-con name={name}|driver={dbeaver_protocol}|user={username}|password={value}|database={dbname}|host={host}|port={port}|save=false|connect=true",
15+
"protocol_templates": {
16+
"dameng": "-con name={name}|driver=dameng|user={username}|password={value}|host={host}|port={port}|save=false|connect=true"
17+
}
1518
},
1619
"display_name": "DBeaver Community"
1720
}

‎plugins/linux/linux.dbeaver/manifest.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"mariadb",
1313
"mysql",
1414
"oracle",
15+
"dameng",
1516
"postgresql",
1617
"sqlserver"
1718
],

‎plugins/linux/linux.terminal-db/connect.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"protocol_templates": {
1616
"redis": "redis-cli -h {host} -p {port} -a {username}@{value}",
1717
"oracle": "sqlplus {username}/{value}@{host}:{port}/{dbname}",
18+
"dameng": "disql {dameng_disql}",
1819
"postgresql": "psql 'user={username} password={value} host={host} dbname={dbname} port={port}'",
1920
"mysql": "mysql -u {username} -p{value} -h {host} -P {port} {dbname}",
2021
"mariadb": "mysql -u {username} -p{value} -h {host} -P {port} {dbname}",

‎plugins/linux/linux.terminal-db/manifest.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"mongodb",
1414
"mysql",
1515
"oracle",
16+
"dameng",
1617
"postgresql",
1718
"redis",
1819
"sqlserver"

‎plugins/macos/macos.dbeaver/connect.json‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
},
1212
"launch": {
1313
"type": "args",
14-
"template": "-con name={name}|driver={dbeaver_protocol}|user={username}|password={value}|database={dbname}|host={host}|port={port}|save=false|connect=true"
14+
"template": "-con name={name}|driver={dbeaver_protocol}|user={username}|password={value}|database={dbname}|host={host}|port={port}|save=false|connect=true",
15+
"protocol_templates": {
16+
"dameng": "-con name={name}|driver=dameng|user={username}|password={value}|host={host}|port={port}|save=false|connect=true"
17+
}
1518
},
1619
"display_name": "DBeaver Community"
1720
}

‎plugins/macos/macos.dbeaver/manifest.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"mariadb",
1313
"mysql",
1414
"oracle",
15+
"dameng",
1516
"postgresql",
1617
"sqlserver"
1718
],

‎plugins/macos/macos.terminal-db/connect.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"protocol_templates": {
1717
"redis": "redis-cli -h {host} -p {port} -a {username}@{value}",
1818
"oracle": "sqlplus {username}/{value}@{host}:{port}/{dbname}",
19+
"dameng": "disql {dameng_disql}",
1920
"postgresql": "psql 'user={username} password={value} host={host} dbname={dbname} port={port}'",
2021
"mysql": "mysql -u {username} -p{value} -h {host} -P {port} {dbname}",
2122
"mariadb": "mysql -u {username} -p{value} -h {host} -P {port} {dbname}",

‎plugins/macos/macos.terminal-db/manifest.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"mongodb",
1414
"mysql",
1515
"oracle",
16+
"dameng",
1617
"postgresql",
1718
"redis",
1819
"sqlserver"

0 commit comments

Comments
 (0)