コード例 #1
0
 public ImportCommand(JsonOperationContext context, DatabaseSmugglerImportOptions options, Stream stream, long operationId, TaskCompletionSource <object> tcs, DatabaseSmuggler parent)
 {
     _stream = stream ?? throw new ArgumentNullException(nameof(stream));
     if (options == null)
     {
         throw new ArgumentNullException(nameof(options));
     }
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     _options     = DocumentConventions.Default.Serialization.DefaultConverter.ToBlittable(options, context);
     _operationId = operationId;
     _tcs         = tcs ?? throw new ArgumentNullException(nameof(tcs));
     _parent      = parent ?? throw new ArgumentNullException(nameof(parent));
 }
コード例 #2
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);
        }
コード例 #3
0
 public ImportCommand(DocumentConventions conventions, JsonOperationContext context, DatabaseSmugglerImportOptions options, Stream stream, long operationId, TaskCompletionSource <object> tcs, DatabaseSmuggler parent, string nodeTag)
 {
     _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.ConvertCommandToBlittable(options, context);
     _operationId    = operationId;
     _tcs            = tcs ?? throw new ArgumentNullException(nameof(tcs));
     _parent         = parent ?? throw new ArgumentNullException(nameof(parent));
     SelectedNodeTag = nodeTag;
 }
コード例 #4
0
 public StreamContentWithConfirmation(Stream content, TaskCompletionSource <object> tcs, DatabaseSmuggler parent) : base(content)
 {
     _tcs    = tcs ?? throw new ArgumentNullException(nameof(tcs));
     _parent = parent;
 }
コード例 #5
0
        public async Task <Operation> ExportAsync(DatabaseSmugglerExportOptions options, DatabaseSmuggler toDatabase, CancellationToken token = default)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (toDatabase == null)
            {
                throw new ArgumentNullException(nameof(toDatabase));
            }

            Operation operation     = null;
            var       importOptions = new DatabaseSmugglerImportOptions(options);

            var tcs = new TaskCompletionSource <object>(TaskCreationOptions.RunContinuationsAsynchronously);

            await ExportAsync(options, async stream =>
            {
                try
                {
                    operation = await toDatabase.ImportAsync(importOptions, stream, token).ConfigureAwait(false);
                    tcs.TrySetResult(null);
                }
                catch (Exception e)
                {
                    tcs.TrySetException(e);
                    throw;
                }
            }, token).ConfigureAwait(false);

            await tcs.Task.ConfigureAwait(false);

            return(operation);
        }
