From 125b8053f88e599a4224c24c991bc500d4bec74a Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sat, 25 Feb 2023 15:34:24 +0000 Subject: [PATCH] Fix readonly transactions. --- conn.go | 16 ++++++++++++++++ driver/driver.go | 19 +++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/conn.go b/conn.go index 7a53741..9987c15 100644 --- a/conn.go +++ b/conn.go @@ -340,6 +340,22 @@ func (conn *Conn) Savepoint() (release func(*error)) { } } +// Pragma executes a PRAGMA statement and returns any result as a string. +// +// https://www.sqlite.org/pragma.html +func (c *Conn) Pragma(str string) string { + stmt := c.MustPrepare(`PRAGMA ` + str) + defer stmt.Close() + + if stmt.Step() { + return stmt.ColumnText(0) + } + if err := stmt.Err(); err != nil { + panic(err) + } + return "" +} + func (c *Conn) error(rc uint64, sql ...string) error { if rc == _OK { return nil diff --git a/driver/driver.go b/driver/driver.go index c2be0db..da013eb 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -62,9 +62,9 @@ func (sqlite) Open(name string) (driver.Conn, error) { } type conn struct { - conn *sqlite3.Conn - txBegin string - txReadOnly bool + conn *sqlite3.Conn + txBegin string + txCommit string } var ( @@ -90,13 +90,15 @@ func (c conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, er } txBegin := c.txBegin + c.txCommit = `COMMIT` if opts.ReadOnly { + c.txCommit = ` + ROLLBACK; + PRAGMA query_only=` + c.conn.Pragma("query_only") txBegin = ` BEGIN deferred; - PRAGMA query_only=on; - ` + PRAGMA query_only=on` } - c.txReadOnly = opts.ReadOnly err := c.conn.Exec(txBegin) if err != nil { @@ -106,10 +108,7 @@ func (c conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, er } func (c conn) Commit() error { - if c.txReadOnly { - return c.Rollback() - } - err := c.conn.Exec(`COMMIT`) + err := c.conn.Exec(c.txCommit) if err != nil { c.Rollback() }