mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 05:59:14 +00:00
Optimize blobs. (#10)
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"fmt"
|
||||
"hash/adler32"
|
||||
"io"
|
||||
"testing"
|
||||
|
||||
@@ -48,17 +49,17 @@ func TestBlob(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, err = io.Copy(blob, bytes.NewReader(data[:size/2]))
|
||||
_, err = blob.Write(data[:size/2])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, err = io.Copy(blob, bytes.NewReader(data[:]))
|
||||
if !errors.Is(err, sqlite3.ERROR) {
|
||||
t.Fatal("want error")
|
||||
n, err := blob.Write(data[:])
|
||||
if n != 0 || !errors.Is(err, sqlite3.ERROR) {
|
||||
t.Fatalf("got (%d, %v), want (0, ERROR)", n, err)
|
||||
}
|
||||
|
||||
_, err = io.Copy(blob, bytes.NewReader(data[size/2:size]))
|
||||
_, err = blob.Write(data[size/2 : size])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -87,6 +88,126 @@ func TestBlob(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestBlob_large(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
db, err := sqlite3.Open(":memory:")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
err = db.Exec(`CREATE TABLE IF NOT EXISTS test (col)`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = db.Exec(`INSERT INTO test VALUES (zeroblob(1000000))`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
blob, err := db.OpenBlob("main", "test", "col", db.LastInsertRowID(), true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer blob.Close()
|
||||
|
||||
size := blob.Size()
|
||||
if size != 1000000 {
|
||||
t.Errorf("got %d, want 1000000", size)
|
||||
}
|
||||
|
||||
hash := adler32.New()
|
||||
_, err = io.CopyN(blob, io.TeeReader(rand.Reader, hash), 1000000)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
_, err = blob.Seek(0, io.SeekStart)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
want := hash.Sum32()
|
||||
hash.Reset()
|
||||
_, err = io.Copy(hash, blob)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if got := hash.Sum32(); got != want {
|
||||
t.Fatalf("got %d, want %d", got, want)
|
||||
}
|
||||
|
||||
if err := blob.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := db.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBlob_overflow(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
db, err := sqlite3.Open(":memory:")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
err = db.Exec(`CREATE TABLE IF NOT EXISTS test (col)`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = db.Exec(`INSERT INTO test VALUES (zeroblob(1024))`)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
blob, err := db.OpenBlob("main", "test", "col", db.LastInsertRowID(), true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer blob.Close()
|
||||
|
||||
n, err := blob.ReadFrom(rand.Reader)
|
||||
if n != 1024 || !errors.Is(err, sqlite3.ERROR) {
|
||||
t.Fatalf("got (%d, %v), want (0, ERROR)", n, err)
|
||||
}
|
||||
|
||||
n, err = blob.ReadFrom(rand.Reader)
|
||||
if n != 0 || !errors.Is(err, sqlite3.ERROR) {
|
||||
t.Fatalf("got (%d, %v), want (0, ERROR)", n, err)
|
||||
}
|
||||
|
||||
_, err = blob.Seek(-128, io.SeekEnd)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
n, err = blob.WriteTo(io.Discard)
|
||||
if n != 128 || err != nil {
|
||||
t.Fatalf("got (%d, %v), want (128, nil)", n, err)
|
||||
}
|
||||
|
||||
n, err = blob.WriteTo(io.Discard)
|
||||
if n != 0 || err != nil {
|
||||
t.Fatalf("got (%d, %v), want (0, nil)", n, err)
|
||||
}
|
||||
|
||||
if err := blob.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := db.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBlob_invalid(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user