SQLite3 sqlite3_open成功,sqlite3_exec因CANTOPEN失败(错误14)

时间:2014-10-24 10:26:17

标签: c sqlite

我有这个代码,它在C:

中使用SQLite
int 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调用成功了。我希望在公开电话上发生这个错误。

1 个答案:

答案 0 :(得分:3)

您的非root用户可能没有权限在托管数据库的目录中创建和写入新文件。

该错误代码的documentation说明:

  

相关文件可能是主数据库文件,也可能是多个临时磁盘文件

SQLite创建临时文件,至少在您修改数据库时。如果您的非root进程无法创建,那么您将收到该错误。您可以通过在strace中运行您的计划来验证该问题,例如:类似的东西:

strace -e trace=open ./a.out

您将看到哪些对open的调用失败(可能是针对日志文件),以及出于什么原因。