Skip to content

Commit f37574f

Browse files
Merge branch 'praeclarum:master' into master
2 parents d9b8795 + e8a24a8 commit f37574f

File tree

10 files changed

+256
-10
lines changed

10 files changed

+256
-10
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ on:
1111
jobs:
1212
build:
1313

14-
runs-on: macOS-10.14
14+
runs-on: macOS-latest
1515

1616
steps:
1717

Directory.Build.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<PropertyGroup>
3-
<VersionPrefix>1.8</VersionPrefix>
4-
<VersionSuffix></VersionSuffix>
3+
<VersionPrefix>1.9</VersionPrefix>
4+
<VersionSuffix>beta</VersionSuffix>
55

66
<PackageIcon>Logo-low.png</PackageIcon>
77
<PackageProjectUrl>https://github.com/praeclarum/sqlite-net</PackageProjectUrl>

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Use one of these packages:
1010
| [![NuGet Package](https://img.shields.io/nuget/v/sqlite-net-pcl.svg)](https://www.nuget.org/packages/sqlite-net-pcl) | [sqlite-net-pcl](https://www.nuget.org/packages/sqlite-net-pcl) | .NET Standard Library |
1111
| [![NuGet Package with Encryption](https://img.shields.io/nuget/v/sqlite-net-sqlcipher.svg)](https://www.nuget.org/packages/sqlite-net-sqlcipher) | [sqlite-net-sqlcipher](https://www.nuget.org/packages/sqlite-net-sqlcipher) | With Encryption Support |
1212
| [![NuGet Package using P/Invoke](https://img.shields.io/nuget/v/sqlite-net-static.svg)](https://www.nuget.org/packages/sqlite-net-static) | [sqlite-net-static](https://www.nuget.org/packages/sqlite-net-static) | Special version that uses P/Invokes to platform-provided sqlite3 |
13+
| [![NuGet Package without a SQLitePCLRaw bundle](https://img.shields.io/nuget/v/sqlite-net-base.svg)](https://www.nuget.org/packages/sqlite-net-base) | [sqlite-net-base](https://www.nuget.org/packages/sqlite-net-base) | wothout a SQLitePCLRaw bundle so you can choose your own provider |
1314

1415
SQLite-net is an open source, minimal library to allow .NET, .NET Core, and Mono applications to store data in
1516
[SQLite 3 databases](http://www.sqlite.org). It was first designed to work with [Xamarin.iOS](http://xamarin.com),
@@ -33,7 +34,7 @@ Install [sqlite-net-pcl](https://www.nuget.org/packages/sqlite-net-pcl) from NuG
3334

3435
## Source Installation
3536

36-
SQLite-net is all contained in 1 file (I know, so cool right?) and is easy to add to your project. Just add [SQLite.cs](https://github.com/praeclarum/sqlite-net/blob/master/src/SQLite.cs) to your project, and you're ready to start creating tables.
37+
SQLite-net is all contained in 1 file (I know, so cool right?) and is easy to add to your project. Just add [SQLite.cs](https://github.com/praeclarum/sqlite-net/blob/master/src/SQLite.cs) to your project, and you're ready to start creating tables. An asynchronous implementation can be found in [SQLiteAsync.cs](https://github.com/praeclarum/sqlite-net/blob/master/src/SQLiteAsync.cs).
3738

3839
## Please Contribute!
3940

nuget/SQLite-net-base/SQLite-net-base.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<DocumentationFile>bin\Debug\netstandard2.0\SQLite-net.xml</DocumentationFile>
2828
</PropertyGroup>
2929
<ItemGroup>
30-
<PackageReference Include="SQLitePCLRaw.core" Version="2.0.4" />
30+
<PackageReference Include="SQLitePCLRaw.core" Version="2.1.2" />
3131
</ItemGroup>
3232
<ItemGroup>
3333
<Compile Include="..\..\src\SQLite.cs">

nuget/SQLite-net-sqlcipher/SQLite-net-sqlcipher.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<DocumentationFile>bin\Debug\netstandard2.0\SQLite-net.xml</DocumentationFile>
2828
</PropertyGroup>
2929
<ItemGroup>
30-
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="2.0.4" />
30+
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlcipher" Version="2.1.2" />
3131
</ItemGroup>
3232
<ItemGroup>
3333
<Compile Include="..\..\src\SQLite.cs">

nuget/SQLite-net-std/SQLite-net-std.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<DocumentationFile>bin\Debug\netstandard2.0\SQLite-net.xml</DocumentationFile>
2828
</PropertyGroup>
2929
<ItemGroup>
30-
<PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.0.4" />
30+
<PackageReference Include="SQLitePCLRaw.bundle_green" Version="2.1.2" />
3131
</ItemGroup>
3232
<ItemGroup>
3333
<Compile Include="..\..\src\SQLite.cs">

src/SQLite.cs

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,109 @@ public enum CreateFlags
159159
FullTextSearch4 = 0x200
160160
}
161161

162+
public interface ISQLiteConnection
163+
{
164+
Sqlite3DatabaseHandle Handle { get; }
165+
string DatabasePath { get; }
166+
int LibVersionNumber { get; }
167+
bool TimeExecution { get; set; }
168+
bool Trace { get; set; }
169+
Action<string> Tracer { get; set; }
170+
bool StoreDateTimeAsTicks { get; }
171+
bool StoreTimeSpanAsTicks { get; }
172+
string DateTimeStringFormat { get; }
173+
TimeSpan BusyTimeout { get; set; }
174+
IEnumerable<TableMapping> TableMappings { get; }
175+
bool IsInTransaction { get; }
176+
177+
event EventHandler<NotifyTableChangedEventArgs> TableChanged;
178+
179+
void Backup (string destinationDatabasePath, string databaseName = "main");
180+
void BeginTransaction ();
181+
void Close ();
182+
void Commit ();
183+
SQLiteCommand CreateCommand (string cmdText, params object[] ps);
184+
SQLiteCommand CreateCommand (string cmdText, Dictionary<string, object> args);
185+
int CreateIndex (string indexName, string tableName, string[] columnNames, bool unique = false);
186+
int CreateIndex (string indexName, string tableName, string columnName, bool unique = false);
187+
int CreateIndex (string tableName, string columnName, bool unique = false);
188+
int CreateIndex (string tableName, string[] columnNames, bool unique = false);
189+
int CreateIndex<T> (Expression<Func<T, object>> property, bool unique = false);
190+
CreateTableResult CreateTable<T> (CreateFlags createFlags = CreateFlags.None);
191+
CreateTableResult CreateTable (Type ty, CreateFlags createFlags = CreateFlags.None);
192+
CreateTablesResult CreateTables<T, T2> (CreateFlags createFlags = CreateFlags.None)
193+
where T : new()
194+
where T2 : new();
195+
CreateTablesResult CreateTables<T, T2, T3> (CreateFlags createFlags = CreateFlags.None)
196+
where T : new()
197+
where T2 : new()
198+
where T3 : new();
199+
CreateTablesResult CreateTables<T, T2, T3, T4> (CreateFlags createFlags = CreateFlags.None)
200+
where T : new()
201+
where T2 : new()
202+
where T3 : new()
203+
where T4 : new();
204+
CreateTablesResult CreateTables<T, T2, T3, T4, T5> (CreateFlags createFlags = CreateFlags.None)
205+
where T : new()
206+
where T2 : new()
207+
where T3 : new()
208+
where T4 : new()
209+
where T5 : new();
210+
CreateTablesResult CreateTables (CreateFlags createFlags = CreateFlags.None, params Type[] types);
211+
IEnumerable<T> DeferredQuery<T> (string query, params object[] args) where T : new();
212+
IEnumerable<object> DeferredQuery (TableMapping map, string query, params object[] args);
213+
int Delete (object objectToDelete);
214+
int Delete<T> (object primaryKey);
215+
int Delete (object primaryKey, TableMapping map);
216+
int DeleteAll<T> ();
217+
int DeleteAll (TableMapping map);
218+
void Dispose ();
219+
int DropTable<T> ();
220+
int DropTable (TableMapping map);
221+
void EnableLoadExtension (bool enabled);
222+
void EnableWriteAheadLogging ();
223+
int Execute (string query, params object[] args);
224+
T ExecuteScalar<T> (string query, params object[] args);
225+
T Find<T> (object pk) where T : new();
226+
object Find (object pk, TableMapping map);
227+
T Find<T> (Expression<Func<T, bool>> predicate) where T : new();
228+
T FindWithQuery<T> (string query, params object[] args) where T : new();
229+
object FindWithQuery (TableMapping map, string query, params object[] args);
230+
T Get<T> (object pk) where T : new();
231+
object Get (object pk, TableMapping map);
232+
T Get<T> (Expression<Func<T, bool>> predicate) where T : new();
233+
TableMapping GetMapping (Type type, CreateFlags createFlags = CreateFlags.None);
234+
TableMapping GetMapping<T> (CreateFlags createFlags = CreateFlags.None);
235+
List<SQLiteConnection.ColumnInfo> GetTableInfo (string tableName);
236+
int Insert (object obj);
237+
int Insert (object obj, Type objType);
238+
int Insert (object obj, string extra);
239+
int Insert (object obj, string extra, Type objType);
240+
int InsertAll (IEnumerable objects, bool runInTransaction = true);
241+
int InsertAll (IEnumerable objects, string extra, bool runInTransaction = true);
242+
int InsertAll (IEnumerable objects, Type objType, bool runInTransaction = true);
243+
int InsertOrReplace (object obj);
244+
int InsertOrReplace (object obj, Type objType);
245+
List<T> Query<T> (string query, params object[] args) where T : new();
246+
List<object> Query (TableMapping map, string query, params object[] args);
247+
List<T> QueryScalars<T> (string query, params object[] args);
248+
void Release (string savepoint);
249+
void Rollback ();
250+
void RollbackTo (string savepoint);
251+
void RunInTransaction (Action action);
252+
string SaveTransactionPoint ();
253+
TableQuery<T> Table<T> () where T : new();
254+
int Update (object obj);
255+
int Update (object obj, Type objType);
256+
int UpdateAll (IEnumerable objects, bool runInTransaction = true);
257+
}
258+
162259
/// <summary>
163260
/// An open connection to a SQLite database.
164261
/// </summary>
165262
[Preserve (AllMembers = true)]
166263
public partial class SQLiteConnection : IDisposable
264+
, ISQLiteConnection
167265
{
168266
private bool _open;
169267
private TimeSpan _busyTimeout;
@@ -1894,7 +1992,7 @@ public int Update (object obj, Type objType)
18941992
}
18951993
ps.Add (pk.GetValue (obj));
18961994
var q = string.Format ("update \"{0}\" set {1} where \"{2}\" = ? ", map.TableName, string.Join (",", (from c in cols
1897-
select "\"" + c.Name + "\" = ? ").ToArray ()), pk.Name);
1995+
select "\"" + c.Name + "\" = ? ").ToArray ()), pk.Name);
18981996

18991997
try {
19001998
rowsAffected = Execute (q, ps.ToArray ());

src/SQLiteAsync.cs

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,101 @@
2828
using System.Threading;
2929
using System.Threading.Tasks;
3030

31+
#pragma warning disable 1591 // XML Doc Comments
32+
3133
namespace SQLite
3234
{
35+
public interface ISQLiteAsyncConnection
36+
{
37+
string DatabasePath { get; }
38+
int LibVersionNumber { get; }
39+
string DateTimeStringFormat { get; }
40+
bool StoreDateTimeAsTicks { get; }
41+
bool StoreTimeSpanAsTicks { get; }
42+
bool Trace { get; set; }
43+
Action<string> Tracer { get; set; }
44+
bool TimeExecution { get; set; }
45+
IEnumerable<TableMapping> TableMappings { get; }
46+
47+
Task BackupAsync (string destinationDatabasePath, string databaseName = "main");
48+
Task CloseAsync ();
49+
Task<int> CreateIndexAsync (string tableName, string columnName, bool unique = false);
50+
Task<int> CreateIndexAsync (string indexName, string tableName, string columnName, bool unique = false);
51+
Task<int> CreateIndexAsync (string tableName, string[] columnNames, bool unique = false);
52+
Task<int> CreateIndexAsync (string indexName, string tableName, string[] columnNames, bool unique = false);
53+
Task<int> CreateIndexAsync<T> (Expression<Func<T, object>> property, bool unique = false);
54+
Task<CreateTableResult> CreateTableAsync<T> (CreateFlags createFlags = CreateFlags.None) where T : new();
55+
Task<CreateTableResult> CreateTableAsync (Type ty, CreateFlags createFlags = CreateFlags.None);
56+
Task<CreateTablesResult> CreateTablesAsync<T, T2> (CreateFlags createFlags = CreateFlags.None)
57+
where T : new()
58+
where T2 : new();
59+
Task<CreateTablesResult> CreateTablesAsync<T, T2, T3> (CreateFlags createFlags = CreateFlags.None)
60+
where T : new()
61+
where T2 : new()
62+
where T3 : new();
63+
Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4> (CreateFlags createFlags = CreateFlags.None)
64+
where T : new()
65+
where T2 : new()
66+
where T3 : new()
67+
where T4 : new();
68+
Task<CreateTablesResult> CreateTablesAsync<T, T2, T3, T4, T5> (CreateFlags createFlags = CreateFlags.None)
69+
where T : new()
70+
where T2 : new()
71+
where T3 : new()
72+
where T4 : new()
73+
where T5 : new();
74+
Task<CreateTablesResult> CreateTablesAsync (CreateFlags createFlags = CreateFlags.None, params Type[] types);
75+
Task<IEnumerable<T>> DeferredQueryAsync<T> (string query, params object[] args) where T : new();
76+
Task<IEnumerable<object>> DeferredQueryAsync (TableMapping map, string query, params object[] args);
77+
Task<int> DeleteAllAsync<T> ();
78+
Task<int> DeleteAllAsync (TableMapping map);
79+
Task<int> DeleteAsync (object objectToDelete);
80+
Task<int> DeleteAsync<T> (object primaryKey);
81+
Task<int> DeleteAsync (object primaryKey, TableMapping map);
82+
Task<int> DropTableAsync<T> () where T : new();
83+
Task<int> DropTableAsync (TableMapping map);
84+
Task EnableLoadExtensionAsync (bool enabled);
85+
Task EnableWriteAheadLoggingAsync ();
86+
Task<int> ExecuteAsync (string query, params object[] args);
87+
Task<T> ExecuteScalarAsync<T> (string query, params object[] args);
88+
Task<T> FindAsync<T> (object pk) where T : new();
89+
Task<object> FindAsync (object pk, TableMapping map);
90+
Task<T> FindAsync<T> (Expression<Func<T, bool>> predicate) where T : new();
91+
Task<T> FindWithQueryAsync<T> (string query, params object[] args) where T : new();
92+
Task<object> FindWithQueryAsync (TableMapping map, string query, params object[] args);
93+
Task<T> GetAsync<T> (object pk) where T : new();
94+
Task<object> GetAsync (object pk, TableMapping map);
95+
Task<T> GetAsync<T> (Expression<Func<T, bool>> predicate) where T : new();
96+
TimeSpan GetBusyTimeout ();
97+
SQLiteConnectionWithLock GetConnection ();
98+
Task<TableMapping> GetMappingAsync (Type type, CreateFlags createFlags = CreateFlags.None);
99+
Task<TableMapping> GetMappingAsync<T> (CreateFlags createFlags = CreateFlags.None) where T : new();
100+
Task<List<SQLiteConnection.ColumnInfo>> GetTableInfoAsync (string tableName);
101+
Task<int> InsertAllAsync (IEnumerable objects, bool runInTransaction = true);
102+
Task<int> InsertAllAsync (IEnumerable objects, string extra, bool runInTransaction = true);
103+
Task<int> InsertAllAsync (IEnumerable objects, Type objType, bool runInTransaction = true);
104+
Task<int> InsertAsync (object obj);
105+
Task<int> InsertAsync (object obj, Type objType);
106+
Task<int> InsertAsync (object obj, string extra);
107+
Task<int> InsertAsync (object obj, string extra, Type objType);
108+
Task<int> InsertOrReplaceAsync (object obj);
109+
Task<int> InsertOrReplaceAsync (object obj, Type objType);
110+
Task<List<T>> QueryAsync<T> (string query, params object[] args) where T : new();
111+
Task<List<object>> QueryAsync (TableMapping map, string query, params object[] args);
112+
Task<List<T>> QueryScalarsAsync<T> (string query, params object[] args);
113+
Task RunInTransactionAsync (Action<SQLiteConnection> action);
114+
Task SetBusyTimeoutAsync (TimeSpan value);
115+
AsyncTableQuery<T> Table<T> () where T : new();
116+
Task<int> UpdateAllAsync (IEnumerable objects, bool runInTransaction = true);
117+
Task<int> UpdateAsync (object obj);
118+
Task<int> UpdateAsync (object obj, Type objType);
119+
}
120+
33121
/// <summary>
34122
/// A pooled asynchronous connection to a SQLite database.
35123
/// </summary>
36124
public partial class SQLiteAsyncConnection
125+
: ISQLiteAsyncConnection
37126
{
38127
readonly SQLiteConnectionString _connectionString;
39128

@@ -143,7 +232,7 @@ public Task EnableWriteAheadLoggingAsync ()
143232
/// Whether to store DateTime properties as ticks (true) or strings (false).
144233
/// </summary>
145234
public bool StoreDateTimeAsTicks => GetConnection ().StoreDateTimeAsTicks;
146-
235+
147236
/// <summary>
148237
/// Whether to store TimeSpan properties as ticks (true) or strings (false).
149238
/// </summary>
@@ -460,7 +549,7 @@ public Task<int> CreateIndexAsync<T> (Expression<Func<T, object>> property, bool
460549
}
461550

462551
/// <summary>
463-
/// Inserts the given object and (and updates its
552+
/// Inserts the given object and (and updates its
464553
/// auto incremented primary key if it has one).
465554
/// </summary>
466555
/// <param name="obj">

tests/SQLite.Tests/DeleteTest.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using System.Threading.Tasks;
34

45
#if NETFX_CORE
56
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
@@ -36,6 +37,17 @@ SQLiteConnection CreateDb ()
3637
return db;
3738
}
3839

40+
async Task<SQLiteAsyncConnection> CreateDbAsync ()
41+
{
42+
var db = new SQLiteAsyncConnection (new SQLiteConnectionString (TestPath.GetTempFileName ()));
43+
await db.CreateTableAsync<TestTable> ();
44+
var items = from i in Enumerable.Range (0, Count)
45+
select new TestTable { Datum = 1000+i, Test = "Hello World" };
46+
await db.InsertAllAsync (items);
47+
Assert.AreEqual (Count, await db.Table<TestTable> ().CountAsync ());
48+
return db;
49+
}
50+
3951
[Test]
4052
public void DeleteEntityOne ()
4153
{
@@ -47,6 +59,17 @@ public void DeleteEntityOne ()
4759
Assert.AreEqual (Count - 1, db.Table<TestTable> ().Count ());
4860
}
4961

62+
[Test]
63+
public async Task DeleteEntityOneAsync ()
64+
{
65+
var db = await CreateDbAsync ();
66+
67+
var r = await db.DeleteAsync (await db.GetAsync<TestTable> (1));
68+
69+
Assert.AreEqual (1, r);
70+
Assert.AreEqual (Count - 1, await db.Table<TestTable> ().CountAsync ());
71+
}
72+
5073
[Test]
5174
public void DeletePKOne ()
5275
{

tests/SQLite.Tests/DropTableTest.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using System.Text;
77
using SQLite;
8+
using System.Threading.Tasks;
89

910
#if NETFX_CORE
1011
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
@@ -37,6 +38,14 @@ public TestDb () : base(TestPath.GetTempFileName ())
3738
}
3839
}
3940

41+
public class TestDbAsync : SQLiteAsyncConnection
42+
{
43+
public TestDbAsync () : base(TestPath.GetTempFileName ())
44+
{
45+
Trace = true;
46+
}
47+
}
48+
4049
[Test]
4150
public void CreateInsertDrop ()
4251
{
@@ -57,5 +66,31 @@ public void CreateInsertDrop ()
5766

5867
ExceptionAssert.Throws<SQLiteException>(() => db.Table<Product> ().Count ());
5968
}
69+
70+
[Test]
71+
public async Task CreateInsertDropAsync ()
72+
{
73+
var db = new TestDbAsync ();
74+
75+
await db.CreateTableAsync<Product> ();
76+
77+
await db.InsertAsync (new Product {
78+
Name = "Hello",
79+
Price = 16,
80+
});
81+
82+
var n = await db.Table<Product> ().CountAsync ();
83+
84+
Assert.AreEqual (1, n);
85+
86+
await db.DropTableAsync<Product> ();
87+
88+
try {
89+
await db.Table<Product> ().CountAsync ();
90+
Assert.Fail ("Should have thrown");
91+
} catch (SQLiteException) {
92+
// Expected
93+
}
94+
}
6095
}
6196
}

0 commit comments

Comments
 (0)