2022-11-16 11:23:54 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-03-15 22:48:34 +00:00
|
|
|
"encoding/json"
|
2024-03-14 12:33:52 +00:00
|
|
|
"log/slog"
|
2022-11-16 11:23:54 +00:00
|
|
|
"os"
|
|
|
|
|
2024-03-14 12:33:52 +00:00
|
|
|
"github.com/urfave/cli/v2"
|
2023-02-23 09:50:52 +00:00
|
|
|
|
2023-11-10 20:36:15 +00:00
|
|
|
"git.sr.ht/~ashkeel/strimertul/database"
|
2024-03-14 12:33:52 +00:00
|
|
|
"git.sr.ht/~ashkeel/strimertul/utils"
|
2022-11-16 11:23:54 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func cliImport(ctx *cli.Context) error {
|
|
|
|
inStream := os.Stdin
|
|
|
|
fileArg := ctx.String("file")
|
|
|
|
if fileArg != "" {
|
|
|
|
file, err := os.Open(fileArg)
|
|
|
|
if err != nil {
|
2022-11-18 16:37:30 +00:00
|
|
|
return fatalError(err, "could not open import file for reading")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
2024-03-14 12:33:52 +00:00
|
|
|
defer utils.Close(file)
|
2022-11-16 11:23:54 +00:00
|
|
|
inStream = file
|
|
|
|
}
|
|
|
|
var entries map[string]string
|
2022-11-23 15:34:49 +00:00
|
|
|
err := json.NewDecoder(inStream).Decode(&entries)
|
2022-11-16 11:23:54 +00:00
|
|
|
if err != nil {
|
2022-11-18 16:37:30 +00:00
|
|
|
return fatalError(err, "could not decode import file")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
|
|
|
|
2022-11-30 18:15:47 +00:00
|
|
|
driver, err := database.GetDatabaseDriver(ctx)
|
2022-11-18 16:37:30 +00:00
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "could not open database")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
|
|
|
|
2022-11-18 16:37:30 +00:00
|
|
|
err = driver.Import(entries)
|
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "import failed")
|
|
|
|
}
|
|
|
|
|
2024-03-14 12:33:52 +00:00
|
|
|
slog.Info("Imported database from file")
|
2022-11-16 11:23:54 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func cliRestore(ctx *cli.Context) error {
|
|
|
|
inStream := os.Stdin
|
|
|
|
fileArg := ctx.String("file")
|
|
|
|
if fileArg != "" {
|
|
|
|
file, err := os.Open(fileArg)
|
|
|
|
if err != nil {
|
2022-11-18 16:37:30 +00:00
|
|
|
return fatalError(err, "could not open import file for reading")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
2024-03-14 12:33:52 +00:00
|
|
|
defer utils.Close(file)
|
2022-11-16 11:23:54 +00:00
|
|
|
inStream = file
|
|
|
|
}
|
|
|
|
|
2022-11-30 18:15:47 +00:00
|
|
|
driver, err := database.GetDatabaseDriver(ctx)
|
2022-11-18 16:37:30 +00:00
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "could not open database")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
|
|
|
|
2022-11-18 16:37:30 +00:00
|
|
|
err = driver.Restore(inStream)
|
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "restore failed")
|
|
|
|
}
|
|
|
|
|
2024-03-14 12:33:52 +00:00
|
|
|
slog.Info("Restored database from backup")
|
2022-11-16 11:23:54 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func cliExport(ctx *cli.Context) error {
|
|
|
|
outStream := os.Stdout
|
|
|
|
fileArg := ctx.String("file")
|
|
|
|
if fileArg != "" {
|
|
|
|
file, err := os.Create(fileArg)
|
|
|
|
if err != nil {
|
2022-11-18 16:37:30 +00:00
|
|
|
return fatalError(err, "could not open output file for writing")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
2024-03-14 12:33:52 +00:00
|
|
|
defer utils.Close(file)
|
2022-11-16 11:23:54 +00:00
|
|
|
outStream = file
|
|
|
|
}
|
|
|
|
|
2022-11-30 18:15:47 +00:00
|
|
|
driver, err := database.GetDatabaseDriver(ctx)
|
2022-11-18 16:37:30 +00:00
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "could not open database")
|
|
|
|
}
|
|
|
|
|
|
|
|
err = driver.Export(outStream)
|
|
|
|
if err != nil {
|
|
|
|
return fatalError(err, "export failed")
|
2022-11-16 11:23:54 +00:00
|
|
|
}
|
|
|
|
|
2024-03-14 12:33:52 +00:00
|
|
|
slog.Info("Exported database")
|
2022-11-16 11:23:54 +00:00
|
|
|
return nil
|
|
|
|
}
|