그PQexec함수는 일반적인 동기 애플리케이션에서 토토 커뮤니티을 제출하는 데 적합합니다. 그러나 일부 사용자에게는 중요할 수 있는 몇 가지 결함이 있습니다.
PQexec토토 커뮤니티이 완료되기를 기다립니다. 애플리케이션에 수행해야 할 다른 작업(예: 사용자 인터페이스 유지 관리)이 있을 수 있으며, 이 경우 응답 대기를 차단하지 않을 것입니다.
클라이언트 응용 프로그램의 실행이 결과를 기다리는 동안 일시 중지되므로 응용 프로그램이 진행 중인 토토 커뮤니티을 취소하려고 하는지 결정하기가 어렵습니다. (신호 처리기에서 수행할 수 있지만 그렇지 않으면 수행할 수 없습니다.)
PQexec하나만 반환할 수 있습니다.PGresult구조. 제출된 토토 커뮤니티 문자열에 여러 개가 포함된 경우SQL토토 커뮤니티, 마지막을 제외한 모든 토토 커뮤니티PGresult다음에 의해 삭제됨PQexec.
PQexec항상 토토 커뮤니티의 전체 결과를 수집하여 단일로 버퍼링합니다.PGresult. 이는 애플리케이션의 오류 처리 논리를 단순화하지만 많은 행을 포함하는 결과에는 비실용적일 수 있습니다.
이러한 제한이 마음에 들지 않는 애플리케이션은 대신 기본 기능을 사용할 수 있습니다.PQexec다음에서 빌드됨:PQsendQuery그리고PQgetResult. 또한 있습니다PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribe준비됨, PQsendDescribePortal, PQsendClose준비됨및PQsendClosePortal, 다음과 함께 사용할 수 있습니다.PQgetResult기능을 복제하기 위해PQexecParams, PQprepare, PQexec준비됨, PQdescribe준비됨, PQdescribePortal, PQclose준비됨및PQclosePortal각각.
PQsendQuery #결과를 기다리지 않고 서버에 명령을 제출합니다. 명령이 성공적으로 전달되면 1이 반환되고, 그렇지 않으면 0이 반환됩니다. 이 경우에는 다음을 사용하세요.PQerrorMessage실패에 대한 추가 정보를 얻으려면).
int PQsendQuery(PGconn *conn, const char *command);
성공적으로 호출한 후PQsendQuery, 전화PQgetResult결과를 얻기 위해 한 번 이상.PQsendQuery다음까지 (동일한 연결에서) 다시 호출할 수 없습니다.PQgetResult토토 커뮤니티이 완료되었음을 나타내는 널 포인터를 반환했습니다.
파이프라인 모드에서는 이 기능이 허용되지 않습니다.
PQsendQueryParams #결과를 기다리지 않고 서버에 토토 커뮤니티과 별도의 매개변수를 제출합니다.
int PQsendQueryParams(PGconn *conn,
const char *명령,
정수 nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
이것은 다음과 같습니다.PQsendQuery단, 쿼리 매개변수는 쿼리 문자열과 별도로 지정할 수 있습니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQexecParams. 좋다PQexecParams, 쿼리 문자열에 하나의 토토 커뮤니티만 허용합니다.
PQsendPrepare #완료를 기다리지 않고 주어진 매개변수를 사용하여 준비된 토토 커뮤니티문을 생성하라는 요청을 보냅니다.
int PQsendPrepare(PGconn *conn,
const char *stmt이름,
const char *쿼리,
정수 nParams,
const Oid *paramTypes);
이것은 비동기 버전입니다.PQprepare: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult서버가 준비된 명령문을 성공적으로 생성했는지 여부를 확인합니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQprepare.
PQsendQuery 준비됨 #결과를 기다리지 않고 주어진 매개변수로 준비된 토토 커뮤니티문을 실행하라는 요청을 보냅니다.
int PQsendQueryPrepared(PGconn *conn,
const char *stmt이름,
정수 nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
이것은 다음과 유사합니다.PQsendQueryParams, 그러나 쿼리 문자열을 제공하는 대신, 미리 준비된 명령문의 이름을 지정하여 실행할 명령을 지정합니다. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQexec준비됨.
PQsendDescribePrepared #완료를 기다리지 않고 지정된 준비된 명령문에 대한 정보를 얻기 위한 요청을 제출합니다.
int PQsendDescribePrepared(PGconn *conn, const char *stmtName);
이것은 비동기 버전입니다.PQdescribe준비됨: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribe준비됨.
PQsendDescribePortal #완료를 기다리지 않고 지정된 포털에 대한 정보를 얻기 위한 요청을 제출합니다.
int PQsendDescribePortal(PGconn *conn, const char *portalName);
이것은 비동기 버전입니다.PQdescribePortal: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQdescribePortal.
PQsendClose준비됨 #완료를 기다리지 않고 지정된 준비된 토토 커뮤니티문을 닫으라는 요청을 제출합니다.
int PQsendClosePrepared(PGconn *conn, const char *stmtName);
이것은 비동기 버전입니다.PQclose준비됨: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQclose준비됨.
PQsendClosePortal #완료를 기다리지 않고 지정된 포털을 닫으라는 요청을 제출합니다.
int PQsendClosePortal(PGconn *conn, const char *portalName);
이것은 비동기 버전입니다.PQclosePortal: 요청을 전달할 수 있으면 1을 반환하고 그렇지 않으면 0을 반환합니다. 통화가 성공한 후 전화하세요.PQgetResult결과를 얻으려면. 함수의 매개변수는 다음과 동일하게 처리됩니다.PQclosePortal.
PQgetResult #이전의 다음 결과를 기다립니다.PQsendQuery, PQsendQueryParams, PQsendPrepare, PQsendQuery준비됨, PQsendDescribe준비됨, PQsendDescribePortal, PQsendClose준비됨, PQsendClosePortal, PQsendPipelineSync또는PQpipelineSync호출하고 반환합니다. 토토 커뮤니티이 완료되면 null 포인터가 반환되고 더 이상 결과가 없습니다.
PGresult *PQgetResult(PGconn *conn);
PQgetResult토토 커뮤니티이 완료되었음을 나타내는 널 포인터를 반환할 때까지 반복적으로 호출되어야 합니다. (활성화된 토토 커뮤니티이 없을 때 호출되는 경우,PQgetResult한 번에 null 포인터를 반환합니다.) null이 아닌 각 결과는PQgetResult동일한 것을 사용하여 처리되어야 합니다PGresult이전에 설명한 접근자 함수입니다. 다음을 사용하여 각 결과 객체를 해제하는 것을 잊지 마세요.PQclear끝났을 때. 참고하세요PQgetResult토토 커뮤니티이 활성화되어 있고 필요한 응답 데이터가 아직 읽혀지지 않은 경우에만 차단됩니다.PQconsumeInput .
파이프라인 모드에서,PQgetResult오류가 발생하지 않는 한 정상적으로 반환됩니다. 오류를 일으킨 쿼리 이후 다음 동기화 지점까지(및 제외) 전송된 모든 후속 쿼리에 대해 다음 유형의 특수 결과입니다.PGRES_PIPELINE_ABORTED이 반환되고 그 뒤에 널 포인터가 반환됩니다. 파이프라인 동기화 지점에 도달하면 다음 유형의 결과가 나타납니다.PGRES_PIPELINE_SYNC반환될 것입니다. 동기화 지점 이후 다음 쿼리의 결과는 즉시 따라옵니다(즉, 동기화 지점 이후에는 null 포인터가 반환되지 않습니다).
언제라도PQresultStatus치명적인 오류를 나타냅니다.PQgetResult널 포인터를 반환할 때까지 호출되어야 합니다.libpq오류 정보를 완전히 처리합니다.
사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 토토 커뮤니티 문자열에 여러 개가 포함된 경우SQL토토 커뮤니티을 수행하면 해당 토토 커뮤니티의 결과를 개별적으로 얻을 수 있습니다. (이것은 간단한 형태의 중첩 처리를 허용합니다. 클라이언트는 한 토토 커뮤니티의 결과를 처리하는 동안 서버는 동일한 토토 커뮤니티 문자열에서 이후 쿼리를 계속 작업할 수 있습니다.)
다음으로 얻을 수 있는 자주 원하는 또 다른 기능PQsendQuery그리고PQgetResult은(는) 한 번에 제한된 수의 행으로 대규모 쿼리 결과를 검색하고 있습니다. 이에 대해서는에서 논의됩니다.PostgreSQL : 문서 : 18 : 32.6. 스포츠 토토 베트맨 검색 결과 chunks.
저절로 호출됨PQgetResult서버가 다음 작업을 완료할 때까지 클라이언트가 계속 차단됩니다.SQL토토 커뮤니티. 이는 두 가지 추가 기능을 적절하게 사용하면 피할 수 있습니다.
PQconsumeInput #서버에서 입력이 가능하다면, 그것을 소비하세요.
int PQconsumeInput(PGconn *conn);
PQconsumeInput일반적으로 다음을 나타내는 1을 반환합니다.“오류 없음”, 그러나 어떤 종류의 문제가 있는 경우 0을 반환합니다(이 경우PQerrorMessage상담 가능). 결과는 입력 데이터가 실제로 수집되었는지 여부를 나타내지 않습니다. 통화 후PQconsumeInput, 애플리케이션에서 확인할 수 있습니다PQisBusy및/또는PQ알림상태가 변경되었는지 확인합니다.
PQconsumeInput애플리케이션이 아직 결과나 알림을 처리할 준비가 되지 않은 경우에도 호출할 수 있습니다. 이 함수는 사용 가능한 데이터를 읽고 이를 버퍼에 저장하므로선택()읽기 준비 표시가 사라집니다. 따라서 애플리케이션은 다음을 사용할 수 있습니다.PQconsumeInput깨끗하게선택()즉시 조건을 설정하고 여유 시간에 결과를 검토하십시오.
PQisBusy #명령이 사용 중인 경우 1을 반환합니다. 즉,PQgetResult입력 대기를 차단합니다. 0 반환은 다음을 나타냅니다.PQgetResult차단하지 않는다는 확신을 갖고 호출할 수 있습니다.
int PQisBusy(PGconn *conn);
PQisBusy자체는 서버에서 데이터를 읽으려고 시도하지 않습니다. 그러므로PQconsumeInput먼저 호출해야 합니다. 그렇지 않으면 사용 중 상태가 끝나지 않습니다.
이러한 함수를 사용하는 일반적인 애플리케이션에는 다음을 사용하는 메인 루프가 있습니다.선택()또는설문조사()응답해야 하는 모든 조건을 기다립니다. 조건 중 하나는 서버에서 입력할 수 있으며, 이는 다음과 같습니다.선택()다음으로 식별된 파일 설명자에서 읽을 수 있는 데이터를 의미합니다.PQsocket. 메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그런 다음 호출할 수 있습니다.PQisBusy, 이어서PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림탐지하다알림메시지(참조Postgresql: Tài liệu: 18: 32.9. Thô와이즈 토토 báo khô와이즈 토토 đồ와이즈 토토 bộ).
다음을 사용하는 클라이언트PQsendQuery/PQgetResult또한 서버에서 아직 처리 중인 토토 커뮤니티을 취소하려고 시도할 수 있습니다. 보다PostgreSQL : 문서 : 18 : 32.7. 진행중인 쿼리 스포츠 토토 사이트. 그러나 반환 값에 관계없이PQcancelBlocking, 애플리케이션은 다음을 사용하여 일반적인 결과 읽기 시퀀스를 계속해야 합니다.PQgetResult. 성공적으로 취소되면 토토 커뮤니티이 다른 경우보다 더 빨리 종료됩니다.
위에서 설명한 기능을 사용하면 데이터베이스 서버의 입력을 기다리는 동안 차단되는 것을 방지할 수 있습니다. 그러나 애플리케이션이 출력을 서버로 보내기를 기다리는 것을 차단할 가능성은 여전히 있습니다. 이는 상대적으로 흔하지 않지만 매우 긴 SQL 명령이나 데이터 값이 전송되는 경우 발생할 수 있습니다. (애플리케이션이 다음을 통해 데이터를 보내는 경우 가능성이 훨씬 더 높습니다.복사단.) 이러한 가능성을 방지하고 완전한 논블로킹 데이터베이스 작업을 달성하려면 다음과 같은 추가 기능을 사용할 수 있습니다.
PQset비차단 #연결의 비차단 상태를 설정합니다.
int PQsetnonblocking(PGconn *conn, int arg);
다음의 경우 연결 상태를 비차단으로 설정합니다.arg은 1이거나 다음과 같은 경우 차단argis 0. 정상이면 0을 반환하고, 오류이면 -1을 반환합니다.
비차단 상태에서 다음 호출이 성공했습니다.PQsendQuery, PQputline, PQputnbytes, PQputCopyData및PQendcopy차단하지 않습니다. 변경 사항은 플러시될 때까지 로컬 출력 버퍼에 저장됩니다. 호출에 실패하면 오류가 반환되며 다시 시도해야 합니다.
참고하세요PQexec비차단 모드를 따르지 않습니다. 호출되면 어쨌든 패션을 차단하는 역할을 합니다.
PQis비차단 #데이터베이스 연결의 차단 상태를 반환합니다.
int PQisnonblocking(const PGconn *conn);
연결이 비차단 모드로 설정된 경우 1을 반환하고 차단하는 경우 0을 반환합니다.
PQflush #대기 중인 출력 데이터를 서버로 플러시하려고 시도합니다. 성공하면(또는 보내기 큐가 비어 있으면) 0을 반환하고, 어떤 이유로 실패하면 -1을 반환하며, 보내기 큐에 있는 모든 데이터를 아직 보낼 수 없으면 1을 반환합니다(이 경우는 연결이 비차단인 경우에만 발생할 수 있습니다).
int PQflush(PGconn *conn);
비차단 연결에서 토토 커뮤니티이나 데이터를 보낸 후 호출PQflush. 1을 반환하면 소켓이 읽기 또는 쓰기 준비가 될 때까지 기다립니다. 쓰기 가능해지면 호출하세요.PQflush다시. 읽을 준비가 되면 호출하세요.PQconsumeInput그런 다음 전화하세요PQflush다시. 까지 반복하세요.PQ플러시0을 반환합니다. (읽기 준비를 확인하고 다음을 사용하여 입력을 배출해야 합니다.PQconsumeInput, 서버가 우리에게 데이터(예: NOTICE 메시지)를 보내려는 시도를 차단할 수 있고 우리가 읽을 때까지 데이터를 읽지 않기 때문입니다.) 한 번PQflush0을 반환하고, 소켓이 읽기 준비가 될 때까지 기다린 다음 위에서 설명한 대로 응답을 읽습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.