Datum dbms_assert_schema_name(PG_FUNCTION_ARGS) { Oid namespaceId; AclResult aclresult; text *sname; char *nspname; List *names; if (PG_ARGISNULL(0)) INVALID_SCHEMA_NAME_EXCEPTION(); sname = PG_GETARG_TEXT_P(0); if (EMPTY_STR(sname)) INVALID_SCHEMA_NAME_EXCEPTION(); nspname = text_to_cstring(sname); names = stringToQualifiedNameList(nspname); if (list_length(names) != 1) INVALID_SCHEMA_NAME_EXCEPTION(); namespaceId = GetSysCacheOid(NAMESPACENAME, CStringGetDatum(strVal(linitial(names))), 0, 0, 0); if (!OidIsValid(namespaceId)) INVALID_SCHEMA_NAME_EXCEPTION(); aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE); if (aclresult != ACLCHECK_OK) INVALID_SCHEMA_NAME_EXCEPTION(); PG_RETURN_TEXT_P(sname); }
/* * get_roleid * Given a role name, look up the role's OID. * Returns InvalidOid if no such role. */ Oid get_roleid(const char *rolname) { return GetSysCacheOid(AUTHNAME, PointerGetDatum(rolname), 0, 0, 0); }
/* * get_relname_relid * Given name and namespace of a relation, look up the OID. * * Returns InvalidOid if there is no such relation. */ Oid get_relname_relid(const char *relname, Oid relnamespace) { return GetSysCacheOid(RELNAMENSP, PointerGetDatum(relname), ObjectIdGetDatum(relnamespace), 0, 0); }
/* * GetForeignDataWrapperOidByName - look up the foreign-data wrapper * OID by name. */ Oid GetForeignDataWrapperOidByName(const char *fdwname, bool missing_ok) { Oid fdwId; fdwId = GetSysCacheOid(FOREIGNDATAWRAPPERNAME, CStringGetDatum(fdwname), 0, 0, 0); if (!OidIsValid(fdwId) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("foreign-data wrapper \"%s\" does not exist", fdwname))); return fdwId; }
/* * GetForeignServerByName - look up the foreign server oid by name. */ Oid GetForeignServerOidByName(const char *srvname, bool missing_ok) { Oid serverid; serverid = GetSysCacheOid(FOREIGNSERVERNAME, CStringGetDatum(srvname), 0, 0, 0); if (!OidIsValid(serverid) && !missing_ok) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("server \"%s\" does not exist", srvname))); return serverid; }
/* Removes the schema and all tables within the schema, if the schema exists. */ void RemoveJobSchema(StringInfo schemaName) { Datum schemaNameDatum = CStringGetDatum(schemaName->data); Oid schemaId = InvalidOid; schemaId = GetSysCacheOid(NAMESPACENAME, schemaNameDatum, 0, 0, 0); if (OidIsValid(schemaId)) { ObjectAddress schemaObject = { 0, 0, 0 }; bool showNotices = false; bool permissionsOK = pg_namespace_ownercheck(schemaId, GetUserId()); if (!permissionsOK) { aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_NAMESPACE, schemaName->data); } schemaObject.classId = NamespaceRelationId; schemaObject.objectId = schemaId; schemaObject.objectSubId = 0; /* * We first delete all tables in this schema. Rather than relying on the * schema command, we call the dependency mechanism directly so that we * can suppress notice messages that are typically displayed during * cascading deletes. */ deleteWhatDependsOn(&schemaObject, showNotices); CommandCounterIncrement(); /* drop the empty schema */ performDeletion(&schemaObject, DROP_RESTRICT, 0); CommandCounterIncrement(); } else { ereport(DEBUG2, (errmsg("schema \"%s\" does not exist, skipping", schemaName->data))); } }