Re: Passing parameters to a C function
От | Tom Lane |
---|---|
Тема | Re: Passing parameters to a C function |
Дата | |
Msg-id | 3825.1180537239@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | Re: Passing parameters to a C function (Martijn van Oosterhout <kleptog@svana.org>) |
Список | pgsql-hackers |
Martijn van Oosterhout <kleptog@svana.org> writes: > On Wed, May 30, 2007 at 11:26:01AM -0300, Rodrigo Sakai wrote: >> But using version 1 calling convention it won't work! So, how can I pass the >> 'a' and 'b' variables in complex_add(?, ?)? > Use the DirectFunctionCalln functions in fmgr. There are boatloads of examples in the existing datatype code, for instance this function in geo_ops.c, which is just applying close_sb() followed by dist_pb(): Datum dist_sb(PG_FUNCTION_ARGS) { LSEG *lseg = PG_GETARG_LSEG_P(0); BOX *box = PG_GETARG_BOX_P(1); Point *tmp; Datum result; tmp = DatumGetPointP(DirectFunctionCall2(close_sb, LsegPGetDatum(lseg), BoxPGetDatum(box))); result = DirectFunctionCall2(dist_pb, PointPGetDatum(tmp), BoxPGetDatum(box)); PG_RETURN_DATUM(result); } All that casting to and from Datum is a bit of a pain, but it's worth it to have a uniform, portable function API. I strongly suggest adding some appropriate cast macros for your own datatype, like the ones being used here, instead of dealing directly with low-level operations like PG_GETARG_POINTER. regards, tom lane
В списке pgsql-hackers по дате отправления: