Skip to content

Commit 77f3789

Browse files
committed
Driver connector.
1 parent f1e36e2 commit 77f3789

File tree

2 files changed

+55
-27
lines changed

2 files changed

+55
-27
lines changed

driver/driver.go

Lines changed: 51 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,42 @@ func init() {
4646

4747
type sqlite struct{}
4848

49-
func (sqlite) Open(name string) (_ driver.Conn, err error) {
49+
func (sqlite) Open(name string) (driver.Conn, error) {
50+
c, err := sqlite{}.OpenConnector(name)
51+
if err != nil {
52+
return nil, err
53+
}
54+
return c.Connect(context.Background())
55+
}
56+
57+
func (sqlite) OpenConnector(name string) (driver.Connector, error) {
58+
c := connector{name: name}
59+
if strings.HasPrefix(name, "file:") {
60+
if _, after, ok := strings.Cut(name, "?"); ok {
61+
query, err := url.ParseQuery(after)
62+
if err != nil {
63+
return nil, err
64+
}
65+
c.txlock = query.Get("_txlock")
66+
c.pragmas = len(query["_pragma"]) > 0
67+
}
68+
}
69+
return &c, nil
70+
}
71+
72+
type connector struct {
73+
name string
74+
txlock string
75+
pragmas bool
76+
}
77+
78+
func (n *connector) Driver() driver.Driver {
79+
return sqlite{}
80+
}
81+
82+
func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
5083
var c conn
51-
c.Conn, err = sqlite3.Open(name)
84+
c.Conn, err = sqlite3.Open(n.name)
5285
if err != nil {
5386
return nil, err
5487
}
@@ -58,25 +91,18 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) {
5891
}
5992
}()
6093

61-
var pragmas bool
62-
c.txBegin = "BEGIN"
63-
if strings.HasPrefix(name, "file:") {
64-
if _, after, ok := strings.Cut(name, "?"); ok {
65-
query, _ := url.ParseQuery(after)
66-
67-
switch s := query.Get("_txlock"); s {
68-
case "":
69-
c.txBegin = "BEGIN"
70-
case "deferred", "immediate", "exclusive":
71-
c.txBegin = "BEGIN " + s
72-
default:
73-
return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s)
74-
}
94+
old := c.Conn.SetInterrupt(ctx)
95+
defer c.Conn.SetInterrupt(old)
7596

76-
pragmas = len(query["_pragma"]) > 0
77-
}
97+
switch n.txlock {
98+
case "":
99+
c.txBegin = "BEGIN"
100+
case "deferred", "immediate", "exclusive":
101+
c.txBegin = "BEGIN " + n.txlock
102+
default:
103+
return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", n.txlock)
78104
}
79-
if !pragmas {
105+
if !n.pragmas {
80106
err = c.Conn.Exec(`PRAGMA busy_timeout=60000`)
81107
if err != nil {
82108
return nil, err
@@ -256,11 +282,14 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) {
256282
}
257283

258284
func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
259-
err := s.setupBindings(ctx, args)
285+
err := s.setupBindings(args)
260286
if err != nil {
261287
return nil, err
262288
}
263289

290+
old := s.Conn.SetInterrupt(ctx)
291+
defer s.Conn.SetInterrupt(old)
292+
264293
err = s.Stmt.Exec()
265294
if err != nil {
266295
return nil, err
@@ -270,15 +299,14 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive
270299
}
271300

272301
func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
273-
err := s.setupBindings(ctx, args)
302+
err := s.setupBindings(args)
274303
if err != nil {
275304
return nil, err
276305
}
277-
278306
return &rows{ctx, s.Stmt, s.Conn}, nil
279307
}
280308

281-
func (s *stmt) setupBindings(ctx context.Context, args []driver.NamedValue) error {
309+
func (s *stmt) setupBindings(args []driver.NamedValue) error {
282310
err := s.Stmt.ClearBindings()
283311
if err != nil {
284312
return err

stmt.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ func (s *Stmt) ClearBindings() error {
6161
func (s *Stmt) Step() bool {
6262
s.c.checkInterrupt()
6363
r := s.c.call(s.c.api.step, uint64(s.handle))
64-
if r == _ROW {
64+
switch r {
65+
case _ROW:
6566
return true
66-
}
67-
if r == _DONE {
67+
case _DONE:
6868
s.err = nil
69-
} else {
69+
default:
7070
s.err = s.c.error(r)
7171
}
7272
return false

0 commit comments

Comments
 (0)