URL Managment - C Function help - Mailing list pgsql-hackers
| From | Samuel ROZE |
|---|---|
| Subject | URL Managment - C Function help |
| Date | |
| Msg-id | 1256139105.2845.11.camel@samuel-laptop Whole thread Raw |
| Responses |
Re: URL Managment - C Function help
Re: URL Managment - C Function help Re: URL Managment - C Function help |
| List | pgsql-hackers |
Hi,
I'm writing two functions "parse_url_key" and "parse_url_record" which
will have one text argument and will return a record or a specific
column of it. Theses functions are calling "parse_url_exec" which parse
the URL. When theses function will works, i'll purpose them to
PostgreSQL community.
The problem is that they don't work fine... :/
Prototypes of function/struct used by them:
----------------------------------------------------
typedef struct url {char *scheme;char *user;char *pass;char *host;unsigned short port;char *path;char *query;char
*fragment;
} url;
url *parse_url_exec (char* str);
----------------------------------------------------
The parse_url_key function:
----------------------------------------------------
PG_FUNCTION_INFO_V1(parse_url_key);
Datum parse_url_key (PG_FUNCTION_ARGS)
{char str[] = "http://www.ovh.com/intenal.html";//text *my_url = PG_GETARG_TEXT_P(0);//char *char_url =
DatumGetCString(my_url);
url *ret = parse_url_exec(str);
PG_RETURN_TEXT_P(ret->host);
}
----------------------------------------------------
Note: I'm using built-in strings to be sure that the recuperation
doesn't change anything..
This function works well:
----------------------------------------------------
postgres=# CREATE OR REPLACE FUNCTION parse_url_key(text) RETURNS text
AS '/home/samuel/parse_url.so', 'parse_url_key' LANGUAGE C;
CREATE FUNCTION
postgres=# SELECT parse_url_key('') as scheme; scheme
------------ww.ovh.com
(1 row)
----------------------------------------------------
Note: there's a little problem here but not important. :-)
The problem is that the other function, "parse_url_record" doesn't
return values ! The code is:
----------------------------------------------------
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;Datum values[2]; // 8
valuesHeapTuple tuple;bool nulls[2];int tuplen;
// Check NULLs valuesif(PG_ARGISNULL(0) || PG_ARGISNULL(1)) { PG_RETURN_NULL();}
url *ret = parse_url_exec(str);
// Add datas into the values Datumvalues[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 arraytuple = heap_form_tuple(tupdesc, values, nulls);// Free null values/*pfree(nulls);*/
// Return the composite typePG_RETURN_DATUM(HeapTupleGetDatum(tuple));
}
----------------------------------------------------
Note: I'm just returning scheme and host fields for test, but others are
too completed by parse_url_exec.
It doesn't works fine:
----------------------------------------------------
postgres=# CREATE OR REPLACE FUNCTION parse_url_record(text) RETURNS
record AS '/home/samuel/parse_url.so', 'parse_url_record' LANGUAGE C;
CREATE FUNCTION
postgres=# SELECT * FROM parse_url_record('') as ("scheme" text, "host"
text);scheme | host
--------+------ |
(1 row)
----------------------------------------------------
Is there anybody here who can help me ?
Thanks you very much !
Samuel ROZE.
http://www.d-sites.com
pgsql-hackers by date: