@@ -55,8 +55,8 @@ func init() {
55
55
//
56
56
// The init function is called by the driver on new connections.
57
57
// The conn can be used to execute queries, register functions, etc.
58
- // Any error return closes the conn and passes the error to database/sql.
59
- func Open (dataSourceName string , init func (ctx context. Context , conn * sqlite3.Conn ) error ) (* sql.DB , error ) {
58
+ // Any error return closes the conn and passes the error to [ database/sql] .
59
+ func Open (dataSourceName string , init func (* sqlite3.Conn ) error ) (* sql.DB , error ) {
60
60
c , err := newConnector (dataSourceName , init )
61
61
if err != nil {
62
62
return nil , err
@@ -78,7 +78,7 @@ func (sqlite) OpenConnector(name string) (driver.Connector, error) {
78
78
return newConnector (name , nil )
79
79
}
80
80
81
- func newConnector (name string , init func (ctx context. Context , conn * sqlite3.Conn ) error ) (* connector , error ) {
81
+ func newConnector (name string , init func (* sqlite3.Conn ) error ) (* connector , error ) {
82
82
c := connector {name : name , init : init }
83
83
if strings .HasPrefix (name , "file:" ) {
84
84
if _ , after , ok := strings .Cut (name , "?" ); ok {
@@ -94,7 +94,7 @@ func newConnector(name string, init func(ctx context.Context, conn *sqlite3.Conn
94
94
}
95
95
96
96
type connector struct {
97
- init func (ctx context. Context , conn * sqlite3.Conn ) error
97
+ init func (* sqlite3.Conn ) error
98
98
name string
99
99
txlock string
100
100
pragmas bool
@@ -132,27 +132,24 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) {
132
132
if err != nil {
133
133
return nil , err
134
134
}
135
- c .reusable = true
136
- } else {
137
- s , _ , err := c .Conn .Prepare (`
138
- SELECT * FROM
139
- PRAGMA_locking_mode,
140
- PRAGMA_query_only;
141
- ` )
135
+ }
136
+ if n .init != nil {
137
+ err = n .init (c .Conn )
142
138
if err != nil {
143
139
return nil , err
144
140
}
145
- if s .Step () {
146
- c .reusable = s .ColumnText (0 ) == "normal"
147
- c .readOnly = s .ColumnRawText (1 )[0 ] // 0 or 1
148
- }
149
- err = s .Close ()
141
+ }
142
+ if n .pragmas || n .init != nil {
143
+ s , _ , err := c .Conn .Prepare (`PRAGMA query_only` )
150
144
if err != nil {
151
145
return nil , err
152
146
}
153
- }
154
- if n .init != nil {
155
- err = n .init (ctx , c .Conn )
147
+ if s .Step () && s .ColumnBool (0 ) {
148
+ c .readOnly = '1'
149
+ } else {
150
+ c .readOnly = '0'
151
+ }
152
+ err = s .Close ()
156
153
if err != nil {
157
154
return nil , err
158
155
}
@@ -165,7 +162,6 @@ type conn struct {
165
162
txBegin string
166
163
txCommit string
167
164
txRollback string
168
- reusable bool
169
165
readOnly byte
170
166
}
171
167
@@ -174,18 +170,13 @@ var (
174
170
_ driver.ConnPrepareContext = & conn {}
175
171
_ driver.ExecerContext = & conn {}
176
172
_ driver.ConnBeginTx = & conn {}
177
- _ driver.Validator = & conn {}
178
173
_ sqlite3.DriverConn = & conn {}
179
174
)
180
175
181
176
func (c * conn ) Raw () * sqlite3.Conn {
182
177
return c .Conn
183
178
}
184
179
185
- func (c * conn ) IsValid () bool {
186
- return c .reusable
187
- }
188
-
189
180
func (c * conn ) Begin () (driver.Tx , error ) {
190
181
return c .BeginTx (context .Background (), driver.TxOptions {})
191
182
}
@@ -199,10 +190,10 @@ func (c *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, e
199
190
txBegin = `
200
191
BEGIN deferred;
201
192
PRAGMA query_only=on`
202
- c .txCommit = `
193
+ c .txRollback = `
203
194
ROLLBACK;
204
195
PRAGMA query_only=` + string (c .readOnly )
205
- c .txRollback = c .txCommit
196
+ c .txCommit = c .txRollback
206
197
}
207
198
208
199
switch opts .Isolation {
0 commit comments