From bd76efeaacdddd0dae3901a0d3cef8f93160df6c Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 12 Aug 2026 16:19:41 +0200 Subject: [PATCH] form catalog --- client | 2 +- common/proto/table_definition.proto | 13 +++ common/src/proto/descriptor.bin | Bin 164924 -> 165685 bytes common/src/proto/komp_ac.table_definition.rs | 97 +++++++++++++++++++ server | 2 +- 5 files changed, 112 insertions(+), 2 deletions(-) diff --git a/client b/client index c617cd36..819a4b63 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit c617cd362de2a0fff4208103ca1ae912cc9ab164 +Subproject commit 819a4b6300c34e749efc14a25eca92e2c5c61e78 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 35a71436..37342892 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -27,6 +27,10 @@ service TableDefinition { // This provides a tree-like overview of table relationships. rpc GetProfileTree(komp_ac.common.Empty) returns (ProfileTreeResponse); + // Lists the tables visible in one data-entry scope. When profile_name is + // absent, only global tables are returned. + rpc GetTableCatalog(GetTableCatalogRequest) returns (GetTableCatalogResponse); + // Lists every column type a table may declare, along with the SQL type it // maps to. Pure data retrieval - no business logic. rpc ListColumnTypes(komp_ac.common.Empty) returns (ListColumnTypesResponse); @@ -260,6 +264,15 @@ message ProfileTreeResponse { repeated Profile profiles = 1; } +message GetTableCatalogRequest { + // Selected profile. Omit this field to request the global-only scope. + optional string profile_name = 1; +} + +message GetTableCatalogResponse { + repeated ProfileTreeResponse.Table tables = 1; +} + // Request to fetch all tables, columns and scripts for a profile. message GetProfileDetailsRequest { // Profile (schema) name to fetch details for. diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 5ede8012cbf059529eca40909254cb08d080297a..b5beab0de6d363aa2fd354ea585ea6dc792c2435 100644 GIT binary patch delta 7852 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, } } +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct GetTableCatalogRequest { + /// Selected profile. Omit this field to request the global-only scope. + #[prost(string, optional, tag = "1")] + pub profile_name: ::core::option::Option<::prost::alloc::string::String>, +} +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetTableCatalogResponse { + #[prost(message, repeated, tag = "1")] + pub tables: ::prost::alloc::vec::Vec, +} /// Request to fetch all tables, columns and scripts for a profile. #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetProfileDetailsRequest { @@ -750,6 +761,37 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Lists the tables visible in one data-entry scope. When profile_name is + /// absent, only global tables are returned. + pub async fn get_table_catalog( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::unknown( + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic_prost::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/komp_ac.table_definition.TableDefinition/GetTableCatalog", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "GetTableCatalog", + ), + ); + self.inner.unary(req, path, codec).await + } /// Lists every column type a table may declare, along with the SQL type it /// maps to. Pure data retrieval - no business logic. pub async fn list_column_types( @@ -985,6 +1027,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Lists the tables visible in one data-entry scope. When profile_name is + /// absent, only global tables are returned. + async fn get_table_catalog( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Lists every column type a table may declare, along with the SQL type it /// maps to. Pure data retrieval - no business logic. async fn list_column_types( @@ -1309,6 +1360,52 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/GetTableCatalog" => { + #[allow(non_camel_case_types)] + struct GetTableCatalogSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for GetTableCatalogSvc { + type Response = super::GetTableCatalogResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_table_catalog(&inner, request) + .await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = GetTableCatalogSvc(inner); + let codec = tonic_prost::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/komp_ac.table_definition.TableDefinition/ListColumnTypes" => { #[allow(non_camel_case_types)] struct ListColumnTypesSvc(pub Arc); diff --git a/server b/server index 2bfe955a..32b38e5a 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 2bfe955a8d4a65736ecbc0ea7513689819812c3d +Subproject commit 32b38e5a5bb6a3e1a794ecb7fdcf426cbb2dec27