mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-27 08:16:14 +02:00
Open sqlite database according to new modes.
This commit is contained in:
parent
afed9ccfad
commit
78fdd6f24e
3 changed files with 13 additions and 5 deletions
|
@ -480,13 +480,20 @@ int LocalStore::getSchema()
|
||||||
|
|
||||||
void LocalStore::openDB(State & state, bool create)
|
void LocalStore::openDB(State & state, bool create)
|
||||||
{
|
{
|
||||||
|
if (create && readOnly) {
|
||||||
|
throw Error("unable to create database while in read-only mode");
|
||||||
|
}
|
||||||
|
|
||||||
if (access(dbDir.c_str(), R_OK | (readOnly ? 0 : W_OK)))
|
if (access(dbDir.c_str(), R_OK | (readOnly ? 0 : W_OK)))
|
||||||
throw SysError("Nix database directory '%1%' is not writable", dbDir);
|
throw SysError("Nix database directory '%1%' is not writable", dbDir);
|
||||||
|
|
||||||
/* Open the Nix database. */
|
/* Open the Nix database. */
|
||||||
std::string dbPath = dbDir + "/db.sqlite";
|
std::string dbPath = dbDir + "/db.sqlite";
|
||||||
auto & db(state.db);
|
auto & db(state.db);
|
||||||
state.db = SQLite(dbPath, create);
|
auto openMode = readOnly ? SQLiteOpenMode::ReadOnly
|
||||||
|
: create ? SQLiteOpenMode::Normal
|
||||||
|
: SQLiteOpenMode::NoCreate;
|
||||||
|
state.db = SQLite(dbPath, openMode);
|
||||||
|
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
/* The cygwin version of sqlite3 has a patch which calls
|
/* The cygwin version of sqlite3 has a patch which calls
|
||||||
|
|
|
@ -50,14 +50,15 @@ static void traceSQL(void * x, const char * sql)
|
||||||
notice("SQL<[%1%]>", sql);
|
notice("SQL<[%1%]>", sql);
|
||||||
};
|
};
|
||||||
|
|
||||||
SQLite::SQLite(const Path & path, bool create)
|
SQLite::SQLite(const Path & path, SQLiteOpenMode mode)
|
||||||
{
|
{
|
||||||
// useSQLiteWAL also indicates what virtual file system we need. Using
|
// useSQLiteWAL also indicates what virtual file system we need. Using
|
||||||
// `unix-dotfile` is needed on NFS file systems and on Windows' Subsystem
|
// `unix-dotfile` is needed on NFS file systems and on Windows' Subsystem
|
||||||
// for Linux (WSL) where useSQLiteWAL should be false by default.
|
// for Linux (WSL) where useSQLiteWAL should be false by default.
|
||||||
const char *vfs = settings.useSQLiteWAL ? 0 : "unix-dotfile";
|
const char *vfs = settings.useSQLiteWAL ? 0 : "unix-dotfile";
|
||||||
int flags = SQLITE_OPEN_READWRITE;
|
int flags = mode == SQLiteOpenMode::ReadOnly
|
||||||
if (create) flags |= SQLITE_OPEN_CREATE;
|
? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE;
|
||||||
|
if (mode == SQLiteOpenMode::Normal) flags |= SQLITE_OPEN_CREATE;
|
||||||
int ret = sqlite3_open_v2(path.c_str(), &db, flags, vfs);
|
int ret = sqlite3_open_v2(path.c_str(), &db, flags, vfs);
|
||||||
if (ret != SQLITE_OK) {
|
if (ret != SQLITE_OK) {
|
||||||
const char * err = sqlite3_errstr(ret);
|
const char * err = sqlite3_errstr(ret);
|
||||||
|
|
|
@ -36,7 +36,7 @@ struct SQLite
|
||||||
{
|
{
|
||||||
sqlite3 * db = 0;
|
sqlite3 * db = 0;
|
||||||
SQLite() { }
|
SQLite() { }
|
||||||
SQLite(const Path & path, bool create = true);
|
SQLite(const Path & path, SQLiteOpenMode mode = SQLiteOpenMode::Normal);
|
||||||
SQLite(const SQLite & from) = delete;
|
SQLite(const SQLite & from) = delete;
|
||||||
SQLite& operator = (const SQLite & from) = delete;
|
SQLite& operator = (const SQLite & from) = delete;
|
||||||
SQLite& operator = (SQLite && from) { db = from.db; from.db = 0; return *this; }
|
SQLite& operator = (SQLite && from) { db = from.db; from.db = 0; return *this; }
|
||||||
|
|
Loading…
Reference in a new issue