Exemplo n.º 1
0
    private FileSystemPath GetBackupDirPath(ProgramDataSource source)
    {
        Logger.Trace("Getting directory for {0} with source {1}", DirPath, source);

        if (source == ProgramDataSource.Default)
        {
            Logger.Trace("Determined to use default directory based on source value");
            return(DirPath);
        }

        if (source == ProgramDataSource.VirtualStore)
        {
            Logger.Trace("Determined to use VirtualStore directory based on source value");
            return(VirtualStoreDirPath);
        }

        if (!VirtualStoreDirPath.DirectoryExists)
        {
            Logger.Trace("Determined to use default directory due to the VirtualStore directory not existing");
            return(DirPath);
        }

        if (!DirPath.DirectoryExists)
        {
            Logger.Trace("Determined to use VirtualStore directory due to the default directory not existing");
            return(VirtualStoreDirPath);
        }

        try
        {
            DateTime originalTime     = GetLastWriteTime(new IOSearchPattern(DirPath, SearchOption, SearchPattern));
            DateTime virtualStoreTime = GetLastWriteTime(new IOSearchPattern(VirtualStoreDirPath, SearchOption, SearchPattern));

            if (originalTime > virtualStoreTime)
            {
                Logger.Trace("Determined to use default directory based on last write time");
                return(DirPath);
            }
            else
            {
                Logger.Trace("Determined to use VirtualStore directory based on last write time");
                return(VirtualStoreDirPath);
            }
        }
        catch (Exception ex)
        {
            Logger.Warn(ex, "Determining directory to use based on last write time");

            // Use the VirtualStore path in case of error since this is most likely to work then
            return(VirtualStoreDirPath);
        }
    }
Exemplo n.º 2
0
    public IEnumerable <IOSearchPattern> GetWriteSearchPatterns(ProgramDataSource source)
    {
        if (source == ProgramDataSource.Auto)
        {
            // Return both paths if available. If the source if auto then we want to write to both locations.
            yield return(new IOSearchPattern(DirPath, SearchOption, SearchPattern));

            if (HasVirtualStoreVersion)
            {
                yield return(new IOSearchPattern(VirtualStoreDirPath, SearchOption, SearchPattern));
            }
        }
        else
        {
            yield return(GetReadSearchPattern(source));
        }
    }
    /// <summary>
    /// Refreshes the backup info
    /// </summary>
    /// <returns>The task</returns>
    public async Task RefreshAsync(ProgramDataSource dataSource)
    {
        ExistingBackups = await GetExistingBackupsAsync();

        // Get the latest backup version to restore from
        LatestAvailableRestoreVersion = GetPrimaryBackup?.BackupVersion ?? -1;

        BackupDirectories = AllBackupDirectories.TryGetValue(LatestAvailableBackupVersion)?.
                            Select(x => x.GetBackupReadSearchPattern(dataSource)).
                            ToArray() ?? Array.Empty <BackupSearchPattern>();

        RestoreDirectories = LatestAvailableRestoreVersion == -1
            ? Array.Empty <BackupSearchPattern>()
            : AllBackupDirectories.TryGetValue(LatestAvailableRestoreVersion)?.
                             SelectMany(x => x.GetBackupWriteSearchPatterns(dataSource)).
                             ToArray() ?? Array.Empty <BackupSearchPattern>();

        if (BackupDirectories.GroupBy(x => x.ID).Any(x => x.Count() > 1))
        {
            throw new InvalidOperationException("Multiple backup directories can not use the same ID starting from version 13.0.0");
        }
    }
Exemplo n.º 4
0
 public IOSearchPattern GetReadSearchPattern(ProgramDataSource source)
 {
     // Find and return a single matching directory path to use
     return(new IOSearchPattern(GetBackupDirPath(source), SearchOption, SearchPattern));
 }
Exemplo n.º 5
0
 public BackupSearchPattern GetBackupReadSearchPattern(ProgramDataSource source) => new(ID, GetReadSearchPattern(source));