/// <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)); } } } }
/// <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); } } } }