Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • id/usermetadb
1 result
Select Git revision
Show changes
Commits on Source (2)
......@@ -2,10 +2,10 @@ module git.autistici.org/id/usermetadb
go 1.21.0
toolchain go1.22.1
toolchain go1.23.3
require (
git.autistici.org/ai3/go-common v0.0.0-20240906100150-439608162088
git.autistici.org/ai3/go-common v0.0.0-20241017171051-880a2c5ae7f4
github.com/google/go-cmp v0.6.0
gopkg.in/yaml.v3 v3.0.1
)
......
......@@ -5,6 +5,7 @@ import (
"database/sql"
"fmt"
"log"
"net/url"
"strings"
_ "github.com/mattn/go-sqlite3"
......@@ -13,11 +14,24 @@ import (
// DebugMigrations can be set to true to dump statements to stderr.
var DebugMigrations bool
const defaultOptions = "?cache=shared&_busy_timeout=10000&_journal=WAL&_sync=OFF"
// See https://github.com/mattn/go-sqlite3/issues/209 for details on
// why these default parameters were chosen. WAL mode is mandatory for
// external litestream support.
func defaultOptions() url.Values {
v := make(url.Values)
v.Set("cache", "shared")
v.Set("_journal", "WAL")
v.Set("_sync", "OFF")
v.Set("_busy_timeout", "999999")
v.Set("_fk", "true")
v.Set("_cache_size", "268435456")
v.Set("_auto_vacuum", "incremental")
return v
}
type sqlOptions struct {
migrations []func(*sql.Tx) error
sqlopts string
sqlopts url.Values
}
type Option func(*sqlOptions)
......@@ -28,16 +42,16 @@ func WithMigrations(migrations []func(*sql.Tx) error) Option {
}
}
func WithSqliteOptions(sqlopts string) Option {
func WithSqliteOption(opt, value string) Option {
return func(opts *sqlOptions) {
opts.sqlopts = sqlopts
opts.sqlopts.Set(opt, value)
}
}
// OpenDB opens a SQLite database and runs the database migrations.
func OpenDB(dburi string, options ...Option) (*sql.DB, error) {
var opts sqlOptions
opts.sqlopts = defaultOptions
opts.sqlopts = defaultOptions()
for _, o := range options {
o(&opts)
}
......@@ -45,7 +59,7 @@ func OpenDB(dburi string, options ...Option) (*sql.DB, error) {
// Add sqlite3-specific parameters if none are already
// specified in the connection URI.
if !strings.Contains(dburi, "?") {
dburi += opts.sqlopts
dburi = fmt.Sprintf("%s?%s", dburi, opts.sqlopts.Encode())
}
db, err := sql.Open("sqlite3", dburi)
......@@ -56,6 +70,7 @@ func OpenDB(dburi string, options ...Option) (*sql.DB, error) {
// Limit the pool to a single connection.
// https://github.com/mattn/go-sqlite3/issues/209
db.SetMaxOpenConns(1)
db.SetMaxIdleConns(1)
if err = migrate(db, opts.migrations); err != nil {
db.Close() // nolint
......
# git.autistici.org/ai3/go-common v0.0.0-20240906100150-439608162088
# git.autistici.org/ai3/go-common v0.0.0-20241017171051-880a2c5ae7f4
## explicit; go 1.21.0
git.autistici.org/ai3/go-common
git.autistici.org/ai3/go-common/clientutil
......