Files
sqlite3/ext/blobio/blob_test.go

185 lines
3.4 KiB
Go
Raw Normal View History

2023-12-14 20:36:07 +00:00
package blobio_test
2023-11-07 00:50:43 +00:00
import (
"io"
"log"
"os"
2023-12-02 12:03:31 +00:00
"reflect"
"testing"
2023-11-07 00:50:43 +00:00
"github.com/ncruces/go-sqlite3"
"github.com/ncruces/go-sqlite3/driver"
_ "github.com/ncruces/go-sqlite3/embed"
2023-12-02 12:03:31 +00:00
"github.com/ncruces/go-sqlite3/ext/array"
2023-12-14 20:36:07 +00:00
"github.com/ncruces/go-sqlite3/ext/blobio"
2023-11-08 14:41:11 +00:00
_ "github.com/ncruces/go-sqlite3/vfs/memdb"
2023-11-07 00:50:43 +00:00
)
func Example() {
// Open the database, registering the extension.
2023-11-08 14:41:11 +00:00
db, err := driver.Open("file:/test.db?vfs=memdb", func(conn *sqlite3.Conn) error {
2023-12-14 20:36:07 +00:00
blobio.Register(conn)
2023-11-07 00:50:43 +00:00
return nil
})
if err != nil {
log.Fatal(err)
}
defer db.Close()
2024-04-04 01:25:52 +01:00
_, err = db.Exec(`CREATE TABLE test (col)`)
2023-11-07 00:50:43 +00:00
if err != nil {
log.Fatal(err)
}
const message = "Hello BLOB!"
// Create the BLOB.
_, err = db.Exec(`INSERT INTO test VALUES (?)`, sqlite3.ZeroBlob(len(message)))
if err != nil {
log.Fatal(err)
}
// Write the BLOB.
2023-12-14 20:36:07 +00:00
_, err = db.Exec(`SELECT writeblob('main', 'test', 'col', last_insert_rowid(), 0, ?)`, message)
2023-11-07 00:50:43 +00:00
if err != nil {
log.Fatal(err)
}
// Read the BLOB.
2023-12-14 20:36:07 +00:00
_, err = db.Exec(`SELECT openblob('main', 'test', 'col', rowid, false, ?) FROM test`,
sqlite3.Pointer[blobio.OpenCallback](func(blob *sqlite3.Blob, _ ...sqlite3.Value) error {
2023-11-07 00:50:43 +00:00
_, err = io.Copy(os.Stdout, blob)
return err
}))
if err != nil {
log.Fatal(err)
}
// Output:
// Hello BLOB!
}
2023-12-02 12:03:31 +00:00
2023-12-14 20:36:07 +00:00
func Test_readblob(t *testing.T) {
t.Parallel()
db, err := sqlite3.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
blobio.Register(db)
array.Register(db)
err = db.Exec(`SELECT readblob()`)
if err == nil {
t.Fatal("want error")
} else {
t.Log(err)
}
err = db.Exec(`
2024-04-04 01:25:52 +01:00
CREATE TABLE test1 (col);
CREATE TABLE test2 (col);
2023-12-14 20:36:07 +00:00
INSERT INTO test1 VALUES (x'cafe');
INSERT INTO test2 VALUES (x'babe');
`)
if err != nil {
t.Fatal(err)
}
stmt, _, err := db.Prepare(`SELECT readblob('main', value, 'col', 1, 1, 1) FROM array(?)`)
if err != nil {
t.Fatal(err)
}
defer stmt.Close()
err = stmt.BindPointer(1, []string{"test1", "test2"})
if err != nil {
t.Fatal(err)
}
if stmt.Step() {
got := stmt.ColumnText(0)
if got != "\xfe" {
t.Errorf("got %q", got)
}
}
if stmt.Step() {
got := stmt.ColumnText(0)
if got != "\xbe" {
t.Errorf("got %q", got)
}
}
err = stmt.Err()
if err != nil {
t.Fatal(err)
}
}
func Test_openblob(t *testing.T) {
2023-12-02 12:03:31 +00:00
t.Parallel()
db, err := sqlite3.Open(":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
2023-12-14 20:36:07 +00:00
blobio.Register(db)
2023-12-02 12:03:31 +00:00
array.Register(db)
2023-12-14 20:36:07 +00:00
err = db.Exec(`SELECT openblob()`)
2023-12-02 12:03:31 +00:00
if err == nil {
t.Fatal("want error")
} else {
t.Log(err)
}
err = db.Exec(`
2024-04-04 01:25:52 +01:00
CREATE TABLE test1 (col);
CREATE TABLE test2 (col);
2023-12-02 12:03:31 +00:00
INSERT INTO test1 VALUES (x'cafe');
INSERT INTO test2 VALUES (x'babe');
`)
if err != nil {
t.Fatal(err)
}
2023-12-14 20:36:07 +00:00
stmt, _, err := db.Prepare(`SELECT openblob('main', value, 'col', 1, false, ?) FROM array(?)`)
2023-12-02 12:03:31 +00:00
if err != nil {
t.Fatal(err)
}
defer stmt.Close()
var got []string
2023-12-14 20:36:07 +00:00
err = stmt.BindPointer(1, blobio.OpenCallback(func(b *sqlite3.Blob, _ ...sqlite3.Value) error {
2023-12-02 12:03:31 +00:00
d, err := io.ReadAll(b)
if err != nil {
return err
}
got = append(got, string(d))
return nil
}))
if err != nil {
t.Fatal(err)
}
err = stmt.BindPointer(2, []string{"test1", "test2"})
if err != nil {
t.Fatal(err)
}
err = stmt.Exec()
if err != nil {
t.Fatal(err)
}
want := []string{"\xca\xfe", "\xba\xbe"}
if !reflect.DeepEqual(got, want) {
t.Errorf("got %v, want %v", got, want)
}
}