我需要将pHashes(phash.org)与汉明距离函数进行比较。

我从pg_similarity尝试了一个,但似乎工作不正确。 (相同的pHash的汉明距离不为0)。

所以我想我只需要使用c扩展名来使用pHash库中的ph_hamming_distance函数。

我所拥有的:
phash.c

#include <postgres.h>
#include <pHash.h>
#include <fmgr.h>
#include <utils/bytea.h>
#include <utils/datum.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(phash_hamming);
Datum phash_hamming(PG_FUNCTION_ARGS) {

    bytea *bytea1 = PG_GETARG_BYTEA_P(0);
    bytea *bytea2 = PG_GETARG_BYTEA_P(1);
    //FIXME - length of bytea1 & bytea2 must be 4 bytes (64bits)

    ulong64 long1 = *((ulong64*) bytea1);
    ulong64 long2 = *((ulong64*) bytea2);

    int32 ret = ph_hamming_distance(long1, long2);

    PG_RETURN_INT32(ret);
}


生成文件

CXXFLAGS=-I/usr/include/postgresql/server
LDFLAGS=-Bstatic -lpHash
all: phash.o

phash.o:
    $(CXX) $(CXXFLAGS) -fpic -c phash.c
    $(CXX) $(LDFLAGS) -shared -o phash.so phash.o

install:
    cp phash.so `pg_config --pkglibdir`

clean:
    rm -f phash.o phash.so


的SQL

 CREATE FUNCTION phash_hamming (bytea1 bytea, bytea2 bytea) RETURNS int AS '$libdir/phash' LANGUAGE C;


我得到的错误:

ERROR:  could not load library "/usr/lib/postgresql/phash.so": /usr/lib/postgresql/phash.so: undefined symbol: _Z16pg_detoast_datumP7varlena


我一定不能以某种方式链接到postgresql吗?

最佳答案

这是一个老问题,但是...


无需添加额外的包装文件并使用gcc对其进行编译。
您需要extern“ C” PostgreSQL头文件和PostgreSQL宏。

extern "C" {
  #include <postgres.h>
  #include <fmgr.h>
  #ifdef PG_MODULE_MAGIC
  PG_MODULE_MAGIC
  #endif
}

09-06 14:24