From ac29d9577b08ef97a165861b4849f2f8a883b348 Mon Sep 17 00:00:00 2001 From: Priec Date: Wed, 2 Sep 2026 18:41:45 +0200 Subject: [PATCH] required columns --- client-gui2 | 2 +- common/proto/table_definition.proto | 22 ++++ common/src/proto/descriptor.bin | Bin 235679 -> 237152 bytes common/src/proto/komp_ac.table_definition.rs | 115 +++++++++++++++++++ server | 2 +- 5 files changed, 139 insertions(+), 2 deletions(-) diff --git a/client-gui2 b/client-gui2 index 6af9d5a1..a03fce26 160000 --- a/client-gui2 +++ b/client-gui2 @@ -1 +1 @@ -Subproject commit 6af9d5a1277aad3f0888c4ceb6861540a2cea8e1 +Subproject commit a03fce267991cd9f851148d491aaef09fc42146e diff --git a/common/proto/table_definition.proto b/common/proto/table_definition.proto index 1c686310..cf331750 100644 --- a/common/proto/table_definition.proto +++ b/common/proto/table_definition.proto @@ -70,6 +70,10 @@ service TableDefinition { // indexes are created or dropped even when rows have already been stored. rpc SetTableIndexes(SetTableIndexesRequest) returns (SetTableIndexesResponse); + // Changes whether one existing column is required. Enabling the requirement + // is rejected while an active row has no value for the column. + rpc SetColumnRequired(SetColumnRequiredRequest) returns (SetColumnRequiredResponse); + // Replaces the optional user-visible aliases for a fixed-option column. // Stored values remain stable machine values and scripts never depend on labels. rpc SetColumnOptionAliases(SetColumnOptionAliasesRequest) returns (SetColumnOptionAliasesResponse); @@ -632,6 +636,24 @@ message SetTableIndexesResponse { int64 row_version = 3; } +message SetColumnRequiredRequest { + string profile_name = 1; + string table_name = 2; + // Stable column identity returned in GetProfileDetails.column_behaviors. + int64 column_id = 3; + bool required = 4; + // Row version returned by GetProfileDetails when the column was read. + int64 expected_row_version = 5; +} + +message SetColumnRequiredResponse { + bool success = 1; + int64 column_id = 2; + bool required = 3; + // New row version after the update, or the current version for a no-op. + int64 row_version = 4; +} + // One public option name. `value` identifies the option by its current public // alias and `alias` is its desired public alias; stored values remain internal. message OptionValueAlias { diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index d947dc1254ee6aea4b109b948def73a0b12aba57..0250087823445c0d6c8a871f4487c6b701e41297 100644 GIT binary patch delta 15935 zcmaKzd7M?nnfGtisdM`FZ5rqUbT>`YTxeMu>~;Yi6*YNXqH&9Y!CgbN6LAbo1e4di znOsFg7Ezf%4uW9R2tgniMcW04qKRbU5*KuE3yMY%9R*RrHZtF*mcGmYT6KKr9Os-PG2>Nw=D>ehO8aHVO}MhXIDTSr{H0SS{Dg{=ep z6DJjaGXBb|+lxP#bd{BGZL}2%-3qbvOwqNZE|7-m4-OPTqt7nf;|9?)jn2rf_`ACM zpq?0=ku>^hJuy0?|51T3I^)Dk3u~QGO&X2Oj(%S~+E#6bjnpQgdGJ0>$5v$zgL|zO_(Q zFeaySX>`7B5EFq|C?AN5=U4U#gxvY{eXX2I%|*HIsX|Hg6xA-uw^=G!XfzZ3SX@EDQ=n~z_7b(mx(McdFtLPpGvrB5y!ikJZ$7y_NF3Yalu1@T6 zX?{@Q5zUyi^x=w*P21IIHR1|C8Xh8ZMWt&3LgtFvy23W1fCXifve7%#2S-lQHuCZ; z;bE2QE+kbNn{6*3%qI;QTKLqNyOp7s%^TW#cG1Dbxc&JtIEcJk>G%0VX12~NzJV6jGgMY zt+UED2{yA-Wu3Q4u$iSA8Vh5rS1VF8Cu`oN&OT<2qMxpr3R<6|=%_~&<|vZZBMNiW z(3Zk)U90)j%+1#9QunsaRb+&#l*eYSs;CZ#&0N*9roeJ2!K_Tp{OqPr)!bv}mz%Am z|MOMV0B=)?#C%meBp?#=)u_V@*C*svlqO46?!k@=b}JqAT&nVog}20W5t(IHcKqlI z^*z01;cM8u}GhMb?PYH65LM)M|Cmnz9iIW!9+5?zRV!WE4nZzozJc zNs~uaZhf}-OSQT5sLHnxNW<7@|1rgM6+b|@5_ACsQG861GrknX#}rB9OetKebU$Cn z6cY@l(wViYvNn`rx>og-Wx<#dE=|okrHA`cZ7jNgO5zCmfPzS^Q>32j1*r~_d)*jT zoF~;@%gO?r)7CTm(87fk?ifD(gcj zk}s%!vVj?sh<9I9`aoaEx+v(@2?}j#|DmB2(-+n75t!<@luMIMD))v9cr2}KQt=>> zjb-aGuP8lI4238J+X51oSJWYg`nnXpsIdxF!&zptxS zZ4(Dm$@SNjw#%F#m0wpwhZR1S*!vn>;|R(yY#lo%PwO~g*fOPrCm@UBtaK4 z5XE;C8=7PR$Uxpv>}bxE!mT0N6?Q^^!BpJ0HAI_IOt*$;mny_T?<(Eb3(NEdgROY; zT~*mTlw$j?s;l?SLhmU($`?w?gKo{Ou+Du?6%Pufw(_AP3%{0>uMqEUS33J~q<>xF zkIz(^nJ7EN>G?GIMCCqH zs^JY){0^tgf4lse$rCOee`WEqYqDF7-cl4r|jUcw2VQB<0?Uab0%D@U~vQOpaX45M4DLwb8d{d#7z7=Fx*Xiu73fZ6aIT~?6L&eneWE!asm zTXWKM3KH7cnxp1Vtpbj}CHt&WUvum&Wd-&ObBp#zBOFB^Zqfc|1fp<@9(7n@wrnp| zX|h1)mUXNw=z=OO(D{KjELGyg+q6HKKy(Up`353+TW}_bNG;Z>+m}I< z7VBd0Ds`7=eYhV$j1m}>;v?wQk`TBmyT>dEfdi3RB7wU}@~=uV?JlhcHvFPECTqGf zs>^OYNq5g~t=8XfS7KOiD^Y2E^^cOo3=muAK8`i9cda*QglS*rb8 zK$Wh*W~t`mVnLyAf_vI-Ys(=rYl3j zbrV{px~<$XnP}T|rP~p!?L^zAd-o}vX-x>+ zj_i#FJ*I6(xfMA-?9dgVpE99#=(Ja1mdu4}nNS~R7xvRPl|I(my#n(Pn~!z9JLZGf ze5_k!3zb7(vPL3e7<{VTJC+cIpgV|yIPOzz-=aA2i{);=zzCh; z*sdYMRNn2^5D@yTTv=?vP}h~R-h7Mv=$KH%KrM~ z*3RG@9wO8krYFciJ7s!`Kf6mSUuVDQk3YW-A>g4r)qYljn0zg>@&wxMktS24+@smo z{q^zb)QGp6?;zA8;tgV2q;JZ`Ht92JrbUI`g_c4h&!tz>v-_L$h*8rcQz-N(RJg}9 zGCiv5Q+_}*(<7$KD&;MyF*~anpjVHYy}zY&Z+28w+hr*ooE?!?BWzcgvbRL~x7qFi zdU(w(5!Ftyf_A>n%?>K+(?-sXOr^JX6L)Sz=w07nfmyP_UFa$dP7 zZW7Ons(N%8N>AoRq~6cHAwgY`H4fCjIAK9#$_+?PE{Lk@x(p={3!?f#Wl%TN}xMN#jewb)QH6IVp~_u1A1^st&0QK5ztqGXkwhO4s1!TR)(tIC3I zKCUW9ga-(&lD-`84QcVd?DoO>#N+NO`;o~=7w?OzQ$H#mNX4jE-|_>L?u$60*({T^ zUXwKs(XGdl#RSn<6ZLYZMi7NH5yxD6dC)^*{zx`wi2l!$ABp^y z$U}J=`RhFpn@1uxcG;wRrpekU_lL-B(%fE~wGrpzvG}T|bZC8c$58#<()!RL9ul+l zkw3+Nn5>V|Cfh#{@%7O_+2*yWNs}j{+>>6MTW<42#L^<0NR5bZh_t&;fk+|HZKoik z-Vjx}yTKaWEUj#a29L0L(`WSlQ)xUVwei3m6evb=W8{zdAd(v;HBUpbSDHK%<(|(jZqcWfo{9WXx0gsh zi=^!ZgeO2J2qO4w5Cjo?Rs?0Zy(BWvMgC+6FXH6hV@$H4~h_ipgSmn2)-8igCdCFYmq-F_L0_JkKEx2AsH6v zh6UQvO815UV)}a2tG8{n)JKN(Mu;?oE$9x4AhvHrd3W6kV*5sjbRVHNBY)irVG0IQ zSxeuH@-EVp+RFC2RZi{6mMHgbq)Kv08cWqJQEa;u+Y9KoBkit{+{H6!FIc3I{=OXz zve!o-mhY4cWvHM{TPdXOJCVCb0imtsx?;MuRIcobZDnn0)8y|_?jt{+YpMG8C@&wK zjH#7Cy&pUVF>KIz8>H_0VQzp7`~BdtT4{4z!Njic-Ny50jtR(Gjk80d>rZP&~tzSxZK;Q>qR@7>F4+PyI62$g{ zD0MGOpsj4zRPhDP?ugv|ppe7R3waIP5hewtDD4OfD2P&Nhg(5Kipn2`{D&L{x5_^G zVdTFgP>St`F8{TuOOubI+}A!>b=3SgEWULTtWP3;42Mt!U5TldZOn1sT%9#?KUBRVw94IY1mx7q?vM!Z3EEwBeVWp`P z`ZVMhM6+OMR>JXV$S+E5Wxw{;NjP>#{;Ckd6bz#k|L>OdM%G?RF)i(uE!B0I%AZC4 zilWZ?9}LZk|38cTy$_|>eir#FiaHtI=OGs%dI1KfCJ28Xa*$?Tyml)=HH2Mon_)kQ^#-u~$|qpacdbF7Ji? z5rfJ|eOZ<&AoXQgs*1Od$bX@#(^W`;L8=O+&azS!N}ZAaM>$^An1Uf*)tLUHoHf;$ z{v)cDi*#-3)8txH%3W{VfvldY*BXBrT`$x2I^)kD5VD|?1*vQqzZ?#JqNv&`bDrg^xX6BHvg)wH(p)}u||G?{L4OR_#A^|wpY z4c8?ySw=e_Kq!GhNtXXv zhIdO@B`8H{mZ>edBN}Xt{pDR>>BVg0a}shGq-6b>ZG3i9iqvf5znX$5%{K0RpN6P= zlW||lgy;nrT8(9)zR5J%FK1GW?M=pgIRmLY$M~fSLJABKkp*Xt@kFO)% z&CTUt%6bF3Qx}Dp-fZL}e7$vsEI2nyG{0*Tfd%K*?5e}`Ic3;Uin2vgV4(Cr$_0t4_#SqPttg$sc<_mb)=HvX3TYwv|Vj(;%7qK=$vW^_^`GlpB-{^8r)gF8rv2%>#xDKlvRM zHe_r^cG}T;*)bg;s_$qVfYY#Jn`w5CXboi6WPJX=;KO{@uANy zF#RMxYZ-}6K8UV?ZX6(jYr{A|1lP(qWNqpvaaw2mX&%B9bS?*NsXy(2n65Mav{ULQ zYtwq;&m9o9V6YYC^~Qgqq!ior#veQS3H`xn_pKGe6bz;kwm%rIM`SWlYAbUg;d)Hi z9yhx0QNC1`8#vg?a`U+HhlPH2xp~}hSh!x{zs5BAqv2Kh-edLD9)C2vTb_y&8pVH4 zXQRKNPoMB~@EZ?NdOG+Gq!&*IzctF}HX8rl2GI%7bpo`d{@e;;x{=!g`xUZ(nml82 zFJ?Qxp~seJl2w@5aQ|ZfdVIiax z)91oMcu{|e;qzfBhj1?FmU58PeBM;K^%z9zdDG;600ScRye#GCb{{`9FGaiBgx7)J5q9CBiF4)vNu0NXOCS;lbS?prdOPenAX0CKGXRLx+v1XOcw~Uk z*6j2X^tq+2!4*8jWNXL}P%0UpAw}NPO>T$JkRmnz9_CR|-0^Z|S?#ynrzcyU;O01h@aQi~6A$kP5 zfPvKA7h(;fx-Z1K*{*um#{QJtY)1nITN%x@u|FkKitV*ADJT=OSw=H8=74l^aqJX+ zir(J!EA`9x75aoJ*YKnCDOX=LksqN?m{>fieae|vP5J>pMn9o_%J>OaPHwZmH!n@R zHTEZzW})k2e^h`l1zlu8Os|jq zc^I^nIV#8nf3sv~_ZwpNq!a&XPpZ#WoS|z=)IpFsp)YcNxFPmC6Qu~=5c_rKfHavA z=Wg~fI)IupVt;pjfW&BK><rX)sm)Bj($?3~I1A5=BD)~=*9$|$k++3e1YrsWQ|Zxd@wt8)QH`qLQ5ogKygI5t!~`kUZU2wTvN2E_I^!J{C} z{wB{yqi5FQ8kOKwNrHa4Cq=J>I1y16yP7)1l(ir6DIEdI5%Bh)c|$3t zOI=E6Gb~M($GQ7_k`ANh^5D{8;?jFVl0vA0`9eunPMFH~hAah?9VRYa8C(is3cA67D*Yks*B}_%mBFXOgjU7=)&{~BbXfq>?5fzm z5`(rfuf(!K4-+4*{{Jq}R6&nAp)cat)gf6aMQ?RT)|NE6Kh8bk9os_9`{TU*-Lh#B z$375p6+#tsy#%TIK*&`P)d#v3=oWG8nvkpzwxDw?XiI&vg4nJJx!NL*eK0r{!W49a z0Wp0r_!Y$T!Qj^xp`#xPjs>v=Lzl&|4+Y0kO6`YY94oIGE#laRv(E46)=~V8;lt%d z#e)xr)T9){hb0ld$%;NaP1eS_C$kIB)T8T%Q*mv~Tk;7=4i^WmCo>xkcORVpc%~ja zil>P4*f|5lW_?Id5b^brpwr|AWVnoXL)LVbz7|Vy~jc0E3s}D*H=iAzIuYF|_zOenW`T&Dp-O zdQWk4SzW$#ZWi_5MEK~yG}+3k(oy$aeTS+&5R0ub$78u$J5YXX^j^#_e4ZJnPp=0l zeJ|!GNBpxA7!oQ z>K`91#p2J8_7@P3eiT=^U)|Um2z(^*1(_IP40`$fQAX#qKkNI+kJsP`#7F=1q5yaM;$ zGm~t<#ro7^r2q11ZRY+8as@s!sch=%gIt2oOa?X={t^bn2ezA&Y}v*7sbfV#KB?WD z?3ZP7BYtzjr|>Wgxf8!RVd5R_Iw5&HH{nRM{1QE~KN>cZ=O*3y6&9*OUP6d2xjZk) z_Fkgr9`7H}(7Yt+#;>6&Lmir$msHp6|A@xsB_zZ5x|FE2Aba+E`dlw0X}#co3rS)x zNcdq|SzDHi1qoNvle>h-?c1}<$LoKUWT1qI{JKHcc@bk;=k^}iT|0LeL&7EOR5{YJSZOwmL>h$$`8<7mK-wD{sQtq@zsi~ z_A-6k@%)Y2io~CWK(tmQ{+kep(u$QTXdP8F^aztT3r?r gudPn}7a>ZeYLdGD+5#f9`o?qGb;mjF(a9tK2lskZVgLXD delta 14802 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 O#z%EWV%B diff --git a/common/src/proto/komp_ac.table_definition.rs b/common/src/proto/komp_ac.table_definition.rs index a037f145..a573ed90 100644 --- a/common/src/proto/komp_ac.table_definition.rs +++ b/common/src/proto/komp_ac.table_definition.rs @@ -683,6 +683,35 @@ pub struct SetTableIndexesResponse { #[prost(int64, tag = "3")] pub row_version: i64, } +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetColumnRequiredRequest { + #[prost(string, tag = "1")] + pub profile_name: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub table_name: ::prost::alloc::string::String, + /// Stable column identity returned in GetProfileDetails.column_behaviors. + #[prost(int64, tag = "3")] + pub column_id: i64, + #[prost(bool, tag = "4")] + pub required: bool, + /// Row version returned by GetProfileDetails when the column was read. + #[prost(int64, tag = "5")] + pub expected_row_version: i64, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct SetColumnRequiredResponse { + #[prost(bool, tag = "1")] + pub success: bool, + #[prost(int64, tag = "2")] + pub column_id: i64, + #[prost(bool, tag = "3")] + pub required: bool, + /// New row version after the update, or the current version for a no-op. + #[prost(int64, tag = "4")] + pub row_version: i64, +} /// One public option name. `value` identifies the option by its current public /// alias and `alias` is its desired public alias; stored values remain internal. #[derive(serde::Serialize, serde::Deserialize)] @@ -1611,6 +1640,37 @@ pub mod table_definition_client { ); self.inner.unary(req, path, codec).await } + /// Changes whether one existing column is required. Enabling the requirement + /// is rejected while an active row has no value for the column. + pub async fn set_column_required( + &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/SetColumnRequired", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new( + "komp_ac.table_definition.TableDefinition", + "SetColumnRequired", + ), + ); + self.inner.unary(req, path, codec).await + } /// Replaces the optional user-visible aliases for a fixed-option column. /// Stored values remain stable machine values and scripts never depend on labels. pub async fn set_column_option_aliases( @@ -1855,6 +1915,15 @@ pub mod table_definition_server { tonic::Response, tonic::Status, >; + /// Changes whether one existing column is required. Enabling the requirement + /// is rejected while an active row has no value for the column. + async fn set_column_required( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Replaces the optional user-visible aliases for a fixed-option column. /// Stored values remain stable machine values and scripts never depend on labels. async fn set_column_option_aliases( @@ -2687,6 +2756,52 @@ pub mod table_definition_server { }; Box::pin(fut) } + "/komp_ac.table_definition.TableDefinition/SetColumnRequired" => { + #[allow(non_camel_case_types)] + struct SetColumnRequiredSvc(pub Arc); + impl< + T: TableDefinition, + > tonic::server::UnaryService + for SetColumnRequiredSvc { + type Response = super::SetColumnRequiredResponse; + 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 { + ::set_column_required(&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 = SetColumnRequiredSvc(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/SetColumnOptionAliases" => { #[allow(non_camel_case_types)] struct SetColumnOptionAliasesSvc(pub Arc); diff --git a/server b/server index 6dbaccc8..f43dc625 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 6dbaccc8685a2d0db3b4d8687b7673aadf0ba05a +Subproject commit f43dc62578245aabad13de2b5336f178d1b5f750