update for database provider specific migrations

fix issues with live radar
This commit is contained in:
RaidMax 2020-11-27 21:52:52 -06:00
parent 8ef2959f63
commit 36a02b3d7b
309 changed files with 76554 additions and 1067 deletions

3
.gitignore vendored
View File

@ -244,4 +244,5 @@ launchSettings.json
/Tests/ApplicationTests/Files/GameEvents.json /Tests/ApplicationTests/Files/GameEvents.json
/Tests/ApplicationTests/Files/replay.json /Tests/ApplicationTests/Files/replay.json
/GameLogServer/game_log_server_env /GameLogServer/game_log_server_env
.idea/* .idea/*
*.db

View File

@ -53,7 +53,6 @@ namespace IW4MAdmin.Application
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly List<MessageToken> MessageTokens; private readonly List<MessageToken> MessageTokens;
private readonly ClientService ClientSvc; private readonly ClientService ClientSvc;
readonly AliasService AliasSvc;
readonly PenaltyService PenaltySvc; readonly PenaltyService PenaltySvc;
public IConfigurationHandler<ApplicationConfiguration> ConfigHandler; public IConfigurationHandler<ApplicationConfiguration> ConfigHandler;
readonly IPageList PageList; readonly IPageList PageList;
@ -80,14 +79,13 @@ namespace IW4MAdmin.Application
IEnumerable<IPlugin> plugins, IParserRegexFactory parserRegexFactory, IEnumerable<IRegisterEvent> customParserEvents, IEnumerable<IPlugin> plugins, IParserRegexFactory parserRegexFactory, IEnumerable<IRegisterEvent> customParserEvents,
IEventHandler eventHandler, IScriptCommandFactory scriptCommandFactory, IDatabaseContextFactory contextFactory, IMetaService metaService, IEventHandler eventHandler, IScriptCommandFactory scriptCommandFactory, IDatabaseContextFactory contextFactory, IMetaService metaService,
IMetaRegistration metaRegistration, IScriptPluginServiceResolver scriptPluginServiceResolver, ClientService clientService, IServiceProvider serviceProvider, IMetaRegistration metaRegistration, IScriptPluginServiceResolver scriptPluginServiceResolver, ClientService clientService, IServiceProvider serviceProvider,
ChangeHistoryService changeHistoryService, ApplicationConfiguration appConfig) ChangeHistoryService changeHistoryService, ApplicationConfiguration appConfig, PenaltyService penaltyService)
{ {
MiddlewareActionHandler = actionHandler; MiddlewareActionHandler = actionHandler;
_servers = new ConcurrentBag<Server>(); _servers = new ConcurrentBag<Server>();
MessageTokens = new List<MessageToken>(); MessageTokens = new List<MessageToken>();
ClientSvc = clientService; ClientSvc = clientService;
AliasSvc = new AliasService(); PenaltySvc = penaltyService;
PenaltySvc = new PenaltyService();
ConfigHandler = appConfigHandler; ConfigHandler = appConfigHandler;
StartTime = DateTime.UtcNow; StartTime = DateTime.UtcNow;
PageList = new PageList(); PageList = new PageList();
@ -401,16 +399,16 @@ namespace IW4MAdmin.Application
#endregion #endregion
#region DATABASE #region DATABASE
using (var db = new DatabaseContext(GetApplicationSettings().Configuration()?.ConnectionString, _logger.LogInformation("Beginning database migration sync");
GetApplicationSettings().Configuration()?.DatabaseProvider)) Console.WriteLine(_translationLookup["MANAGER_MIGRATION_START"]);
{ await ContextSeed.Seed(_serviceProvider.GetRequiredService<IDatabaseContextFactory>(), _tokenSource.Token);
await new ContextSeed(db).Seed(); await DatabaseHousekeeping.RemoveOldRatings(_serviceProvider.GetRequiredService<IDatabaseContextFactory>(), _tokenSource.Token);
DatabaseHousekeeping.RemoveOldRatings(db); _logger.LogInformation("Finished database migration sync");
} Console.WriteLine(_translationLookup["MANAGER_MIGRATION_END"]);
#endregion #endregion
#region COMMANDS #region COMMANDS
if (ClientSvc.GetOwners().Result.Count > 0) if (await ClientSvc.HasOwnerAsync(_tokenSource.Token))
{ {
_commands.RemoveAll(_cmd => _cmd.GetType() == typeof(OwnerCommand)); _commands.RemoveAll(_cmd => _cmd.GetType() == typeof(OwnerCommand));
} }
@ -565,11 +563,6 @@ namespace IW4MAdmin.Application
return ClientSvc; return ClientSvc;
} }
public AliasService GetAliasService()
{
return AliasSvc;
}
public PenaltyService GetPenaltyService() public PenaltyService GetPenaltyService()
{ {
return PenaltySvc; return PenaltySvc;

View File

@ -1,9 +1,16 @@
using System.IO; using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Serilog; using Serilog;
using Serilog.Events;
using SharedLibraryCore; using SharedLibraryCore;
using SharedLibraryCore.Configuration; using SharedLibraryCore.Configuration;
using SharedLibraryCore.Database;
using SharedLibraryCore.Database.MigrationContext;
namespace IW4MAdmin.Application.Extensions namespace IW4MAdmin.Application.Extensions
{ {
@ -21,13 +28,16 @@ namespace IW4MAdmin.Application.Extensions
.Build(); .Build();
var loggerConfig = new LoggerConfiguration() var loggerConfig = new LoggerConfiguration()
.ReadFrom.Configuration(configuration); .ReadFrom.Configuration(configuration)
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning);
if (Utilities.IsDevelopment) if (Utilities.IsDevelopment)
{ {
loggerConfig = loggerConfig.WriteTo.Console( loggerConfig = loggerConfig.WriteTo.Console(
outputTemplate:"[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Server} {Level:u3}] {Message:lj}{NewLine}{Exception}") outputTemplate:
"[{Timestamp:yyyy-MM-dd HH:mm:ss.fff} {Server} {Level:u3}] {Message:lj}{NewLine}{Exception}")
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.MinimumLevel.Debug(); .MinimumLevel.Debug();
} }
@ -37,5 +47,46 @@ namespace IW4MAdmin.Application.Extensions
services.AddLogging(builder => builder.AddSerilog(_defaultLogger, dispose: true)); services.AddLogging(builder => builder.AddSerilog(_defaultLogger, dispose: true));
return services; return services;
} }
public static IServiceCollection AddDatabaseContext(this IServiceCollection services,
ApplicationConfiguration appConfig)
{
if (string.IsNullOrEmpty(appConfig.ConnectionString) || appConfig.DatabaseProvider == "sqlite")
{
var currentPath = Utilities.OperatingDirectory;
currentPath = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? $"{Path.DirectorySeparatorChar}{currentPath}"
: currentPath;
var connectionStringBuilder = new SqliteConnectionStringBuilder
{DataSource = Path.Join(currentPath, "Database", "Database.db")};
var connectionString = connectionStringBuilder.ToString();
services.AddDbContext<DatabaseContext, SqliteDatabaseContext>(options =>
options.UseSqlite(connectionString), ServiceLifetime.Transient);
return services;
}
switch (appConfig.DatabaseProvider)
{
case "mysql":
var appendTimeout = !appConfig.ConnectionString.Contains("default command timeout",
StringComparison.InvariantCultureIgnoreCase);
services.AddDbContext<DatabaseContext, MySqlDatabaseContext>(options =>
options.UseMySql(
appConfig.ConnectionString + (appendTimeout ? "default command timeout=0" : ""),
mysqlOptions => mysqlOptions.EnableRetryOnFailure()), ServiceLifetime.Transient);
break;
case "postgresql":
appendTimeout = !appConfig.ConnectionString.Contains("Command Timeout",
StringComparison.InvariantCultureIgnoreCase);
services.AddDbContext<DatabaseContext, PostgresqlDatabaseContext>(options =>
options.UseNpgsql(appConfig.ConnectionString + (appendTimeout ? "Command Timeout=0" : ""),
postgresqlOptions => postgresqlOptions.EnableRetryOnFailure()), ServiceLifetime.Transient);
break;
}
return services;
}
} }
} }

View File

@ -1,4 +1,7 @@
using SharedLibraryCore.Database; using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SharedLibraryCore.Database;
using SharedLibraryCore.Interfaces; using SharedLibraryCore.Interfaces;
namespace IW4MAdmin.Application.Factories namespace IW4MAdmin.Application.Factories
@ -8,6 +11,13 @@ namespace IW4MAdmin.Application.Factories
/// </summary> /// </summary>
public class DatabaseContextFactory : IDatabaseContextFactory public class DatabaseContextFactory : IDatabaseContextFactory
{ {
private readonly IServiceProvider _serviceProvider;
public DatabaseContextFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
/// <summary> /// <summary>
/// creates a new database context /// creates a new database context
/// </summary> /// </summary>
@ -15,7 +25,24 @@ namespace IW4MAdmin.Application.Factories
/// <returns></returns> /// <returns></returns>
public DatabaseContext CreateContext(bool? enableTracking = true) public DatabaseContext CreateContext(bool? enableTracking = true)
{ {
return enableTracking.HasValue ? new DatabaseContext(disableTracking: !enableTracking.Value) : new DatabaseContext(); var context = _serviceProvider.GetRequiredService<DatabaseContext>();
enableTracking ??= true;
if (enableTracking.Value)
{
context.ChangeTracker.AutoDetectChangesEnabled = true;
context.ChangeTracker.LazyLoadingEnabled = true;
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
}
else
{
context.ChangeTracker.AutoDetectChangesEnabled = false;
context.ChangeTracker.LazyLoadingEnabled = false;
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
}
return context;
} }
} }
} }

View File

@ -334,7 +334,7 @@ namespace IW4MAdmin
// possible a connect/reconnect game event before we get to process it here // possible a connect/reconnect game event before we get to process it here
// it appears that new games decide to switch client slots between maps (even if the clients aren't disconnecting) // it appears that new games decide to switch client slots between maps (even if the clients aren't disconnecting)
// bots can have duplicate names which causes conflicting GUIDs // bots can have duplicate names which causes conflicting GUIDs
else if (existingClient != null && existingClient.ClientNumber != E.Origin.ClientNumber && if (existingClient != null && existingClient.ClientNumber != E.Origin.ClientNumber &&
!E.Origin.IsBot) !E.Origin.IsBot)
{ {
ServerLogger.LogWarning( ServerLogger.LogWarning(

View File

@ -81,6 +81,7 @@ namespace IW4MAdmin.Application
ITranslationLookup translationLookup = null; ITranslationLookup translationLookup = null;
var logger = BuildDefaultLogger<Program>(new ApplicationConfiguration()); var logger = BuildDefaultLogger<Program>(new ApplicationConfiguration());
Utilities.DefaultLogger = logger; Utilities.DefaultLogger = logger;
IServiceCollection services = null;
logger.LogInformation("Begin IW4MAdmin startup. Version is {version} {@args}", Version, args); logger.LogInformation("Begin IW4MAdmin startup. Version is {version} {@args}", Version, args);
try try
@ -89,7 +90,7 @@ namespace IW4MAdmin.Application
ConfigurationMigration.MoveConfigFolder10518(null); ConfigurationMigration.MoveConfigFolder10518(null);
ConfigurationMigration.CheckDirectories(); ConfigurationMigration.CheckDirectories();
logger.LogDebug("Configuring services..."); logger.LogDebug("Configuring services...");
var services = ConfigureServices(args); services = ConfigureServices(args);
serviceProvider = services.BuildServiceProvider(); serviceProvider = services.BuildServiceProvider();
var versionChecker = serviceProvider.GetRequiredService<IMasterCommunication>(); var versionChecker = serviceProvider.GetRequiredService<IMasterCommunication>();
ServerManager = (ApplicationManager)serviceProvider.GetRequiredService<IManager>(); ServerManager = (ApplicationManager)serviceProvider.GetRequiredService<IManager>();
@ -137,7 +138,7 @@ namespace IW4MAdmin.Application
try try
{ {
ApplicationTask = RunApplicationTasksAsync(logger); ApplicationTask = RunApplicationTasksAsync(logger, services);
await ApplicationTask; await ApplicationTask;
} }
@ -160,10 +161,10 @@ namespace IW4MAdmin.Application
/// runs the core application tasks /// runs the core application tasks
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
private static async Task RunApplicationTasksAsync(ILogger logger) private static async Task RunApplicationTasksAsync(ILogger logger, IServiceCollection services)
{ {
var webfrontTask = ServerManager.GetApplicationSettings().Configuration().EnableWebFront ? var webfrontTask = ServerManager.GetApplicationSettings().Configuration().EnableWebFront ?
WebfrontCore.Program.Init(ServerManager, serviceProvider, ServerManager.CancellationToken) : WebfrontCore.Program.Init(ServerManager, serviceProvider, services, ServerManager.CancellationToken) :
Task.CompletedTask; Task.CompletedTask;
// we want to run this one on a manual thread instead of letting the thread pool handle it, // we want to run this one on a manual thread instead of letting the thread pool handle it,
@ -322,9 +323,13 @@ namespace IW4MAdmin.Application
.AddBaseLogger(appConfig) .AddBaseLogger(appConfig)
.AddSingleton<IServiceCollection>(_serviceProvider => serviceCollection) .AddSingleton<IServiceCollection>(_serviceProvider => serviceCollection)
.AddSingleton((IConfigurationHandler<ApplicationConfiguration>) appConfigHandler) .AddSingleton((IConfigurationHandler<ApplicationConfiguration>) appConfigHandler)
.AddSingleton(new BaseConfigurationHandler<CommandConfiguration>("CommandConfiguration") as IConfigurationHandler<CommandConfiguration>) .AddSingleton(
new BaseConfigurationHandler<CommandConfiguration>("CommandConfiguration") as
IConfigurationHandler<CommandConfiguration>)
.AddSingleton(appConfig) .AddSingleton(appConfig)
.AddSingleton(_serviceProvider => _serviceProvider.GetRequiredService<IConfigurationHandler<CommandConfiguration>>().Configuration() ?? new CommandConfiguration()) .AddSingleton(_serviceProvider =>
_serviceProvider.GetRequiredService<IConfigurationHandler<CommandConfiguration>>()
.Configuration() ?? new CommandConfiguration())
.AddSingleton<IPluginImporter, PluginImporter>() .AddSingleton<IPluginImporter, PluginImporter>()
.AddSingleton<IMiddlewareActionHandler, MiddlewareActionHandler>() .AddSingleton<IMiddlewareActionHandler, MiddlewareActionHandler>()
.AddSingleton<IRConConnectionFactory, RConConnectionFactory>() .AddSingleton<IRConConnectionFactory, RConConnectionFactory>()
@ -338,12 +343,16 @@ namespace IW4MAdmin.Application
.AddSingleton<IEntityService<EFClient>, ClientService>() .AddSingleton<IEntityService<EFClient>, ClientService>()
.AddSingleton<IMetaService, MetaService>() .AddSingleton<IMetaService, MetaService>()
.AddSingleton<ClientService>() .AddSingleton<ClientService>()
.AddSingleton<PenaltyService>()
.AddSingleton<ChangeHistoryService>() .AddSingleton<ChangeHistoryService>()
.AddSingleton<IMetaRegistration, MetaRegistration>() .AddSingleton<IMetaRegistration, MetaRegistration>()
.AddSingleton<IScriptPluginServiceResolver, ScriptPluginServiceResolver>() .AddSingleton<IScriptPluginServiceResolver, ScriptPluginServiceResolver>()
.AddSingleton<IResourceQueryHelper<ClientPaginationRequest, ReceivedPenaltyResponse>, ReceivedPenaltyResourceQueryHelper>() .AddSingleton<IResourceQueryHelper<ClientPaginationRequest, ReceivedPenaltyResponse>,
.AddSingleton<IResourceQueryHelper<ClientPaginationRequest, AdministeredPenaltyResponse>, AdministeredPenaltyResourceQueryHelper>() ReceivedPenaltyResourceQueryHelper>()
.AddSingleton<IResourceQueryHelper<ClientPaginationRequest, UpdatedAliasResponse>, UpdatedAliasResourceQueryHelper>() .AddSingleton<IResourceQueryHelper<ClientPaginationRequest, AdministeredPenaltyResponse>,
AdministeredPenaltyResourceQueryHelper>()
.AddSingleton<IResourceQueryHelper<ClientPaginationRequest, UpdatedAliasResponse>,
UpdatedAliasResourceQueryHelper>()
.AddSingleton<IResourceQueryHelper<ChatSearchQuery, MessageResponse>, ChatResourceQueryHelper>() .AddSingleton<IResourceQueryHelper<ChatSearchQuery, MessageResponse>, ChatResourceQueryHelper>()
.AddTransient<IParserPatternMatcher, ParserPatternMatcher>() .AddTransient<IParserPatternMatcher, ParserPatternMatcher>()
.AddSingleton<IRemoteAssemblyHandler, RemoteAssemblyHandler>() .AddSingleton<IRemoteAssemblyHandler, RemoteAssemblyHandler>()
@ -351,7 +360,8 @@ namespace IW4MAdmin.Application
.AddSingleton<IManager, ApplicationManager>() .AddSingleton<IManager, ApplicationManager>()
.AddSingleton<SharedLibraryCore.Interfaces.ILogger, Logger>() .AddSingleton<SharedLibraryCore.Interfaces.ILogger, Logger>()
.AddSingleton<IClientNoticeMessageFormatter, ClientNoticeMessageFormatter>() .AddSingleton<IClientNoticeMessageFormatter, ClientNoticeMessageFormatter>()
.AddSingleton(translationLookup); .AddSingleton(translationLookup)
.AddDatabaseContext(appConfig);
if (args.Contains("serialevents")) if (args.Contains("serialevents"))
{ {

View File

@ -1,20 +1,24 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using IW4MAdmin.Plugins.Stats.Models; using IW4MAdmin.Plugins.Stats.Models;
using SharedLibraryCore.Database; using SharedLibraryCore.Database;
using SharedLibraryCore.Interfaces;
namespace IW4MAdmin.Application.Migration namespace IW4MAdmin.Application.Migration
{ {
public static class DatabaseHousekeeping public static class DatabaseHousekeeping
{ {
private static DateTime _cutoffDate = DateTime.UtcNow.AddMonths(-6); private static readonly DateTime CutoffDate = DateTime.UtcNow.AddMonths(-6);
public static void RemoveOldRatings(DatabaseContext context) public static async Task RemoveOldRatings(IDatabaseContextFactory contextFactory, CancellationToken token)
{ {
await using var context = contextFactory.CreateContext();
var dbSet = context.Set<EFRating>(); var dbSet = context.Set<EFRating>();
var itemsToDelete = dbSet.Where(rating => rating.When <= _cutoffDate); var itemsToDelete = dbSet.Where(rating => rating.When <= CutoffDate);
dbSet.RemoveRange(itemsToDelete); dbSet.RemoveRange(itemsToDelete);
context.SaveChanges(); await context.SaveChangesAsync(token);
} }
} }
} }

View File

@ -118,7 +118,28 @@ namespace IW4MAdmin.Application.Misc
}) })
.CatchClrExceptions()); .CatchClrExceptions());
_scriptEngine.Execute(script); try
{
_scriptEngine.Execute(script);
}
catch (JavaScriptException ex)
{
_logger.LogError(ex,
"Encountered JavaScript runtime error while executing {methodName} for script plugin {plugin} at {@locationInfo}",
nameof(Initialize), _fileName, ex.Location);
throw new PluginException($"A JavaScript parsing error occured while initializing script plugin");
}
catch (Exception e)
{
_logger.LogError(e,
"Encountered unexpected error while running {methodName} for script plugin {plugin}",
nameof(Initialize), _fileName);
throw new PluginException($"An unexpected error occured while initialization script plugin");
}
_scriptEngine.SetValue("_localization", Utilities.CurrentLocalization); _scriptEngine.SetValue("_localization", Utilities.CurrentLocalization);
_scriptEngine.SetValue("_serviceResolver", serviceResolver); _scriptEngine.SetValue("_serviceResolver", serviceResolver);
dynamic pluginObject = _scriptEngine.GetValue("plugin").ToObject(); dynamic pluginObject = _scriptEngine.GetValue("plugin").ToObject();

View File

@ -2,6 +2,7 @@
using SharedLibraryCore; using SharedLibraryCore;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -68,7 +69,9 @@ namespace LiveRadar
lock (lockObject) lock (lockObject)
{ {
generatedBotGuid = _botGuidLookups.ContainsKey(botKey) ? _botGuidLookups[botKey] : 0; generatedBotGuid = _botGuidLookups.ContainsKey(botKey)
? _botGuidLookups[botKey]
: (E.Extra.ToString() ?? "0").ConvertGuidToLong(NumberStyles.HexNumber);
} }
var radarUpdate = RadarEvent.Parse(E.Data, generatedBotGuid); var radarUpdate = RadarEvent.Parse(E.Data, generatedBotGuid);

View File

@ -16,7 +16,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
class MostPlayedCommand : Command class MostPlayedCommand : Command
{ {
public static async Task<List<string>> GetMostPlayed(Server s, ITranslationLookup translationLookup) public static async Task<List<string>> GetMostPlayed(Server s, ITranslationLookup translationLookup, IDatabaseContextFactory contextFactory)
{ {
long serverId = StatManager.GetIdForServer(s); long serverId = StatManager.GetIdForServer(s);
@ -25,42 +25,39 @@ namespace IW4MAdmin.Plugins.Stats.Commands
$"^5--{translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT"]}--" $"^5--{translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT"]}--"
}; };
using (var db = new DatabaseContext(true)) await using var context = contextFactory.CreateContext(false);
{ var thirtyDaysAgo = DateTime.UtcNow.AddMonths(-1);
db.ChangeTracker.AutoDetectChangesEnabled = false;
db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
var thirtyDaysAgo = DateTime.UtcNow.AddMonths(-1); var iqStats = (from stats in context.Set<EFClientStatistics>()
join client in context.Clients
on stats.ClientId equals client.ClientId
join alias in context.Aliases
on client.CurrentAliasId equals alias.AliasId
where stats.ServerId == serverId
where client.Level != EFClient.Permission.Banned
where client.LastConnection >= thirtyDaysAgo
orderby stats.TimePlayed descending
select new
{
alias.Name,
client.TotalConnectionTime,
stats.Kills
})
.Take(5);
var iqStats = (from stats in db.Set<EFClientStatistics>() var iqList = await iqStats.ToListAsync();
join client in db.Clients
on stats.ClientId equals client.ClientId
join alias in db.Aliases
on client.CurrentAliasId equals alias.AliasId
where stats.ServerId == serverId
where client.Level != EFClient.Permission.Banned
where client.LastConnection >= thirtyDaysAgo
orderby stats.TimePlayed descending
select new
{
alias.Name,
client.TotalConnectionTime,
stats.Kills
})
.Take(5);
var iqList = await iqStats.ToListAsync(); mostPlayed.AddRange(iqList.Select(stats => translationLookup["COMMANDS_MOST_PLAYED_FORMAT"].FormatExt(stats.Name, stats.Kills, (DateTime.UtcNow - DateTime.UtcNow.AddSeconds(-stats.TotalConnectionTime)).HumanizeForCurrentCulture())));
mostPlayed.AddRange(iqList.Select(stats => translationLookup["COMMANDS_MOST_PLAYED_FORMAT"].FormatExt(stats.Name, stats.Kills, (DateTime.UtcNow - DateTime.UtcNow.AddSeconds(-stats.TotalConnectionTime)).HumanizeForCurrentCulture())));
}
return mostPlayed; return mostPlayed;
} }
private readonly CommandConfiguration _config; private readonly CommandConfiguration _config;
private readonly IDatabaseContextFactory _contextFactory;
public MostPlayedCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup) public MostPlayedCommand(CommandConfiguration config, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
{ {
Name = "mostplayed"; Name = "mostplayed";
Description = translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC"]; Description = translationLookup["PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC"];
@ -69,11 +66,12 @@ namespace IW4MAdmin.Plugins.Stats.Commands
RequiresTarget = false; RequiresTarget = false;
_config = config; _config = config;
_contextFactory = contextFactory;
} }
public override async Task ExecuteAsync(GameEvent E) public override async Task ExecuteAsync(GameEvent E)
{ {
var topStats = await GetMostPlayed(E.Owner, _translationLookup); var topStats = await GetMostPlayed(E.Owner, _translationLookup, _contextFactory);
if (!E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix)) if (!E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix))
{ {
foreach (var stat in topStats) foreach (var stat in topStats)

View File

@ -12,14 +12,17 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
public class ResetStats : Command public class ResetStats : Command
{ {
public ResetStats(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup) private readonly IDatabaseContextFactory _contextFactory;
public ResetStats(CommandConfiguration config, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
{ {
Name = "resetstats"; Name = "resetstats";
Description = translationLookup["PLUGINS_STATS_COMMANDS_RESET_DESC"]; Description = translationLookup["PLUGINS_STATS_COMMANDS_RESET_DESC"];
Alias = "rs"; Alias = "rs";
Permission = EFClient.Permission.User; Permission = EFClient.Permission.User;
RequiresTarget = false; RequiresTarget = false;
//AllowImpersonation = true; AllowImpersonation = true;
} }
public override async Task ExecuteAsync(GameEvent E) public override async Task ExecuteAsync(GameEvent E)
@ -30,27 +33,24 @@ namespace IW4MAdmin.Plugins.Stats.Commands
long serverId = Helpers.StatManager.GetIdForServer(E.Owner); long serverId = Helpers.StatManager.GetIdForServer(E.Owner);
EFClientStatistics clientStats; EFClientStatistics clientStats;
using (var ctx = new DatabaseContext(disableTracking: true)) await using var context = _contextFactory.CreateContext();
{ clientStats = await context.Set<EFClientStatistics>()
clientStats = await ctx.Set<EFClientStatistics>() .Where(s => s.ClientId == E.Origin.ClientId)
.Where(s => s.ClientId == E.Origin.ClientId) .Where(s => s.ServerId == serverId)
.Where(s => s.ServerId == serverId) .FirstAsync();
.FirstAsync();
clientStats.Deaths = 0; clientStats.Deaths = 0;
clientStats.Kills = 0; clientStats.Kills = 0;
clientStats.SPM = 0.0; clientStats.SPM = 0.0;
clientStats.Skill = 0.0; clientStats.Skill = 0.0;
clientStats.TimePlayed = 0; clientStats.TimePlayed = 0;
// todo: make this more dynamic // todo: make this more dynamic
clientStats.EloRating = 200.0; clientStats.EloRating = 200.0;
// reset the cached version // reset the cached version
Plugin.Manager.ResetStats(E.Origin); Plugin.Manager.ResetStats(E.Origin);
// fixme: this doesn't work properly when another context exists await context.SaveChangesAsync();
await ctx.SaveChangesAsync();
}
E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]); E.Origin.Tell(_translationLookup["PLUGINS_STATS_COMMANDS_RESET_SUCCESS"]);
} }

View File

@ -16,7 +16,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
class TopStats : Command class TopStats : Command
{ {
public static async Task<List<string>> GetTopStats(Server s, ITranslationLookup translationLookup) public static async Task<List<string>> GetTopStats(Server s, ITranslationLookup translationLookup, IDatabaseContextFactory contextFactory)
{ {
long serverId = StatManager.GetIdForServer(s); long serverId = StatManager.GetIdForServer(s);
var topStatsText = new List<string>() var topStatsText = new List<string>()
@ -24,36 +24,34 @@ namespace IW4MAdmin.Plugins.Stats.Commands
$"^5--{translationLookup["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--" $"^5--{translationLookup["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
}; };
using (var db = new DatabaseContext(true)) await using var context = contextFactory.CreateContext(false);
{ var fifteenDaysAgo = DateTime.UtcNow.AddDays(-15);
var fifteenDaysAgo = DateTime.UtcNow.AddDays(-15); int minPlayTime = Plugin.Config.Configuration().TopPlayersMinPlayTime;
int minPlayTime = Plugin.Config.Configuration().TopPlayersMinPlayTime;
var iqStats = (from stats in db.Set<EFClientStatistics>() var iqStats = (from stats in context.Set<EFClientStatistics>()
join client in db.Clients join client in context.Clients
on stats.ClientId equals client.ClientId on stats.ClientId equals client.ClientId
join alias in db.Aliases join alias in context.Aliases
on client.CurrentAliasId equals alias.AliasId on client.CurrentAliasId equals alias.AliasId
where stats.ServerId == serverId where stats.ServerId == serverId
where stats.TimePlayed >= minPlayTime where stats.TimePlayed >= minPlayTime
where client.Level != EFClient.Permission.Banned where client.Level != EFClient.Permission.Banned
where client.LastConnection >= fifteenDaysAgo where client.LastConnection >= fifteenDaysAgo
orderby (stats.EloRating + stats.Skill) / 2.0d descending orderby (stats.EloRating + stats.Skill) / 2.0d descending
select new select new
{ {
stats.KDR, stats.KDR,
stats.Performance, stats.Performance,
alias.Name alias.Name
}) })
.Take(5); .Take(5);
var statsList = (await iqStats.ToListAsync()) var statsList = (await iqStats.ToListAsync())
.Select(stats => $"^3{stats.Name}^7 - ^5{stats.KDR} ^7{translationLookup["PLUGINS_STATS_TEXT_KDR"]} | ^5{stats.Performance} ^7{translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"]}"); .Select(stats => $"^3{stats.Name}^7 - ^5{stats.KDR} ^7{translationLookup["PLUGINS_STATS_TEXT_KDR"]} | ^5{stats.Performance} ^7{translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"]}");
topStatsText.AddRange(statsList); topStatsText.AddRange(statsList);
}
// no one qualified // no one qualified
if (topStatsText.Count == 1) if (topStatsText.Count == 1)
{ {
topStatsText = new List<string>() topStatsText = new List<string>()
@ -66,8 +64,10 @@ namespace IW4MAdmin.Plugins.Stats.Commands
} }
private readonly CommandConfiguration _config; private readonly CommandConfiguration _config;
private readonly IDatabaseContextFactory _contextFactory;
public TopStats(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup) public TopStats(CommandConfiguration config, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
{ {
Name = "topstats"; Name = "topstats";
Description = translationLookup["PLUGINS_STATS_COMMANDS_TOP_DESC"]; Description = translationLookup["PLUGINS_STATS_COMMANDS_TOP_DESC"];
@ -76,11 +76,12 @@ namespace IW4MAdmin.Plugins.Stats.Commands
RequiresTarget = false; RequiresTarget = false;
_config = config; _config = config;
_contextFactory = contextFactory;
} }
public override async Task ExecuteAsync(GameEvent E) public override async Task ExecuteAsync(GameEvent E)
{ {
var topStats = await GetTopStats(E.Owner, _translationLookup); var topStats = await GetTopStats(E.Owner, _translationLookup, _contextFactory);
if (!E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix)) if (!E.Message.IsBroadcastCommand(_config.BroadcastCommandPrefix))
{ {
foreach (var stat in topStats) foreach (var stat in topStats)

View File

@ -14,7 +14,10 @@ namespace IW4MAdmin.Plugins.Stats.Commands
{ {
public class ViewStatsCommand : Command public class ViewStatsCommand : Command
{ {
public ViewStatsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup) private readonly IDatabaseContextFactory _contextFactory;
public ViewStatsCommand(CommandConfiguration config, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
{ {
Name = "stats"; Name = "stats";
@ -32,6 +35,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
}; };
_config = config; _config = config;
_contextFactory = contextFactory;
} }
private readonly CommandConfiguration _config; private readonly CommandConfiguration _config;
@ -66,10 +70,8 @@ namespace IW4MAdmin.Plugins.Stats.Commands
else else
{ {
using (var ctx = new DatabaseContext(true)) await using var context = _contextFactory.CreateContext(false);
{ pStats = (await context.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId));
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Target.ClientId));
}
} }
statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}"; statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
} }
@ -86,10 +88,8 @@ namespace IW4MAdmin.Plugins.Stats.Commands
else else
{ {
using (var ctx = new DatabaseContext(true)) await using var context = _contextFactory.CreateContext(false);
{ pStats = (await context.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Origin.ClientId));
pStats = (await ctx.Set<EFClientStatistics>().FirstAsync(c => c.ServerId == serverId && c.ClientId == E.Origin.ClientId));
}
} }
statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}"; statLine = $"^5{pStats.Kills} ^7{_translationLookup["PLUGINS_STATS_TEXT_KILLS"]} | ^5{pStats.Deaths} ^7{_translationLookup["PLUGINS_STATS_TEXT_DEATHS"]} | ^5{pStats.KDR} ^7KDR | ^5{pStats.Performance} ^7{_translationLookup["PLUGINS_STATS_COMMANDS_PERFORMANCE"].ToUpper()} | {performanceRankingString}";
} }

View File

@ -47,10 +47,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
private void SetupServerIds() private void SetupServerIds()
{ {
using (var ctx = _contextFactory.CreateContext(enableTracking: false)) using var ctx = _contextFactory.CreateContext(enableTracking: false);
{ serverModels = ctx.Set<EFServer>().ToList();
serverModels = ctx.Set<EFServer>().ToList();
}
} }
public Expression<Func<EFRating, bool>> GetRankingFunc(long? serverId = null) public Expression<Func<EFRating, bool>> GetRankingFunc(long? serverId = null)

View File

@ -25,10 +25,12 @@ namespace Stats.Models
builder.Entity<EFRating>() builder.Entity<EFRating>()
.HasIndex(p => new { p.When, p.ServerId, p.Performance, p.ActivityAmount }); .HasIndex(p => new { p.When, p.ServerId, p.Performance, p.ActivityAmount });
builder.Entity<EFClientMessage>()
.HasIndex(p => p.TimeSent);
builder.Entity<EFClientMessage>(message =>
{
message.HasIndex(p => p.TimeSent);
});
// force pluralization // force pluralization
builder.Entity<EFClientKill>().ToTable("EFClientKills"); builder.Entity<EFClientKill>().ToTable("EFClientKills");
builder.Entity<EFClientMessage>().ToTable("EFClientMessages"); builder.Entity<EFClientMessage>().ToTable("EFClientMessages");

View File

@ -391,32 +391,28 @@ namespace IW4MAdmin.Plugins.Stats
async Task<string> totalKills(Server server) async Task<string> totalKills(Server server)
{ {
using (var ctx = new DatabaseContext(disableTracking: true)) await using var context = _databaseContextFactory.CreateContext(false);
{ long kills = await context.Set<EFServerStatistics>().Where(s => s.Active).SumAsync(s => s.TotalKills);
long kills = await ctx.Set<EFServerStatistics>().Where(s => s.Active).SumAsync(s => s.TotalKills); return kills.ToString("#,##0", new System.Globalization.CultureInfo(Utilities.CurrentLocalization.LocalizationName));
return kills.ToString("#,##0", new System.Globalization.CultureInfo(Utilities.CurrentLocalization.LocalizationName));
}
} }
async Task<string> totalPlayTime(Server server) async Task<string> totalPlayTime(Server server)
{ {
using (var ctx = new DatabaseContext(disableTracking: true)) await using var context = _databaseContextFactory.CreateContext(false);
{ long playTime = await context.Set<EFServerStatistics>().Where(s => s.Active).SumAsync(s => s.TotalPlayTime);
long playTime = await ctx.Set<EFServerStatistics>().Where(s => s.Active).SumAsync(s => s.TotalPlayTime); return (playTime / 3600.0).ToString("#,##0", new System.Globalization.CultureInfo(Utilities.CurrentLocalization.LocalizationName));
return (playTime / 3600.0).ToString("#,##0", new System.Globalization.CultureInfo(Utilities.CurrentLocalization.LocalizationName));
}
} }
async Task<string> topStats(Server s) async Task<string> topStats(Server s)
{ {
// todo: this needs to needs to be updated when we DI the lookup // todo: this needs to needs to be updated when we DI the lookup
return string.Join(Environment.NewLine, await Commands.TopStats.GetTopStats(s, Utilities.CurrentLocalization.LocalizationIndex)); return string.Join(Environment.NewLine, await Commands.TopStats.GetTopStats(s, Utilities.CurrentLocalization.LocalizationIndex, _databaseContextFactory));
} }
async Task<string> mostPlayed(Server s) async Task<string> mostPlayed(Server s)
{ {
// todo: this needs to needs to be updated when we DI the lookup // todo: this needs to needs to be updated when we DI the lookup
return string.Join(Environment.NewLine, await Commands.MostPlayedCommand.GetMostPlayed(s, Utilities.CurrentLocalization.LocalizationIndex)); return string.Join(Environment.NewLine, await Commands.MostPlayedCommand.GetMostPlayed(s, Utilities.CurrentLocalization.LocalizationIndex, _databaseContextFactory));
} }
async Task<string> mostKills(Server gameServer) async Task<string> mostKills(Server gameServer)

View File

@ -24,14 +24,17 @@ namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
private readonly IManager _manager; private readonly IManager _manager;
private readonly IResourceQueryHelper<ChatSearchQuery, MessageResponse> _chatResourceQueryHelper; private readonly IResourceQueryHelper<ChatSearchQuery, MessageResponse> _chatResourceQueryHelper;
private readonly ITranslationLookup _translationLookup; private readonly ITranslationLookup _translationLookup;
private readonly IDatabaseContextFactory _contextFactory;
public StatsController(ILogger<StatsController> logger, IManager manager, IResourceQueryHelper<ChatSearchQuery, MessageResponse> resourceQueryHelper, public StatsController(ILogger<StatsController> logger, IManager manager, IResourceQueryHelper<ChatSearchQuery,
ITranslationLookup translationLookup) : base(manager) MessageResponse> resourceQueryHelper, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(manager)
{ {
_logger = logger; _logger = logger;
_manager = manager; _manager = manager;
_chatResourceQueryHelper = resourceQueryHelper; _chatResourceQueryHelper = resourceQueryHelper;
_translationLookup = translationLookup; _translationLookup = translationLookup;
_contextFactory = contextFactory;
} }
[HttpGet] [HttpGet]
@ -155,49 +158,48 @@ namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers
[Authorize] [Authorize]
public async Task<IActionResult> GetAutomatedPenaltyInfoAsync(int penaltyId) public async Task<IActionResult> GetAutomatedPenaltyInfoAsync(int penaltyId)
{ {
using (var ctx = new SharedLibraryCore.Database.DatabaseContext(true)) await using var context = _contextFactory.CreateContext(false);
var penalty = await context.Penalties
.Select(_penalty => new { _penalty.OffenderId, _penalty.PenaltyId, _penalty.When, _penalty.AutomatedOffense })
.FirstOrDefaultAsync(_penalty => _penalty.PenaltyId == penaltyId);
if (penalty == null)
{ {
var penalty = await ctx.Penalties return NotFound();
.Select(_penalty => new { _penalty.OffenderId, _penalty.PenaltyId, _penalty.When, _penalty.AutomatedOffense }) }
.FirstOrDefaultAsync(_penalty => _penalty.PenaltyId == penaltyId);
if (penalty == null) // todo: this can be optimized
var iqSnapshotInfo = context.Set<Stats.Models.EFACSnapshot>()
.Where(s => s.ClientId == penalty.OffenderId)
.Include(s => s.LastStrainAngle)
.Include(s => s.HitOrigin)
.Include(s => s.HitDestination)
.Include(s => s.CurrentViewAngle)
.Include(s => s.PredictedViewAngles)
.ThenInclude(_angles => _angles.Vector)
.OrderBy(s => s.When)
.ThenBy(s => s.Hits);
var penaltyInfo = await iqSnapshotInfo.ToListAsync();
if (penaltyInfo.Count > 0)
{
return View("_PenaltyInfo", penaltyInfo);
}
// we want to show anything related to the automated offense
else
{
return View("_MessageContext", new List<MessageResponse>
{ {
return NotFound(); new MessageResponse()
}
// todo: this can be optimized
var iqSnapshotInfo = ctx.Set<Stats.Models.EFACSnapshot>()
.Where(s => s.ClientId == penalty.OffenderId)
.Include(s => s.LastStrainAngle)
.Include(s => s.HitOrigin)
.Include(s => s.HitDestination)
.Include(s => s.CurrentViewAngle)
.Include(s => s.PredictedViewAngles)
.ThenInclude(_angles => _angles.Vector)
.OrderBy(s => s.When)
.ThenBy(s => s.Hits);
var penaltyInfo = await iqSnapshotInfo.ToListAsync();
if (penaltyInfo.Count > 0)
{
return View("_PenaltyInfo", penaltyInfo);
}
// we want to show anything related to the automated offense
else
{
return View("_MessageContext", new List<MessageResponse>
{ {
new MessageResponse() ClientId = penalty.OffenderId,
{ Message = penalty.AutomatedOffense,
ClientId = penalty.OffenderId, When = penalty.When
Message = penalty.AutomatedOffense, }
When = penalty.When });
}
});
}
} }
} }
} }

View File

@ -65,10 +65,12 @@ namespace IW4MAdmin.Plugins.Welcome
public string Name => "Welcome Plugin"; public string Name => "Welcome Plugin";
private readonly IConfigurationHandler<WelcomeConfiguration> _configHandler; private readonly IConfigurationHandler<WelcomeConfiguration> _configHandler;
private readonly IDatabaseContextFactory _contextFactory;
public Plugin(IConfigurationHandlerFactory configurationHandlerFactory) public Plugin(IConfigurationHandlerFactory configurationHandlerFactory, IDatabaseContextFactory contextFactory)
{ {
_configHandler = configurationHandlerFactory.GetConfigurationHandler<WelcomeConfiguration>("WelcomePluginSettings"); _configHandler = configurationHandlerFactory.GetConfigurationHandler<WelcomeConfiguration>("WelcomePluginSettings");
_contextFactory = contextFactory;
} }
public async Task OnLoadAsync(IManager manager) public async Task OnLoadAsync(IManager manager)
@ -98,9 +100,9 @@ namespace IW4MAdmin.Plugins.Welcome
{ {
string penaltyReason; string penaltyReason;
using (var ctx = new DatabaseContext(disableTracking: true)) await using var context = _contextFactory.CreateContext(false);
{ {
penaltyReason = await ctx.Penalties penaltyReason = await context.Penalties
.Where(p => p.OffenderId == newPlayer.ClientId && p.Type == EFPenalty.PenaltyType.Flag) .Where(p => p.OffenderId == newPlayer.ClientId && p.Type == EFPenalty.PenaltyType.Flag)
.OrderByDescending(p => p.When) .OrderByDescending(p => p.When)
.Select(p => p.AutomatedOffense ?? p.Offense) .Select(p => p.AutomatedOffense ?? p.Offense)

View File

@ -12,7 +12,7 @@
<Description>Welcome plugin for IW4MAdmin welcomes clients to the server</Description> <Description>Welcome plugin for IW4MAdmin welcomes clients to the server</Description>
<Copyright>2018</Copyright> <Copyright>2018</Copyright>
<Configurations>Debug;Release;Prerelease</Configurations> <Configurations>Debug;Release;Prerelease</Configurations>
<LangVersion>7.1</LangVersion> <LangVersion>Latest</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -1434,7 +1434,10 @@ namespace SharedLibraryCore.Commands
/// </summary> /// </summary>
public class PruneAdminsCommand : Command public class PruneAdminsCommand : Command
{ {
public PruneAdminsCommand(CommandConfiguration config, ITranslationLookup translationLookup) : base(config, translationLookup) private readonly IDatabaseContextFactory _contextFactory;
public PruneAdminsCommand(CommandConfiguration config, ITranslationLookup translationLookup,
IDatabaseContextFactory contextFactory) : base(config, translationLookup)
{ {
Name = "prune"; Name = "prune";
Description = _translationLookup["COMMANDS_PRUNE_DESC"]; Description = _translationLookup["COMMANDS_PRUNE_DESC"];
@ -1476,16 +1479,15 @@ namespace SharedLibraryCore.Commands
List<EFClient> inactiveUsers = null; List<EFClient> inactiveUsers = null;
// todo: make an event for this // todo: make an event for this
// update user roles // update user roles
using (var context = new DatabaseContext()) await using var context = _contextFactory.CreateContext();
{ var lastActive = DateTime.UtcNow.AddDays(-inactiveDays);
var lastActive = DateTime.UtcNow.AddDays(-inactiveDays); inactiveUsers = await context.Clients
inactiveUsers = await context.Clients .Where(c => c.Level > Permission.Flagged && c.Level <= Permission.Moderator)
.Where(c => c.Level > Permission.Flagged && c.Level <= Permission.Moderator) .Where(c => c.LastConnection < lastActive)
.Where(c => c.LastConnection < lastActive) .ToListAsync();
.ToListAsync(); inactiveUsers.ForEach(c => c.SetLevel(Permission.User, E.Origin));
inactiveUsers.ForEach(c => c.SetLevel(Permission.User, E.Origin)); await context.SaveChangesAsync();
await context.SaveChangesAsync();
}
E.Origin.Tell(_translationLookup["COMMANDS_PRUNE_SUCCESS"].FormatExt(inactiveUsers.Count)); E.Origin.Tell(_translationLookup["COMMANDS_PRUNE_SUCCESS"].FormatExt(inactiveUsers.Count));
} }
} }

View File

@ -2,31 +2,30 @@
using SharedLibraryCore.Database.Models; using SharedLibraryCore.Database.Models;
using System; using System;
using System.Linq; using System.Linq;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using SharedLibraryCore.Interfaces;
using static SharedLibraryCore.Database.Models.EFClient; using static SharedLibraryCore.Database.Models.EFClient;
namespace SharedLibraryCore.Database namespace SharedLibraryCore.Database
{ {
public class ContextSeed public static class ContextSeed
{ {
private DatabaseContext context; public static async Task Seed(IDatabaseContextFactory contextFactory, CancellationToken token)
public ContextSeed(DatabaseContext ctx)
{ {
context = ctx; var context = contextFactory.CreateContext();
} var strategy = context.Database.CreateExecutionStrategy();
await strategy.ExecuteAsync(async () =>
{
await context.Database.MigrateAsync(token);
});
public async Task Seed() if (!await context.AliasLinks.AnyAsync(token))
{
context.Database.Migrate();
if (context.AliasLinks.Count() == 0)
{ {
var link = new EFAliasLink(); var link = new EFAliasLink();
context.Clients.Add(new EFClient() context.Clients.Add(new EFClient()
{ {
ClientId = 1,
Active = false, Active = false,
Connections = 0, Connections = 0,
FirstConnection = DateTime.UtcNow, FirstConnection = DateTime.UtcNow,
@ -44,8 +43,8 @@ namespace SharedLibraryCore.Database
}, },
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync(token);
} }
} }
} }
} }

View File

@ -15,7 +15,7 @@ using System.Threading.Tasks;
namespace SharedLibraryCore.Database namespace SharedLibraryCore.Database
{ {
public class DatabaseContext : DbContext public abstract class DatabaseContext : DbContext
{ {
public DbSet<EFClient> Clients { get; set; } public DbSet<EFClient> Clients { get; set; }
public DbSet<EFAlias> Aliases { get; set; } public DbSet<EFAlias> Aliases { get; set; }
@ -24,88 +24,6 @@ namespace SharedLibraryCore.Database
public DbSet<EFMeta> EFMeta { get; set; } public DbSet<EFMeta> EFMeta { get; set; }
public DbSet<EFChangeHistory> EFChangeHistory { get; set; } public DbSet<EFChangeHistory> EFChangeHistory { get; set; }
static string _ConnectionString;
static string _provider;
private static readonly ILoggerFactory _loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole()
.AddDebug()
.AddFilter((category, level) => true);
});
public DatabaseContext(DbContextOptions<DatabaseContext> opt) : base(opt)
{
}
public DatabaseContext()
{
}
public override void Dispose()
{
}
public DatabaseContext(bool disableTracking) : this()
{
if (disableTracking)
{
this.ChangeTracker.AutoDetectChangesEnabled = false;
this.ChangeTracker.LazyLoadingEnabled = false;
this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
}
else
{
this.ChangeTracker.AutoDetectChangesEnabled = true;
this.ChangeTracker.LazyLoadingEnabled = true;
this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
}
}
public DatabaseContext(string connStr, string provider) : this()
{
_ConnectionString = connStr;
_provider = provider;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//optionsBuilder.UseLoggerFactory(_loggerFactory)
// .EnableSensitiveDataLogging();
if (string.IsNullOrEmpty(_ConnectionString))
{
string currentPath = Utilities.OperatingDirectory;
// allows the application to find the database file
currentPath = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?
$"{Path.DirectorySeparatorChar}{currentPath}" :
currentPath;
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = Path.Join(currentPath, "Database", "Database.db") };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite(connection);
}
}
else
{
switch (_provider)
{
default:
case "mysql":
optionsBuilder.UseMySql(_ConnectionString, _options => _options.EnableRetryOnFailure());
break;
case "postgresql":
optionsBuilder.UseNpgsql(_ConnectionString, _options => _options.EnableRetryOnFailure());
break;
}
}
}
private void SetAuditColumns() private void SetAuditColumns()
{ {
return; return;
@ -129,6 +47,24 @@ namespace SharedLibraryCore.Database
} }
} }
public DatabaseContext()
{
if (!Utilities.IsMigration)
{
throw new InvalidOperationException();
}
}
public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
{
}
protected DatabaseContext(DbContextOptions options) : base(options)
{
}
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default) public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
{ {
SetAuditColumns(); SetAuditColumns();

View File

@ -0,0 +1,31 @@
using System;
using Microsoft.EntityFrameworkCore;
namespace SharedLibraryCore.Database.MigrationContext
{
public class MySqlDatabaseContext : DatabaseContext
{
public MySqlDatabaseContext()
{
if (!Utilities.IsMigration)
{
throw new InvalidOperationException();
}
}
public MySqlDatabaseContext(DbContextOptions<MySqlDatabaseContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (Utilities.IsMigration)
{
optionsBuilder.UseMySql("Server=127.0.0.1;Database=IW4MAdmin_Migration;Uid=root;Pwd=password;")
.EnableDetailedErrors(true)
.EnableSensitiveDataLogging(true);
}
}
}
}

View File

@ -0,0 +1,33 @@
using System;
using Microsoft.EntityFrameworkCore;
namespace SharedLibraryCore.Database.MigrationContext
{
public class PostgresqlDatabaseContext : DatabaseContext
{
public PostgresqlDatabaseContext()
{
if (!Utilities.IsMigration)
{
throw new InvalidOperationException();
}
}
public PostgresqlDatabaseContext(DbContextOptions<PostgresqlDatabaseContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (Utilities.IsMigration)
{
optionsBuilder.UseNpgsql(
"Host=127.0.0.1;Database=IW4MAdmin_Migration;Username=postgres;Password=password;")
.EnableDetailedErrors(true)
.EnableSensitiveDataLogging(true);
}
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using Microsoft.EntityFrameworkCore;
namespace SharedLibraryCore.Database.MigrationContext
{
public class SqliteDatabaseContext : DatabaseContext
{
public SqliteDatabaseContext()
{
if (!Utilities.IsMigration)
{
throw new InvalidOperationException();
}
}
public SqliteDatabaseContext(DbContextOptions<SqliteDatabaseContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (Utilities.IsMigration)
{
optionsBuilder.UseSqlite("Data Source=IW4MAdmin_Migration.db")
.EnableDetailedErrors(true)
.EnableSensitiveDataLogging(true);
}
}
}
}

View File

@ -24,7 +24,6 @@ namespace SharedLibraryCore.Interfaces
IList<EFClient> GetActiveClients(); IList<EFClient> GetActiveClients();
IConfigurationHandler<ApplicationConfiguration> GetApplicationSettings(); IConfigurationHandler<ApplicationConfiguration> GetApplicationSettings();
ClientService GetClientService(); ClientService GetClientService();
AliasService GetAliasService();
PenaltyService GetPenaltyService(); PenaltyService GetPenaltyService();
/// <summary> /// <summary>
/// enumerates the registered plugin instances /// enumerates the registered plugin instances

View File

@ -6,11 +6,12 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database;
using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180409183408_InitialCreate")] [Migration("20180409183408_InitialCreate")]
partial class InitialCreate partial class InitialCreate
{ {

View File

@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class InitialCreate : Migration public partial class InitialCreate : Migration
{ {

View File

@ -6,11 +6,12 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database;
using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180502195450_Update")] [Migration("20180502195450_Update")]
partial class Update partial class Update
{ {

View File

@ -2,7 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class Update : Migration public partial class Update : Migration
{ {

View File

@ -6,11 +6,12 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database;
using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180516023249_AddEloField")] [Migration("20180516023249_AddEloField")]
partial class AddEloField partial class AddEloField
{ {

View File

@ -2,7 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEloField : Migration public partial class AddEloField : Migration
{ {

View File

@ -6,11 +6,12 @@ using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database;
using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180517223349_AddRollingKDR")] [Migration("20180517223349_AddRollingKDR")]
partial class AddRollingKDR partial class AddRollingKDR
{ {

View File

@ -2,7 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddRollingKDR : Migration public partial class AddRollingKDR : Migration
{ {

View File

@ -5,12 +5,12 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180531212903_AddAutomatedOffenseAndRatingHistory")] [Migration("20180531212903_AddAutomatedOffenseAndRatingHistory")]
partial class AddAutomatedOffenseAndRatingHistory partial class AddAutomatedOffenseAndRatingHistory
{ {

View File

@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddAutomatedOffenseAndRatingHistory : Migration public partial class AddAutomatedOffenseAndRatingHistory : Migration
{ {

View File

@ -5,12 +5,12 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180601172317_AddActivityAmount")] [Migration("20180601172317_AddActivityAmount")]
partial class AddActivityAmount partial class AddActivityAmount
{ {

View File

@ -2,7 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddActivityAmount : Migration public partial class AddActivityAmount : Migration
{ {

View File

@ -5,12 +5,12 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180602041758_AddClientMeta")] [Migration("20180602041758_AddClientMeta")]
partial class AddClientMeta partial class AddClientMeta
{ {

View File

@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddClientMeta : Migration public partial class AddClientMeta : Migration
{ {

View File

@ -5,12 +5,12 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180605191706_AddEFACSnapshots")] [Migration("20180605191706_AddEFACSnapshots")]
partial class AddEFACSnapshots partial class AddEFACSnapshots
{ {

View File

@ -4,7 +4,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEFACSnapshots : Migration public partial class AddEFACSnapshots : Migration
{ {

View File

@ -5,12 +5,12 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage; using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.Storage.Internal; using Microsoft.EntityFrameworkCore.Storage.Internal;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
using System; using System;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180614014303_IndexForEFAlias")] [Migration("20180614014303_IndexForEFAlias")]
partial class IndexForEFAlias partial class IndexForEFAlias
{ {

View File

@ -2,7 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class IndexForEFAlias : Migration public partial class IndexForEFAlias : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180902035612_AddFractionAndIsKill")] [Migration("20180902035612_AddFractionAndIsKill")]
partial class AddFractionAndIsKill partial class AddFractionAndIsKill
{ {

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddFractionAndIsKill : Migration public partial class AddFractionAndIsKill : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180904154622_AddVisibilityPercentage")] [Migration("20180904154622_AddVisibilityPercentage")]
partial class AddVisibilityPercentage partial class AddVisibilityPercentage
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddVisibilityPercentage : Migration public partial class AddVisibilityPercentage : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180907020706_AddVision")] [Migration("20180907020706_AddVision")]
partial class AddVision partial class AddVision
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddVision : Migration public partial class AddVision : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180908004053_AddWhenToRating")] [Migration("20180908004053_AddWhenToRating")]
partial class AddWhenToRating partial class AddWhenToRating
{ {

View File

@ -1,7 +1,7 @@
using System; using System;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddWhenToRating : Migration public partial class AddWhenToRating : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180910221749_AddRatingIndexes")] [Migration("20180910221749_AddRatingIndexes")]
partial class AddRatingIndexes partial class AddRatingIndexes
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddRatingIndexes : Migration public partial class AddRatingIndexes : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180911184224_AddEFAliasNameIndex")] [Migration("20180911184224_AddEFAliasNameIndex")]
partial class AddEFAliasNameIndex partial class AddEFAliasNameIndex
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEFAliasNameIndex : Migration public partial class AddEFAliasNameIndex : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180911190823_AddEFAliasNameMaxLength24")] [Migration("20180911190823_AddEFAliasNameMaxLength24")]
partial class AddEFAliasNameMaxLength24 partial class AddEFAliasNameMaxLength24
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEFAliasNameMaxLength24 : Migration public partial class AddEFAliasNameMaxLength24 : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180912015012_AddPreviousCurrentValueToEFChangeHistory")] [Migration("20180912015012_AddPreviousCurrentValueToEFChangeHistory")]
partial class AddPreviousCurrentValueToEFChangeHistory partial class AddPreviousCurrentValueToEFChangeHistory
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddPreviousCurrentValueToEFChangeHistory : Migration public partial class AddPreviousCurrentValueToEFChangeHistory : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180915163111_AddIndexToMessageTimeSent")] [Migration("20180915163111_AddIndexToMessageTimeSent")]
partial class AddIndexToMessageTimeSent partial class AddIndexToMessageTimeSent
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddIndexToMessageTimeSent : Migration public partial class AddIndexToMessageTimeSent : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180922231310_RemoveACSnapShot")] [Migration("20180922231310_RemoveACSnapShot")]
partial class RemoveACSnapShot partial class RemoveACSnapShot
{ {

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class RemoveACSnapShot : Migration public partial class RemoveACSnapShot : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20180922231600_ReaddACSnapshot")] [Migration("20180922231600_ReaddACSnapshot")]
partial class ReaddACSnapshot partial class ReaddACSnapshot
{ {

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class ReaddACSnapshot : Migration public partial class ReaddACSnapshot : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20181014171848_MakePenaltyExpirationNullable")] [Migration("20181014171848_MakePenaltyExpirationNullable")]
partial class MakePenaltyExpirationNullable partial class MakePenaltyExpirationNullable
{ {

View File

@ -1,7 +1,7 @@
using System; using System;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class MakePenaltyExpirationNullable : Migration public partial class MakePenaltyExpirationNullable : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20181125193243_MakeClientIPNullable")] [Migration("20181125193243_MakeClientIPNullable")]
partial class MakeClientIPNullable partial class MakeClientIPNullable
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class MakeClientIPNullable : Migration public partial class MakeClientIPNullable : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20181127144417_AddEndpointToEFServerUpdateServerIdType")] [Migration("20181127144417_AddEndpointToEFServerUpdateServerIdType")]
partial class AddEndpointToEFServerUpdateServerIdType partial class AddEndpointToEFServerUpdateServerIdType
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEndpointToEFServerUpdateServerIdType : Migration public partial class AddEndpointToEFServerUpdateServerIdType : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20181216214513_AddEvadePenaltyFlag")] [Migration("20181216214513_AddEvadePenaltyFlag")]
partial class AddEvadePenaltyFlag partial class AddEvadePenaltyFlag
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddEvadePenaltyFlag : Migration public partial class AddEvadePenaltyFlag : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190222234742_AddIndexToEFMeta-KeyAndClientId")] [Migration("20190222234742_AddIndexToEFMeta-KeyAndClientId")]
partial class AddIndexToEFMetaKeyAndClientId partial class AddIndexToEFMetaKeyAndClientId
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddIndexToEFMetaKeyAndClientId : Migration public partial class AddIndexToEFMetaKeyAndClientId : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190423142128_AddGameNameToEFServer")] [Migration("20190423142128_AddGameNameToEFServer")]
partial class AddGameNameToEFServer partial class AddGameNameToEFServer
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddGameNameToEFServer : Migration public partial class AddGameNameToEFServer : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190615145212_AddAvgRecoilOffset")] [Migration("20190615145212_AddAvgRecoilOffset")]
partial class AddAvgRecoilOffset partial class AddAvgRecoilOffset
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddAvgRecoilOffset : Migration public partial class AddAvgRecoilOffset : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190615214055_AddRecoilOffsetToSnapshot")] [Migration("20190615214055_AddRecoilOffsetToSnapshot")]
partial class AddRecoilOffsetToSnapshot partial class AddRecoilOffsetToSnapshot
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddRecoilOffsetToSnapshot : Migration public partial class AddRecoilOffsetToSnapshot : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190725000309_AlterEFRatingIndex")] [Migration("20190725000309_AlterEFRatingIndex")]
partial class AlterEFRatingIndex partial class AlterEFRatingIndex
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AlterEFRatingIndex : Migration public partial class AlterEFRatingIndex : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190802174908_AddSearchNameToEFAlias")] [Migration("20190802174908_AddSearchNameToEFAlias")]
partial class AddSearchNameToEFAlias partial class AddSearchNameToEFAlias
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddSearchNameToEFAlias : Migration public partial class AddSearchNameToEFAlias : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190831210503_AvgSnapValueToClientStatistics")] [Migration("20190831210503_AvgSnapValueToClientStatistics")]
partial class AvgSnapValueToClientStatistics partial class AvgSnapValueToClientStatistics
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AvgSnapValueToClientStatistics : Migration public partial class AvgSnapValueToClientStatistics : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190901180209_AddSnapHitCountToClientStatistics")] [Migration("20190901180209_AddSnapHitCountToClientStatistics")]
partial class AddSnapHitCountToClientStatistics partial class AddSnapHitCountToClientStatistics
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddSnapHitCountToClientStatistics : Migration public partial class AddSnapHitCountToClientStatistics : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190901223620_UseJunctionTableForSnapshotVector3")] [Migration("20190901223620_UseJunctionTableForSnapshotVector3")]
partial class UseJunctionTableForSnapshotVector3 partial class UseJunctionTableForSnapshotVector3
{ {

View File

@ -2,7 +2,7 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class UseJunctionTableForSnapshotVector3 : Migration public partial class UseJunctionTableForSnapshotVector3 : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190914011524_AddCurrentSnapValueToSnapshot")] [Migration("20190914011524_AddCurrentSnapValueToSnapshot")]
partial class AddCurrentSnapValueToSnapshot partial class AddCurrentSnapValueToSnapshot
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddCurrentSnapValueToSnapshot : Migration public partial class AddCurrentSnapValueToSnapshot : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20190914012015_AddSessionSnapHitsToSnapshot")] [Migration("20190914012015_AddSessionSnapHitsToSnapshot")]
partial class AddSessionSnapHitsToSnapshot partial class AddSessionSnapHitsToSnapshot
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class AddSessionSnapHitsToSnapshot : Migration public partial class AddSessionSnapHitsToSnapshot : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20191004172550_RenameClientHitLocationCountColumns")] [Migration("20191004172550_RenameClientHitLocationCountColumns")]
partial class RenameClientHitLocationCountColumns partial class RenameClientHitLocationCountColumns
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class RenameClientHitLocationCountColumns : Migration public partial class RenameClientHitLocationCountColumns : Migration
{ {

View File

@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SharedLibraryCore.Database; using SharedLibraryCore.Database.MigrationContext;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(MySqlDatabaseContext))]
[Migration("20191030000713_EnforceUniqueIndexForEFAliasIPName")] [Migration("20191030000713_EnforceUniqueIndexForEFAliasIPName")]
partial class EnforceUniqueIndexForEFAliasIPName partial class EnforceUniqueIndexForEFAliasIPName
{ {

View File

@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
namespace SharedLibraryCore.Migrations namespace SharedLibraryCore.Migrations.MySql
{ {
public partial class EnforceUniqueIndexForEFAliasIPName : Migration public partial class EnforceUniqueIndexForEFAliasIPName : Migration
{ {

Some files were not shown because too many files have changed in this diff Show More