2015-10-07 22 views
3

我要創建的Postgres(使用POSTGIS)的擴展測試,所以我想要做的步驟如下:創建PostgreSQL中的拉伸試驗

1.-編輯文件btree_interval.cbtree_gist這樣:

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 .-我不知道我在哪裏可以找到該文件btree_gist.c一旦安裝PostgreSQL和然後運行上面的命令。

如果你問我:'爲什麼不只是你那樣下載源代碼?' 嗯,因爲當我做,我得到這個錯誤信息:

#include "postgres.h" 
        ^
compilation terminated 

所以,我認爲這是更好地做到這一點在PostgreSQL是已經安裝了相同的文件夾。

2:一旦我得到我知道,我必須複製到路徑/usr/lib/postgresql/lib/的btree_gist_test.so,但我不知道如果我要創建一個符號鏈接到該文件別的一個地方。

+0

我有一些這方面的經驗,但我不明白什麼是萬阿英,蔣達清。請告訴我哪個linux發行版是這個。 –

+0

@iharob我原來的問題是:http://stackoverflow.com/questions/32975888/extensibility-on-postgresql所以,首先我決定創建一個小測試,順便說一句:Linux 3.13.0-44-generic#73 -Ubuntu –

+0

@iharob在我第一次這樣做的時候,如果你能幫我創建一個小擴展測試,我會很感激。 –

回答

3

這是一個可行的小例子,如果你有Ubuntu的安裝

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
postgresql-server開發包 一個簡單的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; 

當它從你的問題看來,你就能明白這是什麼並且如何使它適用於您的用例。

+0

它完美的作品,非常感謝! –

0

有兩種方法來編譯大多數擴展:

在PostgreSQL源代碼樹,如果你已經在源代碼樹編譯的PostgreSQL:

  • cd到擴展目錄
  • make
  • make install

...或者,如果擴展不是直接位於PostgreSQL的源代碼樹內部,或者您希望將其用於不同的PostgreSQL安裝,請使用PGXS。

假設你正在使用二進制包:

  • 確保含pg_config的目錄是在你的PATH環境變量
  • make USE_PGXS=1
  • 如果成功,sudo make USE_PGXS=1 install

欲瞭解更多信息: