Added some code to shrink the DB. reworked the search to speed it up.

This commit is contained in:
tidusjar 2016-08-08 15:41:01 +01:00
parent 97b1901a64
commit 6f008f77a3
6 changed files with 156 additions and 156 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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; }
}
}
}

View file

@ -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;

View file

@ -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)

View file

@ -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">