Sqlite不再打开Goog​​le云端硬盘数据库

时间:2012-10-25 22:39:17

标签: c++ sqlite

可以在 ...\AppData\Local\Google\Drive\sync_config.db 文件中找到Google云端硬盘文件夹的路径,该文件是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);
}

2 个答案:

答案 0 :(得分:1)

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

显然,谷歌使用较新版本的SQLite,不知何故使数据库不向后兼容。

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

答案 1 :(得分:0)

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

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