Re: URL Managment - C Function help

From: Samuel ROZE <samuel(dot)roze(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: URL Managment - C Function help
Date: 2009-10-21 16:48:11
Message-ID: 1256143691.2845.25.camel@samuel-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I'm now using C strings. I don't need to use CStringGetTextDatum, but it
still don't works. There's the code:

---------------------------------------------------------------
PG_FUNCTION_INFO_V1(parse_url_record);
Datum parse_url_record (PG_FUNCTION_ARGS)
{
// Vars about the params
//text *str2 = PG_GETARG_TEXT_P(0);
char str[] = "http://www.ovh.com/intenal.html";

// Some vars which will used to create the composite output type
TupleDesc tupdesc;
char **values;
HeapTuple tuple;
AttInMetadata *attinmeta;
bool nulls[2];
url *ret;

// Check NULLs values
if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) {
PG_RETURN_NULL();
}

ret = parse_url_exec(str);

if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
{
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context that
cannot accept type record")));
}
attinmeta = TupleDescGetAttInMetadata(tupdesc);

// ...
values = (char **) palloc(2 * sizeof(char *));

// Add datas into the values Datum
values[0] = (char *) ret->scheme;
values[1] = (char *) ret->host;

// Convert values into a composite type
memset(nulls, 0, sizeof(nulls));

// build tuple from datum array
tuple = BuildTupleFromCStrings(attinmeta, values);

// Return the composite type
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
---------------------------------------------------------------

Thanks a lot !
Samuel ROZE.

Le mercredi 21 octobre 2009 à 11:42 -0400, Tom Lane a écrit :
> Samuel ROZE <samuel(dot)roze(at)gmail(dot)com> writes:
> > The problem is that they don't work fine... :/
>
> I think the problem is that you are passing C strings to code that
> expects pointers to text datums --- which are not the same thing
> at all. (text has a length word, not a null terminator byte.)
> It's pure accident that your first example works, and entirely
> unsurprising that the second one doesn't. Some CStringGetTextDatum
> calls might help.
>
> regards, tom lane

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2009-10-21 16:48:43 Re: Could regexp_matches be immutable?
Previous Message Tom Lane 2009-10-21 16:46:38 Re: Could regexp_matches be immutable?