static IEnumerable <Tuple <string, string> > ListCollections(MongoDatabase sourceServer, List <string> collections, string targetCollection) { // Forcing targetcollection to be null if it's empty if (targetCollection == "") { targetCollection = null; } if (collections == null || collections.Count == 0) { foreach (var c in sourceServer.GetCollectionNames()) { yield return(Tuple.Create(c, c)); } } else { var list = sourceServer.GetCollectionNames().ToList(); var hashOrdinal = new HashSet <string> (list, StringComparer.Ordinal); foreach (var c in collections) { if (hashOrdinal.Contains(c)) { yield return(Tuple.Create(c, (targetCollection ?? c))); } else if (c.IndexOf('=') > 0) { var split = c.Split('='); var k = split[0]; var col = hashOrdinal.Contains(k) ? k : list.FirstOrDefault(name => k.Equals(name, StringComparison.OrdinalIgnoreCase)); if (!String.IsNullOrEmpty(col) && !String.IsNullOrEmpty(split[1])) { yield return(Tuple.Create(col, split[1])); } } else { foreach (var col in list.Where(name => SharedMethods.WildcardIsMatch(c, name, true))) { yield return(Tuple.Create(col, (targetCollection ?? c))); } } } } }
static IEnumerable <Tuple <MongoDatabase, MongoDatabase> > ListDatabases(MongoServer sourceServer, MongoServer targetServer, List <string> sourceDatabases, List <string> targetDatabases) { if (sourceDatabases == null) { yield break; } if (targetDatabases == null || targetDatabases.Count == 0) { targetDatabases = null; } // check if we are on the same server! bool sameServer = ServersAreEqual(sourceServer, targetServer); // prepare available databases list var databases = sourceServer.GetDatabaseNames().ToList(); var availableDatabases = new HashSet <string> (databases, StringComparer.Ordinal); // create mappings if (targetDatabases == null) { for (int i = 0; i < sourceDatabases.Count; i++) { string k = sourceDatabases[i]; if (k.IndexOf('=') > 0) { var split = k.Split('='); k = split[0]; var db = availableDatabases.Contains(k) ? k : databases.FirstOrDefault(name => k.Equals(name, StringComparison.OrdinalIgnoreCase)); // check if database was found if (String.IsNullOrEmpty(db) || String.IsNullOrEmpty(split[1])) { continue; } yield return(Tuple.Create(sourceServer.GetDatabase(db), targetServer.GetDatabase(split[1]))); } else { foreach (var db in databases.Where(name => SharedMethods.WildcardIsMatch(k, name, true))) { yield return(Tuple.Create(sourceServer.GetDatabase(db), targetServer.GetDatabase(db))); } } } } else { // match for (int i = 0; i < sourceDatabases.Count; i++) { string k = sourceDatabases[i]; var db = availableDatabases.Contains(k) ? k : databases.FirstOrDefault(name => k.Equals(name, StringComparison.OrdinalIgnoreCase)); // check if database was found if (String.IsNullOrEmpty(db) || String.IsNullOrEmpty(targetDatabases[i])) { continue; } yield return(Tuple.Create(sourceServer.GetDatabase(db), targetServer.GetDatabase(targetDatabases[i]))); } } }