creating a new type in C

From: Andrei Ivanov <andrei(dot)ivanov(at)ines(dot)ro>
To: <pgsql-general(at)postgresql(dot)org>
Subject: creating a new type in C
Date: 2002-10-18 19:29:13
Message-ID: Pine.LNX.4.33L2.0210182214400.10783-100000@webdev.ines.ro
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


Hello,
I've been playing with a new type I want to create, but I got stuck,
therefore I ask for your assistance.
I don't know if this is the right list for this, if not please tell me
where to post my questions.
This is the source:

#include "postgres.h"
#include "fmgr.h"

typedef struct movie_property
{
int4 id;
char name[31];
} movie_property;

Datum movie_property_in(PG_FUNCTION_ARGS);
Datum movie_property_out(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(movie_property_in)
Datum movie_property_in(PG_FUNCTION_ARGS)
{
int4 id = PG_GETARG_INT32(0);
char *name = PG_GETARG_CSTRING(1);
movie_property *result;
result = (movie_property *) palloc(sizeof(movie_property));
result->id = id;
strncpy(result->name, name, 30);
result->name[30] = 0;
PG_RETURN_POINTER(result);
}

PG_FUNCTION_INFO_V1(movie_property_out)
Datum movie_property_out(PG_FUNCTION_ARGS)
{
movie_property *property = (movie_property *) PG_GETARG_POINTER(0);
char *result;

if (property == NULL)
PG_RETURN_POINTER(NULL);
if ((result = (char *) palloc(40)) != NULL)
{
sprintf(result, "(%d,%s)", property->id, property->name);
}
PG_RETURN_CSTRING(result);
}

Creating functions and type:
create function movie_property_in(opaque)
returns opaque
as '$libdir/movie_property'
language 'c';
create function movie_property_out(opaque)
returns opaque
as '$libdir/movie_property'
language 'c';
create type movie_property (
internallength = 35,
input = movie_property_in,
output = movie_property_out
);
CREATE TABLE pp (p movie_property);
INSERT INTO pp values('(1, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")');

The problem is with movie_property_in function.
When I try to obtain the id with PG_GETARG_INT32(0),
I don't get 1, but 138944104.
I tried and logged the result of PG_GETARG_CSTRING(0), and it seems it
returns the whole string (1, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx").
Please, tell me, how do I do this the right way ?
If you have any other comments regarding my code (I'm a C begginer),
they are welcomed.

Postgresql version is 7.2.3 on a Gentoo Linux 1.2
gcc version 2.95.3 20010315

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Guillermo Trutner 2002-10-18 19:49:17 problem with transaction
Previous Message Teofilis Martisius 2002-10-18 19:18:40 Re: Performance problem iterating a resultset