Add initial triplestore rebuild functionality
This commit is contained in:
parent
8a1319df16
commit
674b9d8d07
11 changed files with 252 additions and 56 deletions
|
|
@ -48,7 +48,7 @@ var listURIPrefixesPHP string
|
|||
// server is an optional server to fetch prefixes from.
|
||||
// server may be nil.
|
||||
func (prefixes *Prefixes) All(ctx context.Context, server *phpx.Server) ([]string, error) {
|
||||
uris, err := prefixes.database(ctx, server)
|
||||
uris, err := prefixes.triplestore(ctx, server)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
@ -61,7 +61,7 @@ func (prefixes *Prefixes) All(ctx context.Context, server *phpx.Server) ([]strin
|
|||
return append(uris, uris2...), nil
|
||||
}
|
||||
|
||||
func (wisski *Prefixes) database(ctx context.Context, server *phpx.Server) (prefixes []string, err error) {
|
||||
func (wisski *Prefixes) triplestore(ctx context.Context, server *phpx.Server) (prefixes []string, err error) {
|
||||
// get all the ugly prefixes
|
||||
err = wisski.dependencies.PHP.ExecScript(ctx, server, &prefixes, listURIPrefixesPHP, "list_prefixes")
|
||||
if err != nil {
|
||||
|
|
|
|||
91
internal/wisski/ingredient/trb/trb.go
Normal file
91
internal/wisski/ingredient/trb/trb.go
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
package trb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient"
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/barrel"
|
||||
"github.com/FAU-CDI/wisski-distillery/pkg/logging"
|
||||
)
|
||||
|
||||
type TRB struct {
|
||||
ingredient.Base
|
||||
|
||||
dependencies struct {
|
||||
Barrel *barrel.Barrel
|
||||
}
|
||||
}
|
||||
|
||||
func (trb *TRB) DoSomething(ctx context.Context, out io.Writer, allowEmptyRepository bool) (err error) {
|
||||
|
||||
// stop instance, restart when done
|
||||
logging.LogMessage(out, "Shutting down instance")
|
||||
if err := trb.dependencies.Barrel.Stack().Down(ctx, out); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
logging.LogMessage(out, "Restarting instance")
|
||||
e := trb.dependencies.Barrel.Stack().Up(ctx, out)
|
||||
if err == nil {
|
||||
err = e
|
||||
}
|
||||
}()
|
||||
|
||||
// make the backup
|
||||
logging.LogMessage(out, "Dumping triplestore")
|
||||
path, err := trb.makeBackup(ctx, allowEmptyRepository)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fmt.Printf("Wrote %q\n", path)
|
||||
|
||||
logging.LogMessage(out, "Purging triplestore")
|
||||
if err := trb.Malt.TS.Purge(ctx, trb.Instance, trb.Domain()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
logging.LogMessage(out, "Provising triplestore")
|
||||
if err := trb.Malt.TS.Provision(ctx, trb.Instance, trb.Domain()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
logging.LogMessage(out, "Loading dump file")
|
||||
content, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer content.Close()
|
||||
|
||||
logging.LogMessage(out, "Restoring triplestore")
|
||||
if err := trb.Malt.TS.RestoreDB(ctx, trb.GraphDBRepository, content); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var errBackupEmpty = errors.New("no data contained in backup file (is the repository empty?)")
|
||||
|
||||
func (trb *TRB) makeBackup(ctx context.Context, allowEmptyRepository bool) (path string, err error) {
|
||||
f, err := os.CreateTemp("", "")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
count, err := trb.Malt.TS.SnapshotDB(ctx, f, trb.GraphDBRepository)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if count == 0 && !allowEmptyRepository {
|
||||
return "", errBackupEmpty
|
||||
}
|
||||
|
||||
return f.Name(), nil
|
||||
}
|
||||
|
|
@ -19,6 +19,7 @@ import (
|
|||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/php/extras"
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/php/users"
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/reserve"
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/ingredient/trb"
|
||||
"github.com/FAU-CDI/wisski-distillery/internal/wisski/liquid"
|
||||
"github.com/tkw1536/pkglib/lifetime"
|
||||
)
|
||||
|
|
@ -70,6 +71,10 @@ func (wisski *WissKI) Barrel() *barrel.Barrel {
|
|||
return export[*barrel.Barrel](wisski)
|
||||
}
|
||||
|
||||
func (wisski *WissKI) TRB() *trb.TRB {
|
||||
return export[*trb.TRB](wisski)
|
||||
}
|
||||
|
||||
func (wisski *WissKI) Manager() *manager.Manager {
|
||||
return export[*manager.Manager](wisski)
|
||||
}
|
||||
|
|
@ -183,4 +188,5 @@ func (wisski *WissKI) allIngredients(context *lifetime.Registry[ingredient.Ingre
|
|||
lifetime.Place[*reserve.Reserve](context)
|
||||
|
||||
lifetime.Place[*ssh.SSH](context)
|
||||
lifetime.Place[*trb.TRB](context)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue