내부,Postgresa "메모리 덩어리"로서 기본 유형. 사용자 정의 기능은 다음과 같습니다 당신은 턴에서 유형을 정의합니다.Postgres작동 할 수 있습니다. 즉,Postgres보관 전용 디스크에서 데이터를 검색하고 사용자 정의 토토을 사용하십시오. 데이터를 입력, 프로세스 및 출력합니다. 기본 유형은 하나를 가질 수 있습니다 세 가지 내부 형식 :
통과 별 가치, 고정 길이
참조별로 통과, 고정 길이
참조별로 전달, 가변 길이
바이 값 유형은 길이가 1, 2 또는 4 바이트 일 수 있습니다 ( 컴퓨터는 다른 크기의 부가 가치 유형을 지원합니다.)Postgres그 자체는 정수 유형 만 통과합니다 값. 당신은 당신의 유형을 그들이 당신의 유형을 정의하도록주의해야합니다. 모든 아키텍처에서 크기 (바이트)가됩니다. 예를 들어, 그만큼Long타입은 위험합니다 일부 기계에서는 4 바이트이고 다른 기계에는 8 바이트, 반면int타입은 대부분 4 바이트입니다unix기계 (대부분은 아니다 개인용 컴퓨터). 의 합리적인 구현int4타입 ONunix기계는 다음과 같습니다.
/ * 4-byte 정수, 가치에 의해 통과 */ typedef int int4;
반면에, 모든 크기의 고정 길이 유형이 전달 될 수 있습니다. 회의 별. 예를 들어 다음은 A의 샘플 구현이 있습니다.Postgres유형 :
/ * 16 바이트 구조, 참조로 통과 */ typedef struct 숯 데이터 [16]; char16;
그러한 유형에 대한 포인터 만 전달할 때 사용할 수 있습니다. 에서Postgres함수. 마지막으로 모든 가변 길이 유형도 지나쳐야합니다 참조. 모든 가변 길이 유형은 길이 필드로 시작해야합니다 정확히 4 바이트의 경우, 해당 유형 내에 저장 될 모든 데이터는 그 길이 필드 바로 다음에 메모리에 위치하십시오. 길이 필드는 구조의 총 길이입니다 (즉, IT 길이 필드 자체의 크기를 포함합니다). 우리는 정의 할 수 있습니다 다음과 같이 텍스트 유형 :
typedef struct int4 길이; 숯 데이터 [1]; 텍스트;
분명히, 데이터 필드는 모든 것을 유지하기에 충분히 길지 않습니다. 가능한 문자열 - 그러한 구조를 선언하는 것은 불가능합니다C. 가변 길이를 조작 할 때 유형, 우리는 올바른 양의 메모리를 할당하기 위해주의해야합니다. 길이 필드를 초기화하십시오. 예를 들어, 저장하고 싶다면 텍스트 구조의 40 바이트는 다음과 같은 코드 조각을 사용할 수 있습니다. 이것:
#include "postgres.h" ... 숯 버퍼 [40]; / * 소스 데이터 */ ... 텍스트 *대상 = (텍스트 *) palloc (varhdrsz + 40); 대상- 길이 = varhdrsz + 40; Memmove (대상- 데이터, 버퍼, 40); ...
이제 우리는베이스를위한 가능한 모든 구조를 살펴 보았습니다. 유형, 우리는 실제 토토의 몇 가지 예를 보여줄 수 있습니다. 가정하다funcs.c모양 :
#include <string.h #include "postgres.h" int add_one (int arg) 반환 (arg + 1); 텍스트 * concat_text (text *arg1, text *arg2) int32 new_text_size = varsize (arg1) + varsize (arg2) - varhdrsz; 텍스트 *new_text = (텍스트 *) palloc (new_text_size); memset ((void *) new_text, 0, new_text_size); varsize (new_text) = new_text_size; strncpy (vardata (new_text), vardata (arg1), varsize (arg1) -varhdrsz); strncat (vardata (new_text), vardata (arg2), varsize (arg2) -varhdrsz); return (new_text); 텍스트 * 카피 텍스트 (텍스트 *t) /* * varsize는 바이트의 구조물의 총 크기입니다. */ 텍스트 *new_t = (텍스트 *) palloc (varsize (t)); memset (new_t, 0, varsize (t)); varsize (new_t) = varsize (t); /* * Vardata는 구조물의 데이터 영역에 대한 포인터입니다. */ memcpy ((void *) vardata (new_t), / *대상 * / (void *) vardata (t), / *소스 * / varsize (t) -varhdrsz); / * 얼마나 많은 바이트 */ 반환 (new_t);
onOSF/1우리는 다음을 입력 할 것입니다 :
함수 생성 add_one (int4)은 int4를 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; CONCIT CONCAT_TEXT (텍스트, 텍스트) 텍스트를 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; 함수 CopyText (텍스트)를 작성합니다 텍스트를 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; as
다른 시스템에서는 파일 이름을 .sl에서 끝내야 할 수도 있습니다. (공유 도서관임을 나타 내기 위해).
복합 유형에는 C 구조와 같은 고정 레이아웃이 없습니다. 복합 유형의 인스턴스에는 널 필드가 포함될 수 있습니다. 게다가, 상속 계층의 일부인 복합 유형은 같은 상속의 다른 구성원과는 다른 필드 계층. 그러므로,Postgres복합 필드에 액세스하기위한 절차 인터페이스를 제공합니다 C.에서 유형Postgres인스턴스 세트를 처리하면 각 인스턴스가 전달됩니다. 유형의 불투명 구조로서의 토토튜플. 우리가 함수를 작성하고 싶다고 가정 해 봅시다 쿼리 답변
* 이름, c_overpaid (EMP, 1500)를 초과 지불로 선택하십시오 emp에서 여기서 name = 'bill'또는 name = 'sam';위의 쿼리에서 c_overpaid를 다음과 같이 정의 할 수 있습니다.
#include "postgres.h" #include "libpq-fe.h" / * 튜플 * / 부 c_overpaid (tuple t,/ * 현재 emp */ int4 한계) bool isnull = false; int4 급여; 급여 = (int4) getAttributeByName (t, "Salary", & isnull); if (isnull) 반환 (거짓); 반품 (급여 한도);
getAttributeByNamePostgres시스템 기능 현재 인스턴스에서 속성을 반환합니다. 세 가지가 있습니다 인수 : 튜플 유형의 인수는 함수로 전달되었습니다. 원하는 속성의 이름과 반환 매개 변수 속성이 null인지 설명합니다.getAttributeByName데이터를 올바르게 정렬합니다 반환 값을 원하는 유형에 시전 할 수 있습니다. 예를 들어, 당신이 있다면 유형 이름 인 속성 이름이 있습니다.getAttributeByName전화는 다음과 같습니다.
char *str; ... str = (char *) getAttributeByName (t, "name", & isnull)
다음 쿼리가Postgresc_overpaid에 대해 알고 있습니다 토토:
* 함수 만들기 c_overpaid (emp, int4)는 bool을 반환합니다 'pgroot/튜토리얼/obj/funcs.so'language 'c'; as
새로운 인스턴스를 구성하거나 수정하는 방법이 있지만 C 함수 내에서 기존 인스턴스도 있습니다. 이 매뉴얼에서 논의하기 위해 복잡합니다.
이제 우리는 더 어려운 프로그램 작성 작업으로 돌아갑니다. 언어 기능. 경고 :이 매뉴얼 섹션은 그렇지 않습니다 당신을 프로그래머로 만드십시오. 당신은 잘 이해해야합니다C(포인터 사용 포함 및 malloc 메모리 관리자) 쓰기를 시도하기 전에C사용하기위한 토토Postgres. 로드하는 것이 가능할 수 있습니다 이외의 언어로 작성된 토토CinPostgres, 이것은 종종 (전혀 가능할 때) 종종 어렵습니다. 와 같은 언어FortranandPascal종종 같은 것을 따르지 않습니다 "Calling Convention"으로C. 즉, 다른 언어는 인수와 반환 값을 전달하지 않습니다. 같은 방식으로 토토합니다. 이러한 이유로, 우리는 그것을 가정 할 것입니다 프로그래밍 언어 토토은에 작성됩니다.C. 건축의 기본 규칙C기능은 다음과 같습니다.
대부분의 헤더 (포함) 파일 용Postgres이미 설치해야pgroot/include(그림 2 참조). 너 항상 포함해야합니다
-i $ pgroot/includeCC 명령 줄에서. 때때로, 당신은 당신을 찾을 수 있습니다 서버 소스 자체에있는 헤더 파일이 필요합니다 (예 : 포함하여 설치 한 파일이 필요합니다). 그 경우 하나 이상을 추가해야 할 수도 있습니다
-i $ pgroot/src/백엔드 -i $ pgroot/src/백엔드/포함 -i $ pgroot/src/backend/port/<portname -i $ pgroot/src/backend/obj(여기서 <portname은 포트의 이름입니다. 또는 sparc).
메모리를 할당 할 때를 사용하십시오.Postgres대신 Palloc과 Pfree의 루틴 해당C라이브러리 일상적인 malloc 및 무료. Palloc이 할당 한 메모리 각 거래가 끝날 때 자동으로 해제되고 메모리 누출 방지.
항상 memset 또는 BZERO. 여러 루틴 (예 : 해시 액세스 방법, 해시 가입 및 정렬 알고리즘) 원시 비트의 토토 계산 귀하의 구조에 포함되어 있습니다. 모든 필드를 초기화하더라도 귀하의 구조에는 여러 바이트의 정렬이있을 수 있습니다. 쓰레기를 포함 할 수있는 패딩 (구조의 구멍) 값.
대부분의 내부Postgres유형은 postgres.h에 선언됩니다. 따라서 항상 해당 파일을 포함시키는 것이 좋습니다. Postgres.h 포함에는 Elog.h 및 Palloc.h가 포함됩니다 너.
객체 코드를 컴파일하고로드하여 동적으로로드Postgres항상 특별한 깃발이 필요합니다. 방법에 대한 자세한 설명은 부록 A를 참조하십시오. 귀하의 특정 운영 체제.