@@ -17,7 +17,9 @@ use databend_common_meta_app::data_mask::CreateDatamaskReply;
1717use databend_common_meta_app:: data_mask:: CreateDatamaskReq ;
1818use databend_common_meta_app:: data_mask:: DataMaskId ;
1919use databend_common_meta_app:: data_mask:: DataMaskIdIdent ;
20+ use databend_common_meta_app:: data_mask:: DataMaskIdToNameIdent ;
2021use databend_common_meta_app:: data_mask:: DataMaskNameIdent ;
22+ use databend_common_meta_app:: data_mask:: DataMaskNameIdentRaw ;
2123use databend_common_meta_app:: data_mask:: DatamaskMeta ;
2224use databend_common_meta_app:: data_mask:: MaskPolicyIdTableId ;
2325use databend_common_meta_app:: data_mask:: MaskPolicyTableIdIdent ;
@@ -41,11 +43,14 @@ use crate::errors::MaskingPolicyError;
4143use crate :: fetch_id;
4244use crate :: kv_pb_api:: KVPbApi ;
4345use crate :: meta_txn_error:: MetaTxnError ;
46+ use crate :: serialize_struct;
4447use crate :: txn_backoff:: txn_backoff;
4548use crate :: txn_condition_util:: txn_cond_eq_keys_with_prefix;
4649use crate :: txn_condition_util:: txn_cond_eq_seq;
4750use crate :: txn_core_util:: send_txn;
4851use crate :: txn_core_util:: txn_delete_exact;
52+ use crate :: txn_op_builder_util:: txn_op_del;
53+ use crate :: txn_op_builder_util:: txn_op_put;
4954use crate :: txn_op_builder_util:: txn_op_put_pb;
5055
5156/// DatamaskApi is implemented upon kvapi::KVApi.
@@ -77,6 +82,8 @@ impl<KV: kvapi::KVApi<Error = MetaError>> DatamaskApi for KV {
7782
7883 let id = DataMaskId :: new ( masking_policy_id) ;
7984 let id_ident = DataMaskIdIdent :: new_generic ( name_ident. tenant ( ) , id) ;
85+ let id_to_name_ident = DataMaskIdToNameIdent :: new_generic ( name_ident. tenant ( ) , id) ;
86+ let name_raw = DataMaskNameIdentRaw :: from ( name_ident. clone ( ) ) ;
8087 let id_list_key = MaskPolicyTableIdListIdent :: new_from ( name_ident. clone ( ) ) ;
8188
8289 debug ! (
@@ -91,9 +98,12 @@ impl<KV: kvapi::KVApi<Error = MetaError>> DatamaskApi for KV {
9198 txn. condition . push ( txn_cond_eq_seq ( name_ident, 0 ) ) ;
9299 txn. condition
93100 . push ( txn_cond_eq_seq ( & row_access_name_ident, 0 ) ) ;
101+ let name_bytes = serialize_struct ( & name_raw) ?;
102+
94103 txn. if_then . extend ( vec ! [
95- txn_op_put_pb( name_ident, & id, None ) ?, // name -> db_id
104+ txn_op_put_pb( name_ident, & id, None ) ?, // name -> masking_policy_id
96105 txn_op_put_pb( & id_ident, & meta, None ) ?, // id -> meta
106+ txn_op_put( & id_to_name_ident, name_bytes) , // id -> name
97107 // TODO: Tentative retention for compatibility MaskPolicyTableIdListIdent related logic. It can be directly deleted later
98108 txn_op_put_pb( & id_list_key, & id_list, None ) ?, // data mask name -> id_list
99109 ] ) ;
@@ -159,7 +169,9 @@ impl<KV: kvapi::KVApi<Error = MetaError>> DatamaskApi for KV {
159169 }
160170
161171 // No references - drop the policy
162- let id_ident = seq_id. data . into_t_ident ( tenant) ;
172+ let id_ident = seq_id. data . into_t_ident ( tenant. clone ( ) ) ;
173+ let id_to_name_ident =
174+ DataMaskIdToNameIdent :: new_generic ( tenant, DataMaskId :: new ( policy_id) ) ;
163175 let mut txn = TxnRequest :: default ( ) ;
164176
165177 // Ensure no new references were created
@@ -168,6 +180,7 @@ impl<KV: kvapi::KVApi<Error = MetaError>> DatamaskApi for KV {
168180
169181 txn_delete_exact ( & mut txn, name_ident, seq_id. seq ) ;
170182 txn_delete_exact ( & mut txn, & id_ident, seq_meta. seq ) ;
183+ txn. if_then . push ( txn_op_del ( & id_to_name_ident) ) ;
171184
172185 // TODO: Tentative retention for compatibility. Can be deleted later.
173186 clear_table_column_mask_policy ( self , name_ident, & mut txn) . await ?;
@@ -191,6 +204,27 @@ impl<KV: kvapi::KVApi<Error = MetaError>> DatamaskApi for KV {
191204 Ok ( res. map ( |( _, seq_meta) | seq_meta) )
192205 }
193206
207+ async fn get_data_mask_id (
208+ & self ,
209+ name_ident : & DataMaskNameIdent ,
210+ ) -> Result < Option < u64 > , MetaError > {
211+ let res = self . get_pb ( name_ident) . await ?;
212+ Ok ( res. map ( |seq_id| * seq_id. data ) )
213+ }
214+
215+ async fn get_data_mask_name_by_id (
216+ & self ,
217+ tenant : & Tenant ,
218+ policy_id : u64 ,
219+ ) -> Result < Option < String > , MetaError > {
220+ let ident = DataMaskIdToNameIdent :: new_generic ( tenant. clone ( ) , DataMaskId :: new ( policy_id) ) ;
221+ let seq_meta = self . get_pb ( & ident) . await ?;
222+
223+ debug ! ( ident : % =( & ident) ; "get_data_mask_name_by_id" ) ;
224+
225+ Ok ( seq_meta. map ( |s| s. data . data_mask_name ( ) . to_string ( ) ) )
226+ }
227+
194228 async fn get_data_mask_by_id (
195229 & self ,
196230 tenant : & Tenant ,
0 commit comments