示例#1
0
        public async Task <Operation> ImportAsync(DatabaseSmugglerOptions options, Stream stream, CancellationToken token = default(CancellationToken))
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            JsonOperationContext context;

            using (_requestExecutor.ContextPool.AllocateOperationContext(out context))
            {
                var getOperationIdCommand = new GetNextOperationIdCommand();
                await _requestExecutor.ExecuteAsync(getOperationIdCommand, context, token).ConfigureAwait(false);

                var operationId = getOperationIdCommand.Result;

                var command = new ImportCommand(_requestExecutor.Conventions, context, options, stream, operationId);
                await _requestExecutor.ExecuteAsync(command, context, token).ConfigureAwait(false);

                return(new Operation(_requestExecutor, () => _store.Changes(), _requestExecutor.Conventions, operationId));
            }
        }
示例#2
0
        public async Task ImportIncrementalAsync(DatabaseSmugglerOptions options, string fromDirectory, CancellationToken cancellationToken = default(CancellationToken))
        {
            var files = Directory.GetFiles(fromDirectory)
                        .Where(file =>
            {
                var extension = Path.GetExtension(file);
                return
                (Constants.Documents.PeriodicBackup.IncrementalBackupExtension.Equals(extension, StringComparison.OrdinalIgnoreCase) ||
                 Constants.Documents.PeriodicBackup.FullBackupExtension.Equals(extension, StringComparison.OrdinalIgnoreCase));
            })
                        .OrderBy(File.GetLastWriteTimeUtc)
                        .ToArray();

            if (files.Length == 0)
            {
                return;
            }

            var oldOperateOnTypes = ConfigureOptionsForIncrementalImport(options);

            for (var i = 0; i < files.Length - 1; i++)
            {
                var filePath = Path.Combine(fromDirectory, files[i]);
                await ImportAsync(options, filePath, cancellationToken).ConfigureAwait(false);
            }
            options.OperateOnTypes = oldOperateOnTypes;

            var lastFilePath = Path.Combine(fromDirectory, files.Last());

            await ImportAsync(options, lastFilePath, cancellationToken).ConfigureAwait(false);
        }
示例#3
0
        internal static DatabaseItemType ConfigureOptionsForIncrementalImport(DatabaseSmugglerOptions options)
        {
            options.OperateOnTypes |= DatabaseItemType.Tombstones;
            options.OperateOnTypes |= DatabaseItemType.CompareExchangeTombstones;

            // we import the indexes and Subscriptions from the last file only,
            var oldOperateOnTypes = options.OperateOnTypes;

            options.OperateOnTypes &= ~DatabaseItemType.Indexes;
            options.OperateOnTypes &= ~DatabaseItemType.Subscriptions;
            return(oldOperateOnTypes);
        }
示例#4
0
        internal static DatabaseItemType ConfigureOptionsForIncrementalImport(DatabaseSmugglerOptions options)
        {
            options.OperateOnTypes |= DatabaseItemType.Tombstones;

            // we import the indexes and identities from the last file only,
            // as the previous files can hold indexes and identities which were deleted and shouldn't be imported
            var oldOperateOnTypes = options.OperateOnTypes;

            options.OperateOnTypes = options.OperateOnTypes &
                                     ~(DatabaseItemType.Indexes | DatabaseItemType.CompareExchange | DatabaseItemType.Identities);
            return(oldOperateOnTypes);
        }
示例#5
0
        public async Task <Operation> ExportAsync(DatabaseSmugglerOptions options, string toFile, CancellationToken token = default(CancellationToken))
        {
            using (var file = File.OpenWrite(toFile))
            {
                var result = await ExportAsync(options, async stream =>
                {
                    await stream.CopyToAsync(file, 8192, token).ConfigureAwait(false);
                }, token).ConfigureAwait(false);

                await file.FlushAsync(token).ConfigureAwait(false);

                return(result);
            }
        }
示例#6
0
        public async Task <Operation> ImportAsync(DatabaseSmugglerOptions options, string fromFile, CancellationToken cancellationToken = default(CancellationToken))
        {
            var       countOfFileParts = 0;
            Operation result;

            do
            {
                using (var fileStream = File.OpenRead(fromFile))
                {
                    result = await ImportAsync(options, fileStream, cancellationToken).ConfigureAwait(false);
                }
                fromFile = $"{fromFile}.part{++countOfFileParts:D3}";
            } while (File.Exists(fromFile));
            return(result);
        }
示例#7
0
        public async Task <Operation> ExportAsync(DatabaseSmugglerOptions options, DatabaseSmuggler toDatabase, CancellationToken token = default(CancellationToken))
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (toDatabase == null)
            {
                throw new ArgumentNullException(nameof(toDatabase));
            }

            var result = await ExportAsync(options, async stream =>
            {
                await toDatabase.ImportAsync(options, stream, token).ConfigureAwait(false);
            }, token).ConfigureAwait(false);

            return(result);
        }
示例#8
0
 public ImportCommand(DocumentConventions conventions, JsonOperationContext context, DatabaseSmugglerOptions options, Stream stream, long operationId)
 {
     _stream = stream ?? throw new ArgumentNullException(nameof(stream));
     if (conventions == null)
     {
         throw new ArgumentNullException(nameof(conventions));
     }
     if (options == null)
     {
         throw new ArgumentNullException(nameof(options));
     }
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     _options     = EntityToBlittable.ConvertEntityToBlittable(options, conventions, context);
     _operationId = operationId;
 }
示例#9
0
 public ExportCommand(DocumentConventions conventions, JsonOperationContext context, DatabaseSmugglerOptions options, Func <Stream, Task> handleStreamResponse, long operationId)
 {
     if (conventions == null)
     {
         throw new ArgumentNullException(nameof(conventions));
     }
     if (options == null)
     {
         throw new ArgumentNullException(nameof(options));
     }
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     _handleStreamResponse = handleStreamResponse ?? throw new ArgumentNullException(nameof(handleStreamResponse));
     _options     = EntityToBlittable.ConvertEntityToBlittable(options, conventions, context);
     _operationId = operationId;
 }