사용법 #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 포인터. }
PostgreSQL은 SPI 학습의 (a)
추천
출처www.cnblogs.com/kelvin19840813/p/12210308.html
추천
행