사용자 정의 함수를 작성하고 등록한 후 당신의 작업은 본질적으로 완료되었습니다.Postgres, 그러나 객체 코드를토토 핫해야합니다 (예 : A.O파일 또는 공유 라이브러리) 그것은 당신의 기능을 구현합니다. 앞서 언급했듯이Postgres코드를토토 핫합니다 필요에 따라 런타임. 코드가 동적으로되도록하기 위해 토토 핫하면 특별한 방식으로 컴파일하고 링크해야 할 수도 있습니다. 이 섹션에서는 편집을 수행하는 방법과 사용자 정의를토토 핫하기 전에 링크 편집이 필요합니다 달리기로 기능PostgresServer.
매뉴얼을 읽고 다시 읽을 것으로 예상해야합니다. C 컴파일러, CC (1) 및 링크 편집기 LD (1) 페이지 구체적인 질문이 있습니다. 또한 Contrib Area (pgroot/contrib) 및 회귀 테스트 스위트 디렉토리pgroot/src/test/regress이 프로세스의 몇 가지 작업 예를 포함합니다. 당신이 an 예를 들어 문제가 없어야합니다.
다음 용어는 다음과 같습니다.
동적 로딩isPostgres객체로 수행합니다 파일. 객체 파일이 실행 중에 복사됩니다Postgres서버 및 함수 및 파일 내 변수는 함수에 사용할 수 있습니다. 내에서Postgres프로세스.Postgres운영 체제가 제공하는 동적 로딩 메커니즘.
토토 핫 및 링크 편집다른 종류의 생성을 위해 객체 파일을 사용합니다. 객체 파일 (예 : 실행 프로그램 또는 공유 라이브러리). 링크 편집 프로그램, ld (1).을 사용하여이를 수행합니다.
다음의 일반적인 제한 및 메모도 아래 토론 :
create function 명령에 주어진 경로는 절대적이어야합니다. 눈에 보이는 디렉토리를 참조하는 경로 (즉, "/"로 시작) 기계에서Postgres서버가 실행 중입니다.
팁 :상대 경로는 실제로 작동하지만 데이터베이스가있는 디렉토리와 관련하여 ( 일반적으로 프론트 엔드 응용 프로그램에는 보이지 않습니다). 분명히, 사용자가 프론트 엔드 애플리케이션을 시작한 디렉토리 서버가 완전히 다른 상태에서 실행 중일 수 있으므로 기계!
thePostgres사용자는해야합니다 기능 작성 명령에 주어진 경로를 통과 할 수 있습니다. 객체 파일을 읽을 수 있습니다. 이것은이기 때문입니다.Postgres서버로 실행됩니다Postgres사용자가 아닌 사용자 프론트 엔드 프로세스를 시작하는 사람. (파일 만들기 또는 a 상위 수준의 디렉토리는 읽을 수 없거나 실행 불가능합니다 "Postgres"사용자는 매우 일반적인 실수입니다.)
객체 파일 내에 정의 된 기호 이름은 충돌해서는 안됩니다 서로 또는 기호로 정의 된Postgres.
GNU C 컴파일러는 일반적으로 특별한 것을 제공하지 않습니다. 운영 체제의 동적을 사용하는 데 필요한 옵션 로더 인터페이스. 그러한 경우, 함께 제공되는 C 컴파일러 운영 체제를 사용해야합니다.
Linux ELF에서 객체 파일을 컴파일러 플래그 -fpic.
예를 들어
# 단순 리눅스 예제 % CC -FPIC -Cfoo.c라는 객체 파일을 생성foo.o동적으로토토 핫 할 수 있습니다 안으로Postgres. 추가 없음 토토 핫 또는 링크 편집을 수행해야합니다.