diff --git a/Vocaluxe/Lib/Database/CCoverDB.cs b/Vocaluxe/Lib/Database/CCoverDB.cs
index 24178d8d..efd33c13 100644
--- a/Vocaluxe/Lib/Database/CCoverDB.cs
+++ b/Vocaluxe/Lib/Database/CCoverDB.cs
@@ -35,28 +35,29 @@ namespace Vocaluxe.Lib.Database
{
public class CCoverDB : CDatabaseBase
{
- //You have to lock all actions using cover connection or transaction, otherwhise order is not guaranted
- private readonly object _CoverMutex = new object();
private SQLiteTransaction _TransactionCover;
public CCoverDB(string filePath) : base(filePath) {}
public override bool Init()
{
- if (!base.Init())
- return false;
+ lock (_Mutex)
+ {
+ if (!base.Init())
+ return false;
- if (_Version < 0)
- return _CreateCoverDB();
- if (_Version < CSettings.DatabaseCoverVersion)
- throw new NotImplementedException("Upgrading of cover DB not implemented");
+ if (_Version < 0)
+ return _CreateCoverDB();
+ if (_Version < CSettings.DatabaseCoverVersion)
+ throw new NotImplementedException("Upgrading of cover DB not implemented");
+ }
return true;
}
public override void Close()
{
//Do commit and close atomicly otherwhise we may loose changes
- lock (_CoverMutex)
+ lock (_Mutex)
{
_CommitCovers();
@@ -74,7 +75,7 @@ namespace Vocaluxe.Lib.Database
return false;
}
- lock (_CoverMutex)
+ lock (_Mutex)
{
//Double check here because we may have just closed our connection
if (_Connection == null)
@@ -147,7 +148,7 @@ namespace Vocaluxe.Lib.Database
tex = CDraw.EnqueueTexture(size.Width, size.Height, data);
- lock (_CoverMutex)
+ lock (_Mutex)
{
//Double check here because we may have just closed our connection
if (_Connection == null)
@@ -184,7 +185,7 @@ namespace Vocaluxe.Lib.Database
public void CommitCovers()
{
- lock (_CoverMutex)
+ lock (_Mutex)
{
_CommitCovers();
}
diff --git a/Vocaluxe/Lib/Database/CDatabaseBase.cs b/Vocaluxe/Lib/Database/CDatabaseBase.cs
index 068530e5..bbe0f026 100644
--- a/Vocaluxe/Lib/Database/CDatabaseBase.cs
+++ b/Vocaluxe/Lib/Database/CDatabaseBase.cs
@@ -17,7 +17,6 @@
using System;
using System.IO;
-using Vocaluxe.Base;
#if WIN
using System.Data.SQLite;
@@ -27,61 +26,72 @@ using Mono.Data.Sqlite;
namespace Vocaluxe.Lib.Database
{
- public class CDatabaseBase
+ public abstract class CDatabaseBase
{
protected readonly string _FilePath;
protected SQLiteConnection _Connection;
+ //You have to lock all actions using connection or transaction, otherwhise order is not guaranted
+ protected readonly object _Mutex = new object();
+
protected int _Version; //Version of the database (value of row "Value" in table "Version") or -1 if none
- public CDatabaseBase(string filePath)
+ protected CDatabaseBase(string filePath)
{
_FilePath = filePath;
}
public virtual bool Init()
{
- _Connection = new SQLiteConnection("Data Source=" + _FilePath);
- try
+ lock (_Mutex)
{
- _Connection.Open();
- }
- catch (Exception)
- {
- _Connection.Dispose();
- _Connection = null;
- return false;
- }
-
- using (var command = new SQLiteCommand(_Connection))
- {
- command.CommandText = "SELECT Value FROM Version";
-
- SQLiteDataReader reader = null;
-
+ if (_Connection != null)
+ return false;
+ _Connection = new SQLiteConnection("Data Source=" + _FilePath);
try
{
- reader = command.ExecuteReader();
+ _Connection.Open();
+ }
+ catch (Exception)
+ {
+ _Connection.Dispose();
+ _Connection = null;
+ return false;
}
- catch (Exception) {}
- if (reader == null || !reader.Read() || reader.FieldCount == 0)
- _Version = -1;
- else
- _Version = reader.GetInt32(0);
+ using (var command = new SQLiteCommand(_Connection))
+ {
+ command.CommandText = "SELECT Value FROM Version";
- if (reader != null)
- reader.Dispose();
+ SQLiteDataReader reader = null;
+
+ try
+ {
+ reader = command.ExecuteReader();
+ }
+ catch (Exception) {}
+
+ if (reader == null || !reader.Read() || reader.FieldCount == 0)
+ _Version = -1;
+ else
+ _Version = reader.GetInt32(0);
+
+ if (reader != null)
+ reader.Dispose();
+ }
}
return true;
}
public virtual void Close()
{
- if (_Connection != null)
+ lock (_Mutex)
{
- _Connection.Dispose();
- _Connection = null;
+ if (_Connection != null)
+ {
+ _Connection.Dispose();
+ _Connection = null;
+ }
}
}
@@ -92,6 +102,13 @@ namespace Vocaluxe.Lib.Database
return t70.Ticks;
}
+ ///
+ /// Reads the contents of a field as a byte array
+ /// Assumes you did the locking!
+ ///
+ ///
+ /// Field number to read from (default=first)
+ ///
protected static byte[] _GetBytes(SQLiteDataReader reader, int field = 0)
{
const int chunkSize = 2 * 1024;