Refactor.

This commit is contained in:
Nuno Cruces
2023-07-04 02:29:38 +01:00
parent 632ea933b3
commit 78ac2386f6
5 changed files with 56 additions and 55 deletions

View File

@@ -50,19 +50,19 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) {
}
func newConn(filename string, flags OpenFlag) (conn *Conn, err error) {
mod, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
return nil, err
}
defer func() {
if conn == nil {
mod.close()
sqlite.close()
} else {
runtime.SetFinalizer(conn, util.Finalizer[Conn](3))
}
}()
c := &Conn{sqlite: mod}
c := &Conn{sqlite: sqlite}
c.arena = c.newArena(1024)
c.handle, err = c.openDB(filename, flags)
if err != nil {

View File

@@ -194,18 +194,18 @@ const (
// String implements the [fmt.Stringer] interface.
func (t Datatype) String() string {
const name = "INTEGERFLOATTEXTBLOBNULL"
const name = "INTEGERFLOATEXTBLOBNULL"
switch t {
case INTEGER:
return name[0:7]
case FLOAT:
return name[7:12]
case TEXT:
return name[12:16]
return name[11:15]
case BLOB:
return name[16:20]
return name[15:19]
case NULL:
return name[20:24]
return name[19:23]
}
return strconv.FormatUint(uint64(t), 10)
}

View File

@@ -9,6 +9,7 @@ import (
)
// Context is the context in which an SQL function executes.
// An SQLite [Context] is in no way related to a Go [context.Context].
//
// https://www.sqlite.org/c3ref/context.html
type Context struct {

View File

@@ -12,67 +12,67 @@ func init() {
Path = "./embed/sqlite3.wasm"
}
func TestConn_error_OOM(t *testing.T) {
func Test_sqlite_error_OOM(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
defer func() { _ = recover() }()
m.error(uint64(NOMEM), 0)
sqlite.error(uint64(NOMEM), 0)
t.Error("want panic")
}
func TestConn_call_closed(t *testing.T) {
func Test_sqlite_call_closed(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
m.close()
sqlite.close()
defer func() { _ = recover() }()
m.call(m.api.free)
sqlite.call(sqlite.api.free)
t.Error("want panic")
}
func TestConn_new(t *testing.T) {
func Test_sqlite_new(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
t.Run("MaxUint32", func(t *testing.T) {
defer func() { _ = recover() }()
m.new(math.MaxUint32)
sqlite.new(math.MaxUint32)
t.Error("want panic")
})
t.Run("_MAX_ALLOCATION_SIZE", func(t *testing.T) {
defer func() { _ = recover() }()
m.new(_MAX_ALLOCATION_SIZE)
m.new(_MAX_ALLOCATION_SIZE)
sqlite.new(_MAX_ALLOCATION_SIZE)
sqlite.new(_MAX_ALLOCATION_SIZE)
t.Error("want panic")
})
}
func TestConn_newArena(t *testing.T) {
func Test_sqlite_newArena(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
arena := m.newArena(16)
arena := sqlite.newArena(16)
defer arena.free()
const title = "Lorem ipsum"
@@ -80,7 +80,7 @@ func TestConn_newArena(t *testing.T) {
if ptr == 0 {
t.Fatalf("got nullptr")
}
if got := util.ReadString(m.mod, ptr, math.MaxUint32); got != title {
if got := util.ReadString(sqlite.mod, ptr, math.MaxUint32); got != title {
t.Errorf("got %q, want %q", got, title)
}
@@ -89,7 +89,7 @@ func TestConn_newArena(t *testing.T) {
if ptr == 0 {
t.Fatalf("got nullptr")
}
if got := util.ReadString(m.mod, ptr, math.MaxUint32); got != body {
if got := util.ReadString(sqlite.mod, ptr, math.MaxUint32); got != body {
t.Errorf("got %q, want %q", got, body)
}
@@ -101,121 +101,121 @@ func TestConn_newArena(t *testing.T) {
if ptr == 0 {
t.Fatalf("got nullptr")
}
if got := util.View(m.mod, ptr, uint64(len(title))); string(got) != title {
if got := util.View(sqlite.mod, ptr, uint64(len(title))); string(got) != title {
t.Errorf("got %q, want %q", got, title)
}
arena.free()
}
func TestConn_newBytes(t *testing.T) {
func Test_sqlite_newBytes(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
ptr := m.newBytes(nil)
ptr := sqlite.newBytes(nil)
if ptr != 0 {
t.Errorf("got %#x, want nullptr", ptr)
}
buf := []byte("sqlite3")
ptr = m.newBytes(buf)
ptr = sqlite.newBytes(buf)
if ptr == 0 {
t.Fatal("got nullptr, want a pointer")
}
want := buf
if got := util.View(m.mod, ptr, uint64(len(want))); !bytes.Equal(got, want) {
if got := util.View(sqlite.mod, ptr, uint64(len(want))); !bytes.Equal(got, want) {
t.Errorf("got %q, want %q", got, want)
}
}
func TestConn_newString(t *testing.T) {
func Test_sqlite_newString(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
ptr := m.newString("")
ptr := sqlite.newString("")
if ptr == 0 {
t.Error("got nullptr, want a pointer")
}
str := "sqlite3\000sqlite3"
ptr = m.newString(str)
ptr = sqlite.newString(str)
if ptr == 0 {
t.Fatal("got nullptr, want a pointer")
}
want := str + "\000"
if got := util.View(m.mod, ptr, uint64(len(want))); string(got) != want {
if got := util.View(sqlite.mod, ptr, uint64(len(want))); string(got) != want {
t.Errorf("got %q, want %q", got, want)
}
}
func TestConn_getString(t *testing.T) {
func Test_sqlite_getString(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
ptr := m.newString("")
ptr := sqlite.newString("")
if ptr == 0 {
t.Error("got nullptr, want a pointer")
}
str := "sqlite3" + "\000 drop this"
ptr = m.newString(str)
ptr = sqlite.newString(str)
if ptr == 0 {
t.Fatal("got nullptr, want a pointer")
}
want := "sqlite3"
if got := util.ReadString(m.mod, ptr, math.MaxUint32); got != want {
if got := util.ReadString(sqlite.mod, ptr, math.MaxUint32); got != want {
t.Errorf("got %q, want %q", got, want)
}
if got := util.ReadString(m.mod, ptr, 0); got != "" {
if got := util.ReadString(sqlite.mod, ptr, 0); got != "" {
t.Errorf("got %q, want empty", got)
}
func() {
defer func() { _ = recover() }()
util.ReadString(m.mod, ptr, uint32(len(want)/2))
util.ReadString(sqlite.mod, ptr, uint32(len(want)/2))
t.Error("want panic")
}()
func() {
defer func() { _ = recover() }()
util.ReadString(m.mod, 0, math.MaxUint32)
util.ReadString(sqlite.mod, 0, math.MaxUint32)
t.Error("want panic")
}()
}
func TestConn_free(t *testing.T) {
func Test_sqlite_free(t *testing.T) {
t.Parallel()
m, err := instantiateSQLite()
sqlite, err := instantiateSQLite()
if err != nil {
t.Fatal(err)
}
defer m.close()
defer sqlite.close()
m.free(0)
sqlite.free(0)
ptr := m.new(1)
ptr := sqlite.new(1)
if ptr == 0 {
t.Error("got nullptr, want a pointer")
}
m.free(ptr)
sqlite.free(ptr)
}