mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-16 02:02:55 -07:00
Added some code to shrink the DB. reworked the search to speed it up.
This commit is contained in:
parent
97b1901a64
commit
6f008f77a3
6 changed files with 156 additions and 156 deletions
|
@ -48,11 +48,16 @@ namespace PlexRequests.Core
|
||||||
Db = new DbConfiguration(new SqliteFactory());
|
Db = new DbConfiguration(new SqliteFactory());
|
||||||
var created = Db.CheckDb();
|
var created = Db.CheckDb();
|
||||||
TableCreation.CreateTables(Db.DbConnection());
|
TableCreation.CreateTables(Db.DbConnection());
|
||||||
|
|
||||||
if (created)
|
if (created)
|
||||||
{
|
{
|
||||||
CreateDefaultSettingsPage(urlBase);
|
CreateDefaultSettingsPage(urlBase);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Shrink DB
|
||||||
|
TableCreation.Vacuum(Db.DbConnection());
|
||||||
|
}
|
||||||
|
|
||||||
var version = CheckSchema();
|
var version = CheckSchema();
|
||||||
if (version > 0)
|
if (version > 0)
|
||||||
|
|
|
@ -61,12 +61,9 @@ namespace PlexRequests.Services.Jobs
|
||||||
|
|
||||||
public void Queued()
|
public void Queued()
|
||||||
{
|
{
|
||||||
Log.Trace("Getting the settings");
|
|
||||||
|
|
||||||
var settings = SonarrSettings.GetSettings();
|
var settings = SonarrSettings.GetSettings();
|
||||||
if (settings.Enabled)
|
if (settings.Enabled)
|
||||||
{
|
{
|
||||||
Log.Trace("Getting all tv series from Sonarr");
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var series = SonarrApi.GetSeries(settings.ApiKey, settings.FullUri);
|
var series = SonarrApi.GetSeries(settings.ApiKey, settings.FullUri);
|
||||||
|
|
|
@ -1,130 +1,141 @@
|
||||||
#region Copyright
|
#region Copyright
|
||||||
// ***********************************************************************
|
// ***********************************************************************
|
||||||
// Copyright (c) 2016 Jamie Rees
|
// Copyright (c) 2016 Jamie Rees
|
||||||
// File: TableCreation.cs
|
// File: TableCreation.cs
|
||||||
// Created By: Jamie Rees
|
// Created By: Jamie Rees
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining
|
// Permission is hereby granted, free of charge, to any person obtaining
|
||||||
// a copy of this software and associated documentation files (the
|
// a copy of this software and associated documentation files (the
|
||||||
// "Software"), to deal in the Software without restriction, including
|
// "Software"), to deal in the Software without restriction, including
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
// without limitation the rights to use, copy, modify, merge, publish,
|
||||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
// permit persons to whom the Software is furnished to do so, subject to
|
// permit persons to whom the Software is furnished to do so, subject to
|
||||||
// the following conditions:
|
// the following conditions:
|
||||||
//
|
//
|
||||||
// The above copyright notice and this permission notice shall be
|
// The above copyright notice and this permission notice shall be
|
||||||
// included in all copies or substantial portions of the Software.
|
// included in all copies or substantial portions of the Software.
|
||||||
//
|
//
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
// ***********************************************************************
|
// ***********************************************************************
|
||||||
#endregion
|
#endregion
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Dapper;
|
using Dapper;
|
||||||
using Dapper.Contrib.Extensions;
|
using Dapper.Contrib.Extensions;
|
||||||
|
|
||||||
namespace PlexRequests.Store
|
namespace PlexRequests.Store
|
||||||
{
|
{
|
||||||
public static class TableCreation
|
public static class TableCreation
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the tables located in the SqlTables.sql file.
|
/// Creates the tables located in the SqlTables.sql file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="connection">The connection.</param>
|
/// <param name="connection">The connection.</param>
|
||||||
public static void CreateTables(IDbConnection connection)
|
public static void CreateTables(IDbConnection connection)
|
||||||
{
|
{
|
||||||
connection.Open();
|
connection.Open();
|
||||||
connection.Execute(Sql.SqlTables);
|
connection.Execute(Sql.SqlTables);
|
||||||
connection.Close();
|
connection.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DropTable(IDbConnection con, string tableName)
|
public static void DropTable(IDbConnection con, string tableName)
|
||||||
{
|
{
|
||||||
using (con)
|
using (con)
|
||||||
{
|
{
|
||||||
con.Open();
|
con.Open();
|
||||||
var query = $"DROP TABLE IF EXISTS {tableName}";
|
var query = $"DROP TABLE IF EXISTS {tableName}";
|
||||||
con.Execute(query);
|
con.Execute(query);
|
||||||
con.Close();
|
con.Close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AddColumn(IDbConnection connection, string tableName, string alterType, string newColumn, bool isNullable, string dataType)
|
public static void AddColumn(IDbConnection connection, string tableName, string alterType, string newColumn, bool isNullable, string dataType)
|
||||||
{
|
{
|
||||||
connection.Open();
|
connection.Open();
|
||||||
var result = connection.Query<TableInfo>($"PRAGMA table_info({tableName});");
|
var result = connection.Query<TableInfo>($"PRAGMA table_info({tableName});");
|
||||||
if (result.Any(x => x.name == newColumn))
|
if (result.Any(x => x.name == newColumn))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var query = $"ALTER TABLE {tableName} {alterType} {newColumn} {dataType}";
|
var query = $"ALTER TABLE {tableName} {alterType} {newColumn} {dataType}";
|
||||||
if (isNullable)
|
if (isNullable)
|
||||||
{
|
{
|
||||||
query = query + " NOT NULL";
|
query = query + " NOT NULL";
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.Execute(query);
|
connection.Execute(query);
|
||||||
|
|
||||||
connection.Close();
|
connection.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DbInfo GetSchemaVersion(this IDbConnection con)
|
public static void Vacuum(IDbConnection con)
|
||||||
{
|
{
|
||||||
con.Open();
|
using (con)
|
||||||
var result = con.Query<DbInfo>("SELECT * FROM DBInfo");
|
{
|
||||||
con.Close();
|
con.Open();
|
||||||
|
|
||||||
return result.FirstOrDefault();
|
con.Query("VACUUM;");
|
||||||
}
|
|
||||||
|
}
|
||||||
public static void UpdateSchemaVersion(this IDbConnection con, int version)
|
}
|
||||||
{
|
|
||||||
con.Open();
|
public static DbInfo GetSchemaVersion(this IDbConnection con)
|
||||||
con.Query($"UPDATE DBInfo SET SchemaVersion = {version}");
|
{
|
||||||
con.Close();
|
con.Open();
|
||||||
}
|
var result = con.Query<DbInfo>("SELECT * FROM DBInfo");
|
||||||
|
con.Close();
|
||||||
public static void CreateSchema(this IDbConnection con, int version)
|
|
||||||
{
|
return result.FirstOrDefault();
|
||||||
con.Open();
|
}
|
||||||
con.Query($"INSERT INTO DBInfo (SchemaVersion) values ({version})");
|
|
||||||
con.Close();
|
public static void UpdateSchemaVersion(this IDbConnection con, int version)
|
||||||
}
|
{
|
||||||
|
con.Open();
|
||||||
|
con.Query($"UPDATE DBInfo SET SchemaVersion = {version}");
|
||||||
|
con.Close();
|
||||||
[Table("DBInfo")]
|
}
|
||||||
public class DbInfo
|
|
||||||
{
|
public static void CreateSchema(this IDbConnection con, int version)
|
||||||
public int SchemaVersion { get; set; }
|
{
|
||||||
}
|
con.Open();
|
||||||
|
con.Query($"INSERT INTO DBInfo (SchemaVersion) values ({version})");
|
||||||
[Table("sqlite_master")]
|
con.Close();
|
||||||
public class SqliteMasterTable
|
}
|
||||||
{
|
|
||||||
public string type { get; set; }
|
|
||||||
public string name { get; set; }
|
|
||||||
public string tbl_name { get; set; }
|
[Table("DBInfo")]
|
||||||
[Key]
|
public class DbInfo
|
||||||
public long rootpage { get; set; }
|
{
|
||||||
public string sql { get; set; }
|
public int SchemaVersion { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Table("table_info")]
|
[Table("sqlite_master")]
|
||||||
public class TableInfo
|
public class SqliteMasterTable
|
||||||
{
|
{
|
||||||
public int cid { get; set; }
|
public string type { get; set; }
|
||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
public int notnull { get; set; }
|
public string tbl_name { get; set; }
|
||||||
public string dflt_value { get; set; }
|
[Key]
|
||||||
public int pk { get; set; }
|
public long rootpage { get; set; }
|
||||||
}
|
public string sql { get; set; }
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
[Table("table_info")]
|
||||||
|
public class TableInfo
|
||||||
|
{
|
||||||
|
public int cid { get; set; }
|
||||||
|
public string name { get; set; }
|
||||||
|
public int notnull { get; set; }
|
||||||
|
public string dflt_value { get; set; }
|
||||||
|
public int pk { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -314,8 +314,6 @@ namespace PlexRequests.UI.Modules
|
||||||
var viewTv = new List<SearchTvShowViewModel>();
|
var viewTv = new List<SearchTvShowViewModel>();
|
||||||
foreach (var t in apiTv)
|
foreach (var t in apiTv)
|
||||||
{
|
{
|
||||||
var tvInfoTask = Task.Run(() => TvApi.EpisodeLookup(t.show.id));
|
|
||||||
|
|
||||||
var banner = t.show.image?.medium;
|
var banner = t.show.image?.medium;
|
||||||
if (!string.IsNullOrEmpty(banner))
|
if (!string.IsNullOrEmpty(banner))
|
||||||
{
|
{
|
||||||
|
@ -351,7 +349,6 @@ namespace PlexRequests.UI.Modules
|
||||||
else if (t.show?.externals?.thetvdb != null)
|
else if (t.show?.externals?.thetvdb != null)
|
||||||
{
|
{
|
||||||
var tvdbid = (int)t.show.externals.thetvdb;
|
var tvdbid = (int)t.show.externals.thetvdb;
|
||||||
|
|
||||||
if (dbTv.ContainsKey(tvdbid))
|
if (dbTv.ContainsKey(tvdbid))
|
||||||
{
|
{
|
||||||
var dbt = dbTv[tvdbid];
|
var dbt = dbTv[tvdbid];
|
||||||
|
@ -361,20 +358,12 @@ namespace PlexRequests.UI.Modules
|
||||||
viewT.Approved = dbt.Approved;
|
viewT.Approved = dbt.Approved;
|
||||||
viewT.Available = dbt.Available;
|
viewT.Available = dbt.Available;
|
||||||
}
|
}
|
||||||
else if (sonarrCached.Contains(tvdbid) || sickRageCache.Contains(tvdbid)) // compare to the sonarr/sickrage db
|
if (sonarrCached.Contains(tvdbid) || sickRageCache.Contains(tvdbid)) // compare to the sonarr/sickrage db
|
||||||
{
|
{
|
||||||
viewT.Requested = true;
|
viewT.Requested = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var tvInfo = await tvInfoTask;
|
|
||||||
|
|
||||||
// Check if we have every episode in all seasons
|
|
||||||
var epModel = tvInfo.Select(tvIn => new Store.EpisodesModel { SeasonNumber = tvIn.season, EpisodeNumber = tvIn.number }).ToList();
|
|
||||||
var diff = viewT.Episodes.Except(epModel);
|
|
||||||
if (diff.Any())
|
|
||||||
{
|
|
||||||
viewT.TvFullyAvailable = true;
|
|
||||||
}
|
|
||||||
viewTv.Add(viewT);
|
viewTv.Add(viewT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -978,11 +967,11 @@ namespace PlexRequests.UI.Modules
|
||||||
|
|
||||||
var model = new List<EpisodeListViewModel>();
|
var model = new List<EpisodeListViewModel>();
|
||||||
|
|
||||||
var enumerable = allResults as RequestedModel[] ?? allResults.ToArray();
|
var requests = allResults as RequestedModel[] ?? allResults.ToArray();
|
||||||
|
|
||||||
var dbDbShow = enumerable.FirstOrDefault(x => x.Type == RequestType.TvShow && x.TvDbId == seriesId.ToString());
|
var existingRequest = requests.FirstOrDefault(x => x.Type == RequestType.TvShow && x.TvDbId == seriesId.ToString());
|
||||||
var show = await Task.Run(() => TvApi.ShowLookupByTheTvDbId(seriesId));
|
var show = await Task.Run(() => TvApi.ShowLookupByTheTvDbId(seriesId));
|
||||||
var seasons = await Task.Run(() => TvApi.EpisodeLookup(show.id));
|
var tvMaxeEpisodes = await Task.Run(() => TvApi.EpisodeLookup(show.id));
|
||||||
|
|
||||||
var sonarrEpisodes = new List<SonarrEpisodes>();
|
var sonarrEpisodes = new List<SonarrEpisodes>();
|
||||||
if (sonarrEnabled)
|
if (sonarrEnabled)
|
||||||
|
@ -994,9 +983,9 @@ namespace PlexRequests.UI.Modules
|
||||||
|
|
||||||
var plexCacheTask = await Checker.GetEpisodes(seriesId);
|
var plexCacheTask = await Checker.GetEpisodes(seriesId);
|
||||||
var plexCache = plexCacheTask.ToList();
|
var plexCache = plexCacheTask.ToList();
|
||||||
foreach (var ep in seasons)
|
foreach (var ep in tvMaxeEpisodes)
|
||||||
{
|
{
|
||||||
var requested = dbDbShow?.Episodes
|
var requested = existingRequest?.Episodes
|
||||||
.Any(episodesModel =>
|
.Any(episodesModel =>
|
||||||
ep.number == episodesModel.EpisodeNumber && ep.season == episodesModel.SeasonNumber) ?? false;
|
ep.number == episodesModel.EpisodeNumber && ep.season == episodesModel.SeasonNumber) ?? false;
|
||||||
|
|
||||||
|
|
|
@ -149,10 +149,7 @@ namespace PlexRequests.UI
|
||||||
var settingsService = new SettingsServiceV2<LogSettings>(new SettingsJsonRepository(new DbConfiguration(new SqliteFactory()), new MemoryCacheProvider()));
|
var settingsService = new SettingsServiceV2<LogSettings>(new SettingsJsonRepository(new DbConfiguration(new SqliteFactory()), new MemoryCacheProvider()));
|
||||||
var logSettings = settingsService.GetSettings();
|
var logSettings = settingsService.GetSettings();
|
||||||
|
|
||||||
if (logSettings != null)
|
LoggingHelper.ReconfigureLogLevel(logSettings != null ? LogLevel.FromOrdinal(logSettings.Level) : LogLevel.FromOrdinal(4));
|
||||||
{
|
|
||||||
LoggingHelper.ReconfigureLogLevel(LogLevel.FromOrdinal(logSettings.Level));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void PrintToConsole(string message, ConsoleColor colour = ConsoleColor.Gray)
|
private static void PrintToConsole(string message, ConsoleColor colour = ConsoleColor.Gray)
|
||||||
|
|
|
@ -185,6 +185,7 @@
|
||||||
{{/if_eq}}
|
{{/if_eq}}
|
||||||
{{#if_eq type "tv"}}
|
{{#if_eq type "tv"}}
|
||||||
{{#if_eq tvFullyAvailable true}}
|
{{#if_eq tvFullyAvailable true}}
|
||||||
|
@*//TODO Not used yet*@
|
||||||
<button style="text-align: right" class="btn btn-success-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Available</button>
|
<button style="text-align: right" class="btn btn-success-outline disabled" disabled><i class="fa fa-check"></i> @UI.Search_Available</button>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue