|
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 | +caseOCLASS_ROLE_MEMBERSHIP: |
| 3667 | +{ |
| 3668 | +RelationamDesc; |
| 3669 | +ScanKeyDataskey[1]; |
| 3670 | +SysScanDescrcscan; |
| 3671 | +HeapTupletup; |
| 3672 | +Form_pg_auth_membersamForm; |
| 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 | caseOCLASS_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 | +caseOCLASS_ROLE_MEMBERSHIP: |
| 4598 | +appendStringInfoString(&buffer,"role membership"); |
| 4599 | +break; |
| 4600 | + |
4536 | 4601 | caseOCLASS_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 | +caseOCLASS_ROLE_MEMBERSHIP: |
| 5545 | +{ |
| 5546 | +RelationauthMemDesc; |
| 5547 | +ScanKeyDataskey[1]; |
| 5548 | +SysScanDescamscan; |
| 5549 | +HeapTupletup; |
| 5550 | +Form_pg_auth_membersamForm; |
| 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 | caseOCLASS_DATABASE:
|
5480 | 5588 | {
|
5481 | 5589 | char*datname;
|
|