Re: Compiling a user C function in 7.2.1

Поиск
Список
Период
Сортировка
От John Gunther
Тема Re: Compiling a user C function in 7.2.1
Дата
Msg-id 3D43E395.603@bucksvsbytes.com
обсуждение исходный текст
Ответ на Add value in an Array  ("Jerome Chochon" <jerome.chochon@ensma.fr>)
Ответы Re: Compiling a user C function in 7.2.1  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-novice
Tom Lane wrote:

>(a) you didn't run configure, which creates the files you are missing.
>
>
Thanks, Tom. Your reply caused me to learn a lot about building
PostgreSQL from source.

Now I'm much further along: I have created a dynamic library
(bvbpglib.so) containing one PostgreSQL C function (bvbpgsortword). This
function calls a "regular" (non-PostgreSQL) C function (bvbmakesortstring).

My current problem is that my psql statement:
CREATE FUNCTION bvbpgsortword(TEXT) RETURNS TEXT AS
'/usr/include/bvbpglib' LANGUAGE C WITH (ISSTRICT);
fails with "undefined symbol: bvbmakesortstring"

This is probably the result of some fundamental deficit in my
understanding of C writing/compiling/linking, but what puzzles me is
that bvbmakesortstring is called successfully from another C program I
wrote. Only in psql does it come back undefined.

Thanks.

John Gunther

For anyone is interested in enlightening me, relevant source follows:

SOURCE FOR bvbpglib.c (used to create bvbpglib.so, contains PostgreSQL
function bvbpgsortword):
#include "postgres.h"
#include "fmgr.h"
#include <string.h>
#include "bvblib.h"
Datum bvbpgsortword(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(bvbpgsortword);
Datum bvbpgsortword(PG_FUNCTION_ARGS){
//declarations
    char  *bvbmakesortstring(const char *input, const int bitmodes,
const unsigned short int minlength, const char *keeplist, const char
*outdelim, const char *stoplist);
    text *instr = PG_GETARG_TEXT_P(0);
    text *outstr;
    unsigned int length;
    char *target;
//code
    target=VARDATA(outstr);
    target = bvbmakesortstring(VARDATA(instr),1,0,"","}","");
    length=strlen(target-1);
    target[length]=0;
    VARATT_SIZEP(outstr) = length + VARHDRSZ;
    PG_RETURN_TEXT_P(outstr);
}

SOURCE FOR test.c (this successfully calls bvbmakesortstring):
#include <stdio.h>
#include "bvblib.h"
int /*function*/ main(){

printf("out=%s\n",bvbmakesortstring("test-mctöst'tëst",0,0,",","=","A"));
    return 0;
}

PARTIAL SOURCE FOR bvblib.c (this library contains bvbmakesortstring):
#include <string.h>
#include "bvblib.h"
char    bvbstr[65535];
char *bvbmakesortstring(
    const char *instr,
    const int bitmodes,
    const unsigned short int minlength,
    const char *keeplist,
    const char *outdelim,
    const char *stoplist
)
{<code>...
     return bvbstr;//return the sort-ready string
}

SOURCE FOR bvblib.h:
#ifndef BVBLIB_H     /* has this been included */
#define BVBLIB_H     /* if not say its been done once */
char bvbstr[65535];
char *bvbmakesortstring(
    const char                                *instr, //string to be
processed
    const int                                    bitmodes,
    const unsigned short int    minlength,    //words shorter than this
are ignored
    const char                                  *keeplist,    //chars to
be kept in output words
    const char                                  *outdelim,    //char
string to use as word delimiter
    const char                                  *stoplist
//space-separated words to be ignored
);
#endif                  /* end the #ifndef construct */



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

Предыдущее
От: "tom wa"
Дата:
Сообщение: functions
Следующее
От: John Gunther
Дата:
Сообщение: Re: Compiling a user C function in 7.2.1