From c56144d9b33a2faa414bd43fc5e67ece040412ca Mon Sep 17 00:00:00 2001 From: "Chris.Watts90@outlook.com" Date: Tue, 6 Mar 2018 17:07:05 +0000 Subject: [PATCH] create db version object for table to hold our db version. update assemblyinfo so that it uses static const properties. Create 0.2 upgrade script. Add code to repository class that will check version of the database currently being referenced. IT will then proceed to run upgrade scripts (in order) from the oldest to newest version on the database, before finally setting the db version number. #85 --- .../SQLiteRepository/DBVersion.cs | 13 ++++ .../Properties/AssemblyInfo.cs | 15 ++++- .../SQLiteRepository/SQLiteRepository.cs | 60 +++++++++++++++++++ .../SQLiteRepository/SQLiteRepository.csproj | 8 +++ .../SQLiteRepository/UpgradeScripts/0.2.sql | 1 + 5 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 DataCenter_Windows/WindowsDataCenter/SQLiteRepository/DBVersion.cs create mode 100644 DataCenter_Windows/WindowsDataCenter/SQLiteRepository/UpgradeScripts/0.2.sql 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..67dd9d3 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,66 @@ 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 (Stream stream = assembly.GetManifestResourceStream(upgradeScript)) + using(StreamReader str = new StreamReader(stream)) + { + string script = str.ReadToEnd(); + _connection.Execute(script); + } + } + SetDbVersion(AssemblyInfo.ASSEMBLY_VERSION); + } + + private void SetDbVersion(string vers) + { + _connection.DeleteAll(); + _connection.Insert(new DbVersion {VersionNumber = 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