Browse Source

Getting ready for 1.7 and 2.3 release

Former-commit-id: 2872f128571d73fa4aa9648432dc56784615babf
pull/17/head
James South 13 years ago
parent
commit
1198bdbb6a
  1. 4
      src/ImageProcessor/Properties/AssemblyInfo.cs
  2. BIN
      src/Nuget/ImageProcessor.1.3.0.0.nupkg
  3. BIN
      src/Nuget/ImageProcessor.1.4.0.0.nupkg
  4. BIN
      src/Nuget/ImageProcessor.1.4.1.0.nupkg
  5. BIN
      src/Nuget/ImageProcessor.1.4.2.0.nupkg
  6. BIN
      src/Nuget/ImageProcessor.1.5.0.0.nupkg
  7. BIN
      src/Nuget/ImageProcessor.1.6.0.0.nupkg
  8. BIN
      src/Nuget/ImageProcessor.Web.1.3.0.0.nupkg
  9. BIN
      src/Nuget/ImageProcessor.Web.2.0.0.0.nupkg
  10. BIN
      src/Nuget/ImageProcessor.Web.2.0.1.0.nupkg
  11. BIN
      src/Nuget/ImageProcessor.Web.2.1.0.0.nupkg
  12. BIN
      src/Nuget/ImageProcessor.Web.2.1.0.1.nupkg
  13. BIN
      src/Nuget/ImageProcessor.Web.2.1.0.2.nupkg
  14. BIN
      src/Nuget/ImageProcessor.Web.2.1.0.3.nupkg
  15. 1
      src/Nuget/ImageProcessor.Web.2.1.0.4.nupkg.REMOVED.git-id
  16. 1
      src/Nuget/ImageProcessor.Web.2.1.1.0.nupkg.REMOVED.git-id
  17. 1
      src/Nuget/ImageProcessor.Web.2.1.2.0.nupkg.REMOVED.git-id
  18. 1
      src/Nuget/ImageProcessor.Web.2.2.0.0.nupkg.REMOVED.git-id
  19. 1
      src/Nuget/ImageProcessor.Web.2.2.0.1.nupkg.REMOVED.git-id
  20. 43
      src/Nuget/ImageProcessor.Web.2.2.0.1.nuspec
  21. 1
      src/Nuget/ImageProcessor.Web.2.2.1.0.nupkg.REMOVED.git-id
  22. 1
      src/Nuget/ImageProcessor.Web.2.2.2.0.nupkg.REMOVED.git-id
  23. 1
      src/Nuget/ImageProcessor.Web.2.2.3.0.nupkg.REMOVED.git-id
  24. 1
      src/Nuget/ImageProcessor.Web.2.2.3.1.nupkg.REMOVED.git-id
  25. 1
      src/Nuget/ImageProcessor.Web.2.2.3.2.nupkg.REMOVED.git-id
  26. BIN
      src/Nuget/imageprocessor.128.png
  27. 2
      src/packages/sqlite-net.1.0.7/content/SQLite.cs.REMOVED.git-id
  28. 839
      src/packages/sqlite-net.1.0.7/content/SQLiteAsync.cs

4
src/ImageProcessor/Properties/AssemblyInfo.cs

@ -32,6 +32,6 @@ using System.Security;
// //
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("1.6.0.0")] [assembly: AssemblyVersion("1.7.0.0")]
[assembly: AssemblyFileVersion("1.6.0.0")] [assembly: AssemblyFileVersion("1.7.0.0")]

BIN
src/Nuget/ImageProcessor.1.3.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.1.4.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.1.4.1.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.1.4.2.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.1.5.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.1.6.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.1.3.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.0.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.0.1.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.1.0.0.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.1.0.1.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.1.0.2.nupkg

Binary file not shown.

BIN
src/Nuget/ImageProcessor.Web.2.1.0.3.nupkg

Binary file not shown.

