Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path
От | Michael Krüger |
---|---|
Тема | Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path |
Дата | |
Msg-id | 32816FAC-CF61-45E0-B161-7DA662F3FEDF@kruegers.email обсуждение исходный текст |
Ответ на | Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path (Pavel Stehule <pavel.stehule@gmail.com>) |
Ответы |
Re: Postgres C-API: How to get the Oid for a custom type defined in a schema outside of the current search path
|
Список | pgsql-general |
Hi,
Am 03.12.2020 um 11:01 schrieb Pavel Stehule <pavel.stehule@gmail.com>:Hičt 3. 12. 2020 v 10:32 odesílatel Michael Krüger <michael@kruegers.email> napsal:Dear all,I need to find out the Oid of a custom type in C programming language. This type is defined in a schema, outside of the standard search path, e.g. public.I know that I can call TypenameGetTypid to find out an Oid. But this is not working for me if the type is not in the public namespace.
How can I query a non-public Oid? Do I have to change the search path? If yes how do I do it? As mentioned I need to do this with the C interface.I looking to source codeOid
TypenameGetTypidExtended(const char *typname, bool temp_ok)
{
<-->Oid><--><-->typid;
<-->ListCell *l;
<-->recomputeNamespacePath();
<-->foreach(l, activeSearchPath)
<-->{
<--><-->Oid><--><-->namespaceId = lfirst_oid(l);
<--><-->if (!temp_ok && namespaceId == myTempNamespace)
<--><--><-->continue;<-><--><-->/* do not look in temp namespace */
<--><-->typid = GetSysCacheOid2(TYPENAMENSP, Anum_pg_type_oid,
<--><--><--><--><--><--><--><-->PointerGetDatum(typname),
<--><--><--><--><--><--><--><-->ObjectIdGetDatum(namespaceId));
<--><-->if (OidIsValid(typid))
<--><--><-->return typid;
<-->}
<-->/* Not found in path */
<-->return InvalidOid;
}You can get the value from sys cache by call GetSysCacheOid2. It can looks like<--><-->char<--> *schemaname;
<--><-->char<--> *typname;<--><--><-->namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
<--><--><-->if (OidIsValid(namespaceId))
<--><--><--><-->typoid = GetSysCacheOid2(TYPENAMENSP, Anum_pg_type_oid,
<--><--><--><--><--><--><--><--><--><--> PointerGetDatum(typname),
<--><--><--><--><--><--><--><--><--><--> ObjectIdGetDatum(namespaceId));
<--><--><-->else
<--><--><--><-->typoid = InvalidOid;
Thank you so much. That worked.
Regards,
Michael
В списке pgsql-general по дате отправления: