Skip to content

Commit 091fdfe

Browse files
committed
Pipe through static connection
1 parent 293d324 commit 091fdfe

File tree

18 files changed

+193
-71
lines changed

18 files changed

+193
-71
lines changed

Cargo.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ similar_names = "allow"
3131
too_many_lines = "allow"
3232

3333
[workspace.dependencies]
34-
ndc-models = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.2.3" }
35-
ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git", rev = "e2a1aeb" }
36-
ndc-test = { git = "https://github.com/hasura/ndc-spec.git", tag = "v0.2.3" }
34+
ndc-models = { git = "https://github.com/hasura/ndc-spec.git", rev = "3fdff9e" }
35+
ndc-sdk = { git = "https://github.com/hasura/ndc-sdk-rs.git", rev = "2584f5d55049df60951bcdf2ba9c506a2ea8ff1d" }
36+
ndc-test = { git = "https://github.com/hasura/ndc-spec.git", rev = "3fdff9e" }
3737

3838
anyhow = "1"
3939
async-trait = "0.1"

crates/configuration/src/configuration.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::error::{
1212
use crate::values::{IsolationLevel, PoolSettings};
1313
use crate::version3;
1414
use crate::version4;
15-
use crate::version5;
15+
use crate::version5::{self, DynamicConnectionSettings};
1616
use crate::VersionTag;
1717
use schemars::{gen::SchemaSettings, schema::RootSchema};
1818

@@ -56,6 +56,16 @@ impl ParsedConfiguration {
5656
}
5757
}
5858

