installed sqlite.net PCL version, has esqlite3.dll included for both x86 and x64
This commit is contained in:
parent
968c5ad388
commit
4b5e3896ed
@ -13,129 +13,74 @@ namespace NadekoBot.Classes
|
|||||||
|
|
||||||
private string FilePath { get; } = "data/nadekobot.sqlite";
|
private string FilePath { get; } = "data/nadekobot.sqlite";
|
||||||
|
|
||||||
|
public SQLiteConnection Connection { get; set; }
|
||||||
|
|
||||||
static DbHandler() { }
|
static DbHandler() { }
|
||||||
public DbHandler()
|
public DbHandler()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
Connection = new SQLiteConnection(FilePath);
|
||||||
|
Connection.CreateTable<Stats>();
|
||||||
|
Connection.CreateTable<Command>();
|
||||||
|
Connection.CreateTable<Announcement>();
|
||||||
|
Connection.CreateTable<Request>();
|
||||||
|
Connection.CreateTable<TypingArticle>();
|
||||||
|
Connection.CreateTable<CurrencyState>();
|
||||||
|
Connection.CreateTable<CurrencyTransaction>();
|
||||||
|
Connection.CreateTable<Donator>();
|
||||||
|
Connection.CreateTable<UserPokeTypes>();
|
||||||
|
Connection.CreateTable<UserQuote>();
|
||||||
|
Connection.CreateTable<Reminder>();
|
||||||
|
Connection.CreateTable<SongInfo>();
|
||||||
|
Connection.CreateTable<PlaylistSongInfo>();
|
||||||
|
Connection.CreateTable<MusicPlaylist>();
|
||||||
|
Connection.CreateTable<Incident>();
|
||||||
|
Connection.Execute(Queries.TransactionTriggerQuery);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
conn.CreateTable<Stats>();
|
Connection.Execute(Queries.DeletePlaylistTriggerQuery);
|
||||||
conn.CreateTable<Command>();
|
}
|
||||||
conn.CreateTable<Announcement>();
|
catch (Exception ex)
|
||||||
conn.CreateTable<Request>();
|
{
|
||||||
conn.CreateTable<TypingArticle>();
|
Console.WriteLine(ex);
|
||||||
conn.CreateTable<CurrencyState>();
|
|
||||||
conn.CreateTable<CurrencyTransaction>();
|
|
||||||
conn.CreateTable<Donator>();
|
|
||||||
conn.CreateTable<UserPokeTypes>();
|
|
||||||
conn.CreateTable<UserQuote>();
|
|
||||||
conn.CreateTable<Reminder>();
|
|
||||||
conn.CreateTable<SongInfo>();
|
|
||||||
conn.CreateTable<PlaylistSongInfo>();
|
|
||||||
conn.CreateTable<MusicPlaylist>();
|
|
||||||
conn.CreateTable<Incident>();
|
|
||||||
conn.Execute(Queries.TransactionTriggerQuery);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
conn.Execute(Queries.DeletePlaylistTriggerQuery);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine(ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal T FindOne<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
internal T FindOne<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
return Connection.Table<T>().Where(p).FirstOrDefault();
|
||||||
{
|
|
||||||
return conn.Table<T>().Where(p).FirstOrDefault();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IList<T> FindAll<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
internal IList<T> FindAll<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
return conn.Table<T>().Where(p).ToList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void DeleteAll<T>() where T : IDataModel
|
return Connection.Table<T>().Where(p).ToList();
|
||||||
{
|
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
conn.DeleteAll<T>();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void DeleteWhere<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
internal void DeleteWhere<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
var id = Connection.Table<T>().Where(p).FirstOrDefault()?.Id;
|
||||||
{
|
if (id.HasValue)
|
||||||
var id = conn.Table<T>().Where(p).FirstOrDefault()?.Id;
|
Connection.Delete<T>(id);
|
||||||
if (id.HasValue)
|
|
||||||
conn.Delete<T>(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void InsertData<T>(T o) where T : IDataModel
|
|
||||||
{
|
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
conn.Insert(o, typeof(T));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void InsertMany<T>(T objects) where T : IEnumerable<IDataModel>
|
|
||||||
{
|
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
conn.InsertAll(objects);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void UpdateData<T>(T o) where T : IDataModel
|
|
||||||
{
|
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
conn.Update(o, typeof(T));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void UpdateAll<T>(IEnumerable<T> objs) where T : IDataModel
|
|
||||||
{
|
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
|
||||||
{
|
|
||||||
conn.UpdateAll(objs);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal HashSet<T> GetAllRows<T>() where T : IDataModel, new()
|
internal HashSet<T> GetAllRows<T>() where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
return new HashSet<T>(Connection.Table<T>());
|
||||||
{
|
|
||||||
return new HashSet<T>(conn.Table<T>());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal CurrencyState GetStateByUserId(long id)
|
internal CurrencyState GetStateByUserId(long id)
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
return Connection.Table<CurrencyState>().Where(x => x.UserId == id).FirstOrDefault();
|
||||||
{
|
|
||||||
return conn.Table<CurrencyState>().Where(x => x.UserId == id).FirstOrDefault();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal T Delete<T>(int id) where T : IDataModel, new()
|
internal T Delete<T>(int id) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
var found = Connection.Find<T>(id);
|
||||||
{
|
if (found != null)
|
||||||
var found = conn.Find<T>(id);
|
Connection.Delete<T>(found.Id);
|
||||||
if (found != null)
|
return found;
|
||||||
conn.Delete<T>(found.Id);
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -143,14 +88,11 @@ namespace NadekoBot.Classes
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal void Save<T>(T o) where T : IDataModel, new()
|
internal void Save<T>(T o) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
var found = Connection.Find<T>(o.Id);
|
||||||
{
|
if (found == null)
|
||||||
var found = conn.Find<T>(o.Id);
|
Connection.Insert(o, typeof(T));
|
||||||
if (found == null)
|
else
|
||||||
conn.Insert(o, typeof(T));
|
Connection.Update(o, typeof(T));
|
||||||
else
|
|
||||||
conn.Update(o, typeof(T));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -158,20 +100,14 @@ namespace NadekoBot.Classes
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal void SaveAll<T>(IEnumerable<T> ocol) where T : IDataModel, new()
|
internal void SaveAll<T>(IEnumerable<T> ocol) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
foreach (var o in ocol)
|
||||||
{
|
Connection.InsertOrReplace(o);
|
||||||
foreach (var o in ocol)
|
|
||||||
conn.InsertOrReplace(o);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal T GetRandom<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
internal T GetRandom<T>(Expression<Func<T, bool>> p) where T : IDataModel, new()
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
var r = new Random();
|
||||||
{
|
return Connection.Table<T>().Where(p).ToList().OrderBy(x => r.Next()).FirstOrDefault();
|
||||||
var r = new Random();
|
|
||||||
return conn.Table<T>().Where(p).ToList().OrderBy(x => r.Next()).FirstOrDefault();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@ -180,24 +116,19 @@ namespace NadekoBot.Classes
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
internal List<PlaylistData> GetPlaylistData(int num)
|
internal List<PlaylistData> GetPlaylistData(int num)
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
return Connection.Query<PlaylistData>(
|
||||||
{
|
|
||||||
return conn.Query<PlaylistData>(
|
|
||||||
@"SELECT mp.Name as 'Name',mp.Id as 'Id', mp.CreatorName as 'Creator', Count(*) as 'SongCnt' FROM MusicPlaylist as mp
|
@"SELECT mp.Name as 'Name',mp.Id as 'Id', mp.CreatorName as 'Creator', Count(*) as 'SongCnt' FROM MusicPlaylist as mp
|
||||||
INNER JOIN PlaylistSongInfo as psi
|
INNER JOIN PlaylistSongInfo as psi
|
||||||
ON mp.Id = psi.PlaylistId
|
ON mp.Id = psi.PlaylistId
|
||||||
Group BY mp.Name
|
Group BY mp.Name
|
||||||
Order By mp.DateAdded desc
|
Order By mp.DateAdded desc
|
||||||
Limit 20 OFFSET ?", num * 20);
|
Limit 20 OFFSET ?", num * 20);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal IEnumerable<CurrencyState> GetTopRichest(int n = 10)
|
internal IEnumerable<CurrencyState> GetTopRichest(int n = 10)
|
||||||
{
|
{
|
||||||
using (var conn = new SQLiteConnection(FilePath))
|
return Connection.Table<CurrencyState>().OrderByDescending(cs => cs.Value).Take(n).ToList();
|
||||||
{
|
|
||||||
return conn.Table<CurrencyState>().OrderByDescending(cs => cs.Value).Take(n).ToList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ namespace NadekoBot.Classes
|
|||||||
return;
|
return;
|
||||||
await Task.Run(() =>
|
await Task.Run(() =>
|
||||||
{
|
{
|
||||||
DbHandler.Instance.InsertData(new DataModels.CurrencyTransaction
|
DbHandler.Instance.Connection.Insert(new DataModels.CurrencyTransaction
|
||||||
{
|
{
|
||||||
Reason = reason,
|
Reason = reason,
|
||||||
UserId = (long)u.Id,
|
UserId = (long)u.Id,
|
||||||
@ -36,7 +36,7 @@ namespace NadekoBot.Classes
|
|||||||
if (state.Value < amount)
|
if (state.Value < amount)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DbHandler.Instance.InsertData(new DataModels.CurrencyTransaction
|
DbHandler.Instance.Connection.Insert(new DataModels.CurrencyTransaction
|
||||||
{
|
{
|
||||||
Reason = reason,
|
Reason = reason,
|
||||||
UserId = (long)u.Id,
|
UserId = (long)u.Id,
|
||||||
|
@ -19,7 +19,7 @@ namespace NadekoBot.Classes
|
|||||||
Read = false
|
Read = false
|
||||||
};
|
};
|
||||||
|
|
||||||
DbHandler.Instance.InsertData<Incident>(incident);
|
DbHandler.Instance.Connection.Insert(incident, typeof(Incident));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,8 @@ namespace NadekoBot
|
|||||||
-------------------------------------
|
-------------------------------------
|
||||||
");
|
");
|
||||||
}
|
}
|
||||||
catch {
|
catch
|
||||||
|
{
|
||||||
Console.WriteLine("Command errored errorring");
|
Console.WriteLine("Command errored errorring");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -208,7 +209,7 @@ namespace NadekoBot
|
|||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
var connectedServers = NadekoBot.Client.Servers.Count();
|
var connectedServers = NadekoBot.Client.Servers.Count();
|
||||||
|
|
||||||
Classes.DbHandler.Instance.InsertData(new DataModels.Stats
|
Classes.DbHandler.Instance.Connection.Insert(new DataModels.Stats
|
||||||
{
|
{
|
||||||
OnlineUsers = onlineUsers,
|
OnlineUsers = onlineUsers,
|
||||||
RealOnlineUsers = realOnlineUsers,
|
RealOnlineUsers = realOnlineUsers,
|
||||||
@ -252,7 +253,7 @@ namespace NadekoBot
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
commandsRan++;
|
commandsRan++;
|
||||||
Classes.DbHandler.Instance.InsertData(new DataModels.Command
|
Classes.DbHandler.Instance.Connection.Insert(new DataModels.Command
|
||||||
{
|
{
|
||||||
ServerId = (long)(e.Server?.Id ?? 0),
|
ServerId = (long)(e.Server?.Id ?? 0),
|
||||||
ServerName = e.Server?.Name ?? "--Direct Message--",
|
ServerName = e.Server?.Name ?? "--Direct Message--",
|
||||||
|
@ -842,7 +842,7 @@ namespace NadekoBot.Modules.Administration
|
|||||||
if (donator == null) return;
|
if (donator == null) return;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DbHandler.Instance.InsertData(new Donator
|
DbHandler.Instance.Connection.Insert(new Donator
|
||||||
{
|
{
|
||||||
Amount = amount,
|
Amount = amount,
|
||||||
UserName = donator.Name,
|
UserName = donator.Name,
|
||||||
|
@ -20,7 +20,7 @@ namespace NadekoBot.Modules.Administration.Commands
|
|||||||
{
|
{
|
||||||
var sid = (long)e.Server.Id;
|
var sid = (long)e.Server.Id;
|
||||||
var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid && i.Read == false);
|
var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid && i.Read == false);
|
||||||
DbHandler.Instance.UpdateAll<Incident>(incs.Select(i => { i.Read = true; return i; }));
|
DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
|
||||||
|
|
||||||
await e.User.SendMessage(string.Join("\n----------------------", incs.Select(i => i.Text)));
|
await e.User.SendMessage(string.Join("\n----------------------", incs.Select(i => i.Text)));
|
||||||
});
|
});
|
||||||
@ -33,7 +33,7 @@ namespace NadekoBot.Modules.Administration.Commands
|
|||||||
{
|
{
|
||||||
var sid = (long)e.Server.Id;
|
var sid = (long)e.Server.Id;
|
||||||
var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid);
|
var incs = DbHandler.Instance.FindAll<Incident>(i => i.ServerId == sid);
|
||||||
DbHandler.Instance.UpdateAll<Incident>(incs.Select(i => { i.Read = true; return i; }));
|
DbHandler.Instance.Connection.UpdateAll(incs.Select(i => { i.Read = true; return i; }));
|
||||||
var data = string.Join("\n----------------------\n", incs.Select(i => i.Text));
|
var data = string.Join("\n----------------------\n", incs.Select(i => i.Text));
|
||||||
MemoryStream ms = new MemoryStream();
|
MemoryStream ms = new MemoryStream();
|
||||||
var sw = new StreamWriter(ms);
|
var sw = new StreamWriter(ms);
|
||||||
|
@ -8,7 +8,6 @@ using NadekoBot.Modules.Permissions.Classes;
|
|||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -42,7 +41,7 @@ namespace NadekoBot.Modules.Conversations
|
|||||||
if (string.IsNullOrWhiteSpace(text))
|
if (string.IsNullOrWhiteSpace(text))
|
||||||
return;
|
return;
|
||||||
await Task.Run(() =>
|
await Task.Run(() =>
|
||||||
Classes.DbHandler.Instance.InsertData(new DataModels.UserQuote()
|
Classes.DbHandler.Instance.Connection.Insert(new DataModels.UserQuote()
|
||||||
{
|
{
|
||||||
DateAdded = DateTime.Now,
|
DateAdded = DateTime.Now,
|
||||||
Keyword = e.GetArg("keyword").ToLowerInvariant(),
|
Keyword = e.GetArg("keyword").ToLowerInvariant(),
|
||||||
|
@ -182,7 +182,7 @@ namespace NadekoBot.Modules.Games.Commands
|
|||||||
{
|
{
|
||||||
if (!NadekoBot.IsOwner(e.User.Id) || string.IsNullOrWhiteSpace(e.GetArg("text"))) return;
|
if (!NadekoBot.IsOwner(e.User.Id) || string.IsNullOrWhiteSpace(e.GetArg("text"))) return;
|
||||||
|
|
||||||
DbHandler.Instance.InsertData(new TypingArticle
|
DbHandler.Instance.Connection.Insert(new TypingArticle
|
||||||
{
|
{
|
||||||
Text = e.GetArg("text"),
|
Text = e.GetArg("text"),
|
||||||
DateAdded = DateTime.Now
|
DateAdded = DateTime.Now
|
||||||
|
@ -614,11 +614,11 @@ namespace NadekoBot.Modules.Music
|
|||||||
};
|
};
|
||||||
DbHandler.Instance.SaveAll(songInfos);
|
DbHandler.Instance.SaveAll(songInfos);
|
||||||
DbHandler.Instance.Save(playlist);
|
DbHandler.Instance.Save(playlist);
|
||||||
DbHandler.Instance.InsertMany(songInfos.Select(s => new PlaylistSongInfo
|
DbHandler.Instance.Connection.InsertAll(songInfos.Select(s => new PlaylistSongInfo
|
||||||
{
|
{
|
||||||
PlaylistId = playlist.Id.Value,
|
PlaylistId = playlist.Id.Value,
|
||||||
SongInfoId = s.Id.Value
|
SongInfoId = s.Id.Value
|
||||||
}));
|
}), typeof(PlaylistSongInfo));
|
||||||
|
|
||||||
await e.Channel.SendMessage($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false);
|
await e.Channel.SendMessage($"🎵 `Saved playlist as {name}-{playlist.Id}`").ConfigureAwait(false);
|
||||||
|
|
||||||
|
@ -319,11 +319,11 @@ namespace NadekoBot.Modules.Pokemon
|
|||||||
DbHandler.Instance.Delete<UserPokeTypes>(Dict[(long)e.User.Id]);
|
DbHandler.Instance.Delete<UserPokeTypes>(Dict[(long)e.User.Id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DbHandler.Instance.InsertData(new UserPokeTypes
|
DbHandler.Instance.Connection.Insert(new UserPokeTypes
|
||||||
{
|
{
|
||||||
UserId = (long)e.User.Id,
|
UserId = (long)e.User.Id,
|
||||||
type = targetType.Name
|
type = targetType.Name
|
||||||
});
|
}, typeof(UserPokeTypes));
|
||||||
|
|
||||||
//Now for the response
|
//Now for the response
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ namespace NadekoBot.Modules.Utility.Commands
|
|||||||
UserId = (long)e.User.Id,
|
UserId = (long)e.User.Id,
|
||||||
ServerId = (long)e.Server.Id
|
ServerId = (long)e.Server.Id
|
||||||
};
|
};
|
||||||
DbHandler.Instance.InsertData(rem);
|
DbHandler.Instance.Connection.Insert(rem);
|
||||||
|
|
||||||
reminders.Add(StartNewReminder(rem));
|
reminders.Add(StartNewReminder(rem));
|
||||||
|
|
||||||
|
@ -161,8 +161,23 @@
|
|||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>lib\ScaredFingers.UnitsConversion.dll</HintPath>
|
<HintPath>lib\ScaredFingers.UnitsConversion.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="SQLite-net, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\sqlite-net-pcl.1.1.2\lib\portable-net45+wp8+wpa81+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\SQLite-net.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCL.batteries, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLitePCL.bundle_green.0.9.2\lib\net45\SQLitePCL.batteries.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCL.raw, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLitePCL.raw.0.9.2\lib\net45\SQLitePCL.raw.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLitePCLPlugin_esqlite3, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLitePCL.plugin.sqlite3.net45.0.9.2\lib\net45\SQLitePCLPlugin_esqlite3.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Drawing" />
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Net" />
|
<Reference Include="System.Net" />
|
||||||
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
||||||
@ -296,8 +311,6 @@
|
|||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Classes\NadekoStats.cs" />
|
<Compile Include="Classes\NadekoStats.cs" />
|
||||||
<Compile Include="SQLite.cs" />
|
|
||||||
<Compile Include="SQLiteAsync.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config" />
|
<None Include="App.config" />
|
||||||
@ -550,6 +563,13 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup />
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\packages\SQLitePCL.native.sqlite3.v110_xp.0.9.2\build\SQLitePCL.native.sqlite3.v110_xp.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\SQLitePCL.native.sqlite3.v110_xp.0.9.2\build\SQLitePCL.native.sqlite3.v110_xp.targets'))" />
|
||||||
|
</Target>
|
||||||
|
<Import Project="..\packages\SQLitePCL.native.sqlite3.v110_xp.0.9.2\build\SQLitePCL.native.sqlite3.v110_xp.targets" Condition="Exists('..\packages\SQLitePCL.native.sqlite3.v110_xp.0.9.2\build\SQLitePCL.native.sqlite3.v110_xp.targets')" />
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
||||||
|
3278
NadekoBot/SQLite.cs
3278
NadekoBot/SQLite.cs
File diff suppressed because it is too large
Load Diff
@ -1,503 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2012 Krueger Systems, Inc.
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace SQLite
|
|
||||||
{
|
|
||||||
public partial class SQLiteAsyncConnection
|
|
||||||
{
|
|
||||||
SQLiteConnectionString _connectionString;
|
|
||||||
SQLiteOpenFlags _openFlags;
|
|
||||||
|
|
||||||
public SQLiteAsyncConnection(string databasePath, bool storeDateTimeAsTicks = false)
|
|
||||||
: this(databasePath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create, storeDateTimeAsTicks)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public SQLiteAsyncConnection(string databasePath, SQLiteOpenFlags openFlags, bool storeDateTimeAsTicks = false)
|
|
||||||
{
|
|
||||||
_openFlags = openFlags;
|
|
||||||
_connectionString = new SQLiteConnectionString(databasePath, storeDateTimeAsTicks);
|
|
||||||
}
|
|
||||||
|
|
||||||
SQLiteConnectionWithLock GetConnection ()
|
|
||||||
{
|
|
||||||
return SQLiteConnectionPool.Shared.GetConnection (_connectionString, _openFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTableAsync<T> ()
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
return CreateTablesAsync (typeof (T));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTablesAsync<T, T2> ()
|
|
||||||
where T : new ()
|
|
||||||
where T2 : new ()
|
|
||||||
{
|
|
||||||
return CreateTablesAsync (typeof (T), typeof (T2));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3> ()
|
|
||||||
where T : new ()
|
|
||||||
where T2 : new ()
|
|
||||||
where T3 : new ()
|
|
||||||
{
|
|
||||||
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4> ()
|
|
||||||
where T : new ()
|
|
||||||
where T2 : new ()
|
|
||||||
where T3 : new ()
|
|
||||||
where T4 : new ()
|
|
||||||
{
|
|
||||||
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3), typeof (T4));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4, T5> ()
|
|
||||||
where T : new ()
|
|
||||||
where T2 : new ()
|
|
||||||
where T3 : new ()
|
|
||||||
where T4 : new ()
|
|
||||||
where T5 : new ()
|
|
||||||
{
|
|
||||||
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3), typeof (T4), typeof (T5));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<CreateTablesResult> CreateTablesAsync (params Type[] types)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
CreateTablesResult result = new CreateTablesResult ();
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
foreach (Type type in types) {
|
|
||||||
int aResult = conn.CreateTable (type);
|
|
||||||
result.Results[type] = aResult;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> DropTableAsync<T> ()
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.DropTable<T> ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> InsertAsync (object item)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Insert (item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> UpdateAsync (object item)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Update (item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> DeleteAsync (object item)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Delete (item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> GetAsync<T>(object pk)
|
|
||||||
where T : new()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew(() =>
|
|
||||||
{
|
|
||||||
var conn = GetConnection();
|
|
||||||
using (conn.Lock())
|
|
||||||
{
|
|
||||||
return conn.Get<T>(pk);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> FindAsync<T> (object pk)
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Find<T> (pk);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> GetAsync<T> (Expression<Func<T, bool>> predicate)
|
|
||||||
where T : new()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew(() =>
|
|
||||||
{
|
|
||||||
var conn = GetConnection();
|
|
||||||
using (conn.Lock())
|
|
||||||
{
|
|
||||||
return conn.Get<T> (predicate);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> FindAsync<T> (Expression<Func<T, bool>> predicate)
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Find<T> (predicate);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> ExecuteAsync (string query, params object[] args)
|
|
||||||
{
|
|
||||||
return Task<int>.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Execute (query, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> InsertAllAsync (IEnumerable items)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.InsertAll (items);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> UpdateAllAsync (IEnumerable items)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.UpdateAll (items);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
[Obsolete("Will cause a deadlock if any call in action ends up in a different thread. Use RunInTransactionAsync(Action<SQLiteConnection>) instead.")]
|
|
||||||
public Task RunInTransactionAsync (Action<SQLiteAsyncConnection> action)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
var conn = this.GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
conn.BeginTransaction ();
|
|
||||||
try {
|
|
||||||
action (this);
|
|
||||||
conn.Commit ();
|
|
||||||
}
|
|
||||||
catch (Exception) {
|
|
||||||
conn.Rollback ();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task RunInTransactionAsync(Action<SQLiteConnection> action)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew(() =>
|
|
||||||
{
|
|
||||||
var conn = this.GetConnection();
|
|
||||||
using (conn.Lock())
|
|
||||||
{
|
|
||||||
conn.BeginTransaction();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
action(conn);
|
|
||||||
conn.Commit();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
conn.Rollback();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> Table<T> ()
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// This isn't async as the underlying connection doesn't go out to the database
|
|
||||||
// until the query is performed. The Async methods are on the query iteself.
|
|
||||||
//
|
|
||||||
var conn = GetConnection ();
|
|
||||||
return new AsyncTableQuery<T> (conn.Table<T> ());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> ExecuteScalarAsync<T> (string sql, params object[] args)
|
|
||||||
{
|
|
||||||
return Task<T>.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
var command = conn.CreateCommand (sql, args);
|
|
||||||
return command.ExecuteScalar<T> ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<List<T>> QueryAsync<T> (string sql, params object[] args)
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
return Task<List<T>>.Factory.StartNew (() => {
|
|
||||||
var conn = GetConnection ();
|
|
||||||
using (conn.Lock ()) {
|
|
||||||
return conn.Query<T> (sql, args);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// TODO: Bind to AsyncConnection.GetConnection instead so that delayed
|
|
||||||
// execution can still work after a Pool.Reset.
|
|
||||||
//
|
|
||||||
public class AsyncTableQuery<T>
|
|
||||||
where T : new ()
|
|
||||||
{
|
|
||||||
TableQuery<T> _innerQuery;
|
|
||||||
|
|
||||||
public AsyncTableQuery (TableQuery<T> innerQuery)
|
|
||||||
{
|
|
||||||
_innerQuery = innerQuery;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> Where (Expression<Func<T, bool>> predExpr)
|
|
||||||
{
|
|
||||||
return new AsyncTableQuery<T> (_innerQuery.Where (predExpr));
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> Skip (int n)
|
|
||||||
{
|
|
||||||
return new AsyncTableQuery<T> (_innerQuery.Skip (n));
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> Take (int n)
|
|
||||||
{
|
|
||||||
return new AsyncTableQuery<T> (_innerQuery.Take (n));
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> OrderBy<U> (Expression<Func<T, U>> orderExpr)
|
|
||||||
{
|
|
||||||
return new AsyncTableQuery<T> (_innerQuery.OrderBy<U> (orderExpr));
|
|
||||||
}
|
|
||||||
|
|
||||||
public AsyncTableQuery<T> OrderByDescending<U> (Expression<Func<T, U>> orderExpr)
|
|
||||||
{
|
|
||||||
return new AsyncTableQuery<T> (_innerQuery.OrderByDescending<U> (orderExpr));
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<List<T>> ToListAsync ()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock ()) {
|
|
||||||
return _innerQuery.ToList ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<int> CountAsync ()
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock ()) {
|
|
||||||
return _innerQuery.Count ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> ElementAtAsync (int index)
|
|
||||||
{
|
|
||||||
return Task.Factory.StartNew (() => {
|
|
||||||
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock ()) {
|
|
||||||
return _innerQuery.ElementAt (index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> FirstAsync ()
|
|
||||||
{
|
|
||||||
return Task<T>.Factory.StartNew(() => {
|
|
||||||
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock ()) {
|
|
||||||
return _innerQuery.First ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task<T> FirstOrDefaultAsync ()
|
|
||||||
{
|
|
||||||
return Task<T>.Factory.StartNew(() => {
|
|
||||||
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock ()) {
|
|
||||||
return _innerQuery.FirstOrDefault ();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CreateTablesResult
|
|
||||||
{
|
|
||||||
public Dictionary<Type, int> Results { get; private set; }
|
|
||||||
|
|
||||||
internal CreateTablesResult ()
|
|
||||||
{
|
|
||||||
this.Results = new Dictionary<Type, int> ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SQLiteConnectionPool
|
|
||||||
{
|
|
||||||
class Entry
|
|
||||||
{
|
|
||||||
public SQLiteConnectionString ConnectionString { get; private set; }
|
|
||||||
public SQLiteConnectionWithLock Connection { get; private set; }
|
|
||||||
|
|
||||||
public Entry (SQLiteConnectionString connectionString, SQLiteOpenFlags openFlags)
|
|
||||||
{
|
|
||||||
ConnectionString = connectionString;
|
|
||||||
Connection = new SQLiteConnectionWithLock (connectionString, openFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnApplicationSuspended ()
|
|
||||||
{
|
|
||||||
Connection.Dispose ();
|
|
||||||
Connection = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly Dictionary<string, Entry> _entries = new Dictionary<string, Entry> ();
|
|
||||||
readonly object _entriesLock = new object ();
|
|
||||||
|
|
||||||
static readonly SQLiteConnectionPool _shared = new SQLiteConnectionPool ();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the singleton instance of the connection tool.
|
|
||||||
/// </summary>
|
|
||||||
public static SQLiteConnectionPool Shared
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _shared;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SQLiteConnectionWithLock GetConnection (SQLiteConnectionString connectionString, SQLiteOpenFlags openFlags)
|
|
||||||
{
|
|
||||||
lock (_entriesLock) {
|
|
||||||
Entry entry;
|
|
||||||
string key = connectionString.ConnectionString;
|
|
||||||
|
|
||||||
if (!_entries.TryGetValue (key, out entry)) {
|
|
||||||
entry = new Entry (connectionString, openFlags);
|
|
||||||
_entries[key] = entry;
|
|
||||||
}
|
|
||||||
|
|
||||||
return entry.Connection;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Closes all connections managed by this pool.
|
|
||||||
/// </summary>
|
|
||||||
public void Reset ()
|
|
||||||
{
|
|
||||||
lock (_entriesLock) {
|
|
||||||
foreach (var entry in _entries.Values) {
|
|
||||||
entry.OnApplicationSuspended ();
|
|
||||||
}
|
|
||||||
_entries.Clear ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Call this method when the application is suspended.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>Behaviour here is to close any open connections.</remarks>
|
|
||||||
public void ApplicationSuspended ()
|
|
||||||
{
|
|
||||||
Reset ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SQLiteConnectionWithLock : SQLiteConnection
|
|
||||||
{
|
|
||||||
readonly object _lockPoint = new object ();
|
|
||||||
|
|
||||||
public SQLiteConnectionWithLock (SQLiteConnectionString connectionString, SQLiteOpenFlags openFlags)
|
|
||||||
: base (connectionString.DatabasePath, openFlags, connectionString.StoreDateTimeAsTicks)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public IDisposable Lock ()
|
|
||||||
{
|
|
||||||
return new LockWrapper (_lockPoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class LockWrapper : IDisposable
|
|
||||||
{
|
|
||||||
object _lockPoint;
|
|
||||||
|
|
||||||
public LockWrapper (object lockPoint)
|
|
||||||
{
|
|
||||||
_lockPoint = lockPoint;
|
|
||||||
Monitor.Enter (_lockPoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose ()
|
|
||||||
{
|
|
||||||
Monitor.Exit (_lockPoint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Binary file not shown.
BIN
NadekoBot/bin/Debug/x64/esqlite3.dll
Normal file
BIN
NadekoBot/bin/Debug/x64/esqlite3.dll
Normal file
Binary file not shown.
BIN
NadekoBot/bin/Debug/x86/esqlite3.dll
Normal file
BIN
NadekoBot/bin/Debug/x86/esqlite3.dll
Normal file
Binary file not shown.
@ -10,7 +10,12 @@
|
|||||||
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
|
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
|
||||||
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net46" />
|
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net46" />
|
||||||
<package id="RestSharp" version="105.2.3" targetFramework="net452" />
|
<package id="RestSharp" version="105.2.3" targetFramework="net452" />
|
||||||
<package id="sqlite-net" version="1.0.8" targetFramework="net452" />
|
<package id="sqlite-net-pcl" version="1.1.2" targetFramework="net452" />
|
||||||
|
<package id="SQLitePCL.bundle_green" version="0.9.2" targetFramework="net452" />
|
||||||
|
<package id="SQLitePCL.native.sqlite3.v110_xp" version="0.9.2" targetFramework="net452" />
|
||||||
|
<package id="SQLitePCL.plugin.sqlite3.net45" version="0.9.2" targetFramework="net452" />
|
||||||
|
<package id="SQLitePCL.raw" version="0.9.2" targetFramework="net452" />
|
||||||
|
<package id="System.Data.SQLite" version="1.0.102.0" targetFramework="net452" />
|
||||||
<package id="taglib" version="2.1.0.0" targetFramework="net452" />
|
<package id="taglib" version="2.1.0.0" targetFramework="net452" />
|
||||||
<package id="VideoLibrary" version="1.3.3" targetFramework="net452" />
|
<package id="VideoLibrary" version="1.3.3" targetFramework="net452" />
|
||||||
</packages>
|
</packages>
|
Loading…
Reference in New Issue
Block a user