risingwave_frontend/user/
user_manager.rs
1use std::collections::HashMap;
16
17use itertools::Itertools;
18use risingwave_pb::user::{GrantPrivilege, UserInfo};
19
20use crate::user::user_catalog::UserCatalog;
21use crate::user::{UserId, UserInfoVersion};
22
23pub struct UserInfoManager {
25 version: UserInfoVersion,
26 user_by_name: HashMap<String, UserCatalog>,
27 user_name_by_id: HashMap<UserId, String>,
28}
29
30#[expect(clippy::derivable_impls)]
31impl Default for UserInfoManager {
32 fn default() -> Self {
33 UserInfoManager {
34 version: 0,
35 user_by_name: HashMap::new(),
36 user_name_by_id: HashMap::new(),
37 }
38 }
39}
40
41impl UserInfoManager {
42 pub fn get_user_mut(&mut self, id: UserId) -> Option<&mut UserCatalog> {
43 let name = self.user_name_by_id.get(&id)?;
44 self.user_by_name.get_mut(name)
45 }
46
47 pub fn get_all_users(&self) -> Vec<UserCatalog> {
48 self.user_by_name.values().cloned().collect_vec()
49 }
50
51 pub fn get_user_by_name(&self, user_name: &str) -> Option<&UserCatalog> {
52 self.user_by_name.get(user_name)
53 }
54
55 pub fn get_user_name_by_id(&self, id: UserId) -> Option<String> {
56 self.user_name_by_id.get(&id).cloned()
57 }
58
59 pub fn get_user_name_map(&self) -> &HashMap<UserId, String> {
60 &self.user_name_by_id
61 }
62
63 pub fn create_user(&mut self, user_info: UserInfo) {
64 let id = user_info.id;
65 let name = user_info.name.clone();
66 self.user_by_name
67 .try_insert(name.clone(), user_info.into())
68 .unwrap();
69 self.user_name_by_id.try_insert(id, name).unwrap();
70 }
71
72 pub fn drop_user(&mut self, id: UserId) {
73 let name = self.user_name_by_id.remove(&id).unwrap();
74 self.user_by_name.remove(&name).unwrap();
75 }
76
77 pub fn update_user(&mut self, user_info: UserInfo) {
78 let id = user_info.id;
79 let name = user_info.name.clone();
80 if let Some(old_name) = self.get_user_name_by_id(id) {
81 self.user_by_name.remove(&old_name);
82 self.user_by_name.insert(name.clone(), user_info.into());
83 } else {
84 self.user_by_name
85 .insert(name.clone(), user_info.into())
86 .unwrap();
87 }
88 self.user_name_by_id.insert(id, name).unwrap();
89 }
90
91 pub fn authorize(&mut self, _user_name: &str, _password: &str) -> bool {
92 todo!()
93 }
94
95 pub fn verify(&self, _user_name: &str, _privileges: &[GrantPrivilege]) -> bool {
96 todo!()
97 }
98
99 pub fn clear(&mut self) {
100 self.user_by_name.clear();
101 self.user_name_by_id.clear();
102 }
103
104 pub fn version(&self) -> u64 {
106 self.version
107 }
108
109 pub fn set_version(&mut self, version: UserInfoVersion) {
111 self.version = version;
112 }
113}