@@ -113,137 +113,147 @@ exports.initialise = (context) => {
113
113
context . subscriptions . push (
114
114
vscode . window . registerWebviewViewProvider ( `vscode-db2i.resultset` , resultSetProvider ) ,
115
115
116
- vscode . commands . registerCommand ( `vscode-db2i.runEditorStatement` , async ( ) => {
117
- const instance = getInstance ( ) ;
118
- const config = instance . getConfig ( ) ;
119
- const content = instance . getContent ( ) ;
120
- const editor = vscode . window . activeTextEditor ;
121
-
122
- if ( editor . document . languageId === `sql` ) {
123
- const statement = this . parseStatement ( editor ) ;
124
-
125
- if ( statement . content . trim ( ) . length > 0 ) {
126
- try {
127
- if ( statement . type === `cl` ) {
128
- const commandResult = await vscode . commands . executeCommand ( `code-for-ibmi.runCommand` , {
129
- command : statement . content ,
130
- environment : `ile`
131
- } ) ;
132
-
133
- if ( commandResult . code === 0 || commandResult . code === null ) {
134
- vscode . window . showInformationMessage ( `Command executed successfuly.` ) ;
135
- } else {
136
- vscode . window . showErrorMessage ( `Command failed to run.` ) ;
137
- }
116
+ vscode . commands . registerCommand ( `vscode-db2i.runEditorStatement` ,
117
+ /**
118
+ * @param {StatementInfo } [options]
119
+ */
120
+ async ( options ) => {
121
+ const instance = getInstance ( ) ;
122
+ const config = instance . getConfig ( ) ;
123
+ const content = instance . getContent ( ) ;
124
+ const editor = vscode . window . activeTextEditor ;
138
125
139
- let output = `` ;
140
- if ( commandResult . stderr . length > 0 ) output += ` ${ commandResult . stderr } \n\n` ;
141
- if ( commandResult . stdout . length > 0 ) output += ` ${ commandResult . stdout } \n\n` ;
126
+ if ( options || ( editor && editor . document . languageId === `sql` ) ) {
127
+ /** @type { StatementInfo } */
128
+ const statement = options || this . parseStatement ( editor ) ;
142
129
143
- const textDoc = await vscode . workspace . openTextDocument ( { language : `txt` , content : output } ) ;
144
- await vscode . window . showTextDocument ( textDoc , {
145
- preserveFocus : true ,
146
- preview : true
147
- } ) ;
130
+ if ( statement . open ) {
131
+ const textDoc = await vscode . workspace . openTextDocument ( { language : `sql` , content : statement . content } ) ;
132
+ await vscode . window . showTextDocument ( textDoc ) ;
133
+ }
148
134
149
- } else {
150
- if ( statement . type === `statement` && this . isBasicStatement ( statement . content ) ) {
151
- // If it's a basic statement, we can let it scroll!
152
- resultSetProvider . setScrolling ( statement . content ) ;
135
+ if ( statement . content . trim ( ) . length > 0 ) {
136
+ try {
137
+ if ( statement . type === `cl` ) {
138
+ const commandResult = await vscode . commands . executeCommand ( `code-for-ibmi.runCommand` , {
139
+ command : statement . content ,
140
+ environment : `ile`
141
+ } ) ;
142
+
143
+ if ( commandResult . code === 0 || commandResult . code === null ) {
144
+ vscode . window . showInformationMessage ( `Command executed successfuly.` ) ;
145
+ } else {
146
+ vscode . window . showErrorMessage ( `Command failed to run.` ) ;
147
+ }
148
+
149
+ let output = `` ;
150
+ if ( commandResult . stderr . length > 0 ) output += `${ commandResult . stderr } \n\n` ;
151
+ if ( commandResult . stdout . length > 0 ) output += `${ commandResult . stdout } \n\n` ;
152
+
153
+ const textDoc = await vscode . workspace . openTextDocument ( { language : `txt` , content : output } ) ;
154
+ await vscode . window . showTextDocument ( textDoc , {
155
+ preserveFocus : true ,
156
+ preview : true
157
+ } ) ;
153
158
154
159
} else {
155
- // Otherwise... it's a bit complicated.
156
- statement . content = [
157
- `SET CURRENT SCHEMA = '${ config . currentLibrary . toUpperCase ( ) } '` ,
158
- statement . content
159
- ] . join ( `;\n` ) ;
160
+ if ( statement . type === `statement` && this . isBasicStatement ( statement . content ) ) {
161
+ // If it's a basic statement, we can let it scroll!
162
+ resultSetProvider . setScrolling ( statement . content ) ;
160
163
161
- if ( statement . type === `statement` ) {
162
- resultSetProvider . setLoadingText ( `Executing statement...` ) ;
163
- }
164
+ } else {
165
+ // Otherwise... it's a bit complicated.
166
+ statement . content = [
167
+ `SET CURRENT SCHEMA = '${ config . currentLibrary . toUpperCase ( ) } '` ,
168
+ statement . content
169
+ ] . join ( `;\n` ) ;
164
170
165
- const data = await content . runSQL ( statement . content ) ;
171
+ if ( statement . type === `statement` ) {
172
+ resultSetProvider . setLoadingText ( `Executing statement...` ) ;
173
+ }
166
174
167
- if ( data . length > 0 ) {
168
- switch ( statement . type ) {
169
- case `statement` :
170
- resultSetProvider . setResults ( data ) ;
171
- break ;
175
+ const data = await content . runSQL ( statement . content ) ;
172
176
173
- case `csv` :
174
- case `json` :
175
- case `sql` :
176
- let content = `` ;
177
+ if ( data . length > 0 ) {
177
178
switch ( statement . type ) {
178
- case `csv` : content = csv . stringify ( data , {
179
- header : true ,
180
- quoted_string : true ,
181
- } ) ; break ;
182
- case `json` : content = JSON . stringify ( data , null , 2 ) ; break ;
183
-
184
- case `sql` :
185
- const keys = Object . keys ( data [ 0 ] ) ;
186
-
187
- const insertStatement = [
188
- `insert into TABLE (` ,
189
- ` ${ keys . join ( `, ` ) } ` ,
190
- `) values ` ,
191
- data . map (
192
- row => ` (${ keys . map ( key => {
193
- if ( row [ key ] === null ) return `null` ;
194
- if ( typeof row [ key ] === `string` ) return `'${ row [ key ] . replace ( / ' / g, `''` ) } '` ;
195
- return row [ key ] ;
196
- } ) . join ( `, ` ) } )`
197
- ) . join ( `,\n` ) ,
198
- ] ;
199
- content = insertStatement . join ( `\n` ) ;
179
+ case `statement` :
180
+ resultSetProvider . setResults ( data ) ;
200
181
break ;
201
- }
202
182
203
- const textDoc = await vscode . workspace . openTextDocument ( { language : statement . type , content} ) ;
204
- await vscode . window . showTextDocument ( textDoc ) ;
205
- break ;
206
- }
183
+ case `csv` :
184
+ case `json` :
185
+ case `sql` :
186
+ let content = `` ;
187
+ switch ( statement . type ) {
188
+ case `csv` : content = csv . stringify ( data , {
189
+ header : true ,
190
+ quoted_string : true ,
191
+ } ) ; break ;
192
+ case `json` : content = JSON . stringify ( data , null , 2 ) ; break ;
193
+
194
+ case `sql` :
195
+ const keys = Object . keys ( data [ 0 ] ) ;
196
+
197
+ const insertStatement = [
198
+ `insert into TABLE (` ,
199
+ ` ${ keys . join ( `, ` ) } ` ,
200
+ `) values ` ,
201
+ data . map (
202
+ row => ` (${ keys . map ( key => {
203
+ if ( row [ key ] === null ) return `null` ;
204
+ if ( typeof row [ key ] === `string` ) return `'${ row [ key ] . replace ( / ' / g, `''` ) } '` ;
205
+ return row [ key ] ;
206
+ } ) . join ( `, ` ) } )`
207
+ ) . join ( `,\n` ) ,
208
+ ] ;
209
+ content = insertStatement . join ( `\n` ) ;
210
+ break ;
211
+ }
212
+
213
+ const textDoc = await vscode . workspace . openTextDocument ( { language : statement . type , content} ) ;
214
+ await vscode . window . showTextDocument ( textDoc ) ;
215
+ break ;
216
+ }
207
217
208
- } else {
209
- if ( statement . type === `statement` ) {
210
- resultSetProvider . setError ( `Query executed with no data returned.` ) ;
211
218
} else {
212
- vscode . window . showInformationMessage ( `Query executed with no data returned.` ) ;
219
+ if ( statement . type === `statement` ) {
220
+ resultSetProvider . setError ( `Query executed with no data returned.` ) ;
221
+ } else {
222
+ vscode . window . showInformationMessage ( `Query executed with no data returned.` ) ;
223
+ }
213
224
}
214
225
}
215
226
}
216
- }
217
227
218
- } catch ( e ) {
219
- let errorText ;
220
- if ( typeof e === `string` ) {
221
- errorText = e . length > 0 ? e : `An error occurred when executing the statement.` ;
222
- } else {
223
- errorText = e . message || `Error running SQL statement.` ;
224
- }
228
+ } catch ( e ) {
229
+ let errorText ;
230
+ if ( typeof e === `string` ) {
231
+ errorText = e . length > 0 ? e : `An error occurred when executing the statement.` ;
232
+ } else {
233
+ errorText = e . message || `Error running SQL statement.` ;
234
+ }
225
235
226
- if ( statement . type === `statement` ) {
227
- resultSetProvider . setError ( errorText ) ;
228
- } else {
229
- vscode . window . showErrorMessage ( errorText ) ;
236
+ if ( statement . type === `statement` ) {
237
+ resultSetProvider . setError ( errorText ) ;
238
+ } else {
239
+ vscode . window . showErrorMessage ( errorText ) ;
240
+ }
230
241
}
231
242
}
232
243
}
233
- }
234
- } ) ,
244
+ } ) ,
235
245
)
236
246
}
237
247
238
248
exports . isBasicStatement = ( statement ) => {
239
249
const basicStatement = statement . trim ( ) . toUpperCase ( ) ;
240
250
241
- return statement . startsWith ( `SELECT` ) && ! statement . includes ( `LIMIT` ) ;
251
+ return basicStatement . startsWith ( `SELECT` ) && ! basicStatement . includes ( `LIMIT` ) ;
242
252
}
243
253
244
254
/**
245
255
* @param {vscode.TextEditor } editor
246
- * @returns {{type: "statement"|"cl"|"json"|"csv"|"sql", content: string} } Statement
256
+ * @returns {StatementInfo } Statement
247
257
*/
248
258
exports . parseStatement = ( editor ) => {
249
259
const document = editor . document ;
0 commit comments