@@ -7,20 +7,20 @@ use crate::secret::Secret;
7
7
use crate :: { uri, ConnectionUri } ;
8
8
9
9
use ndc_models:: { AggregateFunctionName , CollectionName , ComparisonOperatorName , FieldName } ;
10
+ use query_engine_execution:: query:: execute_query;
10
11
use query_engine_metadata:: metadata;
11
12
use query_engine_metadata:: metadata:: stored_procedures:: {
12
13
StoredProcedureArgumentInfo , StoredProcedureInfo , StoredProcedures ,
13
14
} ;
14
15
use query_engine_metadata:: metadata:: { database, Nullable } ;
15
-
16
16
use query_engine_metrics:: metrics;
17
+ use query_engine_sql:: sql:: { ast:: RawSql , string:: SQL } ;
17
18
use schemars:: JsonSchema ;
18
19
use serde:: { Deserialize , Serialize } ;
19
20
use std:: collections:: BTreeMap ;
20
21
use std:: collections:: BTreeSet ;
21
22
22
23
use thiserror:: Error ;
23
- use tiberius:: Query ;
24
24
25
25
// TODO(KC): Move the `table_configuration.sql` to the `static` folder present
26
26
// in the root of this repo.
@@ -156,22 +156,6 @@ async fn create_mssql_pool(
156
156
bb8:: Pool :: builder ( ) . max_size ( 2 ) . build ( mgr) . await
157
157
}
158
158
159
- async fn select_first_row (
160
- mssql_pool : & bb8:: Pool < bb8_tiberius:: ConnectionManager > ,
161
- query : & str ,
162
- ) -> tiberius:: Row {
163
- let mut connection = mssql_pool. get ( ) . await . unwrap ( ) ;
164
-
165
- // let's do a query to check everything is ok
166
- let select = Query :: new ( query) ;
167
-
168
- // go!
169
- let stream = select. query ( & mut connection) . await . unwrap ( ) ;
170
-
171
- // Nothing is fetched, the first result set starts.
172
- stream. into_row ( ) . await . unwrap ( ) . unwrap ( )
173
- }
174
-
175
159
// get_stored_procedures fetches the stored procedures from the database and returns them as a
176
160
// vector of introspection::IntrospectStoredProcedure.
177
161
async fn configure_stored_procedures (
@@ -181,11 +165,26 @@ async fn configure_stored_procedures(
181
165
) -> Result < StoredProcedures , Error > {
182
166
match config_options {
183
167
Some ( config_options) => {
184
- let stored_procedures_row =
185
- select_first_row ( mssql_pool, STORED_PROCS_CONFIGURATION_QUERY ) . await ;
168
+ let mut connection = mssql_pool
169
+ . get ( )
170
+ . await
171
+ . map_err ( Error :: GetConnectionFromPool ) ?;
172
+ // Let's do some stored procedures introspection
173
+ let mut stored_procs_query = SQL :: new ( ) ;
174
+ RawSql :: RawText ( STORED_PROCS_CONFIGURATION_QUERY . to_string ( ) )
175
+ . to_sql ( & mut stored_procs_query) ;
176
+ let mut stored_procs_rows = Vec :: new ( ) ;
177
+ execute_query (
178
+ & mut connection,
179
+ & stored_procs_query,
180
+ & BTreeMap :: new ( ) ,
181
+ & mut stored_procs_rows,
182
+ )
183
+ . await
184
+ . map_err ( |e| Error :: IntrospectionQueryExecutionError ( format ! ( "{:?}" , e) ) ) ?;
186
185
let introspected_stored_procedures: Vec < introspection:: IntrospectStoredProcedure > =
187
- serde_json:: from_str ( stored_procedures_row . get ( 0 ) . unwrap ( ) )
188
- . map_err ( Error :: StoredProcedureIntrospectionError ) ?;
186
+ serde_json:: from_slice ( & stored_procs_rows )
187
+ . map_err ( |e| Error :: JsonDeserializationError ( e . to_string ( ) ) ) ?;
189
188
let new_stored_procedures = get_stored_procedures ( introspected_stored_procedures) ;
190
189
191
190
// traverse the new stored procedures and add them to the existing stored procedures
@@ -233,26 +232,47 @@ pub async fn configure(
233
232
. await
234
233
. map_err ( Error :: ConnectionPoolError ) ?;
235
234
236
- let mut metadata = query_engine_metadata:: metadata:: Metadata :: default ( ) ;
235
+ let mut connection = mssql_pool
236
+ . get ( )
237
+ . await
238
+ . map_err ( Error :: GetConnectionFromPool ) ?;
239
+
240
+ // Let's do some table introspection
241
+ let mut table_query = SQL :: new ( ) ;
242
+ RawSql :: RawText ( TABLE_CONFIGURATION_QUERY . to_string ( ) ) . to_sql ( & mut table_query) ;
243
+ let mut table_rows = Vec :: new ( ) ;
244
+ execute_query (
245
+ & mut connection,
246
+ & table_query,
247
+ & BTreeMap :: new ( ) ,
248
+ & mut table_rows,
249
+ )
250
+ . await
251
+ . map_err ( |e| Error :: IntrospectionQueryExecutionError ( format ! ( "{:?}" , e) ) ) ?;
252
+ let tables: Vec < introspection:: IntrospectionTable > = serde_json:: from_slice ( & table_rows)
253
+ . map_err ( |e| Error :: JsonDeserializationError ( e. to_string ( ) ) ) ?;
254
+
255
+ // Let's do some types introspection
256
+ let mut types_query = SQL :: new ( ) ;
257
+ RawSql :: RawText ( TYPES_QUERY . to_string ( ) ) . to_sql ( & mut types_query) ;
258
+ let mut types_rows = Vec :: new ( ) ;
259
+ execute_query (
260
+ & mut connection,
261
+ & types_query,
262
+ & BTreeMap :: new ( ) ,
263
+ & mut types_rows,
264
+ )
265
+ . await
266
+ . map_err ( |e| Error :: IntrospectionQueryExecutionError ( format ! ( "{:?}" , e) ) ) ?;
267
+ let type_names: Vec < TypeItem > = serde_json:: from_slice ( & types_rows)
268
+ . map_err ( |e| Error :: JsonDeserializationError ( e. to_string ( ) ) ) ?;
237
269
270
+ let mut metadata = query_engine_metadata:: metadata:: Metadata :: default ( ) ;
238
271
metadata. native_queries = configuration. metadata . native_queries . clone ( ) ;
239
272
metadata. native_mutations = configuration. metadata . native_mutations . clone ( ) ;
240
-
241
- let tables_row = select_first_row ( & mssql_pool, TABLE_CONFIGURATION_QUERY ) . await ;
242
-
243
- let tables: Vec < introspection:: IntrospectionTable > =
244
- serde_json:: from_str ( tables_row. get ( 0 ) . unwrap ( ) ) . unwrap ( ) ;
245
-
246
273
metadata. tables = get_tables_info ( tables) ;
247
-
248
- let types_row = select_first_row ( & mssql_pool, TYPES_QUERY ) . await ;
249
-
250
- let type_names: Vec < TypeItem > = serde_json:: from_str ( types_row. get ( 0 ) . unwrap ( ) ) . unwrap ( ) ;
251
-
252
274
metadata. comparison_operators = get_comparison_operators ( & type_names) ;
253
-
254
275
metadata. aggregate_functions = get_aggregate_functions ( & type_names) ;
255
-
256
276
metadata. stored_procedures = configure_stored_procedures (
257
277
& mssql_pool,
258
278
configuration. metadata . stored_procedures . clone ( ) ,
0 commit comments