Compare commits

..

3 Commits

Author SHA1 Message Date
3d8af35a89 REORDER ME into database 2025-05-08 23:41:36 +02:00
5145191c2b Add version package and update the makefile
The makefile will grab the version info from git and pass it to the
linker so that version information based on tags, commits and commit
times is available in the code.
2025-05-08 16:08:55 +02:00
cd0fb4edd2 Add basic database interaction 2025-05-08 15:11:54 +02:00
7 changed files with 15 additions and 288 deletions

View File

@@ -1,40 +0,0 @@
name: Validate the build
run-name: ${{ gitea.actor }} is validating
on: [push]
jobs:
validate-build:
runs-on: ubuntu-latest
container:
image: node:current-alpine
steps:
- name: Install dependencies
run: |
echo "https://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories
echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
apk update
apk add --no-cache git make bash go
GOBIN=/usr/local/bin go install mvdan.cc/gofumpt@latest
export "PATH=$PATH:/root/go/bin"
echo "---------------------"
echo "Go version:"
go version
echo "---------------------"
- name: Check out repository code
uses: actions/checkout@v4
- name: Fetch dependencies
run: |
go mod download
- name: Validate the code and formatting
run: |
make validate
- name: Run tests
run: |
make test

View File

@@ -1,27 +0,0 @@
package main
import (
"fmt"
"github.com/spf13/cobra"
)
func configPreRun(cmd *cobra.Command, args []string) error {
return setupDb()
}
func configPostRun(cmd *cobra.Command, args []string) error {
return cleanupDb()
}
func configSetHandler(cmd *cobra.Command, args []string) {
fmt.Println("Not implemented")
}
func configGetHandler(cmd *cobra.Command, args []string) {
fmt.Println("Not implemented")
}
func configListHandler(cmd *cobra.Command, args []string) {
fmt.Println("Not implemented")
}

View File

@@ -1,48 +0,0 @@
package main
import (
"fmt"
"git.omicron.one/omicron/linkshare/internal/database"
"git.omicron.one/omicron/linkshare/internal/util"
"git.omicron.one/omicron/linkshare/internal/version"
"github.com/spf13/cobra"
)
func openDB() (*database.DB, error) {
paths, err := util.FindDirectories(dbPath)
if err != nil {
return nil, err
}
return database.Open(paths.DatabaseFile)
}
func dbPreRun(cmd *cobra.Command, args []string) error {
return setupDb()
}
func dbPostRun(cmd *cobra.Command, args []string) error {
return cleanupDb()
}
func dbInitHandler(cmd *cobra.Command, args []string) {
err := db.Initialize(paths.SchemaDir)
if err == database.ErrAlreadyInitialized {
fmt.Printf("Database %q is already initialized\n", dbPath)
return
}
if err == nil {
fmt.Printf("Initialized database %q with schema version %d\n", dbPath, version.SchemaVersion)
return
}
fmt.Printf("Failed to initialize database %q: %v\n", dbPath, err)
}
func dbBackupHandler(cmd *cobra.Command, args []string) {
fmt.Println("Not implemented")
}
func dbUpdateHandler(cmd *cobra.Command, args []string) {
fmt.Println("Not implemented")
}

View File

