Toto je minimální příklad, který funguje, pokud máte postgresql-server
vývojový balíček pro ubuntu nainstalován
extension.c
Jednoduché rozšíření
/* 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
Jednoduchý soubor Makefile pro ilustraci, jak byste mohli sestavit rozšíření.
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
Jednoduchý skript pro vytvoření funkce
CREATE OR REPLACE FUNCTION
compare_strings(VARCHAR,VARCHAR) RETURNS integer AS 'my-extension'
LANGUAGE C STRICT;
Jak se zdá z vaší otázky, budete schopni porozumět tomu, co to dělá, a také tomu, jak to udělat, aby to fungovalo pro váš případ použití.