From 478597ca5ed06e8082a233180a82de775d145b9f Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:42:43 +0200 Subject: [PATCH 01/12] fix: do not attempt db connection if jsonc section is missing --- crates/pgt_cli/src/cli_options.rs | 4 ---- crates/pgt_cli/src/commands/mod.rs | 1 - crates/pgt_configuration/src/database.rs | 4 ++++ crates/pgt_configuration/src/lib.rs | 3 ++- crates/pgt_lsp/src/session.rs | 1 - crates/pgt_workspace/src/settings.rs | 12 ++++++++++++ crates/pgt_workspace/src/workspace.rs | 1 - crates/pgt_workspace/src/workspace/server.rs | 10 ++++------ .../src/workspace/server/db_connection.rs | 5 +++++ 9 files changed, 27 insertions(+), 14 deletions(-) diff --git a/crates/pgt_cli/src/cli_options.rs b/crates/pgt_cli/src/cli_options.rs index d1bfaee9..5c41c7fc 100644 --- a/crates/pgt_cli/src/cli_options.rs +++ b/crates/pgt_cli/src/cli_options.rs @@ -18,10 +18,6 @@ pub struct CliOptions { #[bpaf(long("use-server"), switch, fallback(false))] pub use_server: bool, - /// Skip connecting to the database and only run checks that don't require a database connection. - #[bpaf(long("skip-db"), switch, fallback(false))] - pub skip_db: bool, - /// Print additional diagnostics, and some diagnostics show more information. Also, print out what files were processed and which ones were modified. #[bpaf(long("verbose"), switch, fallback(false))] pub verbose: bool, diff --git a/crates/pgt_cli/src/commands/mod.rs b/crates/pgt_cli/src/commands/mod.rs index b166a033..ebd16e3d 100644 --- a/crates/pgt_cli/src/commands/mod.rs +++ b/crates/pgt_cli/src/commands/mod.rs @@ -307,7 +307,6 @@ pub(crate) trait CommandRunner: Sized { configuration, vcs_base_path, gitignore_matches, - skip_db: cli_options.skip_db, })?; let execution = self.get_execution(cli_options, console, workspace)?; diff --git a/crates/pgt_configuration/src/database.rs b/crates/pgt_configuration/src/database.rs index 209f86dc..cce31142 100644 --- a/crates/pgt_configuration/src/database.rs +++ b/crates/pgt_configuration/src/database.rs @@ -35,11 +35,15 @@ pub struct DatabaseConfiguration { /// The connection timeout in seconds. #[partial(bpaf(long("conn_timeout_secs"), fallback(Some(10)), debug_fallback))] pub conn_timeout_secs: u16, + + #[partial(bpaf(long("skip-db"), switch, fallback(Some(false)),))] + pub skip_db: bool, } impl Default for DatabaseConfiguration { fn default() -> Self { Self { + skip_db: true, host: "127.0.0.1".to_string(), port: 5432, username: "postgres".to_string(), diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index f262450d..5ad6167d 100644 --- a/crates/pgt_configuration/src/lib.rs +++ b/crates/pgt_configuration/src/lib.rs @@ -110,8 +110,9 @@ impl PartialConfiguration { username: Some("postgres".to_string()), password: Some("postgres".to_string()), database: Some("postgres".to_string()), - conn_timeout_secs: Some(10), allow_statement_executions_against: Default::default(), + conn_timeout_secs: Some(10), + skip_db: Some(true), }), } } diff --git a/crates/pgt_lsp/src/session.rs b/crates/pgt_lsp/src/session.rs index 64adf16a..db17dfd1 100644 --- a/crates/pgt_lsp/src/session.rs +++ b/crates/pgt_lsp/src/session.rs @@ -449,7 +449,6 @@ impl Session { configuration: fs_configuration, vcs_base_path, gitignore_matches, - skip_db: false, }); if let Err(error) = result { diff --git a/crates/pgt_workspace/src/settings.rs b/crates/pgt_workspace/src/settings.rs index d4ea462a..ef447e92 100644 --- a/crates/pgt_workspace/src/settings.rs +++ b/crates/pgt_workspace/src/settings.rs @@ -268,6 +268,7 @@ impl Default for LinterSettings { /// Database settings for the entire workspace #[derive(Debug)] pub struct DatabaseSettings { + pub enable_connection: bool, pub host: String, pub port: u16, pub username: String, @@ -280,6 +281,7 @@ pub struct DatabaseSettings { impl Default for DatabaseSettings { fn default() -> Self { Self { + enable_connection: false, host: "127.0.0.1".to_string(), port: 5432, username: "postgres".to_string(), @@ -295,6 +297,14 @@ impl From for DatabaseSettings { fn from(value: PartialDatabaseConfiguration) -> Self { let d = DatabaseSettings::default(); + // "host" is the minimum required setting for database features + // to be enabled. + let enable_connection = value.host.as_ref().is_some_and(|_| { + !value.skip_db.expect( + "Developer Error: --skip-db should never be `None` since it's of type `bpaf(switch)`.", + ) + }); + let database = value.database.unwrap_or(d.database); let host = value.host.unwrap_or(d.host); @@ -312,6 +322,8 @@ impl From for DatabaseSettings { .unwrap_or(false); Self { + enable_connection, + port: value.port.unwrap_or(d.port), username: value.username.unwrap_or(d.username), password: value.password.unwrap_or(d.password), diff --git a/crates/pgt_workspace/src/workspace.rs b/crates/pgt_workspace/src/workspace.rs index 54f7200b..873dd83e 100644 --- a/crates/pgt_workspace/src/workspace.rs +++ b/crates/pgt_workspace/src/workspace.rs @@ -73,7 +73,6 @@ pub struct UpdateSettingsParams { pub vcs_base_path: Option, pub gitignore_matches: Vec, pub workspace_directory: Option, - pub skip_db: bool, } #[derive(Debug, serde::Serialize, serde::Deserialize)] diff --git a/crates/pgt_workspace/src/workspace/server.rs b/crates/pgt_workspace/src/workspace/server.rs index 3bf540cc..3c14f352 100644 --- a/crates/pgt_workspace/src/workspace/server.rs +++ b/crates/pgt_workspace/src/workspace/server.rs @@ -168,12 +168,10 @@ impl Workspace for WorkspaceServer { tracing::info!("Updated settings in workspace"); - if !params.skip_db { - self.connection - .write() - .unwrap() - .set_conn_settings(&self.settings().as_ref().db); - } + self.connection + .write() + .unwrap() + .set_conn_settings(&self.settings().as_ref().db); tracing::info!("Updated Db connection settings"); diff --git a/crates/pgt_workspace/src/workspace/server/db_connection.rs b/crates/pgt_workspace/src/workspace/server/db_connection.rs index d1be3131..d002c0a2 100644 --- a/crates/pgt_workspace/src/workspace/server/db_connection.rs +++ b/crates/pgt_workspace/src/workspace/server/db_connection.rs @@ -16,6 +16,11 @@ impl DbConnection { } pub(crate) fn set_conn_settings(&mut self, settings: &DatabaseSettings) { + if !settings.enable_connection { + tracing::info!("Database connection disabled."); + return; + } + let config = PgConnectOptions::new() .host(&settings.host) .port(settings.port) From aab5aa7449cacad2e95b97ea054d1a9b37684478 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:45:07 +0200 Subject: [PATCH 02/12] comment --- crates/pgt_configuration/src/database.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/pgt_configuration/src/database.rs b/crates/pgt_configuration/src/database.rs index cce31142..9bfe8c18 100644 --- a/crates/pgt_configuration/src/database.rs +++ b/crates/pgt_configuration/src/database.rs @@ -10,6 +10,8 @@ use serde::{Deserialize, Serialize}; #[partial(serde(rename_all = "camelCase", default, deny_unknown_fields))] pub struct DatabaseConfiguration { /// The host of the database. + /// Required if you want database-related features. + /// All else falls back to sensible defaults. #[partial(bpaf(long("host")))] pub host: String, @@ -36,14 +38,14 @@ pub struct DatabaseConfiguration { #[partial(bpaf(long("conn_timeout_secs"), fallback(Some(10)), debug_fallback))] pub conn_timeout_secs: u16, - #[partial(bpaf(long("skip-db"), switch, fallback(Some(false)),))] - pub skip_db: bool, + #[partial(bpaf(long("disable-db"), switch, fallback(Some(false)),))] + pub disable_connection: bool, } impl Default for DatabaseConfiguration { fn default() -> Self { Self { - skip_db: true, + disable_connection: true, host: "127.0.0.1".to_string(), port: 5432, username: "postgres".to_string(), From 8bd73167d817029395158faf0977eb18025cc5e9 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:45:28 +0200 Subject: [PATCH 03/12] comment --- crates/pgt_configuration/src/database.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/pgt_configuration/src/database.rs b/crates/pgt_configuration/src/database.rs index 9bfe8c18..77f82577 100644 --- a/crates/pgt_configuration/src/database.rs +++ b/crates/pgt_configuration/src/database.rs @@ -38,6 +38,7 @@ pub struct DatabaseConfiguration { #[partial(bpaf(long("conn_timeout_secs"), fallback(Some(10)), debug_fallback))] pub conn_timeout_secs: u16, + /// Actively disable all database-related features. #[partial(bpaf(long("disable-db"), switch, fallback(Some(false)),))] pub disable_connection: bool, } From a8207af6a72a9e2e0e4a144abcaeab2cca98ef75 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:45:56 +0200 Subject: [PATCH 04/12] whoopsndoopsn --- crates/pgt_workspace/src/settings.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pgt_workspace/src/settings.rs b/crates/pgt_workspace/src/settings.rs index ef447e92..8e3e2a3a 100644 --- a/crates/pgt_workspace/src/settings.rs +++ b/crates/pgt_workspace/src/settings.rs @@ -301,7 +301,7 @@ impl From for DatabaseSettings { // to be enabled. let enable_connection = value.host.as_ref().is_some_and(|_| { !value.skip_db.expect( - "Developer Error: --skip-db should never be `None` since it's of type `bpaf(switch)`.", + "Developer Error: --disable-db should never be `None` since it's of type `bpaf(switch)`.", ) }); From bf34e19d1e3904455515ee15c004f423c2499088 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:46:31 +0200 Subject: [PATCH 05/12] whoopsndoopsn2 --- crates/pgt_configuration/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index 5ad6167d..a21d8f83 100644 --- a/crates/pgt_configuration/src/lib.rs +++ b/crates/pgt_configuration/src/lib.rs @@ -112,7 +112,7 @@ impl PartialConfiguration { database: Some("postgres".to_string()), allow_statement_executions_against: Default::default(), conn_timeout_secs: Some(10), - skip_db: Some(true), + disable_connection: Some(true), }), } } From d4f9bbbfba513f7cc9b23777fd6414f366b4a126 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 11:46:53 +0200 Subject: [PATCH 06/12] whoopsndoopsn 3 --- crates/pgt_workspace/src/settings.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pgt_workspace/src/settings.rs b/crates/pgt_workspace/src/settings.rs index 8e3e2a3a..110d00a2 100644 --- a/crates/pgt_workspace/src/settings.rs +++ b/crates/pgt_workspace/src/settings.rs @@ -300,7 +300,7 @@ impl From for DatabaseSettings { // "host" is the minimum required setting for database features // to be enabled. let enable_connection = value.host.as_ref().is_some_and(|_| { - !value.skip_db.expect( + !value.disable_connection.expect( "Developer Error: --disable-db should never be `None` since it's of type `bpaf(switch)`.", ) }); From e90df66676b906784a9a4b582bd6a09952130b84 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 12:14:31 +0200 Subject: [PATCH 07/12] ok --- crates/pgt_configuration/src/database.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/pgt_configuration/src/database.rs b/crates/pgt_configuration/src/database.rs index 77f82577..bcc139cf 100644 --- a/crates/pgt_configuration/src/database.rs +++ b/crates/pgt_configuration/src/database.rs @@ -39,7 +39,8 @@ pub struct DatabaseConfiguration { pub conn_timeout_secs: u16, /// Actively disable all database-related features. - #[partial(bpaf(long("disable-db"), switch, fallback(Some(false)),))] + #[partial(bpaf(long("disable-db"), switch, fallback(Some(false))))] + #[partial(cfg_attr(feature = "schema", schemars(skip)))] pub disable_connection: bool, } From 5293b58efdbdb369a863b2a80c314604e4741287 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 12:20:08 +0200 Subject: [PATCH 08/12] ok --- postgrestools.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgrestools.jsonc b/postgrestools.jsonc index 325c7861..0ce2e44f 100644 --- a/postgrestools.jsonc +++ b/postgrestools.jsonc @@ -17,7 +17,7 @@ // YOU CAN COMMENT ME OUT :) "db": { "host": "127.0.0.1", - "port": 5432, + "port": 54322, "username": "postgres", "password": "postgres", "database": "postgres", From 1c07aa1a2655709e70ab85d5859f7af466fbffec Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 12:35:24 +0200 Subject: [PATCH 09/12] just readied --- docs/schemas/0.0.0/schema.json | 2 +- docs/schemas/latest/schema.json | 2 +- justfile | 2 ++ .../backend-jsonrpc/src/workspace.ts | 27 ++++++++++++++----- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/docs/schemas/0.0.0/schema.json b/docs/schemas/0.0.0/schema.json index 086adf3d..faba3b5c 100644 --- a/docs/schemas/0.0.0/schema.json +++ b/docs/schemas/0.0.0/schema.json @@ -100,7 +100,7 @@ ] }, "host": { - "description": "The host of the database.", + "description": "The host of the database. Required if you want database-related features. All else falls back to sensible defaults.", "type": [ "string", "null" diff --git a/docs/schemas/latest/schema.json b/docs/schemas/latest/schema.json index 086adf3d..faba3b5c 100644 --- a/docs/schemas/latest/schema.json +++ b/docs/schemas/latest/schema.json @@ -100,7 +100,7 @@ ] }, "host": { - "description": "The host of the database.", + "description": "The host of the database. Required if you want database-related features. All else falls back to sensible defaults.", "type": [ "string", "null" diff --git a/justfile b/justfile index 3e7163b3..8078d4d0 100644 --- a/justfile +++ b/justfile @@ -77,6 +77,8 @@ serve-docs: uv run mkdocs serve # When you finished coding, run this command. Note that you should have already committed your changes. +# If you haven't run `sqlx prepare` at least once, you need to run `docker compose up` +# to lint the queries. ready: git diff --exit-code --quiet cargo run -p xtask_codegen -- configuration diff --git a/packages/@postgrestools/backend-jsonrpc/src/workspace.ts b/packages/@postgrestools/backend-jsonrpc/src/workspace.ts index 5c9a1ac4..a35dad81 100644 --- a/packages/@postgrestools/backend-jsonrpc/src/workspace.ts +++ b/packages/@postgrestools/backend-jsonrpc/src/workspace.ts @@ -179,21 +179,36 @@ export interface GetCompletionsParams { */ position: TextSize; } -export interface CompletionResult { +export interface CompletionsResult { items: CompletionItem[]; } export interface CompletionItem { + completion_text?: CompletionText; description: string; kind: CompletionItemKind; label: string; preselected: boolean; - score: number; + /** + * String used for sorting by LSP clients. + */ + sort_text: string; +} +/** + * The text that the editor should fill in. If `None`, the `label` should be used. Tables, for example, might have different completion_texts: + +label: "users", description: "Schema: auth", completion_text: "auth.users". + */ +export interface CompletionText { + /** + * A `range` is required because some editors replace the current token, others naively insert the text. Having a range where start == end makes it an insertion. + */ + range: TextRange; + text: string; } -export type CompletionItemKind = "table" | "function" | "column"; +export type CompletionItemKind = "table" | "function" | "column" | "schema"; export interface UpdateSettingsParams { configuration: PartialConfiguration; gitignore_matches: string[]; - skip_db: boolean; vcs_base_path?: string; workspace_directory?: string; } @@ -240,7 +255,7 @@ export interface PartialDatabaseConfiguration { */ database?: string; /** - * The host of the database. + * The host of the database. Required if you want database-related features. All else falls back to sensible defaults. */ host?: string; /** @@ -414,7 +429,7 @@ export interface Workspace { pullDiagnostics( params: PullDiagnosticsParams, ): Promise; - getCompletions(params: GetCompletionsParams): Promise; + getCompletions(params: GetCompletionsParams): Promise; updateSettings(params: UpdateSettingsParams): Promise; openFile(params: OpenFileParams): Promise; changeFile(params: ChangeFileParams): Promise; From a75f3515f14f1d98b54412a34d717463596b27d1 Mon Sep 17 00:00:00 2001 From: Julian Domke <68325451+juleswritescode@users.noreply.github.com> Date: Fri, 25 Apr 2025 12:45:28 +0200 Subject: [PATCH 10/12] Update postgrestools.jsonc --- postgrestools.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgrestools.jsonc b/postgrestools.jsonc index 0ce2e44f..325c7861 100644 --- a/postgrestools.jsonc +++ b/postgrestools.jsonc @@ -17,7 +17,7 @@ // YOU CAN COMMENT ME OUT :) "db": { "host": "127.0.0.1", - "port": 54322, + "port": 5432, "username": "postgres", "password": "postgres", "database": "postgres", From 393402c3300eea337bca8bc1558527301fce4777 Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 16:14:27 +0200 Subject: [PATCH 11/12] ok --- crates/pgt_configuration/src/database.rs | 2 +- crates/pgt_configuration/src/lib.rs | 2 +- crates/pgt_lsp/tests/server.rs | 5 +++-- postgrestools.jsonc | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/pgt_configuration/src/database.rs b/crates/pgt_configuration/src/database.rs index bcc139cf..39efb8d1 100644 --- a/crates/pgt_configuration/src/database.rs +++ b/crates/pgt_configuration/src/database.rs @@ -47,7 +47,7 @@ pub struct DatabaseConfiguration { impl Default for DatabaseConfiguration { fn default() -> Self { Self { - disable_connection: true, + disable_connection: false, host: "127.0.0.1".to_string(), port: 5432, username: "postgres".to_string(), diff --git a/crates/pgt_configuration/src/lib.rs b/crates/pgt_configuration/src/lib.rs index a21d8f83..fcf0b5c6 100644 --- a/crates/pgt_configuration/src/lib.rs +++ b/crates/pgt_configuration/src/lib.rs @@ -112,7 +112,7 @@ impl PartialConfiguration { database: Some("postgres".to_string()), allow_statement_executions_against: Default::default(), conn_timeout_secs: Some(10), - disable_connection: Some(true), + disable_connection: Some(false), }), } } diff --git a/crates/pgt_lsp/tests/server.rs b/crates/pgt_lsp/tests/server.rs index 8e40c097..581ea1fe 100644 --- a/crates/pgt_lsp/tests/server.rs +++ b/crates/pgt_lsp/tests/server.rs @@ -773,14 +773,15 @@ async fn test_execute_statement() -> Result<()> { .to_string(); let host = test_db.connect_options().get_host().to_string(); - let conf = PartialConfiguration { + let mut conf = PartialConfiguration::init(); + conf.merge_with(PartialConfiguration { db: Some(PartialDatabaseConfiguration { database: Some(database), host: Some(host), ..Default::default() }), ..Default::default() - }; + }); fs.insert( url!("postgrestools.jsonc").to_file_path().unwrap(), diff --git a/postgrestools.jsonc b/postgrestools.jsonc index 0ce2e44f..325c7861 100644 --- a/postgrestools.jsonc +++ b/postgrestools.jsonc @@ -17,7 +17,7 @@ // YOU CAN COMMENT ME OUT :) "db": { "host": "127.0.0.1", - "port": 54322, + "port": 5432, "username": "postgres", "password": "postgres", "database": "postgres", From 898718883073653d9d98f4a917736764a88e910f Mon Sep 17 00:00:00 2001 From: Julian Date: Fri, 25 Apr 2025 16:17:50 +0200 Subject: [PATCH 12/12] finally --- crates/pgt_workspace/src/settings.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/crates/pgt_workspace/src/settings.rs b/crates/pgt_workspace/src/settings.rs index 110d00a2..f9275aa9 100644 --- a/crates/pgt_workspace/src/settings.rs +++ b/crates/pgt_workspace/src/settings.rs @@ -299,11 +299,10 @@ impl From for DatabaseSettings { // "host" is the minimum required setting for database features // to be enabled. - let enable_connection = value.host.as_ref().is_some_and(|_| { - !value.disable_connection.expect( - "Developer Error: --disable-db should never be `None` since it's of type `bpaf(switch)`.", - ) - }); + let enable_connection = value + .host + .as_ref() + .is_some_and(|_| value.disable_connection.is_none_or(|disabled| !disabled)); let database = value.database.unwrap_or(d.database); let host = value.host.unwrap_or(d.host);