summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/mongoexport/main/mongoexport.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/mongoexport/main/mongoexport.go')
-rw-r--r--src/mongo/gotools/mongoexport/main/mongoexport.go143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/mongo/gotools/mongoexport/main/mongoexport.go b/src/mongo/gotools/mongoexport/main/mongoexport.go
new file mode 100644
index 00000000000..c18451f03df
--- /dev/null
+++ b/src/mongo/gotools/mongoexport/main/mongoexport.go
@@ -0,0 +1,143 @@
+// Main package for the mongoexport tool.
+package main
+
+import (
+ "github.com/mongodb/mongo-tools/common/db"
+ "github.com/mongodb/mongo-tools/common/log"
+ "github.com/mongodb/mongo-tools/common/options"
+ "github.com/mongodb/mongo-tools/common/signals"
+ "github.com/mongodb/mongo-tools/common/util"
+ "github.com/mongodb/mongo-tools/mongoexport"
+ "gopkg.in/mgo.v2"
+ "gopkg.in/mgo.v2/bson"
+ "os"
+)
+
+func main() {
+ // initialize command-line opts
+ opts := options.New("mongoexport", mongoexport.Usage,
+ options.EnabledOptions{Auth: true, Connection: true, Namespace: true})
+
+ outputOpts := &mongoexport.OutputFormatOptions{}
+ opts.AddOptions(outputOpts)
+ inputOpts := &mongoexport.InputOptions{}
+ opts.AddOptions(inputOpts)
+
+ args, err := opts.Parse()
+ if err != nil {
+ log.Logvf(log.Always, "error parsing command line options: %v", err)
+ log.Logvf(log.Always, "try 'mongoexport --help' for more information")
+ os.Exit(util.ExitBadOptions)
+ }
+ if len(args) != 0 {
+ log.Logvf(log.Always, "too many positional arguments: %v", args)
+ log.Logvf(log.Always, "try 'mongoexport --help' for more information")
+ os.Exit(util.ExitBadOptions)
+ }
+
+ log.SetVerbosity(opts.Verbosity)
+ signals.Handle()
+
+ // print help, if specified
+ if opts.PrintHelp(false) {
+ return
+ }
+
+ // print version, if specified
+ if opts.PrintVersion() {
+ return
+ }
+
+ // connect directly, unless a replica set name is explicitly specified
+ _, setName := util.ParseConnectionString(opts.Host)
+ opts.Direct = (setName == "")
+ opts.ReplicaSetName = setName
+
+ provider, err := db.NewSessionProvider(*opts)
+
+ // temporarily allow secondary reads for the isMongos check
+ provider.SetReadPreference(mgo.Nearest)
+ isMongos, err := provider.IsMongos()
+ if err != nil {
+ log.Logvf(log.Always, "%v", err)
+ os.Exit(util.ExitError)
+ }
+
+ provider.SetFlags(db.DisableSocketTimeout)
+
+ if inputOpts.SlaveOk {
+ if inputOpts.ReadPreference != "" {
+ log.Logvf(log.Always, "--slaveOk can't be specified when --readPreference is specified")
+ os.Exit(util.ExitBadOptions)
+ }
+ log.Logvf(log.Always, "--slaveOk is deprecated and being internally rewritten as --readPreference=nearest")
+ inputOpts.ReadPreference = "nearest"
+ }
+
+ var mode mgo.Mode
+ if opts.ReplicaSetName != "" || isMongos {
+ mode = mgo.Primary
+ } else {
+ mode = mgo.Nearest
+ }
+ var tags bson.D
+ if inputOpts.ReadPreference != "" {
+ mode, tags, err = db.ParseReadPreference(inputOpts.ReadPreference)
+ if err != nil {
+ log.Logvf(log.Always, "error parsing --ReadPreference: %v", err)
+ os.Exit(util.ExitBadOptions)
+ }
+ if len(tags) > 0 {
+ provider.SetTags(tags)
+ }
+ }
+
+ // warn if we are trying to export from a secondary in a sharded cluster
+ if isMongos && mode != mgo.Primary {
+ log.Logvf(log.Always, db.WarningNonPrimaryMongosConnection)
+ }
+
+ provider.SetReadPreference(mode)
+
+ if err != nil {
+ log.Logvf(log.Always, "error connecting to host: %v", err)
+ os.Exit(util.ExitError)
+ }
+ exporter := mongoexport.MongoExport{
+ ToolOptions: *opts,
+ OutputOpts: outputOpts,
+ InputOpts: inputOpts,
+ SessionProvider: provider,
+ }
+
+ err = exporter.ValidateSettings()
+ if err != nil {
+ log.Logvf(log.Always, "error validating settings: %v", err)
+ log.Logvf(log.Always, "try 'mongoexport --help' for more information")
+ os.Exit(util.ExitBadOptions)
+ }
+
+ writer, err := exporter.GetOutputWriter()
+ if err != nil {
+ log.Logvf(log.Always, "error opening output stream: %v", err)
+ os.Exit(util.ExitError)
+ }
+ if writer == nil {
+ writer = os.Stdout
+ } else {
+ defer writer.Close()
+ }
+
+ numDocs, err := exporter.Export(writer)
+ if err != nil {
+ log.Logvf(log.Always, "Failed: %v", err)
+ os.Exit(util.ExitError)
+ }
+
+ if numDocs == 1 {
+ log.Logvf(log.Always, "exported %v record", numDocs)
+ } else {
+ log.Logvf(log.Always, "exported %v records", numDocs)
+ }
+
+}