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

pull/470/head
tidusjar 8 years ago
parent 97b1901a64
commit 6f008f77a3

@ -48,11 +48,16 @@ namespace PlexRequests.Core
Db = new DbConfiguration(new SqliteFactory());
var created = Db.CheckDb();
TableCreation.CreateTables(Db.DbConnection());
if (created)
{
CreateDefaultSettingsPage(urlBase);
}
else
{
// Shrink DB
TableCreation.Vacuum(Db.DbConnection());
}
var version = CheckSchema();
if (version > 0)

@ -61,12 +61,9 @@ namespace PlexRequests.Services.Jobs
public void Queued()
{
Log.Trace("Getting the settings");
var settings = SonarrSettings.GetSettings();
if (settings.Enabled)
{
Log.Trace("Getting all tv series from Sonarr");
try
{
var series = SonarrApi.GetSeries(settings.ApiKey, settings.FullUri);

@ -1,130 +1,141 @@
#region Copyright
// ***********************************************************************
// Copyright (c) 2016 Jamie Rees
// File: TableCreation.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ***********************************************************************
#endregion
using System.Data;
using System.Linq;
using Dapper;
using Dapper.Contrib.Extensions;
namespace PlexRequests.Store
{
public static class TableCreation
{
/// <summary>
/// Creates the tables located in the SqlTables.sql file.
/// </summary>
/// <param name="connection">The connection.</param>
public static void CreateTables(IDbConnection connection)
{
connection.Open();
connection.Execute(Sql.SqlTables);
connection.Close();
}
public static void DropTable(IDbConnection con, string tableName)
{
using (con)
{
con.Open();
var query = $"DROP TABLE IF EXISTS {tableName}";
con.Execute(query);
con.Close();
}
}
public static void AddColumn(IDbConnection connection, string tableName, string alterType, string newColumn, bool isNullable, string dataType)
{
connection.Open();
var result = connection.Query<TableInfo>($"PRAGMA table_info({tableName});");
if (result.Any(x => x.name == newColumn))
{
return;
}
var query = $"ALTER TABLE {tableName} {alterType} {newColumn} {dataType}";
if (isNullable)
{
query = query + " NOT NULL";
}
connection.Execute(query);
connection.Close();
}
public static DbInfo GetSchemaVersion(this IDbConnection con)
{
con.Open();
var result = con.Query<DbInfo>("SELECT * FROM DBInfo");
con.Close();
return result.FirstOrDefault();
}
public static void UpdateSchemaVersion(this IDbConnection con, int version)
{
con.Open();
con.Query($"UPDATE DBInfo SET SchemaVersion = {version}");
con.Close();
}
public static void CreateSchema(this IDbConnection con, int version)
{
con.Open();
con.Query($"INSERT INTO DBInfo (SchemaVersion) values ({version})");
con.Close();
}
[Table("DBInfo")]
public class DbInfo
{
public int SchemaVersion { get; set; }
}
[Table("sqlite_master")]
public class SqliteMasterTable
{
public string type { get; set; }
public string name { get; set; }
public string tbl_name { get; set; }
[Key]
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; }
}
}
}
#region Copyright
// ***********************************************************************
// Copyright (c) 2016 Jamie Rees
// File: TableCreation.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ***********************************************************************
#endregion
using System.Data;
using System.Linq;
using Dapper;
using Dapper.Contrib.Extensions;
namespace PlexRequests.Store
{
public static class TableCreation
{
/// <summary>
/// Creates the tables located in the SqlTables.sql file.
/// </summary>
/// <param name="connection">The connection.</param>
public static void CreateTables(IDbConnection connection)
{
connection.Open();
connection.Execute(Sql.SqlTables);
connection.Close();
}
public static void DropTable(IDbConnection con, string tableName)
{
using (con)
{
con.Open();
var query = $"DROP TABLE IF EXISTS {tableName}";
con.Execute(query);
con.Close();
}
}
public static void AddColumn(IDbConnection connection, string tableName, string alterType, string newColumn, bool isNullable, string dataType)
{
connection.Open();
var result = connection.Query<TableInfo>($"PRAGMA table_info({tableName});");
if (result.Any(x => x.name == newColumn))
{
return;
}
var query = $"ALTER TABLE {tableName} {alterType} {newColumn} {dataType}";
if (isNullable)
{
query = query + " NOT NULL";
}
connection.Execute(query);
connection.Close();
}
public static void Vacuum(IDbConnection con)
{
using (con)
{
con.Open();
con.Query("VACUUM;");
}
}
public static DbInfo GetSchemaVersion(this IDbConnection con)
{
con.Open();
var result = con.Query<DbInfo>("SELECT * FROM DBInfo");
con.Close();
return result.FirstOrDefault();
}
public static void UpdateSchemaVersion(this IDbConnection con, int version)
{
con.Open();
con.Query($"UPDATE DBInfo SET SchemaVersion = {version}");
con.Close();
}
public static void CreateSchema(this IDbConnection con, int version)
{
con.Open();
con.Query($"INSERT INTO DBInfo (SchemaVersion) values ({version})");
con.Close();
}
[Table("DBInfo")]
public class DbInfo
{
public int SchemaVersion { get; set; }
}
[Table("sqlite_master")]
public class SqliteMasterTable
{
public string type { get; set; }
public string name { get; set; }
public string tbl_name { get; set; }
[Key]
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>();
foreach (var t in apiTv)
{
var tvInfoTask = Task.Run(() => TvApi.EpisodeLookup(t.show.id));
var banner = t.show.image?.medium;
if (!string.IsNullOrEmpty(banner))
{
@ -351,7 +349,6 @@ namespace PlexRequests.UI.Modules
else if (t.show?.externals?.thetvdb != null)
{
var tvdbid = (int)t.show.externals.thetvdb;
if (dbTv.ContainsKey(tvdbid))
{
var dbt = dbTv[tvdbid];
@ -361,20 +358,12 @@ namespace PlexRequests.UI.Modules
viewT.Approved = dbt.Approved;
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;
}
}
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);
}
@ -978,11 +967,11 @@ namespace PlexRequests.UI.Modules
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 seasons = await Task.Run(() => TvApi.EpisodeLookup(show.id));
var tvMaxeEpisodes = await Task.Run(() => TvApi.EpisodeLookup(show.id));
var sonarrEpisodes = new List<SonarrEpisodes>();
if (sonarrEnabled)
@ -994,9 +983,9 @@ namespace PlexRequests.UI.Modules
var plexCacheTask = await Checker.GetEpisodes(seriesId);
var plexCache = plexCacheTask.ToList();
foreach (var ep in seasons)
foreach (var ep in tvMaxeEpisodes)
{
var requested = dbDbShow?.Episodes
var requested = existingRequest?.Episodes
.Any(episodesModel =>
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 logSettings = settingsService.GetSettings();
if (logSettings != null)
{
LoggingHelper.ReconfigureLogLevel(LogLevel.FromOrdinal(logSettings.Level));
}
LoggingHelper.ReconfigureLogLevel(logSettings != null ? LogLevel.FromOrdinal(logSettings.Level) : LogLevel.FromOrdinal(4));
}
private static void PrintToConsole(string message, ConsoleColor colour = ConsoleColor.Gray)

@ -185,6 +185,7 @@
{{/if_eq}}
{{#if_eq type "tv"}}
{{#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>
{{else}}
<div class="dropdown">

Loading…
Cancel
Save