@@ -2,156 +2,17 @@ package main
import (
"fmt"
"os"
"git.omicron.one/omicron/linkshare/internal/database"
"git.omicron.one/omicron/linkshare/internal/util"
"git.omicron.one/omicron/linkshare/internal/version"
"github.com/spf13/cobra"
)
var (
dbPath string
verbosity int
)
var (
paths *util.AppPaths
db *database.DB
)
func exitIfError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func setupPaths() error {
if paths != nil {
return nil
}
paths_, err := util.FindDirectories(dbPath)
if err != nil {
return err
}
paths = paths_
return nil
}
func setupDb() error {
if db != nil {
return nil
}
err := setupPaths()
if err != nil {
return nil
}
db_, err := database.Open(dbPath)
if err != nil {
return nil
}
db = db_
return nil
}
func cleanupDb() error {
if db != nil {
err := db.Close()
if err != nil {
return err
}
}
return nil
}
func main() {
rootCmd := &cobra.Command{
Use: "linkctl",
Short: "LinkShare CLI tool",
Long: `Command line tool to manage your self-hosted LinkShare service.`,
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
}
rootCmd.CompletionOptions.DisableDefaultCmd = true
rootCmd.PersistentFlags().StringVarP(&dbPath, "db", "d", "", "Database file path")
rootCmd.PersistentFlags().CountVarP(&verbosity, "verbose", "v", "Increase verbosity level")
configCmd := &cobra.Command{
Use: "config",
Short: "Configuration commands",
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
PersistentPreRunE: configPreRun,
PersistentPostRunE: configPostRun,
}
configSetCmd := &cobra.Command{
Use: "set",
Short: "Set a configuration value",
Run: configSetHandler,
}
configGetCmd := &cobra.Command{
Use: "get",
Short: "Get a configuration value",
Run: configGetHandler,
}
configListCmd := &cobra.Command{
Use: "list",
Short: "List all configuration values",
Run: configListHandler,
}
configCmd.AddCommand(configSetCmd, configGetCmd, configListCmd)
dbCmd := &cobra.Command{
Use: "db",
Short: "Database commands",
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
PersistentPreRunE: dbPreRun,
PersistentPostRunE: dbPostRun,
}
dbInitCmd := &cobra.Command{
Use: "init",
Short: "Initialize the database",
Run: dbInitHandler,
}
dbBackupCmd := &cobra.Command{
Use: "backup",
Short: "Backup the database",
Run: dbBackupHandler,
}
dbUpdateCmd := &cobra.Command{
Use: "update",
Short: "Update the database schema",
Run: dbUpdateHandler,
}
dbCmd.AddCommand(dbInitCmd, dbBackupCmd, dbUpdateCmd)
versionCmd := &cobra.Command{
Use: "version",
Short: "Display version information",
Run: func(cmd *cobra.Command, args []string) {
version.Print()
},
}
rootCmd.AddCommand(configCmd, dbCmd, versionCmd)
if err := rootCmd.Execute(); err != nil {
paths, err := util.FindDirectories("")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("Paths:")
fmt.Println(" Schema:", paths.SchemaDir)
fmt.Println(" Database:", paths.DatabaseFile)
}

10
go.mod
View File

@@ -2,12 +2,4 @@ module git.omicron.one/omicron/linkshare
go 1.24
require (
github.com/mattn/go-sqlite3 v1.14.28
github.com/spf13/cobra v1.9.1
)
require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/spf13/pflag v1.0.6 // indirect
)
require github.com/mattn/go-sqlite3 v1.14.28

10
go.sum
View File

@@ -1,12 +1,2 @@
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -24,10 +24,9 @@ type DB struct {
}
var (
ErrNotInitialized = errors.New("database not initialized")
ErrAlreadyInitialized = errors.New("database already initialized")
ErrSchemaOutdated = errors.New("database schema needs updating")
ErrSchemaUnsupported = errors.New("database schema is too new for the server")
ErrDatabaseNotInitialized = errors.New("database not initialized")
ErrDatabaseSchemaOutdated = errors.New("database schema needs updating")
ErrDatabaseSchemaUnsupported = errors.New("database schema is too new for the server")
ErrMigrationFailed = errors.New("migration failed")
)
@@ -66,7 +65,7 @@ func (db *DB) Close() error {
func (db *DB) Initialize(schemaPath string) error {
err := db.CheckInitialized()
if err == nil {
return ErrAlreadyInitialized
return nil
}
currentSchema := filepath.Join(schemaPath, "current.sql")
@@ -92,7 +91,7 @@ func (db *DB) CheckInitialized() error {
}
if count == 0 {
return ErrNotInitialized
return ErrDatabaseNotInitialized
}
return nil
}
@@ -128,9 +127,9 @@ func (db *DB) CheckSchemaVersion() error {
return err
}
if version_ < version.SchemaVersion {
return ErrSchemaOutdated
return ErrDatabaseSchemaOutdated
} else if version_ > version.SchemaVersion {
return ErrSchemaUnsupported
return ErrDatabaseSchemaUnsupported
}
return nil
}