rupg_catalog/
default_acl.rs1use std::sync::Arc;
4
5use super::{Catalog, DepKind, ObjRef, PG_NAMESPACE};
6
7pub const PG_DEFAULT_ACL: u32 = 826;
9
10#[derive(Clone, Debug, PartialEq, Eq)]
12pub struct DefaultAcl {
13 pub oid: u32,
15 pub role: u32,
17 pub namespace: u32,
19 pub objtype: u8,
21 pub acl: Vec<String>,
23}
24
25impl Catalog {
26 pub fn default_acls(&self) -> impl Iterator<Item = &DefaultAcl> {
28 self.default_acls.values()
29 }
30
31 pub fn default_acl(&self, oid: u32) -> Option<&DefaultAcl> {
33 self.default_acls.get(&oid)
34 }
35
36 pub fn find_default_acl(&self, role: u32, namespace: u32, objtype: u8) -> Option<&DefaultAcl> {
38 self.default_acls
39 .values()
40 .find(|d| d.role == role && d.namespace == namespace && d.objtype == objtype)
41 }
42
43 pub fn set_default_acl(
45 &mut self,
46 role: u32,
47 namespace: u32,
48 objtype: u8,
49 acl: Option<Vec<String>>,
50 ) {
51 let found = self.find_default_acl(role, namespace, objtype).map(|d| d.oid);
52 match (found, acl) {
53 (Some(oid), Some(acl)) => {
54 if let Some(entry) = Arc::make_mut(&mut self.default_acls).get_mut(&oid) {
55 entry.acl = acl;
56 }
57 }
58 (Some(oid), None) => {
59 Arc::make_mut(&mut self.default_acls).remove(&oid);
60 let me = ObjRef::new(PG_DEFAULT_ACL, oid);
61 self.depends.retain(|d| d.object != me);
62 }
63 (None, Some(acl)) => {
64 let oid = self.new_oid();
65 let entry = DefaultAcl { oid, role, namespace, objtype, acl };
66 Arc::make_mut(&mut self.default_acls).insert(oid, entry);
67 if namespace != 0 {
68 let me = ObjRef::new(PG_DEFAULT_ACL, oid);
69 self.depend(me, ObjRef::new(PG_NAMESPACE, namespace), DepKind::Auto);
70 }
71 }
72 (None, None) => {}
73 }
74 }
75
76 pub(super) fn remove_default_acl(&mut self, oid: u32) {
78 if self.default_acls.contains_key(&oid) {
79 Arc::make_mut(&mut self.default_acls).remove(&oid);
80 }
81 }
82}