Re: URL Managment - C Function help - Mailing list pgsql-hackers
From | Samuel ROZE |
---|---|
Subject | Re: URL Managment - C Function help |
Date | |
Msg-id | 1256141612.2845.12.camel@samuel-laptop Whole thread Raw |
In response to | Re: URL Managment - C Function help (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>) |
List | pgsql-hackers |
Thanks for your reply. -------------------------------------------------------- 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 typeTupleDesc tupdesc;char **values;HeapTuple tuple;AttInMetadata*attinmeta;bool nulls[2];int tuplen; // Check NULLs valuesif(PG_ARGISNULL(0) || PG_ARGISNULL(1)) { PG_RETURN_NULL();} url *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 calledin context " "that cannot accept type record")));}attinmeta = TupleDescGetAttInMetadata(tupdesc); // ...values = (char **) palloc(2 * sizeof(char *)); // Add datas into the values Datumvalues[0] = (char *) ret->scheme;values[1] = (char *) ret->host; // Convert values into a composite typememset(nulls, 0, sizeof(nulls)); // build tuple from datum arraytuple = BuildTupleFromCStrings(attinmeta, values); // Return the composite typePG_RETURN_DATUM(HeapTupleGetDatum(tuple)); } ------------------------------------------------------- This code doesn't works better... :/ Le mercredi 21 octobre 2009 à 18:42 +0300, Heikki Linnakangas a écrit : > Samuel ROZE wrote: > > 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; > > Datum values[2]; // 8 values > > HeapTuple tuple; > > bool nulls[2]; > > int tuplen; > > > > // Check NULLs values > > if(PG_ARGISNULL(0) || PG_ARGISNULL(1)) { > > PG_RETURN_NULL(); > > } > > > > url *ret = parse_url_exec(str); > > > > // Add datas into the values Datum > > values[0] = PointerGetDatum(ret->scheme); > > values[1] = PointerGetDatum(ret->host); > > > > // Convert values into a composite type > > /*tuplen = tupdesc->natts; > > nulls = palloc(tuplen * sizeof(bool));*/ > > memset(nulls, 0, sizeof(nulls)); > > > > // build tuple from datum array > > tuple = heap_form_tuple(tupdesc, values, nulls); > > // Free null values > > /*pfree(nulls);*/ > > > > // Return the composite type > > PG_RETURN_DATUM(HeapTupleGetDatum(tuple)); > > } > > You haven't initialized tupdesc. > > BTW, there's a fine example in the manual: > http://www.postgresql.org/docs/8.4/interactive/xfunc-c.html#AEN44968 >
pgsql-hackers by date: