그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 : 문서 : 17 : 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알림감지하다알림메시지(참조토토 커뮤니티 : 문서 : 17 : 32.9. 비동기 알림).
다음을 사용하는 클라이언트PQsendQuery/PQgetResult또한 서버에서 아직 처리 중인 윈 토토을 취소하려고 시도할 수 있습니다. 참조PostgreSQL : 문서 : 17 : 32.7. 진행중인 쿼리 스포츠 토토 베트맨. 그러나 반환 값에 관계없이PQcancelBlocki윈 토토, 애플리케이션은 다음을 사용하여 일반적인 결과 읽기 시퀀스를 계속해야 합니다.PQgetResult. 성공적으로 취소되면 윈 토토이 다른 경우보다 더 빨리 종료됩니다.
위에서 설명한 기능을 사용하면 데이터베이스 서버의 입력을 기다리는 동안 차단되는 것을 방지할 수 있습니다. 그러나 애플리케이션이 출력을 서버로 보내기를 기다리는 것을 차단할 가능성은 여전히 있습니다. 이는 상대적으로 흔하지 않지만 매우 긴 SQL 명령이나 데이터 값이 전송되는 경우 발생할 수 있습니다. (애플리케이션이 다음을 통해 데이터를 보내는 경우 가능성이 훨씬 더 높습니다.복사, 그러나.) 이러한 가능성을 방지하고 완전한 논블로킹 데이터베이스 작업을 달성하려면 다음과 같은 추가 기능을 사용할 수 있습니다.
PQset비차단 #연결의 비차단 상태를 설정합니다.
int PQsetnonblocki윈 토토(PGconn *conn, int arg);
다음의 경우 연결 상태를 비차단으로 설정합니다.arg은 1이거나 다음과 같은 경우 차단됩니다.argis 0. 정상이면 0을 반환하고, 오류이면 -1을 반환합니다.
비차단 상태에서 다음 호출이 성공했습니다.PQsendQuery, PQputline, PQputnbytes, PQputCopyData및PQendcopy차단하지 않습니다; 변경 사항은 플러시될 때까지 로컬 출력 버퍼에 저장됩니다. 호출에 실패하면 오류가 반환되며 다시 시도해야 합니다.
참고하세요PQexec비차단 모드를 따르지 않습니다. 호출되면 어쨌든 패션을 차단하는 역할을 합니다.
PQis비차단 #데이터베이스 연결의 차단 상태를 반환합니다.
int PQisnonblocki윈 토토(const PGconn *conn);
연결이 비차단 모드로 설정된 경우 1을 반환하고 차단하는 경우 0을 반환합니다.
PQflush #대기 중인 출력 데이터를 서버로 플러시하려고 시도합니다. 성공하면(또는 보내기 큐가 비어 있으면) 0을 반환하고, 어떤 이유로 실패하면 -1을 반환하며, 보내기 큐에 있는 모든 데이터를 아직 보낼 수 없으면 1을 반환합니다(이 경우는 연결이 비차단인 경우에만 발생할 수 있습니다).
int PQflush(PGconn *conn);
비차단 연결에서 윈 토토이나 데이터를 보낸 후 호출PQflush. 1을 반환하면 소켓이 읽기 또는 쓰기 준비가 될 때까지 기다립니다. 쓰기 가능해지면 호출하세요.PQflush다시. 읽을 준비가 되면 호출하세요.PQconsumeInput그런 다음 전화하세요PQflush다시. 까지 반복하세요.PQflush0을 반환합니다. (읽기 준비가 되었는지 확인하고 다음을 사용하여 입력을 배출해야 합니다.PQconsumeInput, 서버가 우리에게 데이터(예: NOTICE 메시지)를 보내려는 시도를 차단할 수 있고 우리가 읽을 때까지 데이터를 읽지 않기 때문입니다.) 한 번PQflush0을 반환하고, 소켓이 읽기 준비가 될 때까지 기다린 다음 위에서 설명한 대로 응답을 읽습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.