bitcask-mirror/cmd/bitcask/import.go

107 lines
2.0 KiB
Go

package main
import (
"bufio"
"encoding/base64"
"encoding/json"
"io"
"os"
log "github.com/rs/zerolog/log"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"git.tcp.direct/Mirrors/bitcask-mirror"
)
var importCmd = &cobra.Command{
Use: "import",
Aliases: []string{"restore", "read"},
Short: "Import a database",
Long: `This command allows you to import or restore a database from a
previous export/dump using the export command either creating a new database
or adding additional key/value pairs to an existing one.`,
Args: cobra.RangeArgs(0, 1),
Run: func(cmd *cobra.Command, args []string) {
var input string
path := viper.GetString("path")
if len(args) == 1 {
input = args[0]
} else {
input = "-"
}
os.Exit(_import(path, input))
},
}
func init() {
RootCmd.AddCommand(importCmd)
}
func _import(path, input string) int {
var (
err error
r io.ReadCloser
)
db, err := bitcask.Open(path)
if err != nil {
log.Error().Err(err).Msg("error opening database")
return 1
}
defer db.Close()
if input == "-" {
r = os.Stdin
} else {
r, err = os.Open(input)
if err != nil {
log.Error().Err(err).
Str("input", input).
Msg("error opening input for reading")
return 1
}
}
var kv kvPair
scanner := bufio.NewScanner(r)
for scanner.Scan() {
if err := json.Unmarshal(scanner.Bytes(), &kv); err != nil {
log.Error().Err(err).
Str("input", input).
Msg("error reading input")
return 2
}
key, err := base64.StdEncoding.DecodeString(kv.Key)
if err != nil {
log.Error().Err(err).Msg("error decoding key")
return 2
}
value, err := base64.StdEncoding.DecodeString(kv.Value)
if err != nil {
log.Error().Err(err).Msg("error decoding value")
return 2
}
if err := db.Put(key, value); err != nil {
log.Error().Err(err).Msg("error writing key/value")
return 2
}
}
if err := scanner.Err(); err != nil {
log.Error().Err(err).
Str("input", input).
Msg("error reading input")
return 2
}
return 0
}