diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/DBVersion.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/DBVersion.cs new file mode 100644 index 0000000..b796f80 --- /dev/null +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/DBVersion.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SQLiteRepository +{ + class DbVersion + { + public string VersionNumber { get; set; } + } +} diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/Properties/AssemblyInfo.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/Properties/AssemblyInfo.cs index f820360..1132bf6 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/Properties/AssemblyInfo.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/Properties/AssemblyInfo.cs @@ -1,6 +1,6 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using SQLiteRepository.Properties; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information @@ -32,5 +32,14 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.5.0")] -[assembly: AssemblyFileVersion("0.1.5.0")] +[assembly: AssemblyVersion(AssemblyInfo.ASSEMBLY_VERSION)] +[assembly: AssemblyFileVersion(AssemblyInfo.ASSEMBLY_FILE_VERSION)] + +namespace SQLiteRepository.Properties +{ + internal static class AssemblyInfo + { + internal const string ASSEMBLY_VERSION = "0.2.0.0"; + internal const string ASSEMBLY_FILE_VERSION = "0.2.0.0"; + } +} diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs index 1d29754..01e3a60 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs @@ -8,6 +8,7 @@ using System.Reflection; using Interfaces; using SQLite.Net; using SQLite.Net.Platform.Win32; +using SQLiteRepository.Properties; namespace SQLiteRepository { @@ -32,7 +33,68 @@ namespace SQLiteRepository _connection.CreateTable(); _connection.CreateTable(); _connection.CreateTable(); + _connection.CreateTable(); _logger.Trace("Initialised SQLite Repository"); + _logger.Trace("Checking For Upgrades"); + CheckForDbUpgrade(); + } + + private void CheckForDbUpgrade() + { + var data = _connection.Query("select * from DbVersion"); + if (!data.Any()) + { + //Pre-Upgrade database, need upgrading + _logger.Trace("Pre version 0.2 RC database found, performing update.."); + ExecuteUpgradeFromVersion("0.1"); //execute 0.2 upgrade scripts onwards. + } + else + { + var installedVersion = new Version(data.First().VersionNumber); + var currentVersion = new Version(AssemblyInfo.ASSEMBLY_VERSION); + if (currentVersion.CompareTo(installedVersion) > 0) //greater than 0 - current version is newer + { + _logger.Trace("Installed Database Version: {0} is older than current version {1}"); + ExecuteUpgradeFromVersion(installedVersion.ToString()); + } + } + } + + private void ExecuteUpgradeFromVersion(string installedVersion) + { + const string PREFIX = "SQLiteRepository.UpgradeScripts."; + var instVers = new Version(installedVersion); + //so we have established that each script for upgrade will be .sql, so now start at lowest version and work up! + var assembly = Assembly.GetExecutingAssembly(); + var upgradeScripts = assembly.GetManifestResourceNames() + .Where(x=>x.StartsWith(PREFIX)) + .OrderBy(x=>new Version(Path.GetFileNameWithoutExtension(x.Replace(PREFIX, "")))) + .Where(x => + { + var scriptVersion = new Version(Path.GetFileNameWithoutExtension(x.Replace(PREFIX, ""))).CompareTo(instVers); + return scriptVersion > 0; + } + ) + .ToList(); + //now have an ordered list of upgrade script files, so execute in order! + foreach (var upgradeScript in upgradeScripts) + { + using (var stream = assembly.GetManifestResourceStream(upgradeScript)) + using(var str = new StreamReader(stream)) + { + var script = str.ReadToEnd(); + _logger.Trace("Executing upgrade script with name: {0}", upgradeScript); + _connection.Execute(script); + } + } + SetDbVersion(AssemblyInfo.ASSEMBLY_VERSION); + } + + private void SetDbVersion(string vers) + { + _connection.DeleteAll(); + _connection.Insert(new DbVersion {VersionNumber = vers}); + _logger.Trace("Set Database version to: {0}", vers); } public UserList GetUsers(int pageNumber = -1, int pageSize = -1, int groupId = -1) diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj index 4ca4ebd..eece48e 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.csproj @@ -77,7 +77,9 @@ + + @@ -102,6 +104,12 @@ + + + + + + diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/UpgradeScripts/0.2.sql b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/UpgradeScripts/0.2.sql new file mode 100644 index 0000000..5eeccd7 --- /dev/null +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/UpgradeScripts/0.2.sql @@ -0,0 +1 @@ +insert into GroupDb values ((select max(groupId) from GroupDb)+1,'Archived',0) \ No newline at end of file