/// <summary> /// Starts a new process. /// </summary> public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments, ushort singleNodeReplSetWaitTimeout = 5) { string fileName = @"{0}{1}{2}".Formatted(binariesDirectory, System.IO.Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.MongodExecutable); string arguments = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) ? @"--dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port) : @"--sslMode disabled --dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port); arguments = singleNodeReplSet ? arguments + Space + "--replSet" + Space + ReplicaSetName : arguments; arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); WrappedProcess wrappedProcess = ProcessControl.ProcessFactory(fileName, arguments); wrappedProcess.DoNotKill = doNotKill; string windowTitle = "mongod | port: {0}".Formatted(port); ProcessOutput output = ProcessControl.StartAndWaitForReady(wrappedProcess, 5, ProcessReadyIdentifier, windowTitle); if (singleNodeReplSet) { var replicaSetReady = false; // subscribe to output from mongod process and check for replica set ready message wrappedProcess.OutputDataReceived += (_, args) => replicaSetReady |= !string.IsNullOrWhiteSpace(args.Data) && args.Data.Contains(ReplicaSetReadyIdentifier); MongoClient client = new MongoClient("mongodb://127.0.0.1:{0}/?connect=direct;replicaSet={1}".Formatted(port, ReplicaSetName)); var admin = client.GetDatabase("admin"); var replConfig = new BsonDocument(new List <BsonElement>() { new BsonElement("_id", ReplicaSetName), new BsonElement("members", new BsonArray { new BsonDocument { { "_id", 0 }, { "host", "127.0.0.1:{0}".Formatted(port) } } }) }); var command = new BsonDocument("replSetInitiate", replConfig); admin.RunCommand <BsonDocument>(command); // wait until replica set is ready or until the timeout is reached SpinWait.SpinUntil(() => replicaSetReady, TimeSpan.FromSeconds(singleNodeReplSetWaitTimeout)); if (!replicaSetReady) { throw new TimeoutException($"Replica set initialization took longer than the specified timeout of {singleNodeReplSetWaitTimeout} seconds. Please consider increasing the value of {nameof(singleNodeReplSetWaitTimeout)}."); } } MongoDbProcess mongoDbProcess = new MongoDbProcess(wrappedProcess) { ErrorOutput = output.ErrorOutput, StandardOutput = output.StandardOutput }; return(mongoDbProcess); }
/// <summary> /// Output File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) /// </summary> public static ProcessOutput Export(string binariesDirectory, int port, string database, string collection, string outputFile, string additionalMongodArguments = null) { string finalPath = FolderSearch.FinalizePath(outputFile); string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoExportExecutable); string arguments = @"--host localhost --port {0} --db {1} --collection {2} --out ""{3}""".Formatted(port, database, collection, finalPath); arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); Process process = ProcessControl.ProcessFactory(fileName, arguments); string windowTitle = "mongoexport | port: {0} db: {1} collection: {2} file {3}".Formatted(port, database, collection, outputFile); return(ProcessControl.StartAndWaitForExit(process, windowTitle)); }
/// <summary> /// Starts a new process. /// </summary> public IMongoDbProcess Start(string binariesDirectory, string dataDirectory, int port, bool doNotKill, bool singleNodeReplSet, string additionalMongodArguments) { string fileName = @"{0}{1}{2}".Formatted(binariesDirectory, System.IO.Path.DirectorySeparatorChar.ToString(), MongoDbDefaults.MongodExecutable); string arguments = (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) ? @"--dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port) : @"--sslMode disabled --dbpath ""{0}"" --port {1} --bind_ip 127.0.0.1".Formatted(dataDirectory, port); arguments = singleNodeReplSet ? arguments + Space + "--replSet" + Space + ReplicaSetName : arguments; arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); WrappedProcess wrappedProcess = ProcessControl.ProcessFactory(fileName, arguments); wrappedProcess.DoNotKill = doNotKill; string windowTitle = "mongod | port: {0}".Formatted(port); ProcessOutput output = ProcessControl.StartAndWaitForReady(wrappedProcess, 5, ProcessReadyIdentifier, windowTitle); if (singleNodeReplSet) { MongoClient client = new MongoClient("mongodb://127.0.0.1:{0}/?connect=direct;replicaSet={1}".Formatted(port, ReplicaSetName)); var admin = client.GetDatabase("admin"); var replConfig = new BsonDocument(new List <BsonElement>() { new BsonElement("_id", ReplicaSetName), new BsonElement("members", new BsonArray { new BsonDocument { { "_id", 0 }, { "host", "127.0.0.1:{0}".Formatted(port) } } }) }); var command = new BsonDocument("replSetInitiate", replConfig); admin.RunCommand <BsonDocument>(command); //Need to sleep here so the replica set initialization is complete Thread.Sleep(5000); } MongoDbProcess mongoDbProcess = new MongoDbProcess(wrappedProcess) { ErrorOutput = output.ErrorOutput, StandardOutput = output.StandardOutput }; return(mongoDbProcess); }
/// <summary> /// Input File: Absolute path stays unchanged, relative path will be relative to current executing directory (usually the /bin folder) /// </summary> public static ProcessOutput Import(string binariesDirectory, int port, string database, string collection, string inputFile, bool drop, string additionalMongodArguments = null) { string finalPath = FolderSearch.FinalizePath(inputFile); if (!File.Exists(finalPath)) { throw new FileNotFoundException("File not found", finalPath); } string fileName = Path.Combine("{0}", "{1}").Formatted(binariesDirectory, MongoDbDefaults.MongoImportExecutable); string arguments = @"--host localhost --port {0} --db {1} --collection {2} --file ""{3}""".Formatted(port, database, collection, finalPath); if (drop) { arguments += " --drop"; } arguments += MongodArguments.GetValidAdditionalArguments(arguments, additionalMongodArguments); Process process = ProcessControl.ProcessFactory(fileName, arguments); string windowTitle = "mongoimport | port: {0} db: {1} collection: {2} file {3}".Formatted(port, database, collection, inputFile); return(ProcessControl.StartAndWaitForExit(process, windowTitle)); }