Example #1
0
        /// <inheritdoc/>
        public async Task ExportAsync(ArangoHandle db, Stream output, ArangoMigrationScope scope)
        {
            using var zip = new ZipArchive(output, ZipArchiveMode.Create, true, Encoding.UTF8);

            var serializer  = _arango.Configuration.Serializer;
            var collections = await _arango.Collection.ListAsync(db);

            var structure = await GetStructureAsync(db);

            if (scope.HasFlag(ArangoMigrationScope.Structure))
            {
                var s = zip.CreateEntry(".structure.json", CompressionLevel.Fastest);
                await using var sx  = s.Open();
                await using var sxw = new StreamWriter(sx);
                await sxw.WriteLineAsync(serializer.Serialize(structure));
            }

            if (scope.HasFlag(ArangoMigrationScope.Data))
            {
                foreach (var col in collections)
                {
                    var i = 1;
                    await foreach (var batch in _arango.Document.ExportAsync <object>(db, col.Name, true, 10, 10000, 30))
                    {
                        var entry = zip.CreateEntry($"{col.Name}.{i++.ToString().PadLeft(4, '0')}.json",
                                                    CompressionLevel.Fastest);
                        await using var stream = entry.Open();
                        await using var sw     = new StreamWriter(stream);
                        await sw.WriteAsync(serializer.Serialize(batch));
                    }
                }
            }
        }
Example #2
0
        /// <inheritdoc/>
        public async Task ImportAsync(ArangoHandle db, Stream input, ArangoMigrationScope scope)
        {
            using var zip = new ZipArchive(input, ZipArchiveMode.Read);

            var dataBaseExists = await _arango.Database.ExistAsync(db);

            if (!dataBaseExists)
            {
                await _arango.Database.CreateAsync(db);
            }

            var serializer = _arango.Configuration.Serializer;

            if (scope.HasFlag(ArangoMigrationScope.Structure))
            {
                var entry = zip.Entries.SingleOrDefault(x => x.Name == ".structure.json");

                if (entry == null)
                {
                    throw new InvalidDataException(".structure.json missing");
                }

                await using var stream = entry.Open();
                using var sr           = new StreamReader(stream);
                var structure = serializer.Deserialize <ArangoStructure>(await sr.ReadToEndAsync());

                await ApplyStructureAsync(db, structure);
            }

            foreach (var entry in zip.Entries)
            {
                if (entry.Name.StartsWith("."))
                {
                    continue;
                }

                if (scope.HasFlag(ArangoMigrationScope.Data))
                {
                    if (entry.Name.EndsWith(".json"))
                    {
                        var col = entry.Name.Substring(0, entry.Name.IndexOf('.'));

                        await using var stream = entry.Open();
                        using var sr           = new StreamReader(stream);
                        var docs = serializer.Deserialize <List <object> >(await sr.ReadToEndAsync());

                        await _arango.Document.CreateManyAsync(db, col, docs,
                                                               overwriteMode : ArangoOverwriteMode.Replace);
                    }
                }
            }
        }