diff options
Diffstat (limited to 'internal/db/sqlite/driver.go')
-rw-r--r-- | internal/db/sqlite/driver.go | 70 |
1 files changed, 42 insertions, 28 deletions
diff --git a/internal/db/sqlite/driver.go b/internal/db/sqlite/driver.go index 11cb6b27d..cea976d94 100644 --- a/internal/db/sqlite/driver.go +++ b/internal/db/sqlite/driver.go @@ -15,7 +15,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. -//go:build !wasmsqlite3 +//go:build !moderncsqlite3 package sqlite @@ -23,19 +23,22 @@ import ( "context" "database/sql/driver" - "modernc.org/sqlite" - "github.com/superseriousbusiness/gotosocial/internal/db" + + "github.com/ncruces/go-sqlite3" + sqlite3driver "github.com/ncruces/go-sqlite3/driver" + _ "github.com/ncruces/go-sqlite3/embed" // embed wasm binary + _ "github.com/ncruces/go-sqlite3/vfs/memdb" // include memdb vfs ) // Driver is our own wrapper around the -// sqlite.Driver{} type in order to wrap +// driver.SQLite{} type in order to wrap // further SQL types with our own // functionality, e.g. err processing. -type Driver struct{ sqlite.Driver } +type Driver struct{ sqlite3driver.SQLite } func (d *Driver) Open(name string) (driver.Conn, error) { - conn, err := d.Driver.Open(name) + conn, err := d.SQLite.Open(name) if err != nil { err = processSQLiteError(err) return nil, err @@ -43,6 +46,30 @@ func (d *Driver) Open(name string) (driver.Conn, error) { return &sqliteConn{conn.(connIface)}, nil } +func (d *Driver) OpenConnector(name string) (driver.Connector, error) { + cc, err := d.SQLite.OpenConnector(name) + if err != nil { + return nil, err + } + return &sqliteConnector{driver: d, Connector: cc}, nil +} + +type sqliteConnector struct { + driver *Driver + driver.Connector +} + +func (c *sqliteConnector) Driver() driver.Driver { return c.driver } + +func (c *sqliteConnector) Connect(ctx context.Context) (driver.Conn, error) { + conn, err := c.Connector.Connect(ctx) + err = processSQLiteError(err) + if err != nil { + return nil, err + } + return &sqliteConn{conn.(connIface)}, nil +} + type sqliteConn struct{ connIface } func (c *sqliteConn) Begin() (driver.Tx, error) { @@ -81,26 +108,16 @@ func (c *sqliteConn) ExecContext(ctx context.Context, query string, args []drive return } -func (c *sqliteConn) Query(query string, args []driver.Value) (driver.Rows, error) { - return c.QueryContext(context.Background(), query, db.ToNamedValues(args)) -} - -func (c *sqliteConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (rows driver.Rows, err error) { - rows, err = c.connIface.QueryContext(ctx, query, args) - err = processSQLiteError(err) - if err != nil { - return nil, err - } - return &sqliteRows{rows.(rowsIface)}, nil -} - func (c *sqliteConn) Close() (err error) { + // Get acces the underlying raw sqlite3 conn. + raw := c.connIface.(sqlite3.DriverConn).Raw() + // see: https://www.sqlite.org/pragma.html#pragma_optimize const onClose = "PRAGMA analysis_limit=1000; PRAGMA optimize;" - _, _ = c.connIface.ExecContext(context.Background(), onClose, nil) + _ = raw.Exec(onClose) - // Finally, close the conn. - err = c.connIface.Close() + // Finally, close. + err = raw.Close() return } @@ -164,7 +181,7 @@ func (r *sqliteRows) Close() (err error) { } // connIface is the driver.Conn interface -// types (and the like) that modernc.org/sqlite.conn +// types (and the like) that go-sqlite3/driver.conn // conforms to. Useful so you don't need // to repeatedly perform checks yourself. type connIface interface { @@ -172,11 +189,10 @@ type connIface interface { driver.ConnBeginTx driver.ConnPrepareContext driver.ExecerContext - driver.QueryerContext } // StmtIface is the driver.Stmt interface -// types (and the like) that modernc.org/sqlite.stmt +// types (and the like) that go-sqlite3/driver.stmt // conforms to. Useful so you don't need // to repeatedly perform checks yourself. type stmtIface interface { @@ -186,12 +202,10 @@ type stmtIface interface { } // RowsIface is the driver.Rows interface -// types (and the like) that modernc.org/sqlite.rows +// types (and the like) that go-sqlite3/driver.rows // conforms to. Useful so you don't need // to repeatedly perform checks yourself. type rowsIface interface { driver.Rows driver.RowsColumnTypeDatabaseTypeName - driver.RowsColumnTypeLength - driver.RowsColumnTypeScanType } |