Cppgres
Build Postgres extensions in C++
Loading...
Searching...
No Matches
role.hpp
Go to the documentation of this file.
1
4#pragma once
5
6#include <optional>
7#include <span>
8#include <string>
9#include <utility>
10
11#include "datum.hpp"
12#include "syscache.hpp"
13#include "type.hpp"
14
15namespace cppgres {
16
17struct role : oid {
18 using oid::oid;
19 role() : oid(::GetCurrentRoleId() != InvalidOid ? ::GetCurrentRoleId() : ::GetUserId()) {}
20 role(std::string role_name) : oid(ffi_guard{::get_role_oid}(role_name.c_str(), false)) {}
21
22 std::string_view name() const { return ffi_guard{::GetUserNameFromId}(*this, false); }
23
24 bool is_member(role &other, bool ignore_superuser = false) {
25 return ffi_guard{ignore_superuser ? ::is_member_of_role_nosuper : ::is_member_of_role}(*this,
26 other);
27 }
28};
29
30template <> struct type_traits<role> {
31 static bool is(const type &t) { return t.oid == OIDOID || t.oid == REGROLEOID; }
32 static constexpr type type_for() { return type{.oid = REGROLEOID}; }
33};
34
35template <> struct datum_conversion<role> : default_datum_conversion<role> {
36 static role from_datum(const datum &d, oid, std::optional<memory_context>) {
37 return static_cast<role>(d.operator const ::Datum &());
38 }
39
40 static datum into_datum(const role &t) { return datum(static_cast<::Datum>(t)); }
41};
42
43enum security_context_flag : int {
44 security_none = 0x0000,
45 security_local_user_id_change = SECURITY_LOCAL_USERID_CHANGE,
46 security_restricted_operation = SECURITY_RESTRICTED_OPERATION,
47 security_noforce_rls = SECURITY_NOFORCE_RLS
48};
49
50constexpr security_context_flag operator|(security_context_flag a, security_context_flag b) {
51 return static_cast<security_context_flag>(static_cast<int>(a) | static_cast<int>(b));
52}
53
54constexpr security_context_flag operator&(security_context_flag a, security_context_flag b) {
55 return static_cast<security_context_flag>(static_cast<int>(a) & static_cast<int>(b));
56}
57
58constexpr security_context_flag &operator|=(security_context_flag &a, security_context_flag b) {
59 return a = a | b;
60}
61
63 security_context(role r, security_context_flag context = security_none) : role_(r) {
64 ::GetUserIdAndSecContext(&user, &ctx);
65 ::SetUserIdAndSecContext(role_, context);
66 }
67 ~security_context() { ::SetUserIdAndSecContext(user, ctx); }
68
69 static bool in_local_user_id_change() { return ::InLocalUserIdChange(); }
70 static bool in_security_restricted_operation() { return ::InSecurityRestrictedOperation(); }
71 static bool in_no_force_rls_operation() { return ::InNoForceRLSOperation(); }
72
73private:
74 role role_;
75 ::Oid user;
76 int ctx;
77};
78
79} // namespace cppgres
A trait to convert from and into a cppgres::datum.
Definition: datum.hpp:114
static T from_datum(const datum &, const oid, std::optional< memory_context > context=std::nullopt)=delete
Convert from a datum.
static datum into_datum(const T &d)=delete
Convert datum into a type.
Definition: datum.hpp:39
Definition: datum.hpp:146
Definition: guard.hpp:19
Definition: name.hpp:7
Definition: datum.hpp:17
Definition: role.hpp:17
Definition: role.hpp:62
Definition: type.hpp:41
Postgres type.
Definition: type.hpp:20