8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.127 2006/04/30 21:15:33 tgl Exp $
11
+ * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.128 2006/05/03 22:45:26 tgl Exp $
12
12
*
13
13
* NOTES
14
14
* See acl.h.
34
34
#include "catalog/pg_proc.h"
35
35
#include "catalog/pg_tablespace.h"
36
36
#include "catalog/pg_type.h"
37
+ #include "commands/dbcommands.h"
37
38
#include "miscadmin.h"
38
39
#include "parser/parse_func.h"
39
40
#include "utils/acl.h"
@@ -412,8 +413,8 @@ objectNamesToOids(GrantObjectType objtype, List *objnames)
412
413
case ACL_OBJECT_SEQUENCE :
413
414
foreach (cell , objnames )
414
415
{
415
- Oid relOid ;
416
416
RangeVar * relvar = (RangeVar * ) lfirst (cell );
417
+ Oid relOid ;
417
418
418
419
relOid = RangeVarGetRelid (relvar , false);
419
420
objects = lappend_oid (objects , relOid );
@@ -423,32 +424,15 @@ objectNamesToOids(GrantObjectType objtype, List *objnames)
423
424
foreach (cell , objnames )
424
425
{
425
426
char * dbname = strVal (lfirst (cell ));
426
- ScanKeyData entry [1 ];
427
- HeapScanDesc scan ;
428
- HeapTuple tuple ;
429
- Relation relation ;
430
-
431
- relation = heap_open (DatabaseRelationId , AccessShareLock );
427
+ Oid dbid ;
432
428
433
- /*
434
- * There's no syscache for pg_database, so we must look the
435
- * hard way.
436
- */
437
- ScanKeyInit (& entry [0 ],
438
- Anum_pg_database_datname ,
439
- BTEqualStrategyNumber , F_NAMEEQ ,
440
- CStringGetDatum (dbname ));
441
- scan = heap_beginscan (relation , SnapshotNow , 1 , entry );
442
- tuple = heap_getnext (scan , ForwardScanDirection );
443
- if (!HeapTupleIsValid (tuple ))
429
+ dbid = get_database_oid (dbname );
430
+ if (!OidIsValid (dbid ))
444
431
ereport (ERROR ,
445
432
(errcode (ERRCODE_UNDEFINED_DATABASE ),
446
- errmsg ("database \"%s\" does not exist" , dbname )));
447
- objects = lappend_oid (objects , HeapTupleGetOid (tuple ));
448
-
449
- heap_close (relation , AccessShareLock );
450
-
451
- heap_endscan (scan );
433
+ errmsg ("database \"%s\" does not exist" ,
434
+ dbname )));
435
+ objects = lappend_oid (objects , dbid );
452
436
}
453
437
break ;
454
438
case ACL_OBJECT_FUNCTION :
@@ -474,7 +458,8 @@ objectNamesToOids(GrantObjectType objtype, List *objnames)
474
458
if (!HeapTupleIsValid (tuple ))
475
459
ereport (ERROR ,
476
460
(errcode (ERRCODE_UNDEFINED_OBJECT ),
477
- errmsg ("language \"%s\" does not exist" , langname )));
461
+ errmsg ("language \"%s\" does not exist" ,
462
+ langname )));
478
463
479
464
objects = lappend_oid (objects , HeapTupleGetOid (tuple ));
480
465
@@ -493,7 +478,8 @@ objectNamesToOids(GrantObjectType objtype, List *objnames)
493
478
if (!HeapTupleIsValid (tuple ))
494
479
ereport (ERROR ,
495
480
(errcode (ERRCODE_UNDEFINED_SCHEMA ),
496
- errmsg ("schema \"%s\" does not exist" , nspname )));
481
+ errmsg ("schema \"%s\" does not exist" ,
482
+ nspname )));
497
483
498
484
objects = lappend_oid (objects , HeapTupleGetOid (tuple ));
499
485
@@ -764,22 +750,13 @@ ExecGrant_Database(InternalGrant *istmt)
764
750
int nnewmembers ;
765
751
Oid * oldmembers ;
766
752
Oid * newmembers ;
767
- ScanKeyData entry [1 ];
768
- SysScanDesc scan ;
769
753
HeapTuple tuple ;
770
754
771
- /* There's no syscache for pg_database, so must look the hard way */
772
- ScanKeyInit (& entry [0 ],
773
- ObjectIdAttributeNumber ,
774
- BTEqualStrategyNumber , F_OIDEQ ,
775
- ObjectIdGetDatum (datId ));
776
- scan = systable_beginscan (relation , DatabaseOidIndexId , true,
777
- SnapshotNow , 1 , entry );
778
-
779
- tuple = systable_getnext (scan );
780
-
755
+ tuple = SearchSysCache (DATABASEOID ,
756
+ ObjectIdGetDatum (datId ),
757
+ 0 , 0 , 0 );
781
758
if (!HeapTupleIsValid (tuple ))
782
- elog (ERROR , "could not find tuple for database %u" , datId );
759
+ elog (ERROR , "cache lookup failed for database %u" , datId );
783
760
784
761
pg_database_tuple = (Form_pg_database ) GETSTRUCT (tuple );
785
762
@@ -847,7 +824,7 @@ ExecGrant_Database(InternalGrant *istmt)
847
824
noldmembers , oldmembers ,
848
825
nnewmembers , newmembers );
849
826
850
- systable_endscan ( scan );
827
+ ReleaseSysCache ( tuple );
851
828
852
829
pfree (new_acl );
853
830
@@ -1657,61 +1634,31 @@ pg_database_aclmask(Oid db_oid, Oid roleid,
1657
1634
AclMode mask , AclMaskHow how )
1658
1635
{
1659
1636
AclMode result ;
1660
- Relation pg_database ;
1661
- ScanKeyData entry [1 ];
1662
- SysScanDesc scan ;
1663
1637
HeapTuple tuple ;
1638
+ Datum aclDatum ;
1639
+ bool isNull ;
1640
+ Acl * acl ;
1641
+ Oid ownerId ;
1664
1642
1665
1643
/* Superusers bypass all permission checking. */
1666
1644
if (superuser_arg (roleid ))
1667
1645
return mask ;
1668
1646
1669
1647
/*
1670
1648
* Get the database's ACL from pg_database
1671
- *
1672
- * There's no syscache for pg_database, so must look the hard way
1673
1649
*/
1674
- pg_database = heap_open (DatabaseRelationId , AccessShareLock );
1675
- ScanKeyInit (& entry [0 ],
1676
- ObjectIdAttributeNumber ,
1677
- BTEqualStrategyNumber , F_OIDEQ ,
1678
- ObjectIdGetDatum (db_oid ));
1679
- scan = systable_beginscan (pg_database , DatabaseOidIndexId , true,
1680
- SnapshotNow , 1 , entry );
1681
- tuple = systable_getnext (scan );
1650
+ tuple = SearchSysCache (DATABASEOID ,
1651
+ ObjectIdGetDatum (db_oid ),
1652
+ 0 , 0 , 0 );
1682
1653
if (!HeapTupleIsValid (tuple ))
1683
1654
ereport (ERROR ,
1684
1655
(errcode (ERRCODE_UNDEFINED_DATABASE ),
1685
1656
errmsg ("database with OID %u does not exist" , db_oid )));
1686
1657
1687
- result = pg_database_tuple_aclmask (tuple , RelationGetDescr (pg_database ),
1688
- roleid , mask , how );
1689
-
1690
- systable_endscan (scan );
1691
- heap_close (pg_database , AccessShareLock );
1692
-
1693
- return result ;
1694
- }
1695
-
1696
- /*
1697
- * This is split out so that ReverifyMyDatabase can perform an ACL check
1698
- * without a whole extra search of pg_database
1699
- */
1700
- AclMode
1701
- pg_database_tuple_aclmask (HeapTuple db_tuple , TupleDesc tupdesc ,
1702
- Oid roleid , AclMode mask , AclMaskHow how )
1703
- {
1704
- AclMode result ;
1705
- Datum aclDatum ;
1706
- bool isNull ;
1707
- Acl * acl ;
1708
- Oid ownerId ;
1709
-
1710
- ownerId = ((Form_pg_database ) GETSTRUCT (db_tuple ))-> datdba ;
1711
-
1712
- aclDatum = heap_getattr (db_tuple , Anum_pg_database_datacl ,
1713
- tupdesc , & isNull );
1658
+ ownerId = ((Form_pg_database ) GETSTRUCT (tuple ))-> datdba ;
1714
1659
1660
+ aclDatum = SysCacheGetAttr (DATABASEOID , tuple , Anum_pg_database_datacl ,
1661
+ & isNull );
1715
1662
if (isNull )
1716
1663
{
1717
1664
/* No ACL, so build default ACL */
@@ -1730,6 +1677,8 @@ pg_database_tuple_aclmask(HeapTuple db_tuple, TupleDesc tupdesc,
1730
1677
if (acl && (Pointer ) acl != DatumGetPointer (aclDatum ))
1731
1678
pfree (acl );
1732
1679
1680
+ ReleaseSysCache (tuple );
1681
+
1733
1682
return result ;
1734
1683
}
1735
1684
@@ -2298,36 +2247,24 @@ pg_opclass_ownercheck(Oid opc_oid, Oid roleid)
2298
2247
bool
2299
2248
pg_database_ownercheck (Oid db_oid , Oid roleid )
2300
2249
{
2301
- Relation pg_database ;
2302
- ScanKeyData entry [1 ];
2303
- SysScanDesc scan ;
2304
- HeapTuple dbtuple ;
2250
+ HeapTuple tuple ;
2305
2251
Oid dba ;
2306
2252
2307
2253
/* Superusers bypass all permission checking. */
2308
2254
if (superuser_arg (roleid ))
2309
2255
return true;
2310
2256
2311
- /* There's no syscache for pg_database, so must look the hard way */
2312
- pg_database = heap_open (DatabaseRelationId , AccessShareLock );
2313
- ScanKeyInit (& entry [0 ],
2314
- ObjectIdAttributeNumber ,
2315
- BTEqualStrategyNumber , F_OIDEQ ,
2316
- ObjectIdGetDatum (db_oid ));
2317
- scan = systable_beginscan (pg_database , DatabaseOidIndexId , true,
2318
- SnapshotNow , 1 , entry );
2319
-
2320
- dbtuple = systable_getnext (scan );
2321
-
2322
- if (!HeapTupleIsValid (dbtuple ))
2257
+ tuple = SearchSysCache (DATABASEOID ,
2258
+ ObjectIdGetDatum (db_oid ),
2259
+ 0 , 0 , 0 );
2260
+ if (!HeapTupleIsValid (tuple ))
2323
2261
ereport (ERROR ,
2324
2262
(errcode (ERRCODE_UNDEFINED_DATABASE ),
2325
2263
errmsg ("database with OID %u does not exist" , db_oid )));
2326
2264
2327
- dba = ((Form_pg_database ) GETSTRUCT (dbtuple ))-> datdba ;
2265
+ dba = ((Form_pg_database ) GETSTRUCT (tuple ))-> datdba ;
2328
2266
2329
- systable_endscan (scan );
2330
- heap_close (pg_database , AccessShareLock );
2267
+ ReleaseSysCache (tuple );
2331
2268
2332
2269
return has_privs_of_role (roleid , dba );
2333
2270
}
0 commit comments