lure/internal/db/db.go

68 lines
1.9 KiB
Go

package db
import (
"github.com/genjidb/genji"
"github.com/genjidb/genji/document"
)
// Package is a LURE package's database representation
type Package struct {
Name string `sh:"name,required"`
Version string `sh:"version,required"`
Release int `sh:"release,required"`
Epoch uint `sh:"epoch"`
Description string `sh:"desc"`
Homepage string `sh:"homepage"`
Maintainer string `sh:"maintainer"`
Architectures []string `sh:"architectures"`
Licenses []string `sh:"license"`
Provides []string `sh:"provides"`
Conflicts []string `sh:"conflicts"`
Depends map[string][]string
BuildDepends map[string][]string
Replaces []string `sh:"replaces"`
Repository string
}
// Init initializes the database
func Init(db *genji.DB) error {
return db.Exec(`
CREATE TABLE IF NOT EXISTS pkgs (
name TEXT,
repository TEXT NOT NULL,
UNIQUE(name, repository),
...
);
`)
}
// InsertPackage adds a package to the database
func InsertPackage(db *genji.DB, pkg Package) error {
return db.Exec("INSERT INTO pkgs VALUES ? ON CONFLICT DO REPLACE;", pkg)
}
// GetPkgs returns a result containing packages that match the where conditions
func GetPkgs(db *genji.DB, where string, args ...any) (*genji.Result, error) {
stream, err := db.Query("SELECT * FROM pkgs WHERE "+where, args...)
if err != nil {
return nil, err
}
return stream, nil
}
// GetPkg returns a single package matching the where conditions
func GetPkg(db *genji.DB, where string, args ...any) (*Package, error) {
doc, err := db.QueryDocument("SELECT * FROM pkgs WHERE "+where, args...)
if err != nil {
return nil, err
}
out := &Package{}
err = document.StructScan(doc, out)
return out, err
}
// DeletePkgs deletes all packages matching the where conditions
func DeletePkgs(db *genji.DB, where string, args ...any) error {
return db.Exec("DELETE * FROM pkgs WHERE "+where, args...)
}