PostgreSQL은 SPI 학습의 (a)

사용법 #include " postgres.h "
#포함
사용법 #include " fmgr.h " 
사용법 #include " 액세스 / xlog.h " 
사용법 #include " 복제 / walreceiver.h " 
사용법 #include " 유틸 / elog.h " 
사용법 #include " 유틸 / builtins.h " 
사용법 #include " 유틸 / 타임 스탬프. 시간 " 
#INCLUDE " funcapi.h " 
사용법 #include " 액세스 / htup_details.h " 
사용법 #include " 카탈로그 / pg_type.h " 
사용법 #include " 유틸 / pg_lsn.h "

#ifdef와 PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif 다음

PG_FUNCTION_INFO_V1 (get_rcv_replication_stat);

날짜
get_rcv_replication_stat (PG_FUNCTION_ARGS)
{
어설 션 (PG_NARGS () == 0 ); // 나타내는 입력 매개 변수 없다

IF (! RecoveryInProgress ()) // 데이터베이스가 복구 상태에서 실행되는 동안, 그렇지 않은 경우 
로 ereport (ERROR,
(errcode를 (ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE)
errmsg를 ( " 복구가 진행되지 않습니다 " ),
(errhint " .이 기능 만 복구하는 동안 실행될 수있다 " )));

/ * 방지 재배치 코드를 사용하여 휘발성 포인터 * / 
휘발성 WalRcvData walrcv * = WalRcv; // 관리 복제 된 데이터 스트림의 구조 SRC /를 포함 / 복제 / walreceiver.h 공유 메모리 
; TupleDesc tupdesc // 생성 가변 행 구분 
DatumValue 데이텀 [ 8. ]; // 스토리지 배열 데이텀 값의 길이에 대응하는 배열 생성 여러 필드를 반환해야 생성 
BOOL NULLS [ 8. ]; // 속성의 수를 튜플의 typedef 구조체 TupleDescData -> natts;

/ * 초기화 DatumValue 및 NULL 플래그 배열初始化* / 
memset 함수 (DatumValue, 0 , sizeof 연산자 (DatumValue));
memset 함수 (널, 0 , 는 sizeof (널));

/ * 초기화 정보가 튜플 설명 필드 이름과 필드 유형, 해당 헤더 파일 SRC / 포함 / 카탈로그 / pg_type.h 찾아 해당 유형에 정의 된 속성 * /

/ *
CreateTemplateTupleDesc
이 함수는 빈 튜플 기술자 구조를 할당합니다.
튜플 타입 ID 정보는 처음에 익명 레코드 유형으로 설정되어;
당신이 필요로하는 경우, 호출자는이 메소드를 오버라이드 (override) 할 수 있습니다.

TupleDescInitEntry :이 기능은 이전에 설명 할당 튜플 구조에서 하나의 속성을 초기화합니다.
여기서 attributeName가 NULL 인 경우, attname 필드 (이 우리가 모르거나 필드 이름을 필요로하지 않는 경우에) 빈 문자열로 설정됩니다.
또한, 몇몇 발신자 종래 tupdesc 데이터 유형과 관련된 필드를 변경이 기능을 이용하여, 예를 들어, 이들은 여기서 attributeName = NameStr은 (att-> attname) attname 필드를 표시하기 위해 수정되지 않아야 전달된다.
제발 참고, 지정된 데이터 유형에 대한 기본값으로 attcollation 세트입니다. 당신은 나중에 삽입 기본이 아닌 데이터 정렬, 사용 TupleDescInitEntryCollation이 필요합니다.
* / 
tupdesc = CreateTemplateTupleDesc ( 8 , 거짓 );
TupleDescInitEntry (tupdesc (AttrNumber) 1 , " last_walend_time " ,
TIMESTAMPTZOID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 2 , " last_recv_lsn " ,
LSNOID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 3 , " last_apply_lsn " ,
LSNOID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 4 , " last_apply_delay_ms " ,
INT4OID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 5 , " receiver_pid " ,
INT4OID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 6 , " receiver_state " ,
INT4OID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 7 , " receiver_start_time " ,
INT8OID, - 1 , 0 );
TupleDescInitEntry (tupdesc (AttrNumber) 8 , " receiver_conninfo " ,
TEXTOID, - 1 , 0 );
BlessTupleDesc (tupdesc); // SRC를 참조하여, 반환 형식의 건설을 완료 / / funcapi.h 포함

// DatumValue 데이텀 스토리지 어레이에 대응하는 각 값을 변환 다음으로, 해당 값에 해당하는 빈 세트에만 널링 어레이. 
TimestampTz의 receipttime 단계;
receipttime = walrcv-> latestWalEndTime;     // TimestampTz latestWalEndTime; 
DatumValue [ 0 ] = TimestampTzGetDatum (receipttime)     // #DEFINE TimestampTzGetDatum (X-) Int64GetDatum (X-) 
XLogRecPtr recvPtr;     // SRC에 /를 포함 / 접근 / xlogdefs.h 포인트 XLOG 포인터 위치. 우리가 오버 플로우로하지 않기 때문에 이러한 포인터는, 폭 64 비트입니다.

/ *
SRC / 백엔드 / 복제 / walreceiverfuncs.c : GetWalRcvWriteRecPtr
반환은 마지막 바이트 위치 walreceiver가 작성되었습니다.
(선택) 블록, 즉 walreceiver 최근에 기록 된 첫 번째 바이트의 리프레시 사이클의 시작으로 돌아 간다. 발신자는 lastChunkStart에 전달 될 수있는 값 NULL에 관심이되지 않습니다. 그리고 receiveTLI 같은.
* / 
recvPtr = GetWalRcvWriteRecPtr (NULL, NULL);    // XLogRecPtr의 recptr; 
경우 (recvPtr == 0 )
[널 1 ] = ;
다른 
DatumValue [ 1 ] = LSNGetDatum (recvPtr);    // #DEFINE LSNGetDatum (X) (Int64GetDatum ((INT64) (X)))


/ * 
xlog.c : GetXLogReplayRecPtr
최신 다시 실행 위치를 적용 가져옵니다.
WALReceiver 직접 읽기 포인터를 할 수 있도록 수출했다.

* /
XLogRecPtr applyPtr;
applyPtr = GetXLogReplayRecPtr (NULL);
경우 (recvPtr == 0 )
[널 2 ] = ;
다른 
DatumValue [ 2 ] = LSNGetDatum (applyPtr);
INT apply_delay_ms;

/ *
walreceiverfuncs.c : GetReplicationApplyDelay
지연 정보가 적용되지 않는 경우, 복사 어플리케이션 (밀리 초)의 지연 시간을 반환 -1
* / 
apply_delay_ms = GetReplicationApplyDelay ();
경우 (apply_delay_ms == - 1 )
[널 3 ] = ;
다른 
DatumValue [ 3 ] = Int32GetDatum (apply_delay_ms);
DatumValue [ 4 ] = Int32GetDatum (walrcv-> PID);
DatumValue [ 5 ] = Int32GetDatum (walrcv-> walRcvState);
DatumValue [ 6 ] = Int64GetDatum (walrcv-> startTime을);
DatumValue [ 7. ] = PointerGetDatum (cstring_to_text ((  *) walrcv-> conninfo))
 // 반품 
/ * 데이텀에 기록 AS 데이텀 튜플을 리턴 * / 
PG_RETURN_DATUM (HeapTupleGetDatum (heap_form_tuple (tupdesc, DatumValue, NULLS) ));     // heap_form_tuple 구성 튜플 및 반환 HeapTupleHeader 데이텀에 HeapTupleHeader, HeapTupleGetDatum 포인터. 

}

추천

출처www.cnblogs.com/kelvin19840813/p/12210308.html