Artifact c8056525affb72ab0df263120a969169206472c40967401d454ecc28c58cc60d:
- File
internal/checkout/schema.go
— part of check-in
[f5744359d3]
at
2026-04-19 16:30:54
on branch trunk
— Initial open source release
libfossil is a pure-Go implementation of the Fossil SCM, reading and writing the same .fossil SQLite repository format as upstream Fossil.
This is the first public release of code that previously lived in a private repository. The module path is github.com/danmestas/libfossil and the binary is named libfossil to avoid $PATH collisions with upstream fossil.
Included: - Repo lifecycle (create, clone), checkout/checkin, timeline, merge, diff, annotate, shun, tag, branch, bisect, stash, undo/redo - Sync-over-HTTP protocol (client and handler) - Two SQLite drivers: modernc (pure Go, default) and ncruces (wasm-capable) - Observer interfaces (SyncObserver, CheckoutObserver) with an optional OpenTelemetry implementation in observer/otel (separate submodule) - Deterministic simulation testing harness with BUGGIFY fault injection - Kong-based embeddable CLI under cli/ and a standalone binary under cmd/libfossil/ (user: [email protected], size: 1988) [annotate] [blame] [check-ins using]
package checkout import ( "database/sql" "fmt" ) const vfileSchema = ` CREATE TABLE IF NOT EXISTS vfile( id INTEGER PRIMARY KEY, vid INTEGER NOT NULL, chnged INTEGER DEFAULT 0, deleted INTEGER DEFAULT 0, isexe INTEGER DEFAULT 0, islink INTEGER DEFAULT 0, rid INTEGER DEFAULT 0, mrid INTEGER DEFAULT 0, mtime INTEGER DEFAULT 0, pathname TEXT NOT NULL, origname TEXT, mhash TEXT, UNIQUE(pathname, vid) ); ` const vmergeSchema = ` CREATE TABLE IF NOT EXISTS vmerge( id INTEGER REFERENCES vfile, merge INTEGER, mhash TEXT ); ` const vvarSchema = ` CREATE TABLE IF NOT EXISTS vvar( name TEXT PRIMARY KEY, value TEXT ); ` // EnsureTables creates the vfile, vmerge, and vvar tables if they don't exist. // This is idempotent — safe to call multiple times. // // Panics if db is nil (TigerStyle precondition). func EnsureTables(db *sql.DB) error { if db == nil { panic("checkout.EnsureTables: nil *sql.DB") } schemas := []string{vfileSchema, vmergeSchema, vvarSchema} for _, schema := range schemas { if _, err := db.Exec(schema); err != nil { return fmt.Errorf("checkout.EnsureTables: %w", err) } } return nil } // getVVar retrieves a vvar value by name. Returns empty string if not found. func getVVar(db *sql.DB, name string) (string, error) { if db == nil { panic("checkout.getVVar: nil *sql.DB") } var value string err := db.QueryRow("SELECT value FROM vvar WHERE name = ?", name).Scan(&value) if err == sql.ErrNoRows { return "", nil } if err != nil { return "", fmt.Errorf("checkout.getVVar: %w", err) } return value, nil } // setVVar sets a vvar value, replacing any existing value. func setVVar(db *sql.DB, name, value string) error { if db == nil { panic("checkout.setVVar: nil *sql.DB") } _, err := db.Exec("INSERT OR REPLACE INTO vvar (name, value) VALUES (?, ?)", name, value) if err != nil { return fmt.Errorf("checkout.setVVar: %w", err) } return nil }