C로 작성된 함수는 동적으로 컴파일될 수 있습니다. 로드 가능한 객체(공유 라이브러리라고도 함)는 다음과 같은 용도로 사용됩니다. 사용자 정의 SQL 함수를 구현합니다. 처음으로 특정 로드 가능한 개체 파일의 사용자 정의 함수는 다음과 같습니다. 백엔드 세션에서 호출되면 동적 로더가 해당 객체를 로드합니다. 함수를 호출할 수 있도록 파일을 메모리에 저장합니다.함수 생성사용자 정의의 경우 따라서 함수는 다음과 같은 두 가지 정보를 지정해야 합니다. 함수: 로드 가능한 개체 파일의 이름, C 이름 해당 객체 내에서 호출할 특정 함수의 (링크 기호) 파일. C 이름이 명시적으로 지정되지 않은 경우 SQL 함수 이름과 동일한 것으로 간주됩니다.
참고:처음으로 사용한 후, 동적으로 로드된 사용자 기능은 메모리에 유지됩니다. 동일한 세션에서 함수에 대한 향후 호출은 기호 테이블 조회로 인해 약간의 오버헤드가 발생합니다.
오브젝트 파일을 지정하는 문자열(첫 번째 문자열 AS 절)은 다음과 같아야 합니다.전체 경로의 작은따옴표로 묶인 함수의 개체 코드 파일 마크. AS 절에 링크 기호가 있으면 링크는 기호는 작은따옴표로 묶어야 하며, C 소스의 함수 이름과 정확히 동일해야 합니다. 코드. Unix 시스템에서는 다음 명령을 사용합니다.nm할 것이다 동적으로 로드 가능한 모든 링크 기호를 인쇄합니다. 개체.
참고: 포스트그레스함수를 자동으로 컴토토 사이트 순위하지 않습니다. 그래야만 해 CREATE FUNCTION 명령에 사용되기 전에 컴토토 사이트 순위됩니다. 참조 자세한 내용은 아래를 참조하세요.
현재 C에는 두 가지 다른 호출 규칙이 사용됩니다. 기능. 최신 "버전 1" 호출 규칙이 표시됩니다. a를 작성하여PG_FUNCTION_INFO_V1()매크로 아래 그림과 같이 함수를 호출합니다. 그런 매크로가 부족해요 이전 스타일("버전 0") 기능을 나타냅니다. 언어 이름 CREATE FUNCTION에 지정된 값은 두 경우 모두 'C'입니다. 구식 이제 이식성 문제로 인해 기능이 더 이상 사용되지 않으며 기능이 부족하지만 여전히 지원됩니다. 호환성 이유.
다음 표는 매개변수에 필요한 C 유형을 제공합니다. Postgres에 로드될 C 함수에서. 는 "정의된 위치" 열은 실제 헤더 파일을 제공합니다(.../src/토토 사이트 순위/디렉토리) 동등한 C 유형이 정의됩니다. 항상 해야 한다는 점에 유의하세요. 포함postgres.h먼저, 그리고 그건 차례에는 다음이 포함됩니다c.h.
표 13-1. 내장에 해당하는 C 유형포스트그레유형
| 내장형 | C타입 | 다음에 정의됨 |
|---|---|---|
| 절대 | 절대시간 | utils/nabstime.h |
| 부울 | 부울 | 포함/c.h |
| 상자 | (상자 *) | utils/geo-decls.h |
| 바이테아 | (바이테아 *) | include/postgres.h |
| "문자" | 문자 | 해당 사항 없음 |
| 시드 | CID | include/postgres.h |
| 날짜시간 | (날짜시간 *) | include/c.h 또는 include/postgres.h |
| int2 | int2 또는 int16 | include/postgres.h |
| int2벡터 | (int2벡터 *) | include/postgres.h |
| int4 | int4 또는 int32 | include/postgres.h |
| float4 | (float4 *) | include/c.h 또는 include/postgres.h |
| float8 | (float8 *) | include/c.h 또는 include/postgres.h |
| lseg | (LSEG *) | include/geo-decls.h |
| 이름 | (이름) | include/postgres.h |
| oid | oid | include/postgres.h |
| oidVector | (oidVector *) | include/postgres.h |
| 경로 | (PATH *) | utils/geo-decls.h |
| 점 | (POINT *) | utils/geo-decls.h |
| regproc | regproc 또는 REGPROC | include/postgres.h |
| 상대시간 | 상대시간 | utils/nabstime.h |
| 텍스트 | (텍스트 *) | include/postgres.h |
| tid | 아이템포인터 | 저장소/itempr.h |
| 기간 | (시간 범위 *) | include/c.h 또는 include/postgres.h |
| 틴터벌 | TimeInterval | utils/nabstime.h |
| xid | (XID *) | include/postgres.h |
내부적으로,포스트그레기본 유형을 "메모리 덩어리"로 간주합니다. 사용자 정의 유형에 대해 정의하는 함수는 차례로 다음과 같은 방식을 정의합니다. 그포스트그레작동 가능 그것. 즉,포스트그레스할 것이다 디스크에서만 데이터를 저장 및 검색하고 데이터를 입력, 처리, 출력하는 사용자 정의 함수입니다. 기본 유형은 세 가지 내부 형식 중 하나를 가질 수 있습니다.
값 전달, 고정 길이
참조로 전달, 고정 길이
참조로 전달, 가변 길이
값 기준 유형은 길이가 1, 2 또는 4바이트만 될 수 있습니다(또한 8바이트). 바이트(컴퓨터에서 sizeof(Datum)가 8인 경우). 당신은 유형이 동일하도록 주의 깊게 정의하세요. 모든 아키텍처의 크기(바이트)입니다. 예를 들어,긴유형은 4이므로 위험합니다. 일부 시스템에서는 바이트이고 다른 시스템에서는 8바이트인 반면int유형은 대부분의 Unix에서 4바이트입니다. (대부분의 개인용 컴퓨터에는 없지만) 합리적인 의 구현int4입력하세요 Unix 시스템은 다음과 같습니다.
/* 4바이트 정수, 값으로 전달됨 */ typedef int int4;
반면에, 어떤 크기의 고정 길이 유형도 가능합니다. 참조로 전달되었습니다. 예를 들어, 여기 샘플이 있습니다 a의 구현포스트그레유형:
/* 참조로 전달된 16바이트 구조 */
typedef 구조체
이중 x, y;
가리키다;
이러한 유형에 대한 포인터만 전달할 때 사용할 수 있습니다. 그리고 밖으로포스트그레함수. 이러한 유형의 값을 반환하려면 적절한 양을 할당하십시오. 함께한 기억팔록(), 다음을 입력하세요. 메모리를 할당하고 이에 대한 포인터를 반환합니다. (또는 해당 값을 반환하여 동일한 유형의 입력 값을 반환할 수 있습니다. 포인터.절대로내용 수정 그러나 참조에 의한 전달 입력 값은 제외됩니다.)
마지막으로 모든 가변 길이 유형도 다음을 통해 전달되어야 합니다. 참조. 모든 가변 길이 유형은 길이로 시작해야 합니다. 정확히 4바이트의 필드와 그 안에 저장될 모든 데이터 유형은 해당 유형 바로 뒤에 있는 메모리에 위치해야 합니다. 길이 필드. 길이 필드는 전체 길이입니다. 구조(즉, 길이 필드의 크기를 포함합니다. 자체). 다음과 같이 텍스트 유형을 정의할 수 있습니다.
typedef 구조체
int4 길이;
문자 데이터[1];
텍스트;
분명히 여기에 표시된 데이터 필드는 충분하지 않습니다. 가능한 모든 문자열을 보유하십시오. 그런 선언은 불가능하다 구조C. 조작할 때 가변 길이 유형에서는 할당에 주의해야 합니다. 올바른 메모리 양을 확인하고 길이 필드를 초기화하세요. 에 대한 예를 들어, 텍스트 구조에 40바이트를 저장하려면 다음과 같은 코드 조각을 사용할 수 있습니다.
#include "postgres.h" ... 문자 버퍼[40]; /* 소스 데이터 */ ... 텍스트 *목적지 = (텍스트 *) palloc(VARHDRSZ + 40); 대상-길이 = VARHDRSZ + 40; memmove(대상-데이터, 버퍼, 40); ...
이제 우리는 가능한 모든 구조를 검토했습니다. 기본 유형에 대해서는 실제 함수의 몇 가지 예를 보여줄 수 있습니다.
우리는 다음을 제시합니다."이전 스타일"호출 규칙 먼저 --- 현재는 이 접근 방식이 더 이상 사용되지 않으므로 처음에 처리하는 것이 더 쉽습니다. 에서 버전-0 메서드, C 함수의 인수 및 결과 일반적인 C 스타일로 선언되었지만 사용에 주의해야 합니다. 위에 표시된 대로 각 SQL 데이터 유형의 C 표현입니다.
다음은 몇 가지 예입니다:
#include "postgres.h"
#include <문자열.h
/* 값별 */
정수
add_one(int 인수)
인수 + 1을 반환합니다.
/* 참고로 고정 길이 */
float8 *
add_one_float8(float8 *arg)
float8 *result = (float8 *) palloc(sizeof(float8));
*결과 = *arg + 1.0;
결과 반환;
포인트 *
makepoint(포인트 *pointx, 포인트 *pointy)
Point *new_point = (Point *) palloc(sizeof(Point));
new_point-x = 포인트x-x;
new_point-y = 뾰족한-y;
new_point를 반환합니다.
/* 참고로 가변 길이 */
텍스트 *
카피텍스트(텍스트 *t)
/*
* VARSIZE는 구조체의 총 크기(바이트)입니다.
*/
text *new_t = (text *) palloc(VARSIZE(t));
VARATT_SIZEP(new_t) = VARSIZE(t);
/*
* VARDATA는 구조체의 데이터 영역에 대한 포인터입니다.
*/
memcpy((void *) VARDATA(new_t), /* 대상 */
(void *) VARDATA(t), /* 소스 */
VARSIZE(t)-VARHDRSZ); /* 몇 바이트 */
new_t를 반환;
텍스트 *
concat_text(텍스트 *arg1, 텍스트 *arg2)
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
VARATT_SIZEP(new_text) = new_text_size;
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
new_text를 반환합니다.
위의 코드가 토토 사이트 순위로 준비되었다고 가정funcs.c그리고 공유 토토 사이트 순위로 컴토토 사이트 순위되었습니다. 객체에 대해 함수를 정의할 수 있습니다.포스트그레다음과 같은 명령으로:
함수 생성 add_one(int4) 반환 int4
그대로 'PGROOT/tutorial/funcs.so' 언어 'c'
와(isStrict);
-- SQL 함수 이름 add_one()의 오버로드에 유의하세요.
함수 생성 add_one(float8)은 float8을 반환합니다.
그대로 'PGROOT/tutorial/funcs.so',
'add_one_float8'
LANGUAGE 'c' WITH (isStrict);
CREATE FUNCTION makepoint(point, point) RETURNS 포인트
그대로 'PGROOT/tutorial/funcs.so' 언어 'c'
와(isStrict);
CREATE FUNCTION copytext(text) 텍스트를 반환합니다.
그대로 'PGROOT/tutorial/funcs.so' 언어 'c'
와(isStrict);
CREATE FUNCTION concat_text(text, text) 텍스트를 반환합니다.
그대로 'PGROOT/tutorial/funcs.so' 언어 'c'
WITH(isStrict);
여기PGROOT는 에 대한 전체 경로포스트그레소스 트리. 시스템에 따라 파일 이름은 공유 객체의 경우 다음으로 끝나지 않을 수 있습니다..so하지만.sl또는 다른 것; 그에 맞게 조정하세요.
함수를 "엄격"으로 지정했음을 주목하세요. 이는 시스템이 자동으로 NULL을 가정해야 함을 의미합니다. 입력 값이 NULL인 경우 결과입니다. 이렇게 함으로써 우리는 함수 코드에서 NULL 입력을 확인해야 합니다. 없이 이를 위해서는 명시적으로 NULL을 확인해야 합니다. 예를 들어 다음과 같습니다. 각 참조별 전달에 대한 널 포인터 확인 논쟁. (값별 전달 인수의 경우에는 확인하는 방법!)
이 호출 규칙은 사용하기 간단하지만 그렇지 않습니다. 매우 휴대 가능합니다. 일부 아키텍처에는 문제가 있습니다. int보다 작은 데이터 유형을 이런 식으로 전달합니다. 또한, NULL 결과를 반환하거나 NULL에 대처하는 간단한 방법 함수를 엄격하게 만드는 것 외에 다른 방식으로 인수를 사용하지 마세요. 는 다음에 제시되는 버전 1 규칙은 이러한 문제를 극복합니다. 이의가 있습니다.
버전 1 호출 규칙은 매크로에 의존하여 다음을 수행합니다. 인수 전달의 복잡성을 대부분 억제하고 결과. 버전 1 함수의 C 선언은 다음과 같습니다. 항상
데이텀 기능 이름(PG_FUNCTION_ARGS)또한 매크로 호출
PG_FUNCTION_INFO_V1(기능 이름);동일한 소스 파일에 나타나야 합니다(일반적으로 함수 자체 바로 앞에 작성됨). 이 매크로 호출은 Postgres는 현재 "내부" 언어 기능에 필요합니다. 모든 내부 기능이 버전 1이라고 가정합니다. 그러나 그것은필수동적으로 로드되는 함수의 경우.
버전 1 함수에서는 각각의 실제 인수를 가져옵니다 를 사용하여PG_GETARG_xxx()다음에 해당하는 매크로 인수의 데이터 유형이며 결과는를 사용하여 반환됩니다.PG_RETURN_xxx()반환 유형에 대한 매크로입니다.
여기서는 버전-1에 코딩된 위와 동일한 기능을 보여줍니다. 스타일:
#include "postgres.h"
#include <문자열.h
#include "fmgr.h"
/* 값별 */
PG_FUNCTION_INFO_V1(add_one);
데이텀
add_one(PG_FUNCTION_ARGS)
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(인수 + 1);
/* 참고로 고정 길이 */
PG_FUNCTION_INFO_V1(add_one_float8);
데이텀
add_one_float8(PG_FUNCTION_ARGS)
/* FLOAT8의 매크로는 참조에 의한 전달 특성을 숨깁니다 */
float8 인수 = PG_GETARG_FLOAT8(0);
PG_RETURN_FLOAT8(arg + 1.0);
PG_FUNCTION_INFO_V1(메이크포인트);
데이텀
메이크포인트(PG_FUNCTION_ARGS)
/* 여기서 Point의 참조별 전달 특성은 숨겨지지 않습니다 */
포인트 *pointx = PG_GETARG_POINT_P(0);
포인트 *pointy = PG_GETARG_POINT_P(1);
Point *new_point = (Point *) palloc(sizeof(Point));
new_point-x = 포인트x-x;
new_point-y = 뾰족한-y;
PG_RETURN_POINT_P(new_point);
/* 참고로 가변 길이 */
PG_FUNCTION_INFO_V1(텍스트 복사);
데이텀
카피텍스트(PG_FUNCTION_ARGS)
텍스트 *t = PG_GETARG_TEXT_P(0);
/*
* VARSIZE는 구조체의 총 크기(바이트)입니다.
*/
text *new_t = (text *) palloc(VARSIZE(t));
VARATT_SIZEP(new_t) = VARSIZE(t);
/*
* VARDATA는 구조체의 데이터 영역에 대한 포인터입니다.
*/
memcpy((void *) VARDATA(new_t), /* 대상 */
(void *) VARDATA(t), /* 소스 */
VARSIZE(t)-VARHDRSZ); /* 몇 바이트 */
PG_RETURN_TEXT_P(new_t);
PG_FUNCTION_INFO_V1(concat_text);
데이텀
concat_text(PG_FUNCTION_ARGS)
텍스트 *arg1 = PG_GETARG_TEXT_P(0);
텍스트 *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
VARATT_SIZEP(new_text) = new_text_size;
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ),
VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
PG_RETURN_TEXT_P(new_text);
그함수 생성명령은 버전 0과 동일합니다.
얼핏 보면 버전-1 코딩 규칙이 보일 수 있습니다. 무의미한 모호주의에 불과합니다. 그러나 그들은 다음을 제공합니다. 매크로가 불필요한 것을 숨길 수 있기 때문에 많은 개선이 이루어졌습니다. 세부 사항. 예를 들어 add_one_float8을 코딩할 때 더 이상 float8이 참조별 전달이라는 점을 알아야 합니다. 유형. 또 다른 예는 GETARG 매크로가 가변 길이 유형은 가져오기를 처리할 필요성을 숨깁니다. "토스트된"(압축 또는 라인 외부) 값입니다. 옛날 스타일복사본그리고concat_text위에 표시된 함수는 실제로 구운 값이 있으면 잘못된 것입니다. 전화pg_detoast_datum()그들의 입력. (이전 스타일의 동적으로 로드된 함수에 대한 핸들러 현재 이 세부 사항을 처리하고 있지만 그 정도는 덜합니다. 버전 1 기능보다 효율적입니다.)
버전 1 기능의 큰 개선이 더 좋습니다 NULL 입력 및 결과 처리. 매크로PG_ARGISNULL(n)함수 테스트를 허용합니다. 각 입력이 NULL인지 여부(물론 이를 수행하는 것은 선언되지 않은 함수에 필요함"엄격"). 와 마찬가지로PG_GETARG_xxx()매크로, 입력 인수는 0부터 시작하여 계산됩니다. 받는 사람 NULL 결과를 반환하고 실행합니다.PG_RETURN_NULL(); 이것은 엄격하고 엄격하지 않은 함수.
버전 1 함수 호출 규칙을 사용하면 다음이 가능합니다. 반환"설정"결과 및 구현 트리거 함수 및 절차적 언어 호출 처리기. 버전 1 코드는 버전 0보다 이식성이 더 좋습니다. 함수 호출 프로토콜에 대한 ANSI C 제한을 위반하지 않습니다. 자세한 내용은 참조src/backend/utils/fmgr/README소스에서 배포.
복합 유형에는 C와 같은 고정 레이아웃이 없습니다. 구조. 복합 유형의 인스턴스에는 null이 포함될 수 있습니다. 필드. 또한, 상속 계층 구조는 다른 계층 구조와 다른 필드를 가질 수 있습니다. 동일한 상속 계층 구조의 구성원입니다. 그러므로포스트그레스절차 제공 C에서 복합 유형의 필드에 액세스하기 위한 인터페이스입니다. As포스트그레스다음 세트를 처리합니다. 행, 각 행은 불투명하게 함수에 전달됩니다. 유형의 구조튜플. 우리가 쿼리에 응답하는 함수를 작성하고 싶습니다.
SELECT 이름, c_overpaid(emp, 1500) AS 초과 지불 엠프에서 WHERE 이름 = 'Bill' OR 이름 = 'Sam';위 쿼리에서 c_overpaid를 다음과 같이 정의할 수 있습니다:
#include "postgres.h"
#include "executor/executor.h" /* for GetAttributeByName() */
부울
c_overpaid(TupleTableSlot *t, /* EMP의 현재 행 */
int32 제한)
bool은 null입니다.
int32 급여;
급여 = DatumGetInt32(GetAttributeByName(t, "급여", &isnull));
만약 (isnull)
반환(거짓);
급여 한도 반환;
/* 버전-1 코딩에서 위의 내용은 다음과 같습니다. */
PG_FUNCTION_INFO_V1(c_초과지불);
데이텀
c_과다지급(PG_FUNCTION_ARGS)
TupleTableSlot *t = (TupleTableSlot *) PG_GETARG_POINTER(0);
int32 제한 = PG_GETARG_INT32(1);
bool은 null입니다.
int32 급여;
급여 = DatumGetInt32(GetAttributeByName(t, "급여", &isnull));
만약 (isnull)
PG_RETURN_BOOL(거짓);
/* 대안으로, null 급여에 대해 PG_RETURN_NULL()을 수행하는 것을 선호할 수도 있습니다 */
PG_RETURN_BOOL(급여 한도);
GetAttributeByName이것은포스트그레시스템 기능 현재 행에서 속성을 반환합니다. 그것은 세 가지가 있습니다 인수: 유형의 인수TupleTableSlot*함수에 전달된 이름 원하는 속성과 이를 알려주는 반환 매개변수 속성이 null인지 여부.GetAttributeByName데이텀 값을 반환합니다. 적절한 데이터 유형을 사용하여 적절한 데이터 유형으로 변환할 수 있습니다.데이텀겟XXX()매크로.
다음 쿼리를 통해포스트그레스에 대해 알아요c_과다지급기능:
함수 생성 c_overpaid(emp, int4) 반환 부울 그대로 'PGROOT/tutorial/obj/funcs.so' 언어 'c';
새 행을 구성하거나 수정하는 방법이 있지만 C 함수 내의 기존 행은 너무 멀습니다. 이 매뉴얼에서 논의하기에는 복잡합니다.
이제 우리는 더 어려운 글쓰기 작업으로 넘어갑니다 프로그래밍 언어 기능. 주의하세요: 매뉴얼이 당신을 프로그래머로 만들어주지는 않습니다. 당신은 좋은 것을 가지고 있어야합니다 이해C(포함 포인터와 malloc 메모리 관리자 사용) 쓰다C사용할 함수포스트그레. 그럴 수도 있지만 이외의 언어로 작성된 함수를 로드할 수 있습니다.C속으로포스트그레스, 이것은 종종 어려운 일입니다( 전혀 가능합니다) 다음과 같은 다른 언어 때문에포트란그리고파스칼종종 같은 것을 따르지 않습니다호출 규칙asC. 즉, 다른 언어는 통과하지 못합니다 함수 사이의 인수와 반환 값도 같은 방식으로 수행됩니다. 이러한 이유로 우리는 귀하의 프로그래밍 언어가 함수는 다음과 같이 작성되었습니다.C.
건축의 기본 규칙C함수는 다음과 같습니다:
관련 헤더(포함) 토토 사이트 순위은 아래에 설치됩니다./usr/local/pgsql/include또는 동등하다. 당신은 사용할 수 있습니다pg_config --includedir그것이 당신의 시스템 어디에 있는지 알아내기 위해 (또는 사용자가 실행될 시스템). 에 대한 매우 낮은 수준의 작업을 완료해야 할 수도 있습니다.포스트그레SQL소스 트리 가능합니다.
메모리를 할당할 때 다음을 사용하십시오.포스트그레루틴팔록그리고프리해당하는 대신C라이브러리 루틴malloc그리고무료. 에 의해 할당된 메모리팔록해방될 것입니다 각 거래가 끝날 때마다 자동으로 방지 메모리 누수.
항상 다음을 사용하여 구조의 바이트를 0으로 만듭니다.memset또는bzero. 여러 루틴(예: 해시 액세스 방법, 해시 조인 및 정렬 알고리즘) 계산 구조에 포함된 원시 비트의 기능. 짝수 구조의 모든 필드를 초기화하면 다음이 발생할 수 있습니다. 몇 바이트의 정렬 패딩( 구조) 쓰레기 값을 포함할 수 있습니다.
대부분의 내부포스트그레스유형은 다음에서 선언됩니다.postgres.h, 함수는 관리자 인터페이스(PG_FUNCTION_ARGS등)이 포함됨fmgr.h, 따라서 다음 위치에 포함해야 합니다. 적어도 이 두 파일은요. 이식성의 이유로 다음을 수행하는 것이 가장 좋습니다. 포함postgres.h 첫 번째, 다른 시스템이나 사용자보다 먼저 헤더 토토 사이트 순위. 포함postgres.h또한 포함됩니다c.h, elog.h그리고palloc.h당신을 위해.
객체 파일 내에 정의된 기호 이름은 다음과 같을 수 없습니다. 서로 충돌하거나에 정의된 기호와 충돌합니다.포스트그레SQL서버 실행 가능. 함수의 이름을 바꾸거나 이에 대한 오류 메시지가 나타나면 변수를 사용하세요.
귀하의 개체 코드를 컴토토 사이트 순위하고 연결하여 동적으로 로드됨포스트그레항상 특별한 것이 필요합니다 플래그. 참조섹션 13.4.6이를 수행하는 방법에 대한 자세한 설명은 특정 운영 체제.
귀하가 귀하를 사용하기 전에포스트그레SQLC로 작성된 확장 함수 순서대로 특별한 방법으로 컴토토 사이트 순위하고 링크해야 합니다. 서버에서 필요에 따라 동적으로 로드할 수 있도록 합니다. 정확히 말하자면, 가공유 라이브러리필요 생성됩니다.
자세한 내용은 다음 문서를 읽어야 합니다. 운영 체제, 특히 C 매뉴얼 페이지 컴파일러,cc및 링크 편집기ld. 게다가,포스트그레SQL소스 코드에는 여러 가지가 포함되어 있습니다 작업 예제는기여디렉토리. 이러한 예를 활용하면 다음과 같은 결과를 얻을 수 있습니다. 모듈은 가용성에 따라 다름포스트그레SQL그러나 소스 코드는 있습니다.
공유 라이브러리 생성은 일반적으로 연결과 유사합니다. 실행 파일: 먼저 소스 파일이 객체로 컴파일됩니다. 파일이면 개체 파일이 서로 연결됩니다. 개체 파일은 다음과 같이 생성되어야 합니다.위치 독립적 코드 (사진), 이는 개념적으로 다음을 수행할 수 있음을 의미합니다. 저장될 때 메모리의 임의 위치에 배치됩니다. 실행 파일에 의해 로드됩니다. (목적 파일은 실행 파일은 그런 식으로 컴파일되지 않습니다.) 공유 라이브러리에는 이를 구별하기 위한 특수 플래그가 포함되어 있습니다. 실행 파일을 연결합니다. --- 적어도 이것은 이론입니다. 일부에서는 시스템 관행은 훨씬 더 추악합니다.
다음 예에서는 소스 코드가 다음과 같다고 가정합니다. 파일에서foo.c그리고 우리는 공유 라이브러리foo.so. 는 중간 개체 토토 사이트 순위이 호출됩니다.foo.o별도의 언급이 없는 한. 공유 라이브러리 둘 이상의 객체 파일을 포함할 수 있지만 우리는 하나만 사용합니다. 여기.
생성할 컴토토 사이트 순위러 플래그사진이다-fpic. 공유 라이브러리를 생성하기 위한 링커 플래그는 다음과 같습니다.-공유.
gcc -fpic -c foo.c ld -shared -o foo.so foo.o이 내용은 버전 4.0부터 적용됩니다.BSD/OS.
생성할 컴토토 사이트 순위러 플래그사진is-fpic. 받는 사람 공유 라이브러리를 생성하면 컴파일러 플래그는 다음과 같습니다.-공유.
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o이는 버전 3.0부터 적용됩니다.FreeBSD.
생성할 시스템 컴토토 사이트 순위러의 컴토토 사이트 순위러 플래그사진is+z. 사용시GCC그것은-fpic. 공유 라이브러리에 대한 링커 플래그 이다-b. 그래서
cc +z -c foo.c또는
gcc -fpic -c foo.c그리고 나서
ld -b -o foo.sl foo.oHP-UX확장 프로그램을 사용합니다.sl대부분과 달리 공유 라이브러리의 경우 다른 시스템.
사진기본값입니다. 아니요 특별한 컴파일러 옵션이 필요합니다. 링커 옵션 공유 라이브러리를 생성하는 것은-공유.
cc -c foo.c ld -shared -o foo.so foo.o
생성할 컴토토 사이트 순위러 플래그사진is-fpic. 켜짐 어떤 상황에서는 일부 플랫폼-fPIC다음의 경우 사용해야 합니다-fpic작동하지 않습니다. GCC를 참고하세요 자세한 내용은 설명서를 참조하세요. 생성할 컴토토 사이트 순위러 플래그 공유 라이브러리는-공유. 에이 전체 예는 다음과 같습니다.
cc -fpic -c foo.c cc -shared -o foo.so foo.o
생성할 컴토토 사이트 순위러 플래그사진is-fpic. 에 대한ELF시스템, 플래그가 있는 컴토토 사이트 순위러-공유이다 공유 라이브러리를 연결하는 데 사용됩니다. ELF가 아닌 구형 버전에서는 시스템,ld -B공유 가능이다 사용되었습니다.
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o
생성할 컴토토 사이트 순위러 플래그사진is-fpic. ld -B공유 가능링크에 사용됩니다. 공유 라이브러리.
gcc -fpic -c foo.c ld -Bshareable -o foo.so foo.o
사진이 기본값이므로 컴토토 사이트 순위 명령은 일반적인 명령입니다.ld특수 옵션을 사용하여 다음을 수행합니다. 연결:
cc -c foo.c ld -shared -expect_unresolved '*' -o foo.so foo.o시스템 대신 GCC에서도 동일한 절차가 사용됩니다. 컴파일러; 특별한 옵션은 필요하지 않습니다.
생성할 컴토토 사이트 순위러 플래그사진이다-KPICSun 컴토토 사이트 순위러와-fpic와GCC. 링크를 공유하려면 라이브러리, 컴파일러 옵션은 다음과 같습니다.-G컴파일러 또는 대안으로-공유와GCC.
cc -KPIC -c foo.c cc -G -o foo.so foo.o또는
gcc -fpic -c foo.c gcc -G -o foo.so foo.o
생성할 컴토토 사이트 순위러 플래그사진is-K PICSCO 컴토토 사이트 순위러와-fpic와GCC. 링크를 공유하려면 라이브러리, 컴파일러 옵션은 다음과 같습니다.-GSCO 컴토토 사이트 순위러와-공유와GCC.
cc -K PIC -c foo.c cc -G -o foo.so foo.o또는
gcc -fpic -c foo.c gcc -shared -o foo.so foo.o
팁:확장을 패키징하려는 경우 광범위한 배포를 위한 모듈 사용을 고려해야 합니다.GNU Libtool용 공유 라이브러리 구축. 플랫폼을 캡슐화합니다. 일반적이고 강력한 인터페이스로의 차이점. 심각한 패키징에는 라이브러리에 대한 고려 사항도 필요합니다. 버전 관리, 기호 확인 방법 및 기타 문제.
결과 공유 라이브러리 파일은 다음으로 로드될 수 있습니다.포스트그레. 지정할 때 파일 이름을함수 생성명령을 실행하려면 공유 라이브러리 파일의 이름을 지정해야 합니다. (다음으로 끝남).so)보다는 간단한 객체 토토 사이트 순위.
참고:사실은,포스트그레당신의 이름은 상관하지 않습니다 공유 라이브러리 파일인 경우 해당 파일입니다.