2014-12-30 3 views
1

libpq (C로 작성)을 기반으로 Objective-C에 PostgreSQL 라이브러리를 작성하고 있습니다. PQexec을 성공적으로 사용하는 동기식 쿼리 메서드를 작성한 반면, 내 비동기 메서드는 쿼리 결과를받지 못합니다. PQgetResult은 항상 NULL을 반환합니다.PQgetResult는 항상 NULL을 반환합니다.

다양한 조합의 연결 및 쿼리 검사를 시도했지만 문제를 해결하지 못했습니다. 쿼리 자체는 한 행이있는 테이블의 SELECT입니다. 동기 메서드에 대해이 비동기 메서드를 스왑하고 원하는 동작을 수행 할 수 있습니다. 또한 내가 유지하고있는 conn 포인터가 동일한 객체를 전체적으로 참조하고 있는지 확인했습니다.

나는 이 아니며, 단일 행 모드를 사용합니다.입니다. 문제를 디버그하는 데 도움하려면

+ (instancetype) resultSetWithQuery: (NSString*) query usingConnection: (PGConnection*) conn whenComplete: (Callback) callback { 
    PGResultSet* resultSet = [[PGResultSet alloc] init]; 
    NSString* encoding = [conn encoding]; 
    int success = PQsendQuery([conn conn], [query UTF8String]); 

    [resultSet setEncoding:encoding]; 
    [resultSet setQuery:query]; 
    [resultSet setConn:conn]; 

    if(success){ 
     NSTimeInterval timeInterval = 0.5; 
     NSTimer* checkStatus = [NSTimer scheduledTimerWithTimeInterval:timeInterval 
                   target:resultSet 
                  selector:@selector(checkIfComplete) 
                  userInfo:nil 
                  repeats:YES]; 
     [resultSet setTimer:checkStatus]; 
     [resultSet setCallback:callback]; 
    } 

    return resultSet; 
} 

- (void)checkIfComplete{ 
    if(!PQconsumeInput([[self conn] conn])){ 
     [[self timer] invalidate]; 
    } 

    if(PQisBusy([[self conn] conn])){ 
     return; 
    } 

    // result is always NULL 
    PGresult* result = PQgetResult([[self conn] conn]); 

    // ... 
} 

답변

1

, 나는 디버그 레벨 설정으로 PostgreSQL 서버를 시작 :

$ postgres -d 2 

로그를 검토 한 결과, 추가 쿼리는 동일한 PGconn 연결 인스턴스에서 실행되는 것을 보았다.


내 문제가 일련의 사태에서 파생 된 생각 : 쿼리에

  1. 호출 PQsendQuery합니다.
  2. 새 쿼리에서 PQexec을 호출하십시오.
  3. 결과를 PQsendQuery으로 예상하여 PQgetResult을 호출하십시오.

이 경우 PQgetResult은 유효한 성공적으로 실행 된 쿼리에도 불구하고 NULL을 반환합니다.

해결 방법 : 다중 스레드 또는 비동기 환경에서 연결 인스턴스에 대한 쿼리를 관리하기 위해 큐를 만들어야합니다. pqlib은 사용자 대신이 작업을 수행하지 않습니다. 여러 비동기 작업에서 이것이 사실 일 수는 있지만 단일 동기 및 단일 비동기 작업의 경우도 마찬가지입니다.

관련 문제