Fix every finding surfaced by the canonical .golangci.yml with golangci-lint v2.12.2 (refs #61), behavior-preserving throughout: - err113: dynamic errors replaced with package-level sentinels and %w wrapping; direct comparisons converted to errors.Is - goprintffuncname: printf-style helpers renamed with an f suffix (ui.Writer message methods, cli.ReportErrorf, database.Fatalf, vaultik stdoutf) and all call sites updated - revive: stuttering type names renamed (blob.Handler, blob.WithReader, blob.ChunkPosition, storage.URL, storage.Info), doc comments added, unused parameters blanked, package comments added - contextcheck/noctx: ctx threaded through blob.Packer (AddChunk/Flush/FinalizeBlob/PackChunks) and scanner call sites; context-aware exec and sql variants used - funlen/cyclop/gocognit/nestif/dupl: oversized or duplicated functions split into focused helpers across production and test code - paralleltest/tparallel/thelper/usetesting/testpackage: tests parallelized where safe (global log.Initialize kept in the serial phase), helpers marked, t.TempDir adopted, external test packages where only exported API is used - gosec: integer conversions clamped or justified, header timeouts added, remaining findings suppressed with per-site justifications - mnd/goconst/lll/wsl_v5/nlreturn/noinlineerr/errcheck and other mechanical findings fixed directly Remove the deprecated log.LogOptions alias (callers migrated to log.Options). make check is green.
59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
// LocalMetaKeyStorageURL is the key under which the destination store's
|
|
// URL is recorded when a mutating command first binds the local index
|
|
// to a specific backup destination.
|
|
const LocalMetaKeyStorageURL = "storage_url"
|
|
|
|
// LocalMetaRepository provides keyed access to host-local settings
|
|
// stored in the local_meta table.
|
|
type LocalMetaRepository struct {
|
|
db *DB
|
|
}
|
|
|
|
// NewLocalMetaRepository creates a LocalMetaRepository backed by db.
|
|
func NewLocalMetaRepository(db *DB) *LocalMetaRepository {
|
|
return &LocalMetaRepository{db: db}
|
|
}
|
|
|
|
// Get returns the value stored at key, or the empty string if the key
|
|
// is not set. A missing key is not an error — the caller distinguishes
|
|
// "unset" (bind on first use) from "set to something" (compare).
|
|
func (r *LocalMetaRepository) Get(ctx context.Context, key string) (string, error) {
|
|
var value string
|
|
|
|
err := r.db.conn.QueryRowContext(ctx,
|
|
"SELECT value FROM local_meta WHERE key = ?", key,
|
|
).Scan(&value)
|
|
if errors.Is(err, sql.ErrNoRows) {
|
|
return "", nil
|
|
}
|
|
|
|
if err != nil {
|
|
return "", fmt.Errorf("reading local_meta %q: %w", key, err)
|
|
}
|
|
|
|
return value, nil
|
|
}
|
|
|
|
// Set writes key=value, replacing any prior value.
|
|
func (r *LocalMetaRepository) Set(ctx context.Context, key, value string) error {
|
|
_, err := r.db.ExecWithLog(ctx,
|
|
`INSERT INTO local_meta (key, value) VALUES (?, ?)
|
|
ON CONFLICT(key) DO UPDATE SET value = excluded.value`,
|
|
key, value,
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("writing local_meta %q: %w", key, err)
|
|
}
|
|
|
|
return nil
|
|
}
|