mirror of
https://github.com/ppy/osu.git
synced 2024-11-11 17:47:29 +08:00
113 lines
4.2 KiB
C#
113 lines
4.2 KiB
C#
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
|
|
|
using System;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Logging;
|
|
using osu.Framework.Logging;
|
|
using osu.Game.Beatmaps;
|
|
using osu.Game.Input.Bindings;
|
|
using osu.Game.IO;
|
|
using osu.Game.Rulesets;
|
|
using LogLevel = Microsoft.Extensions.Logging.LogLevel;
|
|
|
|
namespace osu.Game.Database
|
|
{
|
|
public class OsuDbContext : DbContext
|
|
{
|
|
public DbSet<BeatmapInfo> BeatmapInfo { get; set; }
|
|
public DbSet<BeatmapSetInfo> BeatmapSetInfo { get; set; }
|
|
public DbSet<DatabasedKeyBinding> DatabasedKeyBinding { get; set; }
|
|
public DbSet<FileInfo> FileInfo { get; set; }
|
|
public DbSet<RulesetInfo> RulesetInfo { get; set; }
|
|
private readonly string connectionString;
|
|
|
|
static OsuDbContext()
|
|
{
|
|
// required to initialise native SQLite libraries on some platforms.
|
|
SQLitePCL.Batteries_V2.Init();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create a new OsuDbContext instance.
|
|
/// </summary>
|
|
/// <param name="connectionString">A valid SQLite connection string. If not provided, an in-memory instance will be created.</param>
|
|
public OsuDbContext(string connectionString = "DataSource=:memory:")
|
|
{
|
|
this.connectionString = connectionString;
|
|
|
|
Database.SetCommandTimeout(new TimeSpan(TimeSpan.TicksPerSecond * 10));
|
|
|
|
var connection = Database.GetDbConnection();
|
|
connection.Open();
|
|
using (var cmd = connection.CreateCommand())
|
|
{
|
|
cmd.CommandText = "PRAGMA journal_mode=WAL;";
|
|
cmd.ExecuteNonQuery();
|
|
}
|
|
}
|
|
|
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
|
{
|
|
base.OnConfiguring(optionsBuilder);
|
|
optionsBuilder.UseSqlite(connectionString);
|
|
optionsBuilder.UseLoggerFactory(new OsuDbLoggerFactory());
|
|
}
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
base.OnModelCreating(modelBuilder);
|
|
modelBuilder.Entity<BeatmapInfo>().HasIndex(b => b.MD5Hash);
|
|
modelBuilder.Entity<BeatmapSetInfo>().HasIndex(b => b.DeletePending);
|
|
modelBuilder.Entity<DatabasedKeyBinding>().HasIndex(b => b.Variant);
|
|
modelBuilder.Entity<DatabasedKeyBinding>().HasIndex(b => b.IntAction);
|
|
modelBuilder.Entity<FileInfo>().HasIndex(b => b.Hash).IsUnique();
|
|
modelBuilder.Entity<FileInfo>().HasIndex(b => b.ReferenceCount);
|
|
modelBuilder.Entity<RulesetInfo>().HasIndex(b => b.Name).IsUnique();
|
|
modelBuilder.Entity<RulesetInfo>().HasIndex(b => b.InstantiationInfo).IsUnique();
|
|
modelBuilder.Entity<RulesetInfo>().HasIndex(b => b.Available);
|
|
}
|
|
|
|
private class OsuDbLoggerFactory : ILoggerFactory
|
|
{
|
|
#region Disposal
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
|
|
public ILogger CreateLogger(string categoryName) => new OsuDbLogger();
|
|
|
|
public void AddProvider(ILoggerProvider provider)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
private class OsuDbLoggerProvider : ILoggerProvider
|
|
{
|
|
#region Disposal
|
|
|
|
public void Dispose()
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
|
|
public ILogger CreateLogger(string categoryName) => new OsuDbLogger();
|
|
}
|
|
|
|
private class OsuDbLogger : ILogger
|
|
{
|
|
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
|
|
=> Logger.Log(formatter(state, exception), LoggingTarget.Database, Framework.Logging.LogLevel.Debug);
|
|
|
|
public bool IsEnabled(LogLevel logLevel) => true;
|
|
|
|
public IDisposable BeginScope<TState>(TState state) => null;
|
|
}
|
|
}
|
|
}
|
|
}
|