1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-25 01:02:05 +03:00

Standardize get_whatever_oid functions for object types with

unqualified names.

- Add a missing_ok parameter to get_tablespace_oid.
- Avoid duplicating get_tablespace_od guts in objectNamesToOids.
- Add a missing_ok parameter to get_database_oid.
- Replace get_roleid and get_role_checked with get_role_oid.
- Add get_namespace_oid, get_language_oid, get_am_oid.
- Refactor existing code to use new interfaces.

Thanks to KaiGai Kohei for the review.
This commit is contained in:
Robert Haas
2010-08-05 14:45:09 +00:00
parent 641459f269
commit 2a6ef3445c
25 changed files with 259 additions and 437 deletions

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.157 2010/02/26 02:01:05 momjian Exp $
* $PostgreSQL: pgsql/src/backend/utils/adt/acl.c,v 1.158 2010/08/05 14:45:04 rhaas Exp $
*
*-------------------------------------------------------------------------
*/
@ -22,6 +22,7 @@
#include "catalog/pg_type.h"
#include "catalog/pg_class.h"
#include "commands/dbcommands.h"
#include "commands/proclang.h"
#include "commands/tablespace.h"
#include "foreign/foreign.h"
#include "funcapi.h"
@ -324,7 +325,7 @@ aclparse(const char *s, AclItem *aip)
if (name[0] == '\0')
aip->ai_grantee = ACL_ID_PUBLIC;
else
aip->ai_grantee = get_roleid_checked(name);
aip->ai_grantee = get_role_oid(name, false);
/*
* XXX Allow a degree of backward compatibility by defaulting the grantor
@ -337,7 +338,7 @@ aclparse(const char *s, AclItem *aip)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("a name must follow the \"/\" sign")));
aip->ai_grantor = get_roleid_checked(name2);
aip->ai_grantor = get_role_oid(name2, false);
}
else
{
@ -1790,7 +1791,7 @@ has_table_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_table_priv_string(priv_type_text);
@ -1839,7 +1840,7 @@ has_table_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_table_priv_string(priv_type_text);
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
@ -1997,7 +1998,7 @@ has_sequence_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*rolename), false);
mode = convert_sequence_priv_string(priv_type_text);
sequenceoid = convert_table_name(sequencename);
if (get_rel_relkind(sequenceoid) != RELKIND_SEQUENCE)
@ -2057,7 +2058,7 @@ has_sequence_privilege_name_id(PG_FUNCTION_ARGS)
AclResult aclresult;
char relkind;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_sequence_priv_string(priv_type_text);
relkind = get_rel_relkind(sequenceoid);
if (relkind == '\0')
@ -2208,7 +2209,7 @@ has_any_column_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_column_priv_string(priv_type_text);
@ -2265,7 +2266,7 @@ has_any_column_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_column_priv_string(priv_type_text);
if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid)))
@ -2450,7 +2451,7 @@ has_column_privilege_name_name_name(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
roleid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
colattnum = convert_column_name(tableoid, column);
mode = convert_column_priv_string(priv_type_text);
@ -2478,7 +2479,7 @@ has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
roleid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*rolename), false);
tableoid = convert_table_name(tablename);
mode = convert_column_priv_string(priv_type_text);
@ -2505,7 +2506,7 @@ has_column_privilege_name_id_name(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
colattnum = convert_column_name(tableoid, column);
mode = convert_column_priv_string(priv_type_text);
@ -2531,7 +2532,7 @@ has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS)
AclMode mode;
int privresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_column_priv_string(priv_type_text);
privresult = column_privilege_check(tableoid, colattnum, roleid, mode);
@ -2822,7 +2823,7 @@ has_database_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
databaseoid = convert_database_name(databasename);
mode = convert_database_priv_string(priv_type_text);
@ -2871,7 +2872,7 @@ has_database_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_database_priv_string(priv_type_text);
if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
@ -2966,15 +2967,8 @@ static Oid
convert_database_name(text *databasename)
{
char *dbname = text_to_cstring(databasename);
Oid oid;
oid = get_database_oid(dbname);
if (!OidIsValid(oid))
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_DATABASE),
errmsg("database \"%s\" does not exist", dbname)));
return oid;
return get_database_oid(dbname, false);
}
/*
@ -3027,7 +3021,7 @@ has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
fdwid = convert_foreign_data_wrapper_name(fdwname);
mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
@ -3076,7 +3070,7 @@ has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
aclresult = pg_foreign_data_wrapper_aclcheck(fdwid, roleid, mode);
@ -3209,7 +3203,7 @@ has_function_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
functionoid = convert_function_name(functionname);
mode = convert_function_priv_string(priv_type_text);
@ -3258,7 +3252,7 @@ has_function_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_function_priv_string(priv_type_text);
if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
@ -3409,7 +3403,7 @@ has_language_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
languageoid = convert_language_name(languagename);
mode = convert_language_priv_string(priv_type_text);
@ -3458,7 +3452,7 @@ has_language_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_language_priv_string(priv_type_text);
if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
@ -3553,15 +3547,8 @@ static Oid
convert_language_name(text *languagename)
{
char *langname = text_to_cstring(languagename);
Oid oid;
oid = GetSysCacheOid1(LANGNAME, CStringGetDatum(langname));
if (!OidIsValid(oid))
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("language \"%s\" does not exist", langname)));
return oid;
return get_language_oid(langname, false);
}
/*
@ -3607,7 +3594,7 @@ has_schema_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
schemaoid = convert_schema_name(schemaname);
mode = convert_schema_priv_string(priv_type_text);
@ -3656,7 +3643,7 @@ has_schema_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_schema_priv_string(priv_type_text);
if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
@ -3751,15 +3738,8 @@ static Oid
convert_schema_name(text *schemaname)
{
char *nspname = text_to_cstring(schemaname);
Oid oid;
oid = GetSysCacheOid1(NAMESPACENAME, CStringGetDatum(nspname));
if (!OidIsValid(oid))
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_SCHEMA),
errmsg("schema \"%s\" does not exist", nspname)));
return oid;
return get_namespace_oid(nspname, false);
}
/*
@ -3807,7 +3787,7 @@ has_server_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
serverid = convert_server_name(servername);
mode = convert_server_priv_string(priv_type_text);
@ -3856,7 +3836,7 @@ has_server_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_server_priv_string(priv_type_text);
aclresult = pg_foreign_server_aclcheck(serverid, roleid, mode);
@ -3989,7 +3969,7 @@ has_tablespace_privilege_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
tablespaceoid = convert_tablespace_name(tablespacename);
mode = convert_tablespace_priv_string(priv_type_text);
@ -4038,7 +4018,7 @@ has_tablespace_privilege_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_tablespace_priv_string(priv_type_text);
aclresult = pg_tablespace_aclcheck(tablespaceoid, roleid, mode);
@ -4124,16 +4104,8 @@ static Oid
convert_tablespace_name(text *tablespacename)
{
char *spcname = text_to_cstring(tablespacename);
Oid oid;
oid = get_tablespace_oid(spcname);
if (!OidIsValid(oid))
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("tablespace \"%s\" does not exist", spcname)));
return oid;
return get_tablespace_oid(spcname, false);
}
/*
@ -4178,8 +4150,8 @@ pg_has_role_name_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleoid = get_roleid_checked(NameStr(*rolename));
roleid = get_role_oid(NameStr(*username), false);
roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@ -4204,7 +4176,7 @@ pg_has_role_name(PG_FUNCTION_ARGS)
AclResult aclresult;
roleid = GetUserId();
roleoid = get_roleid_checked(NameStr(*rolename));
roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@ -4227,7 +4199,7 @@ pg_has_role_name_id(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleid = get_roleid_checked(NameStr(*username));
roleid = get_role_oid(NameStr(*username), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@ -4273,7 +4245,7 @@ pg_has_role_id_name(PG_FUNCTION_ARGS)
AclMode mode;
AclResult aclresult;
roleoid = get_roleid_checked(NameStr(*rolename));
roleoid = get_role_oid(NameStr(*rolename), false);
mode = convert_role_priv_string(priv_type_text);
aclresult = pg_role_aclcheck(roleoid, roleid, mode);
@ -4830,3 +4802,22 @@ select_best_grantor(Oid roleId, AclMode privileges,
}
}
}
/*
* get_role_oid - Given a role name, look up the role's OID.
*
* If missing_ok is false, throw an error if tablespace name not found. If
* true, just return InvalidOid.
*/
Oid
get_role_oid(const char *rolname, bool missing_ok)
{
Oid oid;
oid = GetSysCacheOid1(AUTHNAME, CStringGetDatum(rolname));
if (!OidIsValid(oid) && !missing_ok)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("role \"%s\" does not exist", rolname)));
return oid;
}