eventstore/cmd: fix mmm deinitialization.
This commit is contained in:
@@ -17,7 +17,10 @@ import (
|
||||
"github.com/urfave/cli/v3"
|
||||
)
|
||||
|
||||
var db eventstore.Store
|
||||
var (
|
||||
db eventstore.Store
|
||||
end func()
|
||||
)
|
||||
|
||||
var app = &cli.Command{
|
||||
Name: "eventstore",
|
||||
@@ -71,45 +74,58 @@ var app = &cli.Command{
|
||||
switch typ {
|
||||
case "lmdb":
|
||||
db = &lmdb.LMDBBackend{Path: path}
|
||||
if err := db.Init(); err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
end = db.Close
|
||||
case "boltdb":
|
||||
db = &boltdb.BoltBackend{Path: path}
|
||||
if err := db.Init(); err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
end = db.Close
|
||||
case "mmm":
|
||||
var err error
|
||||
if db, err = doMmmInit(path); err != nil {
|
||||
if db, err, end = doMmmInit(path); err != nil {
|
||||
if end != nil {
|
||||
end()
|
||||
}
|
||||
return ctx, err
|
||||
}
|
||||
case "file":
|
||||
db = &slicestore.SliceStore{}
|
||||
if err := db.Init(); err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
|
||||
// run this after we've called db.Init()
|
||||
defer func() {
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
log.Printf("failed to file at '%s': %s\n", path, err)
|
||||
os.Exit(3)
|
||||
// fill in the slicestore with the data from the file
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
log.Printf("failed to file at '%s': %s\n", path, err)
|
||||
os.Exit(3)
|
||||
}
|
||||
scanner := bufio.NewScanner(f)
|
||||
scanner.Buffer(make([]byte, 16*1024*1024), 256*1024*1024)
|
||||
i := 0
|
||||
for scanner.Scan() {
|
||||
var evt nostr.Event
|
||||
if err := json.Unmarshal(scanner.Bytes(), &evt); err != nil {
|
||||
log.Printf("invalid event read at line %d: %s (`%s`)\n", i, err, scanner.Text())
|
||||
}
|
||||
scanner := bufio.NewScanner(f)
|
||||
scanner.Buffer(make([]byte, 16*1024*1024), 256*1024*1024)
|
||||
i := 0
|
||||
for scanner.Scan() {
|
||||
var evt nostr.Event
|
||||
if err := json.Unmarshal(scanner.Bytes(), &evt); err != nil {
|
||||
log.Printf("invalid event read at line %d: %s (`%s`)\n", i, err, scanner.Text())
|
||||
}
|
||||
db.SaveEvent(evt)
|
||||
i++
|
||||
}
|
||||
}()
|
||||
db.SaveEvent(evt)
|
||||
i++
|
||||
}
|
||||
|
||||
end = func() {
|
||||
db.Close()
|
||||
f.Close()
|
||||
}
|
||||
case "":
|
||||
return ctx, fmt.Errorf("couldn't determine store type, you can use --type to specify it manually")
|
||||
default:
|
||||
return ctx, fmt.Errorf("'%s' store type is not supported by this CLI", typ)
|
||||
}
|
||||
|
||||
if err := db.Init(); err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
|
||||
return ctx, nil
|
||||
},
|
||||
Commands: []*cli.Command{
|
||||
@@ -124,6 +140,7 @@ var app = &cli.Command{
|
||||
}
|
||||
|
||||
func main() {
|
||||
defer func() { end() }()
|
||||
if err := app.Run(context.Background(), os.Args); err != nil {
|
||||
fmt.Println(err)
|
||||
os.Exit(1)
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"github.com/rs/zerolog"
|
||||
)
|
||||
|
||||
func doMmmInit(path string) (eventstore.Store, error) {
|
||||
func doMmmInit(path string) (eventstore.Store, error, func()) {
|
||||
logger := zerolog.New(zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) {
|
||||
w.Out = os.Stderr
|
||||
}))
|
||||
@@ -20,8 +20,13 @@ func doMmmInit(path string) (eventstore.Store, error) {
|
||||
Logger: &logger,
|
||||
}
|
||||
if err := mmmm.Init(); err != nil {
|
||||
return nil, err
|
||||
return nil, err, nil
|
||||
}
|
||||
|
||||
return mmmm.EnsureLayer(filepath.Base(path))
|
||||
end := func() {
|
||||
mmmm.Close()
|
||||
}
|
||||
|
||||
store, err := mmmm.EnsureLayer(filepath.Base(path))
|
||||
return store, err, end
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user