@@ -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