【发布时间】:2017-12-01 12:47:39
【问题描述】:
我正在开发可以帮助我显示浏览器历史记录的 C 程序。 每当我在 sqlite 中运行任何 sql 命令时,它都会在文件中显示所有历史记录。 这就是Sql命令(包含chrome历史的历史文件)!
sqlite3 History "select datetime(last_visit_time/1000000-11644473600,'unixepoch'),url from url order by last_visit_time desc" > history_export.txt
例如它给了我一个很好的结果
2017-06-28 10:20:20 | stackoverflow.com
2017-06-28 8:20:20 google.com 2017-06-28 07.10:20 | facebook.comETC
然后我想获得相同的结果,但使用 C 应用程序。 这是我的代码:
int main()
{
sqlite3 *db;
char *err_msg = 0;
int rc = sqlite3_open("c:/Users/XXXXXX/AppData/Local/Google/Chrome/User Data/Default/History", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n",
sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
//the same command works fine in sqlite3
char *sql = "select datetime(last_visit_time/1000000-11644473600,'unixepoch'),url from urls order by last_visit_time desc";
rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
if (rc != SQLITE_OK ) {
fprintf(stderr, "Failed to select data\n");
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
system ("pause");
return 0;
}
//declaration of callback function i think that the problem is here
int callback(void *NotUsed, int argc, char **argv,
char **azColName) {
NotUsed = 0;
FILE *fp ;
fp=fopen("C:/sqlite/historyc.txt","w");
for (int i = 0; i < argc; i++) {
fprintf(fp,"%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
它向我显示旧访问的 2 或 3 行 (20/03/2017..) 但我希望得到与使用 sql 命令相同的结果。 问题可能是由于回调函数。
【问题讨论】:
-
如果你用 C 编程,为什么要添加 C++ 标签? C 和 C++ 是不同的语言。这个问题与 Google Chrome 网络浏览器有什么关系?请不要在您的问题中添加不相关的(语言或其他)标签。
-
为查询返回的每一行运行回调。每次运行时,它都会从头开始创建您的 historyc.txt 文件并向其中写入一行。因此,您最终只有一个条目,它是查询返回的最后一个条目。答案#31146713 可能对您有帮助。
-
对不起,它没有解决我的问题。Sql 命令将检索两列 Datetime 和 URL 。通常,如果回调运行每一行,那么我会得到最后一行,但它不是真的,它会显示我一个随机行......