1
src/Nuget/ImageProcessor.Web.2.1.0.4.nupkg.REMOVED.git-id

@ -1 +0,0 @@
eaff612b7db9e40f185c91161fd9c977faec69bb

1
src/Nuget/ImageProcessor.Web.2.1.1.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
2af35ccdf0476cbe432b2440be45ffd0f6c414f4

1
src/Nuget/ImageProcessor.Web.2.1.2.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
1ac41e14e3ae5f8ac9b06bcfbbacc6c4a9841863

1
src/Nuget/ImageProcessor.Web.2.2.0.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
13403db94dce99fd4e73114b3334d4ef0c2b4ae5

1
src/Nuget/ImageProcessor.Web.2.2.0.1.nupkg.REMOVED.git-id

@ -1 +0,0 @@
8a3fd4491298fec4626034f03e534caac7f22941

43
src/Nuget/ImageProcessor.Web.2.2.0.1.nuspec

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>ImageProcessor.Web</id>
<version>2.2.0.1</version>
<title>ImageProcessor.Web</title>
<authors>James South</authors>
<owners>James South</owners>
<projectUrl>http://jimbobsquarepants.github.com/ImageProcessor/</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>ImageProcessor.Web adds a configurable HttpModule to your website which allows on-the-fly processing of image files. The module also comes with a file and browser based cache that can handle up to 12,960,000 images increasing your processing output and saving precious server memory.
Methods include; Resize, Rotate, Flip, Crop, Watermark, Filter, Saturation, Brightness, Contrast, Quality, Format, Vignette, and Transparency.
This package also requires Microsoft.Bcl.Async -pre on .NET 4.0 which will be added in the background on install if applicable.
If you use ImageProcessor please get in touch via my twitter @james_m_south
Feedback is always welcome.</description>
<summary>An extension to ImageProcessor that allows on-the-fly processing of image files in an ASP.NET website</summary>
<releaseNotes>Fixed cache bug which caused unneccessary processing of images.
If upgrading from &lt; 2.2.0.0 You will have to delete your cache if upgrading to this version as the database differs.</releaseNotes>
<copyright>James South</copyright>
<language>en-GB</language>
<tags>Image, Imaging, ASP, Performance, Processing, HttpModule, Cache, Resize, Rotate, Flip, Crop, Filter, Effects, Quality, Watermark, Alpha, Vignette, Saturation, Brightness, Contrast, Gif, Jpeg, Bitmap, Png, Fluent</tags>
<dependencies>
<dependency id="ImageProcessor" version="1.5.0.0" />
<dependency id="Csharp-Sqlite" version="3.7.7.1" />
</dependencies>
</metadata>
<files>
<file src="content\net40\web.config.transform" target="content\net40\web.config.transform" />
<file src="content\net45\web.config.transform" target="content\net45\web.config.transform" />
<file src="..\ImageProcessor.Web\bin\Release\ImageProcessor.Web.dll" target="lib\net40\ImageProcessor.Web.dll" />
<file src="lib\net40\System.Runtime.dll" target="lib\net40\System.Runtime.dll" />
<file src="lib\net40\System.Threading.Tasks.dll" target="lib\net40\System.Threading.Tasks.dll" />
<file src="..\ImageProcessor.Web\bin\Release\ImageProcessor.Web.dll" target="lib\net45\ImageProcessor.Web.dll" />
<file src="tools\net40\install.ps1" target="tools\net40\install.ps1" />
<file src="tools\net45\install.ps1" target="tools\net45\install.ps1" />
</files>
</package>

1
src/Nuget/ImageProcessor.Web.2.2.1.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
46b009d93ab9f1ea75f1ea1efb0073b3d369d3e5

1
src/Nuget/ImageProcessor.Web.2.2.2.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
50dc5dc47c964ccc80bb8abb22650a579ae796c3

1
src/Nuget/ImageProcessor.Web.2.2.3.0.nupkg.REMOVED.git-id

