2011-09-03 5 views
0

Linux Apache 2.x 호스트에서 SQL Server에 대한 ODBTP 인터페이스로 작업하고 있습니다. mod_dbm은 이것을 지원하지 않으므로 Apache를 지원하는 모든 호스트로 코드를 옮길 수 있어야합니다.mod_dbd가 드라이버를 지원하지 않을 때 Apache에서 지속되는 DB Conn에 대해 어떻게해야합니까?

내 환경에 대한주의 사항 : 제가 아파치에 대한 C에 싸여 아파치 2.2.17, C++, ODBTP 1.14, SQL 서버 2008

를 사용하고 나는 성공적으로 ODBTP 연결을 구현하고 난 완전히 수 있어요 모듈 자체의 데이터를 사용하지만 JSON 형식으로 데이터를 검색하는 로컬 HTTP 호출을 사용하는 응용 프로그램에 대해 연결, 연결 해제 및 다시 시작하는 대신 지속적으로 연결을 유지하려고합니다.

문제는 데이터베이스 자격 증명으로 안전하게 보호하기 위해 일반 텍스트 작성 응용 프로그램의 보안을 신뢰하지 않는 환경에서이 응용 프로그램과 모듈을 배포해야한다는 것입니다. 응용 프로그램이 HTTP를 통해 연결되면 내 모듈이 암호를 해독하여 데이터베이스에 전송하는 암호화 된 자격 증명 만 제공합니다.

현재 데이터베이스에 대한 핸들을 만들고 모듈 정의의 키가있는 apr_hash_t 테이블에 저장하고 있습니다. 응용 프로그램이 연결되면 모듈은 해당 응용 프로그램에 대한 연결을 찾기 위해 응용 프로그램에서 URL에 지정하는 고유 한 요청 별 토큰을 찾습니다. 이것은 한 번만 작동합니다.

해시 키는 초기에 풀에서 생성 된 char *이며 해시 테이블의 행으로 ODBTP 핸들과 함께 저장되는 32 자리 키입니다. 어떤 방법으로, 호출 사이의 키가 수정되고 원래의 키는 잘린 버전입니다.

예 : 1) 응용 프로그램에서 지속적인 연결을 시작하기 위해 1 번의 전화를 겁니다. 이 작동합니다. 2) SQL 문자열을 실행하기 위해 응용 프로그램에서 3 등을 맞댄 호출을합니다. (/ 별/execute_sql/고유/<>/sql/<>) x 3

첫 번째 호출이 완벽하며 데이터를 검색합니다. 다음 호출은 키로 저장된 토큰이 절단되고 모듈은 연관된 키를 찾을 수 없습니다. 토큰은 시도 2에서와 같은 잘린 상태입니다.

메모리를 덮어 쓰고 있는지 아닌지 확실하지 않습니까? 나는 데이터가 손상되었을 수있는 곳을 찾기 위해 모든 지점에서 함수를 사용할 수 있도록 해시 테이블의 내용을 추출하기 위해 짧은 루프 함수를 작성했지만 내 발견은 의미가 없다. 나는 uri에 포함 된 데이터를 찾기 위해 uri를 분할해야합니다. 나는이 함수에서 "raw = apr_psprintf (apache-> pool,"% s ", subject)와 같은 줄로 이동하는 메모리를 추적했다;" 아래 코드에 있습니다.

void theRequest::get_exploded_str(char *subject, char *delimiter) 
{ 
    // variables 
    char *raw, *next, *last; 
    // create the split chars database if not created 
    loadSDB(); 
    apr_array_clear(x_split_chars); 
    subject = apr_pstrndup(apache->pool, subject, string(subject).length()); 
    raw = apr_psprintf(apache->pool,"%s", subject); 

    next = (char*)apr_strtok(raw, delimiter, &last); 

    while (next) 
    { 
     // add next to array 
     *(char **) apr_array_push(x_split_chars) = apr_pstrdup(apache->pool, next); 
     // fetch next 
     next = (char*)apr_strtok(NULL, delimiter, &last); 
    } 

    return; 
}; 

키가 어떻게 든 이동되기 때문에 통화 1에서는 완벽하게 작동하지만 통화 2에서는 작동하지 않습니다.

아이디어가 있으십니까? 아니면 내가 더 나은 이것을 달성하기 위해 APR_RESLIST를 사용할 수있는 방법에 대한 생각은 어느 정도입니까?

미리 감사드립니다.

답변

0

내가 직접 응용 프로그램을 통해 풀링 할 수는 없지만 ODBTP 라이브러리 자체를 통해 풀을 찾았습니다. TCP에서 ODBC 로의 연결이기 때문에 어느 정도 연결을 풀링 할 수는 있었지만 충분히 효율적이지는 않았습니다.

저는이 임무를 포기했지만 서버 환경이 변경되어 응용 프로그램 데이터베이스로 SQLite3을 사용하려고합니다.