【问题标题】:Creating an extension test in postgresql在 postgresql 中创建扩展测试
【发布时间】:2016-01-04 07:09:51
【问题描述】:

我想在 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 我最初的问题是:stackoverflow.com/questions/32975888/… 所以,首先我决定创建一个小测试,顺便说一句:Linux 3.13.0-44-generic #73-Ubuntu
  • @iharob 我第一次会这样做,所以如果你能帮我创建一个小扩展测试,我将不胜感激。
  • 好吧,我不是每天都这样做,但我在去年做的一个大项目中有一个扩展。让我检查一下,我会回来找你的。顺便说一句,这方面的 Postgres 文档真的很糟糕。
  • @iharob 我知道,我理解这些概念,但是按照您在我的拙见中所说的获得成功的步骤并没有很好的记录。谢谢!

标签: c database postgresql postgis


【解决方案1】:

如果您安装了 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;

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

【讨论】:

    【解决方案2】:

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

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

    • cd到扩展目录
    • make那里
    • make install

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

    假设您使用的是二进制包:

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

    更多信息:

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 2013-09-12
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2017-01-20
      • 2015-09-14
      • 1970-01-01
      相关资源
      最近更新 更多