lure/internal/db/db.go

127 lines
3.5 KiB
Go
Raw Normal View History

package db
import (
"github.com/genjidb/genji"
2022-12-18 05:01:50 +00:00
"github.com/genjidb/genji/types"
)
2022-12-01 06:15:34 +00:00
// 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"`
2022-12-01 06:22:37 +00:00
Replaces []string `sh:"replaces"`
Depends map[string][]string
BuildDepends map[string][]string
Repository string
}
2022-12-18 05:01:50 +00:00
// Package is a LURE Web comment's database representation
type Comment struct {
CommentID int64
PackageName string
PackageRepo string
TimeCreated int64
Contents string
}
// Init initializes the database
func Init(db *genji.DB) error {
return db.Exec(`
CREATE TABLE IF NOT EXISTS pkgs (
2022-12-01 06:52:21 +00:00
name TEXT NOT NULL,
repository TEXT NOT NULL,
version TEXT NOT NULL,
release INT NOT NULL,
epoch INT,
description TEXT,
homepage TEXT,
maintainer TEXT,
2022-12-01 06:22:37 +00:00
architectures ARRAY,
2022-12-01 06:52:21 +00:00
licenses ARRAY,
provides ARRAY,
conflicts ARRAY,
replaces ARRAY,
depends (...),
builddepends (...),
2022-12-01 06:22:37 +00:00
UNIQUE(name, repository)
);
2022-12-18 05:01:50 +00:00
CREATE TABLE IF NOT EXISTS comments (
comment_id INT PRIMARY KEY,
package_name TEXT NOT NULL,
package_repo TEXT NOT NULL,
time_created INT NOT NULL,
contents TEXT NOT NULL,
UNIQUE(comment_id),
UNIQUE(package_name, package_repo)
);
`)
}
// 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
}
// DeletePkgs deletes all packages matching the where conditions
func DeletePkgs(db *genji.DB, where string, args ...any) error {
2022-12-04 22:52:46 +00:00
return db.Exec("DELETE FROM pkgs WHERE "+where, args...)
}
2022-12-18 05:01:50 +00:00
func InsertComment(db *genji.DB, c Comment) error {
return db.Exec("INSERT INTO comments VALUES ? ON CONFLICT DO REPLACE;", c)
}
func CountComments(db *genji.DB) (int64, error) {
doc, err := db.QueryDocument("SELECT count(*) FROM comments;")
if err != nil {
return 0, err
}
val, err := doc.GetByField("COUNT(*)")
if err != nil {
return 0, err
}
return val.V().(int64), nil
}
// GetComments returns a result containing comments that match the where conditions
func GetComments(db *genji.DB, where string, args ...any) (*genji.Result, error) {
stream, err := db.Query("SELECT * FROM comments WHERE "+where, args...)
if err != nil {
return nil, err
}
return stream, nil
}
// GetComment returns a comment that matches the where conditions
func GetComment(db *genji.DB, where string, args ...any) (types.Document, error) {
doc, err := db.QueryDocument("SELECT * FROM comments WHERE "+where+" LIMIT 1", args...)
if err != nil {
return nil, err
}
return doc, nil
}
// DeleteComments deletes all comments matching the where conditions
func DeleteComments(db *genji.DB, where string, args ...any) error {
return db.Exec("DELETE FROM comments WHERE "+where, args...)
}