안녕하세요
postgresql에서 c로 작성된 공유 라이브러리를 호출하는 방법이 있는지 문의드립니다.
소스의 contrib 디렉토리에 보면, 확장 모듈 예제들이 많이 있습니다.
그것을 보면서,
확장 모듈 형태로 wrapper를 만들어서 사용해야합니다.
즉, libtest.so 가 있는데, 그 안에, int to_lower(instr *char, strlen int, outstr *char) 이런 형태의 함수가 있다고 했을 때, 그것을 pg_to_lower(...) 형태로 wrapper 함수를 만들고, 각 입출력 자료형은 pg 용으로 바꿔야합니다. 그리고, 그것을 확장 모듈로 등록해서 SQL 구문에서 사용합니다.
차근하게 만들면 그렇게 어렵지는 않습니다.
답변 감사드립니다.
테스트 예제로 만들어서 진행 하다가 공유 라이브러리 작성하고 postgresql에서 호출 까지는 했는데
해당 라이브러리 참조하여 함수를 작성하려고 하니 library version missmatch 발생하는데 혹시 어느 부분
확인해야 하는지 알 수 있을까요?
postgresql 확장 모듈은 메이져 버전 단위로 다시 빌드 해서 사용해야합니다.
9.6 에서 만든 .so 파일을 10 에서 사용하려면, 그런 메시지가 나와요.
그때는 10 버전 include 와 라이브러리를 가지고, 해당 확장 모듈을 다시 컴파일 하셔야합니다.
제가 빌드한 so 파일은 9.3 대상으로 하였고 함수를 작성하려는 버전도 동일하게 9.3입니다.
그런데 .c 로 작성된 함수를 postgresql에서 create 하면 라이브러리 버전이 8.4라고 나오는데 도무지 원인을 찾을 수가 없습니다...ㅠㅠ
더 여쭙고 싶은게 기존에 실행파일을 만드는 a.c 라는 파일이 있는데 실행 파일을 만들 때 b.so라는 라브러리를 사용하는데 a.c를 postgresql에서 사용 가능한 함수 형식으로 바꾼다면 b.so라는 라이브러리는 어떻게 처리가 되어야 하는지 질문 드립니다.
1.
동적 라이브러리 로딩 우선 순위 때문에 발생하는 문제로 예상됩니다.
LD_LIBRARY_PATH 값으로 그 우선 순위를 조정할 수 있고요,
같은 이름의 8.4 동적 라이브러리를 먼저 로딩하면서 발생하는 것 같습니다.
8.4 관련 패키지들을 쓰지 않는다면 다 지우고 해보세요.
일단 만든 .so 파일이 어떤 동적라이브러리를 사용하는지 ldd 명령으로 확인해 보세요.
2.
a.c 가 b.so 를 이용한다면, a.c로 만든 a.so 가 b.so를 이용하게 됩니다.
즉, pg는 a.so를 로딩하고, 그 로딩과정에서 b.so는 자동으로 로딩하겠죠. 로딩할 수 있다면.