Skip to content

Commit 3469460

Browse files
committed
Improved error handling.
1 parent b5adcac commit 3469460

File tree

8 files changed

+74
-62
lines changed

8 files changed

+74
-62
lines changed

conn.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,36 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) {
6666

6767
type connKey struct{}
6868

69-
func newConn(ctx context.Context, filename string, flags OpenFlag) (conn *Conn, err error) {
70-
err = ctx.Err()
69+
func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ error) {
70+
err := ctx.Err()
7171
if err != nil {
7272
return nil, err
7373
}
74-
sqlite, err := instantiateSQLite()
74+
75+
c := &Conn{interrupt: ctx}
76+
c.sqlite, err = instantiateSQLite()
7577
if err != nil {
7678
return nil, err
7779
}
7880
defer func() {
79-
if err != nil {
80-
conn.Close()
81-
conn = nil
82-
sqlite.close()
81+
if res == nil {
82+
c.Close()
83+
c.sqlite.close()
84+
} else {
85+
c.interrupt = context.Background()
8386
}
8487
}()
8588

86-
c := &Conn{sqlite: sqlite, interrupt: ctx}
8789
c.ctx = context.WithValue(c.ctx, connKey{}, c)
8890
c.arena = c.newArena(1024)
8991
c.handle, err = c.openDB(filename, flags)
9092
if err == nil {
9193
err = initExtensions(c)
9294
}
93-
c.interrupt = context.Background()
94-
return c, err
95+
if err != nil {
96+
return nil, err
97+
}
98+
return c, nil
9599
}
96100

97101
func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) {

driver/driver.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func (n *connector) Driver() driver.Driver {
202202
return n.driver
203203
}
204204

205-
func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
205+
func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) {
206206
c := &conn{
207207
txLock: n.txLock,
208208
tmRead: n.tmRead,
@@ -214,8 +214,8 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
214214
return nil, err
215215
}
216216
defer func() {
217-
if err != nil {
218-
c.Conn.Close()
217+
if res == nil {
218+
c.Close()
219219
}
220220
}()
221221

@@ -239,6 +239,7 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
239239
if err != nil {
240240
return nil, err
241241
}
242+
defer s.Close()
242243
if s.Step() && s.ColumnBool(0) {
243244
c.readOnly = '1'
244245
} else {

ext/bloom/bloom.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type bloom struct {
3434
}
3535

3636
func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom, err error) {
37-
t := bloom{
37+
b := bloom{
3838
db: db,
3939
schema: schema,
4040
storage: table + "_storage",
@@ -54,30 +54,30 @@ func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom,
5454
}
5555

5656
if len(arg) > 1 {
57-
t.prob, err = strconv.ParseFloat(arg[1], 64)
57+
b.prob, err = strconv.ParseFloat(arg[1], 64)
5858
if err != nil {
5959
return nil, err
6060
}
61-
if t.prob <= 0 || t.prob >= 1 {
61+
if b.prob <= 0 || b.prob >= 1 {
6262
return nil, util.ErrorString("bloom: probability must be in the range (0,1)")
6363
}
6464
} else {
65-
t.prob = 0.01
65+
b.prob = 0.01
6666
}
6767

6868
if len(arg) > 2 {
69-
t.hashes, err = strconv.Atoi(arg[2])
69+
b.hashes, err = strconv.Atoi(arg[2])
7070
if err != nil {
7171
return nil, err
7272
}
73-
if t.hashes <= 0 {
73+
if b.hashes <= 0 {
7474
return nil, util.ErrorString("bloom: number of hash functions must be positive")
7575
}
7676
} else {
77-
t.hashes = max(1, numHashes(t.prob))
77+
b.hashes = max(1, numHashes(b.prob))
7878
}
7979

80-
t.bytes = numBytes(nelem, t.prob)
80+
b.bytes = numBytes(nelem, b.prob)
8181

8282
err = db.DeclareVTab(
8383
`CREATE TABLE x(present, word HIDDEN NOT NULL PRIMARY KEY) WITHOUT ROWID`)
@@ -87,7 +87,7 @@ func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom,
8787

8888
err = db.Exec(fmt.Sprintf(
8989
`CREATE TABLE %s.%s (data BLOB, p REAL, n INTEGER, m INTEGER, k INTEGER)`,
90-
sqlite3.QuoteIdentifier(t.schema), sqlite3.QuoteIdentifier(t.storage)))
90+
sqlite3.QuoteIdentifier(b.schema), sqlite3.QuoteIdentifier(b.storage)))
9191
if err != nil {
9292
return nil, err
9393
}
@@ -98,17 +98,17 @@ func create(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom,
9898
err = db.Exec(fmt.Sprintf(
9999
`INSERT INTO %s.%s (rowid, data, p, n, m, k)
100100
VALUES (1, zeroblob(%d), %f, %d, %d, %d)`,
101-
sqlite3.QuoteIdentifier(t.schema), sqlite3.QuoteIdentifier(t.storage),
102-
t.bytes, t.prob, nelem, 8*t.bytes, t.hashes))
101+
sqlite3.QuoteIdentifier(b.schema), sqlite3.QuoteIdentifier(b.storage),
102+
b.bytes, b.prob, nelem, 8*b.bytes, b.hashes))
103103
if err != nil {
104-
t.Destroy()
104+
b.Destroy()
105105
return nil, err
106106
}
107-
return &t, nil
107+
return &b, nil
108108
}
109109

110110
func connect(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom, err error) {
111-
t := bloom{
111+
b := bloom{
112112
db: db,
113113
schema: schema,
114114
storage: table + "_storage",
@@ -122,7 +122,7 @@ func connect(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom
122122

123123
load, _, err := db.Prepare(fmt.Sprintf(
124124
`SELECT m/8, p, k FROM %s.%s WHERE rowid = 1`,
125-
sqlite3.QuoteIdentifier(t.schema), sqlite3.QuoteIdentifier(t.storage)))
125+
sqlite3.QuoteIdentifier(b.schema), sqlite3.QuoteIdentifier(b.storage)))
126126
if err != nil {
127127
return nil, err
128128
}
@@ -135,10 +135,10 @@ func connect(db *sqlite3.Conn, _, schema, table string, arg ...string) (_ *bloom
135135
return nil, sqlite3.CORRUPT_VTAB
136136
}
137137

138-
t.bytes = load.ColumnInt64(0)
139-
t.prob = load.ColumnFloat(1)
140-
t.hashes = load.ColumnInt(2)
141-
return &t, nil
138+
b.bytes = load.ColumnInt64(0)
139+
b.prob = load.ColumnFloat(1)
140+
b.hashes = load.ColumnInt(2)
141+
return &b, nil
142142
}
143143

144144
func (b *bloom) Destroy() error {

ext/csv/csv.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func Register(db *sqlite3.Conn) error {
3030
// RegisterFS registers the CSV virtual table.
3131
// If a filename is specified, fsys is used to open the file.
3232
func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
33-
declare := func(db *sqlite3.Conn, _, _, _ string, arg ...string) (_ *table, err error) {
33+
declare := func(db *sqlite3.Conn, _, _, _ string, arg ...string) (res *table, err error) {
3434
var (
3535
filename string
3636
data string
@@ -76,7 +76,7 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
7676
return nil, util.ErrorString(`csv: must specify either "filename" or "data" but not both`)
7777
}
7878

79-
table := &table{
79+
t := &table{
8080
fsys: fsys,
8181
name: filename,
8282
data: data,
@@ -88,7 +88,7 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
8888
if schema == "" {
8989
var row []string
9090
if header || columns < 0 {
91-
csv, c, err := table.newReader()
91+
csv, c, err := t.newReader()
9292
defer c.Close()
9393
if err != nil {
9494
return nil, err
@@ -100,22 +100,20 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
100100
}
101101
schema = getSchema(header, columns, row)
102102
} else {
103-
defer func() {
104-
if err == nil {
105-
table.typs, err = getColumnAffinities(schema)
106-
}
107-
}()
103+
t.typs, err = getColumnAffinities(schema)
104+
if err != nil {
105+
return nil, err
106+
}
108107
}
109108

110109
err = db.DeclareVTab(schema)
111-
if err != nil {
112-
return nil, err
110+
if err == nil {
111+
err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
113112
}
114-
err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
115113
if err != nil {
116114
return nil, err
117115
}
118-
return table, nil
116+
return t, nil
119117
}
120118

121119
return sqlite3.CreateModule(db, "csv", declare, declare)

ext/fileio/fileio.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
3131
db.CreateFunction("lsmode", 1, sqlite3.DETERMINISTIC, lsmode),
3232
sqlite3.CreateModule(db, "fsdir", nil, func(db *sqlite3.Conn, _, _, _ string, _ ...string) (fsdir, error) {
3333
err := db.DeclareVTab(`CREATE TABLE x(name,mode,mtime TIMESTAMP,data,path HIDDEN,dir HIDDEN)`)
34-
db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
34+
if err == nil {
35+
err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
36+
}
3537
return fsdir{fsys}, err
3638
}))
3739
}

ext/lines/lines.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,17 @@ func RegisterFS(db *sqlite3.Conn, fsys fs.FS) error {
3939
sqlite3.CreateModule(db, "lines", nil,
4040
func(db *sqlite3.Conn, _, _, _ string, _ ...string) (lines, error) {
4141
err := db.DeclareVTab(`CREATE TABLE x(line TEXT, data HIDDEN)`)
42-
db.VTabConfig(sqlite3.VTAB_INNOCUOUS)
42+
if err == nil {
43+
err = db.VTabConfig(sqlite3.VTAB_INNOCUOUS)
44+
}
4345
return lines{}, err
4446
}),
4547
sqlite3.CreateModule(db, "lines_read", nil,
4648
func(db *sqlite3.Conn, _, _, _ string, _ ...string) (lines, error) {
4749
err := db.DeclareVTab(`CREATE TABLE x(line TEXT, data HIDDEN)`)
48-
db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
50+
if err == nil {
51+
err = db.VTabConfig(sqlite3.VTAB_DIRECTONLY)
52+
}
4953
return lines{fsys}, err
5054
}))
5155
}

ext/pivot/pivot.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ type table struct {
2525
cols []*sqlite3.Value
2626
}
2727

28-
func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (_ *table, err error) {
28+
func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (res *table, err error) {
2929
if len(arg) != 3 {
3030
return nil, fmt.Errorf("pivot: wrong number of arguments")
3131
}
3232

33-
table := &table{db: db}
33+
t := &table{db: db}
3434
defer func() {
35-
if err != nil {
36-
table.Close()
35+
if res == nil {
36+
t.Close()
3737
}
3838
}()
3939

@@ -42,17 +42,17 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (_ *table, err err
4242
create.WriteString("CREATE TABLE x(")
4343

4444
// Row key query.
45-
table.scan = "SELECT * FROM\n" + arg[0]
46-
stmt, _, err := db.Prepare(table.scan)
45+
t.scan = "SELECT * FROM\n" + arg[0]
46+
stmt, _, err := db.Prepare(t.scan)
4747
if err != nil {
4848
return nil, err
4949
}
5050
defer stmt.Close()
5151

52-
table.keys = make([]string, stmt.ColumnCount())
53-
for i := range table.keys {
52+
t.keys = make([]string, stmt.ColumnCount())
53+
for i := range t.keys {
5454
name := sqlite3.QuoteIdentifier(stmt.ColumnName(i))
55-
table.keys[i] = name
55+
t.keys[i] = name
5656
create.WriteString(sep)
5757
create.WriteString(name)
5858
sep = ","
@@ -70,32 +70,32 @@ func declare(db *sqlite3.Conn, _, _, _ string, arg ...string) (_ *table, err err
7070
}
7171
for stmt.Step() {
7272
name := sqlite3.QuoteIdentifier(stmt.ColumnText(1))
73-
table.cols = append(table.cols, stmt.ColumnValue(0).Dup())
73+
t.cols = append(t.cols, stmt.ColumnValue(0).Dup())
7474
create.WriteString(",")
7575
create.WriteString(name)
7676
}
7777
stmt.Close()
7878

7979
// Pivot cell query.
80-
table.cell = "SELECT * FROM\n" + arg[2]
81-
stmt, _, err = db.Prepare(table.cell)
80+
t.cell = "SELECT * FROM\n" + arg[2]
81+
stmt, _, err = db.Prepare(t.cell)
8282
if err != nil {
8383
return nil, err
8484
}
8585

8686
if stmt.ColumnCount() != 1 {
8787
return nil, util.ErrorString("pivot: cell query expects 1 result columns")
8888
}
89-
if stmt.BindCount() != len(table.keys)+1 {
90-
return nil, fmt.Errorf("pivot: cell query expects %d bound parameters", len(table.keys)+1)
89+
if stmt.BindCount() != len(t.keys)+1 {
90+
return nil, fmt.Errorf("pivot: cell query expects %d bound parameters", len(t.keys)+1)
9191
}
9292

9393
create.WriteByte(')')
9494
err = db.DeclareVTab(create.String())
9595
if err != nil {
9696
return nil, err
9797
}
98-
return table, nil
98+
return t, nil
9999
}
100100

101101
func (t *table) Close() error {

go.work.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
22
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
33
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
4+
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
5+
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
46
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
57
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
68
golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
79
golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk=
810
golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
11+
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
912
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
1013
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=

0 commit comments

Comments
 (0)