2012-10-25 2 views
2

Google 드라이브 폴더의 경로는 ...\AppData\Local\Google\Drive\sync_config.db 파일 (SQLite3 데이터베이스)에서 찾을 수 있습니다. 내 Windows C++ 프로그램은이 데이터를 성공적으로 가져 오는 데 사용되었지만 최근에는 내 PC와 내가들은 고객 모두에게 작동이 중지되었습니다. sqlite3 명령 줄 유틸리티를 사용하여 데이터베이스를 열고 프로그래밍 방식으로 사용하려고하는 정확한 쿼리로 성공적으로 쿼리 할 수 ​​있기 때문에 데이터베이스가 여전히 유효해야합니다. 아래 그림과 같이 코드에서 어떻게됩니까Sqlite가 Google 드라이브 데이터베이스를 더 이상 열지 않습니다.

는 오류 코드 26을 반환, 과거 **sqlite3_prepare_v2**를 얻을 수 없다는 것이다. 이 코드는 일반적으로 파일이 유효한 데이터베이스가 아님을 나타냅니다. 그렇다면 커맨드 라인 유틸리티는 왜 작동합니까?

어떤 아이디어가 갑자기이 코드를 어기 는가?

extern CString GoogleDrivePath() 
{ 
    CString sPath = ""; 
    CString sDbPath; 
    char acValue[1024]; 
    DWORD lSize = sizeof(acValue); 
    struct _stat fstat; 
    sqlite3 *pDb; 
    sqlite3_stmt *pStmt; 
    int iSts; 
    char acSelect[] = "SELECT data_value FROM data WHERE entry_key = 'local_sync_root_path';"; 
    const unsigned char *pPath; 

    DWORD lLen = GetEnvironmentVariable("LOCALAPPDATA", acValue, lSize); 
    if (lSize <= 0) return(sPath); 

    sDbPath = acValue; 
    sDbPath += "\\Google\\Drive\\sync_config.db"; 
    if (_stat(sDbPath, &fstat) < 0) return(sPath); 

    iSts = sqlite3_open_v2(sDbPath, &pDb, SQLITE_OPEN_READONLY, NULL); 
    if (iSts) return(sPath); 
    iSts = sqlite3_prepare_v2(pDb, acSelect, -1, &pStmt, NULL); 
    if (!iSts) { 
    iSts = sqlite3_step(pStmt); 
    if (iSts == SQLITE_ROW) { 
     pPath = sqlite3_column_text(pStmt, 0); 
     if (pPath != NULL) { 
     sPath = pPath; 
     } 
    } 
    sqlite3_finalize(pStmt); 
    } 

    sqlite3_close(pDb); 
    return(sPath); 
} 
+0

추측 : 그것은 쿼리 구문이 잘못되었을 때와 같이 관련이없는 상황에서도 SQLite가'SQLite_NOTADB'를 반환하는 것을 좋아합니다. 너의 것으로 보이는 유일한 것은 SQL 문자열에서 후행하는';'이다. 이것은 아마도 불필요 할 것이다. 그것없이 프로그램을 사용해 볼 수 있습니까? – millimoose

+0

아니, 그게 아니야. 수수께끼는 이것이 그대로 작동하는 데 사용되었지만 이제는 실패합니다. 이것은 내 구성이나 SQLite 빌드에 동의하지 않는 데이터베이스 내에서 Google이 변경 한 것을 의미합니다. 그것은 명령 행 유틸리티가 V3.6.23이기 때문에 엄격하게 버전 작업이 아니며 작동합니다. – gordonwd

답변

1

수정 사항을 발견했습니다. 내 제품은 V3.6으로 제작되었으며 작동을 멈췄습니다. 실제로 작동했던 명령 행 유틸리티는 실제로 V3.7이었다. 그래서 나는 sqlite3.c V3.7.14.1로 프로그램을 재구성했고 이제는 작동한다!

Google에서는 SQLite의 최신 버전을 사용하여 데이터베이스가 이전 버전과 호환되지 않도록합니다.

는 (내 프로그램은 또한 다음 안드로이드 장치에 사용되는 SQLite 데이터베이스를 생성하기 때문에, 내 버전을 업데이트하는 방법에 대한 약간 걱정했지만, 그것은 확인을 작동하는 것으로 나타납니다.) 무작위로 인터넷 검색에서

0

명령 줄 유틸리티는 읽기 전용 모드로 데이터베이스를 열려고하지 않습니다. 시도하십시오 SQLITE_OPEN_READWRITE.

읽기 전용 모드가 실패하는 데에는 데이터베이스에 최신 저널이있어 복구가 필요하거나 WAL을 사용하도록 설정하는 두 가지 이유가 있습니다.

+0

그렇지 않습니다. 위 내 의견을 참조하십시오. 이전에는 작동 했으므로 데이터베이스에 관한 것이 변경되었을 것입니다. – gordonwd

+0

변경되었을 수있는 데이터베이스에 대한 몇 가지 이유를 나열했습니다. READONLY없이 시도하십시오. –

관련 문제