Este es un ejemplo mínimo que funciona si tiene el postgresql-server
paquete de desarrollo para ubuntu instalado
extensión.c
Una extensión simple
/* 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);
}
Archivo Make
Un Makefile simple para ilustrar cómo podría construir la extensión.
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
crear-función.sql
Un script simple para crear la función
CREATE OR REPLACE FUNCTION
compare_strings(VARCHAR,VARCHAR) RETURNS integer AS 'my-extension'
LANGUAGE C STRICT;
Como parece a partir de su pregunta, podrá comprender qué hace esto y también cómo hacer que funcione para su caso de uso.