Thread: Getting Text data as C string

Getting Text data as C string

From
Denis Gasparin
Date:
Hi.

I wrote a simple c stored procedure that accepts only one text parameter
that i want to convert to a c string.
The problem is that i obtain the C string correctly but with spurious
characters at the end... I use these calls to obtain the c string:

text *t_myfield = PG_GETARG_TEXT_P(0);
char *str_myfield = VARDATA(t_myfield);

Here it is the source:

#include "postgres.h" /* general Postgres declarations */

#include "fmgr.h" /* for argument/result macros */
#include "executor/executor.h" /* for GetAttributeByName() */
#include <math.h>
#include "libpq/pqformat.h" /* needed for send/recv functions */


Datum test_text(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(test_text);

Datum test_text(PG_FUNCTION_ARGS) {
text *t_myfield = PG_GETARG_TEXT_P(0);
char *str_myfield = VARDATA(t_myfield);

elog(NOTICE,"(%s)",str_myfield);

PG_RETURN_TEXT_P(t_myfield);
}

This is the sql to create the function:

CREATE or replace FUNCTION test_text(text)
RETURNS text
AS '/your_path_to_sp.so/sp.so'
LANGUAGE C IMMUTABLE STRICT;

The output is (note the trailing spurious character in the NOTICE line):

NOTICE: (test12345678?)
test_text
--------------
test12345678

I expected:
NOTICE: (test12345678)
test_text
--------------
test12345678


Where is the error?

Thank you,
Denis


Re: Getting Text data as C string

From
Peter Eisentraut
Date:
Am Montag, 12. März 2007 12:47 schrieb Denis Gasparin:
> I wrote a simple c stored procedure that accepts only one text parameter
> that i want to convert to a c string.
> The problem is that i obtain the C string correctly but with spurious
> characters at the end... I use these calls to obtain the c string:

The data in a text datum is not null terminated.  You need to call the
function textout() to convert.  Grep the source code for examples of invoking
it.

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

Re: Getting Text data as C string

From
Denis Gasparin
Date:
Peter Eisentraut ha scritto:
Am Montag, 12. März 2007 12:47 schrieb Denis Gasparin: 
I wrote a simple c stored procedure that accepts only one text parameter
that i want to convert to a c string.
The problem is that i obtain the C string correctly but with spurious
characters at the end... I use these calls to obtain the c string:   
The data in a text datum is not null terminated.  You need to call the 
function textout() to convert.  Grep the source code for examples of invoking 
it.
 
I found these defines into the contrib section:

#define GET_STR(textp) DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(textp)))
#define GET_TEXT(cstrp) DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(cstrp)))

So i can safely use them to obtain a string pointer from a text pointer and viceversa.

I tried and all seemed to work ok.
Thank you,
Denis