我有这个代码,它在C:
中使用SQLiteint settings_set(const char *name, const char *value) {
int r = SQLITE_ERROR;
int res = sqlite3_open(PERSISTENTDB, &db_persistent);
if (SQLITE_OK == res) {
char *sql = sqlite3_mprintf("REPLACE INTO settings VALUES ('%q', '%q')", name, value);
r = sqlite3_exec(db_persistent, sql, 0, 0, 0);
if (SQLITE_OK == r) {
log_write(LVL_NOTICE, "[data] set setting '%s' to '%s'\n", name, value);
} else {
log_write(LVL_NOTICE, "[data] failed to set setting '%s' to '%s': code %d\n", name, value, r);
}
sqlite3_close(db_persistent);
sqlite3_free(sql);
} else {
log_write(LVL_NOTICE, "[data] settings_set(): could not open persistent database: code %d\n", res);
}
return r;
}
当此代码以root身份运行时(数据库文件设置为rw-rw-rw-
并由root拥有),这样可以正常工作。以nobody
运行时,我在SQLITE_CANTOPEN
电话上收到错误代码14(sqlite3_exec
)。所以,显然sqlite3_open
调用成功了。我希望在公开电话上发生这个错误。
答案 0 :(得分:3)
您的非root用户可能没有权限在托管数据库的目录中创建和写入新文件。
该错误代码的documentation说明:
相关文件可能是主数据库文件,也可能是多个临时磁盘文件。
SQLite创建临时文件,至少在您修改数据库时。如果您的非root进程无法创建,那么您将收到该错误。您可以通过在strace
中运行您的计划来验证该问题,例如:类似的东西:
strace -e trace=open ./a.out
您将看到哪些对open
的调用失败(可能是针对日志文件),以及出于什么原因。