mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 02:44:59 +00:00
* Add (commented out) linters that we should introduce I went through the available linters and added (commented out) the ones I think we should work on in the near term. In other words, fix them, then uncomment them so they are enabled in CI. * linter: errchkjson * linter: ineffassign * linter: gosimple * linter: errname
100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
// Copyright 2022 Molecula Corp. (DBA FeatureBase).
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
package ctl
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
|
|
pilosa "github.com/featurebasedb/featurebase/v3"
|
|
"github.com/featurebasedb/featurebase/v3/logger"
|
|
"github.com/featurebasedb/featurebase/v3/server"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// ExportCommand represents a command for bulk exporting data from a server.
|
|
type ExportCommand struct {
|
|
// Remote host and port.
|
|
Host string
|
|
|
|
// Name of the index & field to export from.
|
|
Index string
|
|
Field string
|
|
|
|
// Filename to export to.
|
|
Path string
|
|
|
|
// Standard input/output
|
|
logDest logger.Logger
|
|
|
|
TLS server.TLSConfig
|
|
}
|
|
|
|
// Logger returns the command's associated Logger to maintain CommandWithTLSSupport interface compatibility
|
|
func (cmd *ExportCommand) Logger() logger.Logger {
|
|
return cmd.logDest
|
|
}
|
|
|
|
// NewExportCommand returns a new instance of ExportCommand.
|
|
func NewExportCommand(logdest logger.Logger) *ExportCommand {
|
|
return &ExportCommand{
|
|
logDest: logdest,
|
|
}
|
|
}
|
|
|
|
// Run executes the export.
|
|
func (cmd *ExportCommand) Run(ctx context.Context) error {
|
|
logger := cmd.Logger()
|
|
|
|
// Validate arguments.
|
|
if cmd.Index == "" {
|
|
return fmt.Errorf("%w: %v", ErrUsage, pilosa.ErrIndexRequired)
|
|
} else if cmd.Field == "" {
|
|
return fmt.Errorf("%w: %v", ErrUsage, pilosa.ErrFieldRequired)
|
|
}
|
|
|
|
// Use output file, if specified.
|
|
// Otherwise use STDOUT.
|
|
var w io.Writer = os.Stdout
|
|
if cmd.Path != "" {
|
|
f, err := os.Create(cmd.Path)
|
|
if err != nil {
|
|
return errors.Wrap(err, "creating file")
|
|
}
|
|
defer f.Close()
|
|
|
|
w = f
|
|
}
|
|
|
|
// Create a client to the server.
|
|
client, err := commandClient(cmd)
|
|
if err != nil {
|
|
return errors.Wrap(err, "creating client")
|
|
}
|
|
|
|
// Determine shard count.
|
|
maxShards, err := client.MaxShardByIndex(ctx)
|
|
if err != nil {
|
|
return errors.Wrap(err, "getting shard count")
|
|
}
|
|
|
|
// Export each shard.
|
|
for shard := uint64(0); shard <= maxShards[cmd.Index]; shard++ {
|
|
logger.Printf("exporting shard: %d", shard)
|
|
if err := client.ExportCSV(ctx, cmd.Index, cmd.Field, shard, w); err != nil {
|
|
return errors.Wrap(err, "exporting")
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (cmd *ExportCommand) TLSHost() string {
|
|
return cmd.Host
|
|
}
|
|
|
|
func (cmd *ExportCommand) TLSConfiguration() server.TLSConfig {
|
|
return cmd.TLS
|
|
}
|