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
This commit is contained in:
Chris.Watts90@outlook.com 2018-03-06 17:07:05 +00:00
parent 9a2ff37004
commit c56144d9b3
5 changed files with 94 additions and 3 deletions

View File

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

View File

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

View File

@ -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<TimeLogDb>();
_connection.CreateTable<GroupDb>();
_connection.CreateTable<UserGroupJoinDb>();
_connection.CreateTable<DbVersion>();
_logger.Trace("Initialised SQLite Repository");
_logger.Trace("Checking For Upgrades");
CheckForDbUpgrade();
}
private void CheckForDbUpgrade()
{
var data = _connection.Query<DbVersion>("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 <version>.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<DbVersion>();
_connection.Insert(new DbVersion {VersionNumber = vers});
}
public UserList GetUsers(int pageNumber = -1, int pageSize = -1, int groupId = -1)

View File

@ -77,7 +77,9 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyVersionInfo.cs" />
<Compile Include="CardUniqueId.cs" />
<Compile Include="DBVersion.cs" />
<Compile Include="GroupDb.cs" />
<Compile Include="LogSourceDb.cs" />
<Compile Include="SQLiteRepository.cs" />
@ -102,6 +104,12 @@
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="UpgradeScripts\0.2.sql" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="UpgradeScripts\0.3.sql" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.104.0\build\net451\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.104.0\build\net451\System.Data.SQLite.Core.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

View File

@ -0,0 +1 @@
insert into GroupDb values ((select max(groupId) from GroupDb)+1,'Archived',0)