• v1.0.0 0acf4da97e

    Rene Nochebuena released this 2026-05-29 09:57:09 -06:00 | 0 commits to main since this release

    v1.0.0

    code.nochebuena.dev/einherjar/db-sqlite


    Architecture Decisions Resolved

    Decision Outcome
    CGO vs pure-Go driver modernc.org/sqlite — pure Go; cross-compilation works without a C toolchain
    Tx Commit/Rollback context No ctx — honest database/sql contract; sql.Tx does not support per-call context
    Single-writer serialization writeMu sync.Mutex in UnitOfWork — prevents SQLITE_BUSY under concurrent goroutines
    GetExecutor nil guard Explicit if db == nil { return nil } — avoids typed-nil interface pitfall
    Health priority LevelDegraded — file-based DB; absence is non-fatal if file is present
    WAL default pragma ?_journal=WAL&_timeout=5000&_fk=true — WAL mode improves concurrent reads

    API

    import "code.nochebuena.dev/einherjar/db-sqlite"
    
    // Interfaces
    type Executor interface {
        ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
        QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
        QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
    }
    type Tx interface {
        Executor
        Commit() error    // no ctx — database/sql limitation
        Rollback() error
    }
    type Provider interface {
        GetExecutor(ctx context.Context) Executor
        Begin(ctx context.Context) (Tx, error)
        Ping(ctx context.Context) error
        HandleError(err error) error
    }
    type Component interface {
        lifecycle.Component
        observability.Checkable
        observability.Identifiable
        Provider
    }
    type UnitOfWork interface {
        Do(ctx context.Context, fn func(ctx context.Context) error) error
    }
    
    // Config
    type Config struct {
        Path         string `env:"EINHERJAR_SQLITE_PATH,required"`
        MaxOpenConns int    `env:"EINHERJAR_SQLITE_MAX_OPEN_CONNS" envDefault:"1"`
        MaxIdleConns int    `env:"EINHERJAR_SQLITE_MAX_IDLE_CONNS" envDefault:"1"`
        Pragmas      string `env:"EINHERJAR_SQLITE_PRAGMAS"        envDefault:"?_journal=WAL&_timeout=5000&_fk=true"`
    }
    func DefaultConfig() Config
    func (c Config) DSN() string
    
    // Constructors
    func New(logger logging.Logger, cfg Config) Component
    func NewUnitOfWork(logger logging.Logger, client Provider) UnitOfWork
    
    // Package-level error handler (also available as Provider.HandleError)
    func HandleError(err error) error
    

    Install

    go get code.nochebuena.dev/einherjar/db-sqlite@v1.0.0
    

    Dependencies

    Module Version Role
    code.nochebuena.dev/einherjar/contracts v1.0.0 lifecycle.Component, observability.Checkable, logging.Logger
    code.nochebuena.dev/einherjar/core v1.0.0 xerrors
    modernc.org/sqlite v1.37.1 Pure-Go SQLite driver (no CGO)
    Downloads