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