|
27 | 27 | #include "catalog/pg_amproc.h"
|
28 | 28 | #include "catalog/pg_attrdef.h"
|
29 | 29 | #include "catalog/pg_authid.h"
|
| 30 | +#include "catalog/pg_auth_members.h" |
30 | 31 | #include "catalog/pg_cast.h"
|
31 | 32 | #include "catalog/pg_collation.h"
|
32 | 33 | #include "catalog/pg_constraint.h"
|
@@ -386,6 +387,20 @@ static const ObjectPropertyType ObjectProperty[] =
|
386 | 387 | -1,
|
387 | 388 | true
|
388 | 389 | },
|
| 390 | + { |
| 391 | + "role membership", |
| 392 | + AuthMemRelationId, |
| 393 | + AuthMemOidIndexId, |
| 394 | + -1, |
| 395 | + -1, |
| 396 | + Anum_pg_auth_members_oid, |
| 397 | + InvalidAttrNumber, |
| 398 | + InvalidAttrNumber, |
| 399 | + Anum_pg_auth_members_grantor, |
| 400 | + InvalidAttrNumber, |
| 401 | + -1, |
| 402 | + true |
| 403 | + }, |
389 | 404 | {
|
390 | 405 | "rule",
|
391 | 406 | RewriteRelationId,
|
@@ -787,6 +802,10 @@ static const struct object_type_map
|
787 | 802 | {
|
788 | 803 | "role", OBJECT_ROLE
|
789 | 804 | },
|
| 805 | + /* OCLASS_ROLE_MEMBERSHIP */ |
| 806 | + { |
| 807 | + "role membership", -1 /* unmapped */ |
| 808 | + }, |
790 | 809 | /* OCLASS_DATABASE */
|
791 | 810 | {
|
792 | 811 | "database", OBJECT_DATABASE
|
@@ -3644,6 +3663,48 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok)
|
3644 | 3663 | break;
|
3645 | 3664 | }
|
3646 | 3665 |
|
| 3666 | + case OCLASS_ROLE_MEMBERSHIP: |
| 3667 | + { |
| 3668 | + Relation amDesc; |
| 3669 | + ScanKeyData skey[1]; |
| 3670 | + SysScanDesc rcscan; |
| 3671 | + HeapTuple tup; |
| 3672 | + Form_pg_auth_members amForm; |
| 3673 | + |
| 3674 | + amDesc = table_open(AuthMemRelationId, AccessShareLock); |
| 3675 | + |
| 3676 | + ScanKeyInit(&skey[0], |
| 3677 | + Anum_pg_auth_members_oid, |
| 3678 | + BTEqualStrategyNumber, F_OIDEQ, |
| 3679 | + ObjectIdGetDatum(object->objectId)); |
| 3680 | + |
| 3681 | + rcscan = systable_beginscan(amDesc, AuthMemOidIndexId, true, |
| 3682 | + NULL, 1, skey); |
| 3683 | + |
| 3684 | + tup = systable_getnext(rcscan); |
| 3685 | + |
| 3686 | + if (!HeapTupleIsValid(tup)) |
| 3687 | + { |
| 3688 | + if (!missing_ok) |
| 3689 | + elog(ERROR, "could not find tuple for role membership %u", |
| 3690 | + object->objectId); |
| 3691 | + |
| 3692 | + systable_endscan(rcscan); |
| 3693 | + table_close(amDesc, AccessShareLock); |
| 3694 | + break; |
| 3695 | + } |
| 3696 | + |
| 3697 | + amForm = (Form_pg_auth_members) GETSTRUCT(tup); |
| 3698 | + |
| 3699 | + appendStringInfo(&buffer, _("membership of role %s in role %s"), |
| 3700 | + GetUserNameFromId(amForm->member, false), |
| 3701 | + GetUserNameFromId(amForm->roleid, false)); |
| 3702 | + |
| 3703 | + systable_endscan(rcscan); |
| 3704 | + table_close(amDesc, AccessShareLock); |
| 3705 | + break; |
| 3706 | + } |
| 3707 | + |
3647 | 3708 | case OCLASS_DATABASE:
|
3648 | 3709 | {
|
3649 | 3710 | char *datname;
|
@@ -4533,6 +4594,10 @@ getObjectTypeDescription(const ObjectAddress *object, bool missing_ok)
|
4533 | 4594 | appendStringInfoString(&buffer, "role");
|
4534 | 4595 | break;
|
4535 | 4596 |
|
| 4597 | + case OCLASS_ROLE_MEMBERSHIP: |
| 4598 | + appendStringInfoString(&buffer, "role membership"); |
| 4599 | + break; |
| 4600 | + |
4536 | 4601 | case OCLASS_DATABASE:
|
4537 | 4602 | appendStringInfoString(&buffer, "database");
|
4538 | 4603 | break;
|
@@ -5476,6 +5541,49 @@ getObjectIdentityParts(const ObjectAddress *object,
|
5476 | 5541 | break;
|
5477 | 5542 | }
|
5478 | 5543 |
|
| 5544 | + case OCLASS_ROLE_MEMBERSHIP: |
| 5545 | + { |
| 5546 | + Relation authMemDesc; |
| 5547 | + ScanKeyData skey[1]; |
| 5548 | + SysScanDesc amscan; |
| 5549 | + HeapTuple tup; |
| 5550 | + Form_pg_auth_members amForm; |
| 5551 | + |
| 5552 | + authMemDesc = table_open(AuthMemRelationId, |
| 5553 | + AccessShareLock); |
| 5554 | + |
| 5555 | + ScanKeyInit(&skey[0], |
| 5556 | + Anum_pg_auth_members_oid, |
| 5557 | + BTEqualStrategyNumber, F_OIDEQ, |
| 5558 | + ObjectIdGetDatum(object->objectId)); |
| 5559 | + |
| 5560 | + amscan = systable_beginscan(authMemDesc, AuthMemOidIndexId, true, |
| 5561 | + NULL, 1, skey); |
| 5562 | + |
| 5563 | + tup = systable_getnext(amscan); |
| 5564 | + |
| 5565 | + if (!HeapTupleIsValid(tup)) |
| 5566 | + { |
| 5567 | + if (!missing_ok) |
| 5568 | + elog(ERROR, "could not find tuple for pg_auth_members entry %u", |
| 5569 | + object->objectId); |
| 5570 | + |
| 5571 | + systable_endscan(amscan); |
| 5572 | + table_close(authMemDesc, AccessShareLock); |
| 5573 | + break; |
| 5574 | + } |
| 5575 | + |
| 5576 | + amForm = (Form_pg_auth_members) GETSTRUCT(tup); |
| 5577 | + |
| 5578 | + appendStringInfo(&buffer, _("membership of role %s in role %s"), |
| 5579 | + GetUserNameFromId(amForm->member, false), |
| 5580 | + GetUserNameFromId(amForm->roleid, false)); |
| 5581 | + |
| 5582 | + systable_endscan(amscan); |
| 5583 | + table_close(authMemDesc, AccessShareLock); |
| 5584 | + break; |
| 5585 | + } |
| 5586 | + |
5479 | 5587 | case OCLASS_DATABASE:
|
5480 | 5588 | {
|
5481 | 5589 | char *datname;
|
|
0 commit comments