예제 #1
0
        public static void loadFromDbThenSerializeToJsonThenSaveToDir(IMongoDatabase db,
                                                                      IExportImportPathInfoProvider pathInfo, string collectionNamePrefix,
                                                                      ISimmpleProgressReporter progressReporter, CodeApproachType codeApproach = CodeApproachType.AsyncFunctional)
        {
            if (db == null)
            {
                return;
            }

            var dirName = $@"{pathInfo.RootPath}\{pathInfo.WorkingDirName} {collectionNamePrefix}";

            progressReporter?.Start($"Start exporting data from {db.DatabaseNamespace.DatabaseName} to {dirName}");

            Directory.CreateDirectory(dirName);

            progressReporter?.Report($"{dirName} was created");

            var filter = Builders <BsonDocument> .Filter.Regex("name", $"^{collectionNamePrefix}");

            var localFunctions = new Dictionary <CodeApproachType, Action>()
            {
                { CodeApproachType.AsyncFunctional, doItAsync },
                { CodeApproachType.SyncFunctional, doItSync },
                { CodeApproachType.SyncNotFunctional, doItSyncAndNotFuncional }
            };

            localFunctions[codeApproach].Invoke();

            progressReporter?.End("Export complete");

            #region Local functions

            IMongoCollection <BsonDocument> getCollectionByName(string name) => db.GetCollection <BsonDocument>(name);

            void reportProgressAndSaveSyncFunc(Tuple <string, IEnumerable <string> > tuple)
            {
                progressReporter?.Report($"Saving {tuple.Item1}");
                saveSyncFunc(tuple.Item1, tuple.Item2);
                progressReporter?.Report($"Complete {tuple.Item1}");
            }

            void saveSyncFunc(string fileName, IEnumerable <string> linesToWrite)
            {
                using (var streamWriter = new StreamWriter($"{dirName}/{fileName}.{pathInfo.FileExtension}"))
                    linesToWrite
                    .ToList()
                    .ForEach(line => streamWriter.WriteLine(line));
            }

            void doItAsync() =>
            db.ListCollectionNames(new ListCollectionNamesOptions {
                Filter = filter
            })
            .ToEnumerable()
            .AsParallel()
            .Select(getCollectionByName)
            .Select(col => Tuple.Create(col.CollectionNamespace.CollectionName, serializeCollectionParallel(col)))
            .ForAll(reportProgressAndSaveSyncFunc);

            void doItSync() =>
            db.ListCollectionNames(new ListCollectionNamesOptions {
                Filter = filter
            })
            .ToEnumerable()
            .Select(getCollectionByName)
            .Select(col => Tuple.Create(col.CollectionNamespace.CollectionName, serializeCollection(col)))
            .ToList()
            .ForEach(reportProgressAndSaveSyncFunc);

            void doItSyncAndNotFuncional()
            {
                using (IAsyncCursor <string> cursor = db.ListCollectionNames(new ListCollectionNamesOptions {
                    Filter = filter
                })) {
                    while (cursor.MoveNext())
                    {
                        foreach (var collectionName in cursor.Current)
                        {
                            var collection = getCollectionByName(collectionName);

                            var colName = collection.CollectionNamespace.CollectionName;

                            progressReporter?.Report($"Saving {colName}");

                            using (var fluentCursor = collection.Find(new BsonDocument()).ToCursor())
                                while (fluentCursor.MoveNext())
                                {
                                    foreach (var document in fluentCursor.Current)
                                    {
                                        using (var streamWriter = new StreamWriter($"{dirName}/{colName}.{pathInfo.FileExtension}"))
                                            using (var stringWriter = new StringWriter())
                                                using (var jsonWriter = new JsonWriter(stringWriter)) {
                                                    var serializationContext = BsonSerializationContext.CreateRoot(jsonWriter);

                                                    collection.DocumentSerializer.Serialize(serializationContext, document);

                                                    var serializedLine = stringWriter.ToString();

                                                    streamWriter.WriteLine(serializedLine);
                                                }
                                    }
                                }
                            progressReporter?.Report($"Complete");
                        }
                    }
                }
            }

            #endregion
        }
        public static void loadFromDirThenDeserializeFromJsonThenSaveToDb(IMongoDatabase db, IExportImportPathInfoProvider pathInfoProvider,
                                                                          ISimmpleProgressReporter progressReporter = null, CodeApproachType codeApproach = CodeApproachType.AsyncFunctional)
        {
            var dirPath = $@"{pathInfoProvider.RootPath}\{pathInfoProvider.WorkingDirName}";

            if (Directory.Exists(dirPath) && db != null)
            {
                var localFunctions = new Dictionary <CodeApproachType, Action>()
                {
                    { CodeApproachType.AsyncFunctional, doItAsync },
                    { CodeApproachType.SyncFunctional, doItSync },
                    { CodeApproachType.SyncNotFunctional, doItSyncAndNotFuncional }
                };

                progressReporter?.Start($"Start importing data from {dirPath} to {db.DatabaseNamespace.DatabaseName}");

                localFunctions[codeApproach].Invoke();

                progressReporter?.End($"All data from {dirPath} was loaded successfully");
            }

            #region Local functions

            void doItAsync() =>
            Directory.EnumerateFiles(dirPath, $"*.{pathInfoProvider.FileExtension}", SearchOption.TopDirectoryOnly)
            .AsParallel()

            .Select(fullPath => new {
                Name  = Path.GetFileNameWithoutExtension(fullPath),
                Lines = readLinesFromFile(fullPath)
            })

            .Select(file => new {
                Collection = dropThenCreateCollection(db, file.Name),
                Documents  = file.Lines.Select(deserializeFunc)
            })

            .ForAll(async deserialized => {
                var name = deserialized.Collection.CollectionNamespace.CollectionName;
                progressReporter?.Report($"Loading {name}");
                await deserialized.Collection.InsertManyAsync(deserialized.Documents);
                progressReporter?.Report($"Complete {name}");
            });

            void doItSync() =>
            Directory.EnumerateFiles(dirPath, $"*.{pathInfoProvider.FileExtension}", SearchOption.TopDirectoryOnly)
            .Select(fullPath => new {
                Name  = Path.GetFileNameWithoutExtension(fullPath),
                Lines = readLinesFromFile(fullPath)
            })

            .Select(file => new {
                Collection = dropThenCreateCollection(db, file.Name),
                Documents  = file.Lines.Select(deserializeFunc)
            })
            .ToList()
            .ForEach(deserialized => {
                var name = deserialized.Collection.CollectionNamespace.CollectionName;
                progressReporter?.Report($"Loading {name}");
                deserialized.Collection.InsertMany(deserialized.Documents);
                progressReporter?.Report($"Complete {name}");
            });

            void doItSyncAndNotFuncional()
            {
                foreach (var fullPath in Directory.EnumerateFiles(dirPath, $"*.{pathInfoProvider.FileExtension}", SearchOption.TopDirectoryOnly))
                {
                    var collectionName = Path.GetFileNameWithoutExtension(fullPath);

                    var collection = dropThenCreateCollection(db, collectionName);

                    progressReporter?.Report($"Loading {collectionName}");

                    using (var streamReader = new StreamReader(fullPath)) {
                        string line;

                        while ((line = streamReader.ReadLine()) != null)
                        {
                            var document = BsonSerializer.Deserialize <BsonDocument>(line);

                            collection.InsertOne(document);
                        }
                    }

                    progressReporter?.Report($"Complete {collectionName}");
                }
            }

            BsonDocument deserializeFunc(string line) => BsonSerializer.Deserialize <BsonDocument>(line);

            #endregion
        }