Skip to content

Commit 66fee24

Browse files
authored
Improve connection test (#655)
1 parent 586b6e5 commit 66fee24

File tree

1 file changed

+77
-67
lines changed

1 file changed

+77
-67
lines changed

src/ls/driver.ts

Lines changed: 77 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -85,94 +85,104 @@ export default class ClickHouseDriver
8585
query,
8686
opt = {}
8787
) => {
88-
return this.open().then((ch) => {
89-
return new Promise<NSDatabase.IResult[]>(async (resolve) => {
90-
const { requestId } = opt;
91-
const queryStart = query.toString().trimStart().toUpperCase();
92-
const method =
93-
queryStart.startsWith("SELECT") ||
94-
queryStart.startsWith("SHOW") ||
95-
queryStart.startsWith("WITH") ||
96-
queryStart.startsWith("DESC")
97-
? "query"
98-
: "command";
88+
const ch = await this.open();
9989

100-
try {
101-
if (method === "query") {
102-
const result = await (
103-
await ch.query({
104-
query: query.toString(),
105-
format: "JSON",
106-
})
107-
).json<ResponseJSON>();
90+
return new Promise<NSDatabase.IResult[]>(async (resolve) => {
91+
const { requestId } = opt;
92+
const queryStart = query.toString().trimStart().toUpperCase();
93+
const method =
94+
queryStart.startsWith("SELECT") ||
95+
queryStart.startsWith("SHOW") ||
96+
queryStart.startsWith("WITH") ||
97+
queryStart.startsWith("DESC")
98+
? "query"
99+
: "command";
108100

109-
return resolve([
110-
<NSDatabase.IResult>{
111-
requestId,
112-
connId: this.getId(),
113-
resultId: generateId(),
114-
cols: result.meta?.map((v) => v.name) ?? [],
115-
results: result.data,
116-
pageSize: result.data.length,
117-
query,
118-
messages: [
119-
this.prepareMessage([
120-
`Elapsed: ${result.statistics.elapsed} sec, read ${result.statistics.rows_read} rows, ${result.statistics.bytes_read} B.`,
121-
]),
122-
],
123-
},
124-
]);
125-
} else {
126-
await ch.command({
101+
try {
102+
if (method === "query") {
103+
const result = await (
104+
await ch.query({
127105
query: query.toString(),
128-
});
106+
format: "JSON",
107+
})
108+
).json<ResponseJSON>();
129109

130-
return resolve([
131-
<NSDatabase.IResult>{
132-
requestId,
133-
connId: this.getId(),
134-
resultId: generateId(),
135-
cols: [],
136-
results: [],
137-
pageSize: 0,
138-
query,
139-
messages: [this.prepareMessage([`Done.`])],
140-
},
141-
]);
142-
}
143-
} catch (err) {
144110
return resolve([
145111
<NSDatabase.IResult>{
146112
requestId,
147113
connId: this.getId(),
148114
resultId: generateId(),
149-
error: true,
150-
rawError: err,
151-
cols: [],
152-
results: [],
115+
cols: result.meta?.map((v) => v.name) ?? [],
116+
results: result.data,
117+
pageSize: result.data.length,
153118
query,
154119
messages: [
155-
this.prepareMessage(
156-
[err.message.replace(/\n/g, " ")].filter(Boolean).join(" ")
157-
),
120+
this.prepareMessage([
121+
`Elapsed: ${result.statistics.elapsed} sec, read ${result.statistics.rows_read} rows, ${result.statistics.bytes_read} B.`,
122+
]),
158123
],
159124
},
160125
]);
126+
} else {
127+
await ch.command({
128+
query: query.toString(),
129+
});
130+
131+
return resolve([
132+
<NSDatabase.IResult>{
133+
requestId,
134+
connId: this.getId(),
135+
resultId: generateId(),
136+
cols: [],
137+
results: [],
138+
pageSize: 0,
139+
query,
140+
messages: [this.prepareMessage([`Done.`])],
141+
},
142+
]);
161143
}
162-
});
144+
} catch (err) {
145+
return resolve([
146+
<NSDatabase.IResult>{
147+
requestId,
148+
connId: this.getId(),
149+
resultId: generateId(),
150+
error: true,
151+
rawError: err,
152+
cols: [],
153+
results: [],
154+
query,
155+
messages: [
156+
this.prepareMessage(
157+
[err.message.replace(/\n/g, " ")].filter(Boolean).join(" ")
158+
),
159+
],
160+
},
161+
]);
162+
}
163163
});
164164
};
165165

166166
public async testConnection() {
167-
await this.open();
168-
const pingResult = await (await this.connection).ping();
169-
if (!pingResult.success) {
170-
if ("error" in pingResult) {
171-
return Promise.reject(pingResult.error);
167+
try {
168+
const ch = await this.open();
169+
170+
// Try ping
171+
const pingResult = await ch.ping();
172+
if (!pingResult.success) {
173+
throw "Failed to ping ClickHouse server";
172174
}
173-
return Promise.reject("Can't ping ClickHouse server");
175+
176+
// Try "select 1"
177+
await ch.query({
178+
query: "SELECT 1",
179+
format: "JSON",
180+
});
181+
} catch (err) {
182+
return Promise.reject(err);
183+
} finally {
184+
await this.close();
174185
}
175-
await this.close();
176186
}
177187

178188
private async getColumns(

0 commit comments

Comments
 (0)