-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
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
Add Blob I/O #1083
Add Blob I/O #1083
Conversation
interesting. |
|
I have implemented write and seek support. As far as I'm concerned, this pull request is ready for further review. Thanks so far. |
I was tempted to implement the type Foo struct {
io.ReadSeeker
}
func (f *Foo) ReadAt(p []byte, off int64) (int, error) {
_, err := f.Seek(off, io.SeekStart)
if err != nil {
return 0, err
}
n, err := f.Read(p)
return n, err
} |
blob_io.go
Outdated
return 0, errors.New("sqlite.SQLiteBlob.Seek: negative position") | ||
} | ||
|
||
if abs > math.MaxInt32 { |
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.
Can we instead check if abs > math.MaxInt32 || abs > int64(s.size)
?
Co-authored-by: rittneje <rittneje@gmail.com>
The Linux builds with libsqlite3 fail with:
I don't know how to fix this. |
Hello!
Problem is like this:
So - vfs=memdb will not work in ubuntu focal. You would need to recompile libsqlite3 deb package and add SQLITE_ENABLE_DESERIALIZE option to make. Without it memdb is just not there. And package libsqlite3-dev do not consist c code of sqlite3 - it's .a and .so files, already precompiled. This behaviour was changed in sqlite 3.36.0 - SQLITE_ENABLE_DESERIALIZE is defined by default, you need to explicity disable it by defining SQLITE_OMIT_DESERIALIZE option during sqlite compilation. So, there are imho there are two solution of this problem:
This problem will disappear after ubuntu will release next LTS version, and github action will change ubuntu-latest to this LTS version - there should be at least sqlite3 3.37.0 there. |
sugested fix (will work with any version of sqlite): diff --git a/blob_io_test.go b/blob_io_test.go
index 3e6fb91..b98df8d 100644
--- a/blob_io_test.go
+++ b/blob_io_test.go
@@ -25,12 +25,14 @@ var _ io.Closer = &SQLiteBlob{}
type driverConnCallback func(*testing.T, *SQLiteConn)
func blobTestData(t *testing.T, dbname string, rowid int64, blob []byte, c driverConnCallback) {
- db, err := sql.Open("sqlite3", "file:/"+dbname+"?vfs=memdb")
+ db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
+ db.SetMaxOpenConns(1)
+
// Test data
query := `
CREATE TABLE data ( |
@rittneje do you agree with the proposed fix? |
@joriszwart In this particular case Really I think we need a better approach for dealing with testing |
Any updates on this? It looks very interesting and enables "streaming" to and from the database! 👍 |
@rittneje Is there anything I can do to get this approved? |
n = len(b) | ||
} | ||
|
||
if n != len(b) { |
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.
Trying to remember - is there a reason not to do this check after the call to sqlite3_blob_write
and only write what we can instead of nothing? I guess the current implementation is consistent with what sqlite3_blob_write
internally does.
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.
@joriszwart following up on this
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 don't know what to do. Sorry.
@joriszwart I am away from my dev machine or I'd just add those two |
Can you add them? |
Anyone else? @graf0 @pokstad @jlelse @lezhnev74 @mitar? |
blob_io_test.go
Outdated
|
||
func blobTestData(t *testing.T, dbname string, rowid int64, blob []byte, c driverConnCallback) { | ||
|
||
// TODO use :memory: for compatibility with SQLite versions < 3.37.0. |
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.
@joriszwart please resolve this TODO
if err != nil { | ||
t.Fatal(err) | ||
} | ||
defer driverConn.Close() |
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.
Remove. This is superfluous with the call to conn.Close()
above. (And also you aren't supposed to do anything with the conn
outside the Raw
callback.)
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.
Remove those 4 lines? Or only the last?
@rittneje can I leave the suggested changes to you? That would make this process more efficient. |
Pulling in this RP for Blob access
A shame this was abandoned. Thanks for trying @joriszwart ! |
Incremental Blob I/O
This PR adds support for Incremental Blob I/O.
Notes
If this PR makes sense, I'll enhance it with additional io interfaces.