59+
#[derive(Debug)]
60+
pub enum ConnectionSettings {
61+
Static {
62+
connection_uri: String,
63+
},
64+
Dynamic {
65+
dynamic_connection_settings: DynamicConnectionSettings,
66+
},
67+
}
68+
5969
/// The 'Configuration' type collects all the information necessary to serve queries at runtime.
6070
///
6171
/// 'ParsedConfiguration' deals with a multitude of different concrete version formats, and each
@@ -71,8 +81,8 @@ impl ParsedConfiguration {
7181
pub struct Configuration {
7282
pub metadata: metadata::Metadata,
7383
pub configuration_version_tag: VersionTag,
84+
pub connection: ConnectionSettings,
7485
pub pool_settings: PoolSettings,
75-
pub connection_uri: String,
7686
pub isolation_level: IsolationLevel,
7787
pub mutations_version: Option<metadata::mutations::MutationsVersion>,
7888
pub mutations_prefix: Option<String>,

crates/configuration/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ pub mod version5;
1212

1313
pub use configuration::{
1414
generate_latest_schema, introspect, make_runtime_configuration, parse_configuration,
15-
upgrade_to_latest_version, write_parsed_configuration, Configuration, ParsedConfiguration,
16-
DEFAULT_CONNECTION_URI_VARIABLE,
15+
upgrade_to_latest_version, write_parsed_configuration, Configuration, ConnectionSettings,
16+
ParsedConfiguration, DEFAULT_CONNECTION_URI_VARIABLE,
1717
};
1818
pub use values::{ConnectionUri, IsolationLevel, PoolSettings, Secret};
1919

crates/configuration/src/version3/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -597,7 +597,7 @@ pub fn make_runtime_configuration(
597597
Ok(crate::Configuration {
598598
metadata: convert_metadata(configuration.metadata),
599599
pool_settings: configuration.connection_settings.pool_settings,
600-
connection_uri,
600+
connection: crate::ConnectionSettings::Static { connection_uri },
601601
isolation_level: configuration.connection_settings.isolation_level,
602602
mutations_version: convert_mutations_version(configuration.mutations_version),
603603
configuration_version_tag: VersionTag::Version3,

crates/configuration/src/version4/to_runtime_configuration.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub fn make_runtime_configuration(
3030
Ok(crate::Configuration {
3131
metadata: convert_metadata(parsed_config.metadata),
3232
pool_settings: parsed_config.connection_settings.pool_settings,
33-
connection_uri,
33+
connection: crate::ConnectionSettings::Static { connection_uri },
3434
isolation_level: parsed_config.connection_settings.isolation_level,
3535
mutations_version: convert_mutations_version(parsed_config.mutations_version),
3636
configuration_version_tag: VersionTag::Version4,

crates/configuration/src/version5/to_runtime_configuration.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,18 @@ pub fn make_runtime_configuration(
2727
})
2828
}
2929
}?;
30+
31+
let connection = match parsed_config.dynamic_connections {
32+
Some(dynamic_connection_settings) => crate::ConnectionSettings::Dynamic {
33+
dynamic_connection_settings,
34+
},
35+
None => crate::ConnectionSettings::Static { connection_uri },
36+
};
37+
3038
Ok(crate::Configuration {
3139
metadata: convert_metadata(parsed_config.metadata),
40+
connection,
3241
pool_settings: parsed_config.connection_settings.pool_settings,
33-
connection_uri,
3442
isolation_level: parsed_config.connection_settings.isolation_level,
3543
mutations_version: convert_mutations_version(parsed_config.mutations_version),
3644
configuration_version_tag: VersionTag::Version4,

crates/connectors/ndc-postgres/src/connector.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ impl Connector for Postgres {
3939
/// the number of idle connections in a connection pool
4040
/// can be polled but not updated directly.
4141
fn fetch_metrics(_configuration: &Self::Configuration, state: &Self::State) -> Result<()> {
42-
state.query_metrics.update_pool_metrics(&state.pool);
42+
match &state.pool {
43+
state::Pool::Static { pool, .. } => state.query_metrics.update_pool_metrics(&pool),
44+
state::Pool::Dynamic(_) => {}
45+
};
4346
Ok(())
4447
}
4548

@@ -279,9 +282,9 @@ impl<Env: Environment + Send + Sync + 'static> ConnectorSetup for PostgresSetup<
279282
) -> Result<<Self::Connector as Connector>::State> {
280283
// create the state
281284
state::create_state(
282-
&configuration.connection_uri,
283-
&self.environment,
285+
&configuration.connection,
284286
&configuration.pool_settings,
287+
&self.environment,
285288
metrics,
286289
configuration.configuration_version_tag,
287290
)

crates/connectors/ndc-postgres/src/mutation.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,15 @@ async fn execute_mutation(
9999
state: &state::State,
100100
plan: sql::execution_plan::ExecutionPlan<sql::execution_plan::Mutations>,
101101
) -> Result<JsonResponse<models::MutationResponse>, query_engine_execution::error::Error> {
102-
query_engine_execution::mutation::execute(
103-
&state.pool,
104-
&state.database_info,
105-
&state.query_metrics,
106-
plan,
107-
)
108-
.await
109-
.map(JsonResponse::Serialized)
102+
let (pool, database_info) = match &state.pool {
103+
state::Pool::Static {
104+
pool,
105+
database_info,
106+
} => (pool, database_info),
107+
_ => todo!("Dynamic connect for execute_mutation"),
108+
};
109+
110+
query_engine_execution::mutation::execute(&pool, &database_info, &state.query_metrics, plan)
111+
.await
112+
.map(JsonResponse::Serialized)
110113
}

crates/connectors/ndc-postgres/src/mutation/explain.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
use std::collections::BTreeMap;
77

8+
use query_engine_execution::database_info;
89
use tracing::{info_span, Instrument};
910

1011
use ndc_postgres_configuration as configuration;
@@ -43,9 +44,17 @@ pub async fn explain(
4344

4445
// Execute an explain query.
4546
let results = async {
47+
let (pool, database_info) = match &state.pool {
48+
state::Pool::Static {
49+
pool,
50+
database_info,
51+
} => (pool, database_info),
52+
_ => todo!("Dynamic connect for explain_mutation"),
53+
};
54+
4655
query_engine_execution::mutation::explain(
47-
&state.pool,
48-
&state.database_info,
56+
&pool,
57+
&database_info,
4958
&state.query_metrics,
5059
plan,
5160
)

crates/connectors/ndc-postgres/src/query.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,15 @@ async fn execute_query(
8080
state: &state::State,
8181
plan: sql::execution_plan::ExecutionPlan<sql::execution_plan::Query>,
8282
) -> Result<JsonResponse<models::QueryResponse>, query_engine_execution::error::Error> {
83-
query_engine_execution::query::execute(
84-
&state.pool,
85-
&state.database_info,
86-
&state.query_metrics,
87-
plan,
88-
)
89-
.await
90-
.map(JsonResponse::Serialized)
83+
let (pool, database_info) = match &state.pool {
84+
state::Pool::Static {
85+
pool,
86+
database_info,
87+
} => (pool, database_info),
88+
_ => todo!("Dynamic connect for execute_query"),
89+
};
90+
91+
query_engine_execution::query::execute(&pool, &database_info, &state.query_metrics, plan)
92+
.await
93+
.map(JsonResponse::Serialized)
9194
}

crates/connectors/ndc-postgres/src/query/explain.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
use std::collections::BTreeMap;
77

8+
use query_engine_execution::database_info;
89
use tracing::{info_span, Instrument};
910

1011
use ndc_postgres_configuration as configuration;
@@ -42,9 +43,16 @@ pub async fn explain(
4243

4344
// Execute an explain query.
4445
let (query, plan) = async {
46+
let (pool, database_info) = match &state.pool {
47+
state::Pool::Static {
48+
pool,
49+
database_info,
50+
} => (pool, database_info),
51+
_ => todo!("Dynamic connect for explain"),
52+
};
4553
query_engine_execution::query::explain(
46-
&state.pool,
47-
&state.database_info,
54+
&pool,
55+
&database_info,
4856
&state.query_metrics,
4957
plan,
5058
)

crates/connectors/ndc-postgres/src/schema/mod.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ mod mutation;
88

99
use std::collections::BTreeMap;
1010

11+
use ndc_postgres_configuration::version5::DynamicConnectionSettings;
12+
use ndc_postgres_configuration::ConnectionSettings;
1113
use ndc_sdk::connector;
1214
use ndc_sdk::models;
1315

1416
use helpers::*;
1517
use ndc_postgres_configuration as configuration;
18+
use ndc_sdk::models::RequestLevelArguments;
1619
use ndc_sdk::models::ScalarTypeName;
1720
use query_engine_metadata::metadata;
1821
use query_engine_metadata::metadata::TypeRepresentation;
@@ -418,6 +421,37 @@ pub fn get_schema(
418421
extraction_functions: BTreeMap::new(),
419422
});
420423

424+
// if we are using dynamic connection strings then we're going to need some
425+
// request_level_arguments to tell us which ones to use
426+
let request_arguments = match config.connection {
427+
ConnectionSettings::Dynamic {
428+
dynamic_connection_settings: DynamicConnectionSettings::NamedFromList,
429+
} => {
430+
let request_level_arguments = BTreeMap::from_iter(vec![(
431+
"connection_identifier".into(),
432+
models::ArgumentInfo {
433+
argument_type: models::Type::Named {
434+
name: "String".into(),
435+
},
436+
description: Some(
437+
"Identifier to choose which connection string to use for this request."
438+
.into(),
439+
),
440+
},
441+
)]);
442+
RequestLevelArguments {
443+
query_arguments: request_level_arguments.clone(),
444+
mutation_arguments: request_level_arguments,
445+
relational_query_arguments: BTreeMap::new(),
446+
}
447+
}
448+
ConnectionSettings::Static { .. } => RequestLevelArguments {
449+
query_arguments: BTreeMap::new(),
450+
mutation_arguments: BTreeMap::new(),
451+
relational_query_arguments: BTreeMap::new(),
452+
},
453+
};
454+
421455
Ok(models::SchemaResponse {
422456
collections,
423457
procedures,
@@ -431,6 +465,7 @@ pub fn get_schema(
431465
}),
432466
}),
433467
}),
468+
request_arguments,
434469
})
435470
}
436471

0 commit comments

Comments
 (0)