在postgresql中创建扩展测试

我想在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/ ,但我不确定是否必须创建一个符号链接到其他地方为此文件。

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

extension.c
一个简单的扩展

 /* Postgres headers */ #include  #include  #include  #include  #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 

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

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

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

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

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

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

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

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

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

欲获得更多信息:

  • pgxs和扩展建设基础设施
  • 编译PostgreSQL
  • 扩展