User defined type in C

Поиск
Список
Период
Сортировка
От Armel HERVE
Тема User defined type in C
Дата
Msg-id 20040510102035.2C5F780038F@mwinf0402.wanadoo.fr
обсуждение исходный текст
Ответы Re: User defined type in C  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-admin
Hi everybody,

Sorry if it's not the good forum and for my poor English.

I'm trying to create a new type in C for postgreSQL (7.3.4).
This type is a structure of 4 fields including a variable length field.

When I try to insert record ino a table using this type, postgre server
crashes:
LOG:  server process (pid 10838) was terminated by signal 11
LOG:  terminating any other active server processes
WARNING:  Message from PostgreSQL backend:
        The Postmaster has informed me that some other backend
        died abnormally and possibly corrupted shared memory.
        I have rolled back the current transaction and am
        going to terminate your database system connection and exit.
        Please reconnect to the database system and repeat your query.
WARNING:  Message from PostgreSQL backend:
        The Postmaster has informed me that some other backend
        died abnormally and possibly corrupted shared memory.
        I have rolled back the current transaction and am
        going to terminate your database system connection and exit.
        Please reconnect to the database system and repeat your query.
WARNING:  Message from PostgreSQL backend:
        The Postmaster has informed me that some other backend
        died abnormally and possibly corrupted shared memory.
        I have rolled back the current transaction and am
        going to terminate your database system connection and exit.
        Please reconnect to the database system and repeat your query.
LOG:  all server processes terminated; reinitializing shared memory and
semaphores
LOG:  database system was interrupted at 2004-05-10 12:25:55 CEST
LOG:  checkpoint record is at 0/627BE1DC
LOG:  redo record is at 0/627BE1DC; undo record is at 0/0; shutdown TRUE
LOG:  next transaction id: 2026530; next oid: 342157
LOG:  database system was not properly shut down; automatic recovery in
progress
LOG:  redo starts at 0/627BE21C
LOG:  ReadRecord: record with zero length at 0/627DD5F4
LOG:  redo done at 0/627DD5D0
LOG:  database system is ready


Does anybody can help me ???
Thanks for your answers,



Armel HERVE




This is the C code:
#include "postgres.h"

#define KEY_SIZE 31

typedef struct {
      int4 globalSize;
      int64 fileSize;
      char fileKey[KEY_SIZE + 1];
      char fileName[1];
} Psfile;

#define PSFILE_BASIC_SIZE (4 + sizeof(int64) + KEY_SIZE + 1)

/**
 *
 * char *str :  string representation of a psfile.
 *              must be formatted as follow :
 *                      xxx,yyy,zzz
 *              with xxx : the name of the file
 *                   yyy : the size of the file
 *                   zzz : the key associated with the file.
 */
Psfile *psfile_in(char *str) {
        Psfile *retValue = NULL;

        int nameSize = 0;

        // In first, we look for the size of the name
        for(nameSize = 0; str[nameSize] != ',' && str[nameSize] != 0;
nameSize++) {
               // Nothing to do in this block...
        }

        if(str[nameSize] == 0) {
                // We are at the end of the string... Something is wrong!!
                elog(ERROR, "psfile_in: string representation of a psfile :
name,size,key \"%s\"", str);
                return NULL;
        }

        // Now, we have the size, so we can allocate memory for the global
structure
        retValue = (Psfile *)palloc(PSFILE_BASIC_SIZE + nameSize + 1);

        char format[15];
        sprintf(format, "%%%ds,%%li,%%s", nameSize);

        char *fileName  = retValue->fileName;
        char *fileKey   = retValue->fileKey;
        int64 *fileSize = &(retValue->fileSize);

        if(sscanf(str, format, fileName, fileSize, fileKey) != 3) {
                // Something is wrong : the number of parameters found must
be 3
                pfree(retValue);
                elog(ERROR, "psfile_in: string representation of a psfile :
name,size,key \"%s\"", str);
                return NULL;
        }

        return retValue;
}

char *psfile_out(Psfile *psfile) {
elog(LOG, "psfile_out");
        if(psfile == NULL) return NULL;

        char *retValue = NULL;

        char size[30];
        sprintf(size, "%ld", psfile->fileSize);

        retValue = (char *)palloc(strlen(psfile->fileName) + 1 +
strlen(size) + 1 + strlen(psfile->fileKey) + 1);

        sprintf(retValue, "%s,%s,%s", psfile->fileName, size,
psfile->fileKey);

        return retValue;
}

And this is the type declaration :
CREATE FUNCTION psfile_in(cstring)
    RETURNS psfile
    AS '/usr/include/pgsql/server/pslib/pslib'
    LANGUAGE C IMMUTABLE STRICT;

CREATE FUNCTION psfile_out(psfile)
    RETURNS cstring
    AS '/usr/include/pgsql/server/pslib/pslib'
    LANGUAGE C IMMUTABLE STRICT;

CREATE TYPE psfile(
    internallength = valiable,
    input = psfile_in,
    output = psfile_out,
    alignment = int4
);






В списке pgsql-admin по дате отправления:

Предыдущее
От: Stephan Szabo
Дата:
Сообщение: Re: cast not IMMUTABLE?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: User defined type in C