在PostgreSQL中创建扩展测试

3
我希望在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/,但我不确定是否需要为此文件创建符号链接到其他位置。


我在这方面有一些经验,但我不明白问题出在哪里。请告诉我这是哪个Linux发行版。 - Iharob Al Asimi
@iharob 我的原始问题是:https://dev59.com/MY_ea4cB1Zd3GeqPTdN_ 所以,首先我决定创建一个小测试,顺便说一下:Linux 3.13.0-44-generic #73-Ubuntu - user4029213
@iharob 第一次做这个,如果你能帮我创建一个小的扩展测试,我会非常感激。 - user4029213
好的,我不是每天都这样做,但我在去年的一个大项目中有一个扩展。让我检查一下,然后再回来给你。顺便说一句,Postgres对此的文档真的很糟糕。 - Iharob Al Asimi
还有,对于那个奇怪的回答我很抱歉。我不知道我是怎么从btree_gist到PostGIS的。-ENOCOFFEE? - Craig Ringer
显示剩余2条评论
2个回答

2

如果您已经安装了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
一个简单的 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

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

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

从您的问题中看来,您似乎能够理解这意味着什么,也知道如何使其适合您的使用情况。


0

编译大多数扩展有两种方法:

在 PostgreSQL 源代码树中,如果您已经在该源代码树中编译了 PostgreSQL:

  • cd 到扩展目录
  • make 编译
  • make install

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

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

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

更多信息请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接