@ -1 +0,0 @@
9142f8cdad57d5c52d8721112c18a8d26c6f9817

1
src/Nuget/ImageProcessor.Web.2.2.3.1.nupkg.REMOVED.git-id

@ -1 +0,0 @@
24114542de37d7b4463b56749e64e34b0d43a9cc

1
src/Nuget/ImageProcessor.Web.2.2.3.2.nupkg.REMOVED.git-id

@ -1 +0,0 @@
3de0aa82f042cfdda2764554fb34e686b401df85

BIN
src/Nuget/imageprocessor.128.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

2
src/packages/sqlite-net.1.0.7/content/SQLite.cs.REMOVED.git-id

@ -1 +1 @@
d2856e3733eb6c7d85057c37ae415e54c8bf2386 86139d135bd91c43d8ffe8808f0f04975fd22a82

839
src/packages/sqlite-net.1.0.7/content/SQLiteAsync.cs

@ -30,115 +30,126 @@ using System.Threading.Tasks;
namespace SQLite namespace SQLite
{ {
public partial class SQLiteAsyncConnection public partial class SQLiteAsyncConnection
{ {
SQLiteConnectionString _connectionString; SQLiteConnectionString _connectionString;
public SQLiteAsyncConnection (string databasePath, bool storeDateTimeAsTicks = false) public SQLiteAsyncConnection(string databasePath, bool storeDateTimeAsTicks = false)
{ {
_connectionString = new SQLiteConnectionString (databasePath, storeDateTimeAsTicks); _connectionString = new SQLiteConnectionString(databasePath, storeDateTimeAsTicks);
} }
SQLiteConnectionWithLock GetConnection () SQLiteConnectionWithLock GetConnection()
{ {
return SQLiteConnectionPool.Shared.GetConnection (_connectionString); return SQLiteConnectionPool.Shared.GetConnection(_connectionString);
} }
public Task<CreateTablesResult> CreateTableAsync<T> () public Task<CreateTablesResult> CreateTableAsync<T>()
where T : new () where T : new()
{ {
return CreateTablesAsync (typeof (T)); return CreateTablesAsync(typeof(T));
} }
public Task<CreateTablesResult> CreateTablesAsync<T, T2> () public Task<CreateTablesResult> CreateTablesAsync<T, T2>()
where T : new () where T : new()
where T2 : new () where T2 : new()
{ {
return CreateTablesAsync (typeof (T), typeof (T2)); return CreateTablesAsync(typeof(T), typeof(T2));
} }
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3> () public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3>()
where T : new () where T : new()
where T2 : new () where T2 : new()
where T3 : new () where T3 : new()
{ {
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3)); return CreateTablesAsync(typeof(T), typeof(T2), typeof(T3));
} }
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4> () public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4>()
where T : new () where T : new()
where T2 : new () where T2 : new()
where T3 : new () where T3 : new()
where T4 : new () where T4 : new()
{ {
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3), typeof (T4)); return CreateTablesAsync(typeof(T), typeof(T2), typeof(T3), typeof(T4));
} }
public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4, T5> () public Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4, T5>()
where T : new () where T : new()
where T2 : new () where T2 : new()
where T3 : new () where T3 : new()
where T4 : new () where T4 : new()
where T5 : new () where T5 : new()
{ {
return CreateTablesAsync (typeof (T), typeof (T2), typeof (T3), typeof (T4), typeof (T5)); return CreateTablesAsync(typeof(T), typeof(T2), typeof(T3), typeof(T4), typeof(T5));
} }
public Task<CreateTablesResult> CreateTablesAsync (params Type[] types) public Task<CreateTablesResult> CreateTablesAsync(params Type[] types)
{ {
return Task.Factory.StartNew (() => { return Task.Factory.StartNew(() =>
CreateTablesResult result = new CreateTablesResult (); {
var conn = GetConnection (); CreateTablesResult result = new CreateTablesResult();
using (conn.Lock ()) { var conn = GetConnection();
foreach (Type type in types) { using (conn.Lock())
int aResult = conn.CreateTable (type); {
result.Results[type] = aResult; foreach (Type type in types)
} {
} int aResult = conn.CreateTable(type);
return result; result.Results[type] = aResult;
}); }
} }
return result;
public Task<int> DropTableAsync<T> () });
where T : new () }
{
return Task.Factory.StartNew (() => { public Task<int> DropTableAsync<T>()
var conn = GetConnection (); where T : new()
using (conn.Lock ()) { {
return conn.DropTable<T> (); return Task.Factory.StartNew(() =>
} {
}); var conn = GetConnection();
} using (conn.Lock())
{
public Task<int> InsertAsync (object item) return conn.DropTable<T>();
{ }
return Task.Factory.StartNew (() => { });
var conn = GetConnection (); }
using (conn.Lock ()) {
return conn.Insert (item); public Task<int> InsertAsync(object item)
} {
}); return Task.Factory.StartNew(() =>
} {
var conn = GetConnection();
public Task<int> UpdateAsync (object item) using (conn.Lock())
{ {
return Task.Factory.StartNew (() => { return conn.Insert(item);
var conn = GetConnection (); }
using (conn.Lock ()) { });
return conn.Update (item); }
}
}); public Task<int> UpdateAsync(object item)
} {
return Task.Factory.StartNew(() =>
public Task<int> DeleteAsync (object item) {
{ var conn = GetConnection();
return Task.Factory.StartNew (() => { using (conn.Lock())
var conn = GetConnection (); {
using (conn.Lock ()) { return conn.Update(item);
return conn.Delete (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) public Task<T> GetAsync<T>(object pk)
where T : new() where T : new()
@ -153,18 +164,20 @@ namespace SQLite
}); });
} }
public Task<T> FindAsync<T> (object pk) public Task<T> FindAsync<T>(object pk)
where T : new () where T : new()
{ {
return Task.Factory.StartNew (() => { return Task.Factory.StartNew(() =>
var conn = GetConnection (); {
using (conn.Lock ()) { var conn = GetConnection();
return conn.Find<T> (pk); using (conn.Lock())
} {
}); return conn.Find<T>(pk);
} }
});
}
public Task<T> GetAsync<T> (Expression<Func<T, bool>> predicate) public Task<T> GetAsync<T>(Expression<Func<T, bool>> predicate)
where T : new() where T : new()
{ {
return Task.Factory.StartNew(() => return Task.Factory.StartNew(() =>
@ -172,60 +185,70 @@ namespace SQLite
var conn = GetConnection(); var conn = GetConnection();
using (conn.Lock()) using (conn.Lock())
{ {
return conn.Get<T> (predicate); return conn.Get<T>(predicate);
} }
}); });
} }
public Task<T> FindAsync<T> (Expression<Func<T, bool>> predicate) public Task<T> FindAsync<T>(Expression<Func<T, bool>> predicate)
where T : new () where T : new()
{ {
return Task.Factory.StartNew (() => { return Task.Factory.StartNew(() =>
var conn = GetConnection (); {
using (conn.Lock ()) { var conn = GetConnection();
return conn.Find<T> (predicate); using (conn.Lock())
} {
}); return conn.Find<T>(predicate);
} }
});
public Task<int> ExecuteAsync (string query, params object[] args) }
{
return Task<int>.Factory.StartNew (() => { public Task<int> ExecuteAsync(string query, params object[] args)
var conn = GetConnection (); {
using (conn.Lock ()) { return Task<int>.Factory.StartNew(() =>
return conn.Execute (query, args); {
} 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 ()) { public Task<int> InsertAllAsync(IEnumerable items)
return conn.InsertAll (items); {
} return Task.Factory.StartNew(() =>
}); {
} var conn = GetConnection();
using (conn.Lock())
{
return conn.InsertAll(items);
}
});
}
[Obsolete("Will cause a deadlock if any call in action ends up in a different thread. Use RunInTransactionAsync(Action<SQLiteConnection>) instead.")] [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) public Task RunInTransactionAsync(Action<SQLiteAsyncConnection> action)
{ {
return Task.Factory.StartNew (() => { return Task.Factory.StartNew(() =>
var conn = this.GetConnection (); {
using (conn.Lock ()) { var conn = this.GetConnection();
conn.BeginTransaction (); using (conn.Lock())
try { {
action (this); conn.BeginTransaction();
conn.Commit (); try
} {
catch (Exception) { action(this);
conn.Rollback (); conn.Commit();
throw; }
} catch (Exception)
} {
}); conn.Rollback();
} throw;
}
}
});
}
public Task RunInTransactionAsync(Action<SQLiteConnection> action) public Task RunInTransactionAsync(Action<SQLiteConnection> action)
{ {
@ -249,238 +272,256 @@ namespace SQLite
}); });
} }
public AsyncTableQuery<T> Table<T> () public AsyncTableQuery<T> Table<T>()
where T : new () where T : new()
{ {
// //
// This isn't async as the underlying connection doesn't go out to the database // 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. // until the query is performed. The Async methods are on the query iteself.
// //
var conn = GetConnection (); var conn = GetConnection();
return new AsyncTableQuery<T> (conn.Table<T> ()); return new AsyncTableQuery<T>(conn.Table<T>());
} }
public Task<T> ExecuteScalarAsync<T> (string sql, params object[] args) public Task<T> ExecuteScalarAsync<T>(string sql, params object[] args)
{ {
return Task<T>.Factory.StartNew (() => { return Task<T>.Factory.StartNew(() =>
var conn = GetConnection (); {
using (conn.Lock ()) { var conn = GetConnection();
var command = conn.CreateCommand (sql, args); using (conn.Lock())
return command.ExecuteScalar<T> (); {
} var command = conn.CreateCommand(sql, args);
}); return command.ExecuteScalar<T>();
} }
});
public Task<List<T>> QueryAsync<T> (string sql, params object[] args) }
where T : new ()
{ public Task<List<T>> QueryAsync<T>(string sql, params object[] args)
return Task<List<T>>.Factory.StartNew (() => { where T : new()
var conn = GetConnection (); {
using (conn.Lock ()) { return Task<List<T>>.Factory.StartNew(() =>
return conn.Query<T> (sql, args); {
} 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 //
{ // TODO: Bind to AsyncConnection.GetConnection instead so that delayed
public Dictionary<Type, int> Results { get; private set; } // execution can still work after a Pool.Reset.
//
internal CreateTablesResult () public class AsyncTableQuery<T>
{ where T : new()
this.Results = new Dictionary<Type, int> (); {
} TableQuery<T> _innerQuery;
}
public AsyncTableQuery(TableQuery<T> innerQuery)
class SQLiteConnectionPool {
{ _innerQuery = innerQuery;
class Entry }
{
public SQLiteConnectionString ConnectionString { get; private set; } public AsyncTableQuery<T> Where(Expression<Func<T, bool>> predExpr)
public SQLiteConnectionWithLock Connection { get; private set; } {
return new AsyncTableQuery<T>(_innerQuery.Where(predExpr));
public Entry (SQLiteConnectionString connectionString) }
{
ConnectionString = connectionString; public AsyncTableQuery<T> Skip(int n)
Connection = new SQLiteConnectionWithLock (connectionString); {
} return new AsyncTableQuery<T>(_innerQuery.Skip(n));
}
public void OnApplicationSuspended ()
{ public AsyncTableQuery<T> Take(int n)
Connection.Dispose (); {
Connection = null; return new AsyncTableQuery<T>(_innerQuery.Take(n));
} }
}
public AsyncTableQuery<T> OrderBy<U>(Expression<Func<T, U>> orderExpr)
readonly Dictionary<string, Entry> _entries = new Dictionary<string, Entry> (); {
readonly object _entriesLock = new object (); return new AsyncTableQuery<T>(_innerQuery.OrderBy<U>(orderExpr));
}
static readonly SQLiteConnectionPool _shared = new SQLiteConnectionPool ();
public AsyncTableQuery<T> OrderByDescending<U>(Expression<Func<T, U>> orderExpr)
/// <summary> {
/// Gets the singleton instance of the connection tool. return new AsyncTableQuery<T>(_innerQuery.OrderByDescending<U>(orderExpr));
/// </summary> }
public static SQLiteConnectionPool Shared
{ public Task<List<T>> ToListAsync()
get {
{ return Task.Factory.StartNew(() =>
return _shared; {
} using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock())
} {
return _innerQuery.ToList();
public SQLiteConnectionWithLock GetConnection (SQLiteConnectionString connectionString) }
{ });
lock (_entriesLock) { }
Entry entry;
string key = connectionString.ConnectionString; public Task<int> CountAsync()
{
if (!_entries.TryGetValue (key, out entry)) { return Task.Factory.StartNew(() =>
entry = new Entry (connectionString); {
_entries[key] = entry; using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock())
} {
return _innerQuery.Count();
return entry.Connection; }
} });
} }
/// <summary> public Task<T> ElementAtAsync(int index)
/// Closes all connections managed by this pool. {
/// </summary> return Task.Factory.StartNew(() =>
public void Reset () {
{ using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock())
lock (_entriesLock) { {
foreach (var entry in _entries.Values) { return _innerQuery.ElementAt(index);
entry.OnApplicationSuspended (); }
} });
_entries.Clear (); }
}
} public Task<T> FirstAsync()
{
/// <summary> return Task<T>.Factory.StartNew(() =>
/// Call this method when the application is suspended. {
/// </summary> using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock())
/// <remarks>Behaviour here is to close any open connections.</remarks> {
public void ApplicationSuspended () return _innerQuery.First();
{ }
Reset (); });
} }
}
public Task<T> FirstOrDefaultAsync()
class SQLiteConnectionWithLock : SQLiteConnection {
{ return Task<T>.Factory.StartNew(() =>
readonly object _lockPoint = new object (); {
using (((SQLiteConnectionWithLock)_innerQuery.Connection).Lock())
public SQLiteConnectionWithLock (SQLiteConnectionString connectionString) {
: base (connectionString.DatabasePath, connectionString.StoreDateTimeAsTicks) return _innerQuery.FirstOrDefault();
{ }
} });
}
public IDisposable Lock () }
{
return new LockWrapper (_lockPoint); public class CreateTablesResult
} {
public Dictionary<Type, int> Results { get; private set; }
private class LockWrapper : IDisposable
{ internal CreateTablesResult()
object _lockPoint; {
this.Results = new Dictionary<Type, int>();
public LockWrapper (object lockPoint) }
{ }
_lockPoint = lockPoint;
Monitor.Enter (_lockPoint); class SQLiteConnectionPool
} {
class Entry
public void Dispose () {
{ public SQLiteConnectionString ConnectionString { get; private set; }
Monitor.Exit (_lockPoint); public SQLiteConnectionWithLock Connection { get; private set; }
}
} public Entry(SQLiteConnectionString connectionString)
} {
ConnectionString = connectionString;
Connection = new SQLiteConnectionWithLock(connectionString);
}
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)
{
lock (_entriesLock)
{
Entry entry;
string key = connectionString.ConnectionString;
if (!_entries.TryGetValue(key, out entry))
{
entry = new Entry(connectionString);
_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)
: base(connectionString.DatabasePath, 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);
}
}
}
} }

Loading…
Cancel
Save