コード例 #6
0
        protected async Task SmugglerRestore(DocumentDatabase database, List <string> filesToRestore, DocumentsOperationContext context,
                                             DatabaseRecord databaseRecord, Action <IOperationProgress> onProgress, RestoreResult result)
        {
            Debug.Assert(onProgress != null);

            // the files are already ordered by name
            // take only the files that are relevant for smuggler restore

            if (filesToRestore.Count == 0)
            {
                return;
            }

            // we do have at least one smuggler backup, we'll take the indexes from the last file
            databaseRecord.AutoIndexes = new Dictionary <string, AutoIndexDefinition>();
            databaseRecord.Indexes     = new Dictionary <string, IndexDefinition>();

            // restore the smuggler backup
            var options = new DatabaseSmugglerOptionsServerSide
            {
                AuthorizationStatus  = AuthorizationStatus.DatabaseAdmin,
                SkipRevisionCreation = true
            };

            options.OperateOnTypes |= DatabaseItemType.LegacyDocumentDeletions;
            options.OperateOnTypes |= DatabaseItemType.LegacyAttachments;
            options.OperateOnTypes |= DatabaseItemType.LegacyAttachmentDeletions;
#pragma warning disable 618
            options.OperateOnTypes |= DatabaseItemType.Counters;
#pragma warning restore 618

            var oldOperateOnTypes = DatabaseSmuggler.ConfigureOptionsForIncrementalImport(options);
            var destination       = new DatabaseDestination(database);

            for (var i = 0; i < filesToRestore.Count - 1; i++)
            {
                result.AddInfo($"Restoring file {(i + 1):#,#;;0}/{filesToRestore.Count:#,#;;0}");
                onProgress.Invoke(result.Progress);

                var filePath = GetBackupPath(filesToRestore[i]);
                await ImportSingleBackupFile(database, onProgress, result, filePath, context, destination, options, isLastFile : false,
                                             onDatabaseRecordAction : smugglerDatabaseRecord =>
                {
                    // need to enable revisions before import
                    database.DocumentsStorage.RevisionsStorage.InitializeFromDatabaseRecord(smugglerDatabaseRecord);
                });
            }

            options.OperateOnTypes = oldOperateOnTypes;
            var lastFilePath = GetBackupPath(filesToRestore.Last());

            result.AddInfo($"Restoring file {filesToRestore.Count:#,#;;0}/{filesToRestore.Count:#,#;;0}");

            onProgress.Invoke(result.Progress);

            await ImportSingleBackupFile(database, onProgress, result, lastFilePath, context, destination, options, isLastFile : true,
                                         onIndexAction : indexAndType =>
            {
                if (this.RestoreFromConfiguration.SkipIndexes)
                {
                    return;
                }

                switch (indexAndType.Type)
                {
                case IndexType.AutoMap:
                case IndexType.AutoMapReduce:
                    var autoIndexDefinition = (AutoIndexDefinitionBase)indexAndType.IndexDefinition;
                    databaseRecord.AutoIndexes[autoIndexDefinition.Name] =
                        PutAutoIndexCommand.GetAutoIndexDefinition(autoIndexDefinition, indexAndType.Type);
                    break;

                case IndexType.Map:
                case IndexType.MapReduce:
                case IndexType.JavaScriptMap:
                case IndexType.JavaScriptMapReduce:
                    var indexDefinition = (IndexDefinition)indexAndType.IndexDefinition;
                    databaseRecord.Indexes[indexDefinition.Name] = indexDefinition;
                    break;

                case IndexType.None:
                case IndexType.Faulty:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            },
                                         onDatabaseRecordAction : smugglerDatabaseRecord =>
            {
                databaseRecord.ConflictSolverConfig = smugglerDatabaseRecord.ConflictSolverConfig;
                foreach (var setting in smugglerDatabaseRecord.Settings)
                {
                    databaseRecord.Settings[setting.Key] = setting.Value;
                }
                databaseRecord.SqlEtls                = smugglerDatabaseRecord.SqlEtls;
                databaseRecord.RavenEtls              = smugglerDatabaseRecord.RavenEtls;
                databaseRecord.PeriodicBackups        = smugglerDatabaseRecord.PeriodicBackups;
                databaseRecord.ExternalReplications   = smugglerDatabaseRecord.ExternalReplications;
                databaseRecord.Sorters                = smugglerDatabaseRecord.Sorters;
                databaseRecord.SinkPullReplications   = smugglerDatabaseRecord.SinkPullReplications;
                databaseRecord.HubPullReplications    = smugglerDatabaseRecord.HubPullReplications;
                databaseRecord.Revisions              = smugglerDatabaseRecord.Revisions;
                databaseRecord.Expiration             = smugglerDatabaseRecord.Expiration;
                databaseRecord.RavenConnectionStrings = smugglerDatabaseRecord.RavenConnectionStrings;
                databaseRecord.SqlConnectionStrings   = smugglerDatabaseRecord.SqlConnectionStrings;
                databaseRecord.Client = smugglerDatabaseRecord.Client;

                // need to enable revisions before import
                database.DocumentsStorage.RevisionsStorage.InitializeFromDatabaseRecord(smugglerDatabaseRecord);
            });
        }
コード例 #7
0
ファイル: RestoreBackupTask.cs プロジェクト: tinybaby/ravendb
        private void SmugglerRestore(
            string backupDirectory,
            DocumentDatabase database,
            DocumentsOperationContext context,
            DatabaseRecord databaseRecord,
            Action <IOperationProgress> onProgress,
            RestoreResult result)
        {
            Debug.Assert(onProgress != null);

            // the files are already ordered by name
            // take only the files that are relevant for smuggler restore
            _filesToRestore = _filesToRestore
                              .Where(BackupUtils.IsBackupFile)
                              .OrderBackups()
                              .ToList();

            if (_filesToRestore.Count == 0)
            {
                return;
            }

            // we do have at least one smuggler backup
            databaseRecord.AutoIndexes = new Dictionary <string, AutoIndexDefinition>();
            databaseRecord.Indexes     = new Dictionary <string, IndexDefinition>();

            // restore the smuggler backup
            var options = new DatabaseSmugglerOptionsServerSide
            {
                AuthorizationStatus = AuthorizationStatus.DatabaseAdmin,
                OperateOnTypes      = ~(DatabaseItemType.CompareExchange | DatabaseItemType.Identities)
            };

            options.OperateOnTypes |= DatabaseItemType.LegacyDocumentDeletions;
            options.OperateOnTypes |= DatabaseItemType.LegacyAttachments;
            options.OperateOnTypes |= DatabaseItemType.LegacyAttachmentDeletions;

            var oldOperateOnTypes = DatabaseSmuggler.ConfigureOptionsForIncrementalImport(options);
            var destination       = new DatabaseDestination(database);

            for (var i = 0; i < _filesToRestore.Count - 1; i++)
            {
                var filePath = Path.Combine(backupDirectory, _filesToRestore[i]);
                ImportSingleBackupFile(database, onProgress, result, filePath, context, destination, options,
                                       onDatabaseRecordAction: smugglerDatabaseRecord =>
                {
                    // need to enable revisions before import
                    database.DocumentsStorage.RevisionsStorage.InitializeFromDatabaseRecord(smugglerDatabaseRecord);
                });
            }

            options.OperateOnTypes = oldOperateOnTypes;
            var lastFilePath = Path.Combine(backupDirectory, _filesToRestore.Last());

            ImportSingleBackupFile(database, onProgress, result, lastFilePath, context, destination, options,
                                   onIndexAction: indexAndType =>
            {
                switch (indexAndType.Type)
                {
                case IndexType.AutoMap:
                case IndexType.AutoMapReduce:
                    var autoIndexDefinition = (AutoIndexDefinitionBase)indexAndType.IndexDefinition;
                    databaseRecord.AutoIndexes[autoIndexDefinition.Name] =
                        PutAutoIndexCommand.GetAutoIndexDefinition(autoIndexDefinition, indexAndType.Type);
                    break;

                case IndexType.Map:
                case IndexType.MapReduce:
                case IndexType.JavaScriptMap:
                case IndexType.JavaScriptMapReduce:
                    var indexDefinition = (IndexDefinition)indexAndType.IndexDefinition;
                    databaseRecord.Indexes[indexDefinition.Name] = indexDefinition;
                    break;

                case IndexType.None:
                case IndexType.Faulty:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            },
                                   onDatabaseRecordAction: smugglerDatabaseRecord =>
            {
                // need to enable revisions before import
                database.DocumentsStorage.RevisionsStorage.InitializeFromDatabaseRecord(smugglerDatabaseRecord);

                databaseRecord.Revisions              = smugglerDatabaseRecord.Revisions;
                databaseRecord.Expiration             = smugglerDatabaseRecord.Expiration;
                databaseRecord.RavenConnectionStrings = smugglerDatabaseRecord.RavenConnectionStrings;
                databaseRecord.SqlConnectionStrings   = smugglerDatabaseRecord.SqlConnectionStrings;
                databaseRecord.Client = smugglerDatabaseRecord.Client;
            });
        }
コード例 #8
0
        private void SmugglerRestore(
            string backupDirectory,
            DocumentDatabase database,
            DocumentsOperationContext context,
            DatabaseRecord databaseRecord,
            Action <IOperationProgress> onProgress,
            RestoreResult result)
        {
            Debug.Assert(onProgress != null);

            // the files are already ordered by name
            // take only the files that are relevant for smuggler restore
            _filesToRestore = _filesToRestore
                              .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(x => x)
                              .ToList();

            if (_filesToRestore.Count == 0)
            {
                return;
            }

            // we do have at least one smuggler backup
            databaseRecord.AutoIndexes = new Dictionary <string, AutoIndexDefinition>();
            databaseRecord.Indexes     = new Dictionary <string, IndexDefinition>();

            // restore the smuggler backup
            var options = new DatabaseSmugglerOptionsServerSide
            {
                OperateOnTypes = ~(DatabaseItemType.CmpXchg | DatabaseItemType.Identities)
            };
            var oldOperateOnTypes = options.OperateOnTypes;

            options.OperateOnTypes = DatabaseSmuggler.ConfigureOptionsForIncrementalImport(options);

            var destination = new DatabaseDestination(database);

            for (var i = 0; i < _filesToRestore.Count - 1; i++)
            {
                var filePath = Path.Combine(backupDirectory, _filesToRestore[i]);
                ImportSingleBackupFile(database, onProgress, result, filePath, context, destination, options);
            }

            options.OperateOnTypes = oldOperateOnTypes;
            var lastFilePath = Path.Combine(backupDirectory, _filesToRestore.Last());

            ImportSingleBackupFile(database, onProgress, result, lastFilePath, context, destination, options,
                                   onIndexAction: indexAndType =>
            {
                switch (indexAndType.Type)
                {
                case IndexType.AutoMap:
                case IndexType.AutoMapReduce:
                    var autoIndexDefinition = (AutoIndexDefinitionBase)indexAndType.IndexDefinition;
                    databaseRecord.AutoIndexes[autoIndexDefinition.Name] =
                        PutAutoIndexCommand.GetAutoIndexDefinition(autoIndexDefinition, indexAndType.Type);
                    break;

                case IndexType.Map:
                case IndexType.MapReduce:
                    var indexDefinition = (IndexDefinition)indexAndType.IndexDefinition;
                    databaseRecord.Indexes[indexDefinition.Name] = indexDefinition;
                    break;

                case IndexType.None:
                case IndexType.Faulty:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            });
        }