-
-
Notifications
You must be signed in to change notification settings - Fork 324
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#1392 : Add support for SQLite VFS and open mode flags #1393
base: dev
Are you sure you want to change the base?
#1392 : Add support for SQLite VFS and open mode flags #1393
Conversation
hey @ancientjpeg . Thank for this PR. Please work in |
13c0562
to
42d717b
Compare
Just rebased. Thanks and apologies again. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@fnc12 I've added enums to allow for full control over what open mode/VFS options users actually have access to. I'm happy with the state this PR is in, but I have some preliminary evidence that using some VFS modes like unix-dotfile
may interfere with the ability to set certain journal_mode
s. This is detectable by just checking journal_mode
after you've set it, but if you'd like me to brainstorm a layer of protection for that I'd be happy to.
bool readonly() const { | ||
sqlite3* db = this->connection->get(); | ||
return sqlite3_db_readonly(db, "main"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At first I was a little nervous about using the "main"
DB name here but then I realized that's used in other places in the lib. I figure this indicates there's no near-future plans for attachment support.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From where exactly do you draw the conclusion about "main"
?
Currently it's only the backup functionality that literally uses "main"
.
At least dealing with the "temp"
DB is in the works, upon which the attachment functionality could be built.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I drew the conclusion from the backup code, as it was the only other sqlite3
method I could find in sqlite_orm
that was being called with a database name parameter. How would you like me structure this in order to make it more compatible with future attempts to implement ATTACH
? My first assumption would be to pass in the database name as one of the storage_options
, but let me know what approach you think is best.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can just leave it as is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @ancientjpeg for your contribution! Here come my 2 cents...
bool readonly() const { | ||
sqlite3* db = this->connection->get(); | ||
return sqlite3_db_readonly(db, "main"); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From where exactly do you draw the conclusion about "main"
?
Currently it's only the backup functionality that literally uses "main"
.
At least dealing with the "temp"
DB is in the works, upon which the attachment functionality could be built.
dev/connection_holder.h
Outdated
@@ -41,6 +49,8 @@ namespace sqlite_orm { | |||
} | |||
|
|||
const std::string filename; | |||
const vfs_mode vfs; | |||
const sqlite_orm::open_mode open; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer to call the member variable openFlags
or openMode
.
Also there's no need to qualify it with the namespace.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I opted to just move the entire options
structure in here instead—this avoid some errors that GCC throws. See this comment for more details.
@trueqbit Still working through your changes, but something occurred to me while refactoring. I had some of those unnecessary enum class vfs_mode_t; Then it'd be a lot clearer to re-use the same verbiage for defining variables, e.g. vfs_mode_t vfs_mode;
open_mode_t open_mode;
struct storage_options {
vfs_mode_t vfs_mode;
open_mode_t open_mode;
}; Let me know what you think of that. Edit: I ended up implementing this because GCC complains of ambiguity in cases such as |
b96a21f
to
319c614
Compare
Hmm, that's a funny problem as both are public :) I personally like camel case for (member) variables, but I agree that's debatable. While we are at it, I also suggest renaming |
@trueqbit Great point about using I'll be away from my development system until next week, at which time I'll wrap up these changes. Thanks for the feedback! |
Addresses #1392
Changelog
vfs_mode
enum class to simplify thesqlite_orm
API for using different VFS systems, as compared to the raw string passed insqlite3.h
open_mode
enum class to support the open flags passed bysqlite3_open_v2
. Only two values have been added so far, but this addition makes it very easy to add more in the future.More Info
https://www.sqlite.org/vfs.html - VFS options and description
https://www.sqlite.org/c3ref/open.html - open flag options