在 postgresql 中创建扩展测试
Creating an extension test in 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.- I don't know where I can find the file btree_gist.c
once postgresql is installed and then run the command above.
如果你问我:“你为什么不直接下载源代码呢?”
好吧,因为当我这样做时,我收到了这条错误消息:
#include "postgres.h"
^
compilation terminated
因此,我认为最好在已安装 postgresql 的同一文件夹中执行此操作。
2.- Once I get the btree_gist_test.so I know that I have to copy to the path /usr/lib/postgresql/lib/
, but I'm not sure if I have to create a symbolic link to a somewhere else for this file.
这是一个最小的示例,如果您安装了 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] = '[=10=]';
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;
从你的问题看来,你将能够理解它的作用以及如何使其适用于你的用例。
大多数扩展有两种编译方式:
在 PostgreSQL 源代码树中,如果您在该源代码树中编译了 PostgreSQL:
cd
到扩展目录
make
那里
make install
...或者,如果扩展不直接位于 PostgreSQL 的源代码树中,或者您想将其用于不同的 PostgreSQL 安装,请使用 PGXS。
假设您使用的是二进制包:
- 确保包含
pg_config
的目录在您的 PATH
环境变量中
make USE_PGXS=1
- 如果成功,
sudo make USE_PGXS=1 install
更多信息:
我想在 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.- I don't know where I can find the file
btree_gist.c
once postgresql is installed and then run the command above.
如果你问我:“你为什么不直接下载源代码呢?” 好吧,因为当我这样做时,我收到了这条错误消息:
#include "postgres.h"
^
compilation terminated
因此,我认为最好在已安装 postgresql 的同一文件夹中执行此操作。
2.- Once I get the btree_gist_test.so I know that I have to copy to the path
/usr/lib/postgresql/lib/
, but I'm not sure if I have to create a symbolic link to a somewhere else for this file.
这是一个最小的示例,如果您安装了 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] = '[=10=]';
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;
从你的问题看来,你将能够理解它的作用以及如何使其适用于你的用例。
大多数扩展有两种编译方式:
在 PostgreSQL 源代码树中,如果您在该源代码树中编译了 PostgreSQL:
cd
到扩展目录make
那里make install
...或者,如果扩展不直接位于 PostgreSQL 的源代码树中,或者您想将其用于不同的 PostgreSQL 安装,请使用 PGXS。
假设您使用的是二进制包:
- 确保包含
pg_config
的目录在您的PATH
环境变量中 make USE_PGXS=1
- 如果成功,
sudo make USE_PGXS=1 install
更多信息: