Files
mailcloak/src/sqlite.go
2026-01-18 14:14:24 +00:00

63 lines
1.5 KiB
Go

package main
import (
"database/sql"
"fmt"
_ "modernc.org/sqlite"
)
type AliasDB struct{ DB *sql.DB }
func OpenAliasDB(path string) (*AliasDB, error) {
db, err := sql.Open("sqlite", path)
if err != nil {
return nil, err
}
if _, err := db.Exec(`
CREATE TABLE IF NOT EXISTS aliases (
alias_email TEXT PRIMARY KEY,
username TEXT NOT NULL,
enabled INTEGER NOT NULL DEFAULT 1,
updated_at INTEGER NOT NULL DEFAULT (strftime('%s','now'))
);
CREATE INDEX IF NOT EXISTS idx_aliases_username ON aliases(username);
`); err != nil {
_ = db.Close()
return nil, fmt.Errorf("init schema: %w", err)
}
return &AliasDB{DB: db}, nil
}
func (a *AliasDB) Close() error { return a.DB.Close() }
// Returns username owning alias, ok
func (a *AliasDB) AliasOwner(aliasEmail string) (string, bool, error) {
var username string
var enabled int
err := a.DB.QueryRow(`SELECT username, enabled FROM aliases WHERE alias_email=?`, aliasEmail).Scan(&username, &enabled)
if err == sql.ErrNoRows {
return "", false, nil
}
if err != nil {
return "", false, err
}
if enabled != 1 {
return "", false, nil
}
return username, true, nil
}
// Returns true if alias belongs to username
func (a *AliasDB) AliasBelongsTo(aliasEmail, username string) (bool, error) {
var enabled int
err := a.DB.QueryRow(`SELECT enabled FROM aliases WHERE alias_email=? AND username=?`, aliasEmail, username).Scan(&enabled)
if err == sql.ErrNoRows {
return false, nil
}
if err != nil {
return false, err
}
return enabled == 1, nil
}