mirror of https://github.com/Sonarr/Sonarr
111 lines
3.5 KiB
C#
111 lines
3.5 KiB
C#
|
using Migrator.Framework;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace Migrator
|
||
|
{
|
||
|
public abstract class BaseMigrate
|
||
|
{
|
||
|
protected readonly ITransformationProvider _provider;
|
||
|
protected ILogger _logger;
|
||
|
protected List<long> _availableMigrations;
|
||
|
protected List<long> _original;
|
||
|
protected long _current;
|
||
|
protected bool _dryrun;
|
||
|
|
||
|
protected BaseMigrate(List<long> availableMigrations, ITransformationProvider provider, ILogger logger)
|
||
|
{
|
||
|
_provider = provider;
|
||
|
_availableMigrations = availableMigrations;
|
||
|
_original = new List<long> (_provider.AppliedMigrations.ToArray()); //clone
|
||
|
_logger = logger;
|
||
|
}
|
||
|
|
||
|
public static BaseMigrate GetInstance(List<long> availableMigrations, ITransformationProvider provider, ILogger logger)
|
||
|
{
|
||
|
return new MigrateAnywhere(availableMigrations, provider, logger);
|
||
|
}
|
||
|
|
||
|
public List<long> AppliedVersions
|
||
|
{
|
||
|
get { return _original; }
|
||
|
}
|
||
|
|
||
|
public virtual long Current
|
||
|
{
|
||
|
get { return _current; }
|
||
|
protected set { _current = value; }
|
||
|
}
|
||
|
|
||
|
public virtual bool DryRun
|
||
|
{
|
||
|
get { return _dryrun; }
|
||
|
set { _dryrun = value; }
|
||
|
}
|
||
|
|
||
|
public abstract long Previous { get; }
|
||
|
public abstract long Next { get; }
|
||
|
|
||
|
public void Iterate()
|
||
|
{
|
||
|
Current = Next;
|
||
|
}
|
||
|
|
||
|
public abstract bool Continue(long targetVersion);
|
||
|
|
||
|
public abstract void Migrate(IMigration migration);
|
||
|
|
||
|
/// <summary>
|
||
|
/// Finds the next migration available to be applied. Only returns
|
||
|
/// migrations that have NOT already been applied.
|
||
|
/// </summary>
|
||
|
/// <returns>The migration number of the next available Migration.</returns>
|
||
|
protected long NextMigration()
|
||
|
{
|
||
|
// Start searching at the current index
|
||
|
int migrationSearch = _availableMigrations.IndexOf(Current)+1;
|
||
|
|
||
|
// See if we can find a migration that matches the requirement
|
||
|
while(migrationSearch < _availableMigrations.Count
|
||
|
&& _provider.AppliedMigrations.Contains(_availableMigrations[migrationSearch]))
|
||
|
{
|
||
|
migrationSearch++;
|
||
|
}
|
||
|
|
||
|
// did we exhaust the list?
|
||
|
if(migrationSearch == _availableMigrations.Count){
|
||
|
// we're at the last one. Done!
|
||
|
return _availableMigrations[migrationSearch-1]+1;
|
||
|
}
|
||
|
// found one.
|
||
|
return _availableMigrations[migrationSearch];
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Finds the previous migration that has been applied. Only returns
|
||
|
/// migrations that HAVE already been applied.
|
||
|
/// </summary>
|
||
|
/// <returns>The most recently applied Migration.</returns>
|
||
|
protected long PreviousMigration()
|
||
|
{
|
||
|
// Start searching at the current index
|
||
|
int migrationSearch = _availableMigrations.IndexOf(Current)-1;
|
||
|
|
||
|
// See if we can find a migration that matches the requirement
|
||
|
while(migrationSearch > -1
|
||
|
&& !_provider.AppliedMigrations.Contains(_availableMigrations[migrationSearch]))
|
||
|
{
|
||
|
migrationSearch--;
|
||
|
}
|
||
|
|
||
|
// did we exhaust the list?
|
||
|
if(migrationSearch < 0){
|
||
|
// we're at the first one. Done!
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// found one.
|
||
|
return _availableMigrations[migrationSearch];
|
||
|
}
|
||
|
}
|
||
|
}
|