2

Google Drive 文件夹的路径可以在文件中找到,该文件...\AppData\Local\Google\Drive\sync_config.db是一个 SQLITE3 数据库。我的 Windows C++ 程序曾经成功地获取此数据,但最近它停止工作,无论是在我的 PC 上还是对于我听说过的客户。数据库必须仍然有效,因为我可以使用sqlite3命令行实用程序打开数据库并使用我尝试以编程方式使用的确切查询成功查询它。

如下所示的代码中发生的事情是它永远不会过去**sqlite3_prepare_v2**,它会返回错误代码26。此代码通常表明该文件不是有效的数据库。那么为什么命令行实用程序有效呢?

有什么想法可能会突然破坏这段代码吗?

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);
}
4

2 回答 2

1

我找到了解决办法。我的产品是用 V3.6 构建的并且停止工作;起作用的命令行实用程序实际上是 V3.7。所以我用 sqlite3.c V3.7.14.1 重建了程序,它现在可以工作了!

显然,谷歌使用了更新版本的 SQLite,它以某种方式使数据库不向后兼容。

(由于我的程序还创建了一个 SQLite 数据库,然后在 Android 设备上使用,我有点担心更新我的版本,但它似乎工作正常。)

于 2012-10-26T22:04:04.467 回答
0

命令行实用程序不会尝试以只读模式打开数据库。试试SQLITE_OPEN_READWRITE

只读模式可能失败的原因有两个:数据库有热日志并且需要恢复,或者您启用了 WAL。

于 2012-10-26T07:04:06.780 回答