在postgresql中创建扩展测试

时间:2015-10-07 06:59:58

标签: c database postgresql postgis

我想在postgres中创建一个扩展测试(使用PostGis),所以我想执行以下步骤:

1.-以这种方式从btree_gist编辑文件btree_interval.c

gbt_intvkey_cmp(const void *a, const void *b)
{
    intvKEY    *ia = (intvKEY *) (((const Nsrt *) a)->t);
    intvKEY    *ib = (intvKEY *) (((const Nsrt *) b)->t);
    int         res;
  ......
  ......

  printf("Test for PostGis\n");

    return res;
}

只添加printf,因为我只想做一点测试

2.-运行以下命令:

gcc -shared -o btree_gist_test.so -fPIC btree_gist.c

我的怀疑是:

  

1.-一旦安装了postgresql,我就不知道在哪里可以找到文件btree_gist.c,然后运行上面的命令。

如果你问我:'为什么不直接下载源代码?' 好吧,因为当我这样做时,我收到了以下错误消息:

 #include "postgres.h"
                      ^
compilation terminated

所以,我认为在已安装postgresql的同一个文件夹中做得更好。

  

2.-一旦我得到btree_gist_test.so我知道我必须复制到路径/usr/lib/postgresql/lib/,但我不确定是否必须创建一个到其他地方的符号链接这个档案。

2 个答案:

答案 0 :(得分:3)

这是一个最小的例子,如果您安装了ubuntu的postgresql-server开发包

<强> extension.c
一个简单的扩展

/* Postgres headers */
#include <postgres.h>
#include <utils/rel.h>

#include <stdio.h>
#include <string.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

static char *
extract_string(text *word)
{
    char *head;
    char *tail;

    if (word == NULL)
        return NULL;

    head = VARDATA(word);
    tail = head + VARSIZE(word) - VARHDRSZ;
    tail[0] = '\0';

    return head;
}

PG_FUNCTION_INFO_V1(compare_strings);
Datum
compare_strings(PG_FUNCTION_ARGS)
{
    char *lhs;
    char *rhs;

    lhs = extract_string(PG_GETARG_TEXT_P(0));
    rhs = extract_string(PG_GETARG_TEXT_P(1));

    PG_RETURN_BOOL(strcmp(lhs, rhs) == 0);
}

<强>生成文件
一个简单的Makefile,用于说明如何构建扩展。

CC     = gcc
OBJECT = extension.o
NAME   = my-extension.so
CFLAGS = -Wall -Werror -g3 -O0 -I$(shell pg_config --includedir-server)

all: $(OBJECT)
    $(CC) -shared -o $(NAME) $(OBJECT)

%.o: %.c
    $(CC) -c -fPIC $(CFLAGS) $<

install: all
    @install -Dv -m755 $(NAME) $(shell pg_config --pkglibdir)/$(NAME)
    @psql -U postgres -f create-function.sql

clean:
    @rm -fv *.o *.so

创建-function.sql
创建函数的简单脚本

CREATE OR REPLACE FUNCTION 
    compare_strings(VARCHAR,VARCHAR) RETURNS integer AS 'my-extension' 
LANGUAGE C STRICT;

从您的问题看来,您将能够理解它的作用以及如何使其适用于您的用例。

答案 1 :(得分:0)

有两种方法可以编译大多数扩展程序:

在PostgreSQL源代码树中,如果你在源代码树中编译了PostgreSQL:

  • cd到扩展程序目录
  • make
  • make install

...或者,如果扩展名不直接位于PostgreSQL的源代码树内,或者您希望将其与不同的PostgreSQL安装一起使用,请使用PGXS。

假设您正在使用二进制包:

  • 确保包含pg_config的目录位于PATH环境变量
  • make USE_PGXS=1
  • 如果成功,sudo make USE_PGXS=1 install

了解更多信息: