From a44dccf84b83cc6e9a019196f16a93338d645787 Mon Sep 17 00:00:00 2001 From: Filipriec Date: Sun, 23 Aug 2026 23:29:27 +0200 Subject: [PATCH] put table definition --- client | 2 +- common/proto/table_definition.proto | 30 +++++ common/src/proto/descriptor.bin | Bin 189229 -> 191347 bytes common/src/proto/komp_ac.table_definition.rs | 126 +++++++++++++++++++ server | 2 +- 5 files changed, 158 insertions(+), 2 deletions(-) diff --git a/client b/client index 9dbcd82f..fc712732 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit 9dbcd82f37a22f94fb7dce29dba49f13eaa8e530 +Subproject commit fc712732df6521160302fd6ace06261fd8336f53 diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index f0c79d1a..076a1873 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -27,6 +27,11 @@ service TableDefinition { // Existing columns, links, and table logic are never changed by this call. rpc AddTableColumns(AddTableColumnsRequest) returns (TableDefinitionResponse); + // Atomically removes selected columns and appends new columns to an empty + // dynamic table. Column identities come from GetProfileDetails. The call is + // rejected after any row, including a soft-deleted row, has been stored. + rpc PutTableDefinition(PutTableDefinitionRequest) returns (PutTableDefinitionResponse); + // Lists all profiles (schemas) and their tables with declared dependencies. // This provides a tree-like overview of table relationships. rpc GetProfileTree(komp_ac.common.Empty) returns (ProfileTreeResponse); @@ -203,6 +208,31 @@ message AddTableColumnsRequest { } +// One atomic structural edit to an existing empty table. +// +// Removals use stable column IDs rather than aliases. Generated companion +// columns must be removed together with their generating column. New columns +// follow the same contract as AddTableColumns. +message PutTableDefinitionRequest { + string profile_name = 1; + string table_name = 2; + repeated int64 remove_column_ids = 3; + repeated ColumnDefinition add_columns = 4; + repeated string add_indexes = 5; + repeated GeneratedColumnAlias generated_aliases = 6; + + // Revision returned by GetProfileDetails. Prevents a stale editor from + // overwriting a newer structural or presentation change. + int64 expected_row_version = 7; +} + +message PutTableDefinitionResponse { + bool success = 1; + string sql = 2; + int64 row_version = 3; + repeated int64 removed_column_ids = 4; +} + enum MoneyRounding { MONEY_ROUNDING_NONE = 0; MONEY_ROUNDING_HALF_UP = 1; diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 9fe5cba29738ba965001b4c1c70ff994a4dc64f9..0e67ea935a6acd14d400e2feb3d940d93a0dd419 100644 GIT binary patch delta 11096 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 UT9w(~NCBa9I{WH5YWnj30Rf!a;Q#;t delta 9336 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 e9RP^d?kK;l08!cQyKy-HZ%RBPT5B?vDF*KY2 diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index 59af8e83..2d84a993 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -165,6 +165,41 @@ pub struct AddTableColumnsRequest { #[prost(message, repeated, tag = "5")] pub generated_aliases: ::prost::alloc::vec::Vec, } +/// One atomic structural edit to an existing empty table. +/// +/// Removals use stable column IDs rather than aliases. Generated companion +/// columns must be removed together with their generating column. New columns +/// follow the same contract as AddTableColumns. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct PutTableDefinitionRequest { + #[prost(string, tag = "1")] + pub profile_name: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub table_name: ::prost::alloc::string::String, + #[prost(int64, repeated, tag = "3")] + pub remove_column_ids: ::prost::alloc::vec::Vec, + #[prost(message, repeated, tag = "4")] + pub add_columns: ::prost::alloc::vec::Vec, + #[prost(string, repeated, tag = "5")] + pub add_indexes: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, + #[prost(message, repeated, tag = "6")] + pub generated_aliases: ::prost::alloc::vec::Vec, + /// Revision returned by GetProfileDetails. Prevents a stale editor from + /// overwriting a newer structural or presentation change. + #[prost(int64, tag = "7")] + pub expected_row_version: i64, +} +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct PutTableDefinitionResponse { + #[prost(bool, tag = "1")] + pub success: bool, + #[prost(string, tag = "2")] + pub sql: ::prost::alloc::string::String, + #[prost(int64, tag = "3")] + pub row_version: i64, + #[prost(int64, repeated, tag = "4")] + pub removed_column_ids: ::prost::alloc::vec::Vec, +} /// Describes one user-defined column for a table. #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] @@ -893,6 +928,38 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Atomically removes selected columns and appends new columns to an empty + /// dynamic table. Column identities come from GetProfileDetails. The call is + /// rejected after any row, including a soft-deleted row, has been stored. + pub async fn put_table_definition( + &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/PutTableDefinition", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "PutTableDefinition", + ), + ); + self.inner.unary(req, path, codec).await + } /// Lists all profiles (schemas) and their tables with declared dependencies. /// This provides a tree-like overview of table relationships. pub async fn get_profile_tree( @@ -1191,6 +1258,16 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Atomically removes selected columns and appends new columns to an empty + /// dynamic table. Column identities come from GetProfileDetails. The call is + /// rejected after any row, including a soft-deleted row, has been stored. + async fn put_table_definition( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Lists all profiles (schemas) and their tables with declared dependencies. /// This provides a tree-like overview of table relationships. async fn get_profile_tree( @@ -1542,6 +1619,55 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/PutTableDefinition" => { + #[allow(non_camel_case_types)] + struct PutTableDefinitionSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for PutTableDefinitionSvc { + type Response = super::PutTableDefinitionResponse; + 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 { + ::put_table_definition( + &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 = PutTableDefinitionSvc(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/GetProfileTree" => { #[allow(non_camel_case_types)] struct GetProfileTreeSvc(pub Arc); diff --git a/server b/server index 0a8cf005..f559f57d 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 0a8cf005d853b760eb295f57c223ea4f27cd42fc +Subproject commit f559f57d40b9b0b8821ff9a924b2392903302813