Skip to content

Commit 5c5729c

Browse files
committed
Fix tests and add dynamic query result support
1 parent e958aef commit 5c5729c

5 files changed

Lines changed: 103 additions & 8 deletions

File tree

PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ public interface IPowerSyncDatabase : IEventStream<PowerSyncDBEvent>
6868

6969
Task<T> Get<T>(string sql, object?[]? parameters = null);
7070

71+
Task<dynamic[]> GetAll(string sql, object?[]? parameters = null);
72+
73+
Task<dynamic?> GetOptional(string sql, object?[]? parameters = null);
74+
75+
Task<dynamic> Get(string sql, object?[]? parameters = null);
76+
7177
Task<T> ReadLock<T>(Func<ILockContext, Task<T>> fn, DBLockOptions? options = null);
7278

7379
Task<T> ReadTransaction<T>(Func<ITransaction, Task<T>> fn, DBLockOptions? options = null);
@@ -590,6 +596,23 @@ public async Task<NonQueryResult> ExecuteBatch(string query, object?[][]? parame
590596
return await Database.ExecuteBatch(query, parameters);
591597
}
592598

599+
public async Task<dynamic[]> GetAll(string query, object?[]? parameters = null)
600+
{
601+
await WaitForReady();
602+
return await Database.GetAll(query, parameters);
603+
}
604+
605+
public async Task<dynamic?> GetOptional(string query, object?[]? parameters = null)
606+
{
607+
await WaitForReady();
608+
return await Database.GetOptional(query, parameters);
609+
}
610+
public async Task<dynamic> Get(string query, object?[]? parameters = null)
611+
{
612+
await WaitForReady();
613+
return await Database.Get(query, parameters);
614+
}
615+
593616
public async Task<T[]> GetAll<T>(string query, object?[]? parameters = null)
594617
{
595618
await WaitForReady();
@@ -693,13 +716,13 @@ public Task Watch<T>(string query, object?[]? parameters, WatchHandler<T> handle
693716

694717
private class ExplainedResult
695718
{
696-
public int addr;
697-
public string opcode;
698-
public int p1;
699-
public int p2;
700-
public int p3;
701-
public string p4;
702-
public int p5;
719+
public int addr = 0;
720+
public string opcode = "";
721+
public int p1 = 0;
722+
public int p2 = 0;
723+
public int p3 = 0;
724+
public string p4 = "";
725+
public int p5 = 0;
703726
}
704727
private record TableSelectResult(string tbl_name);
705728
public async Task<string[]> ResolveTables(string sql, object?[]? parameters = null, SQLWatchOptions? options = null)

PowerSync/PowerSync.Common/DB/IDBAdapter.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,15 @@ public interface IDBGetUtils
3131
{
3232
// Execute a read-only query and return results.
3333
Task<T[]> GetAll<T>(string sql, object?[]? parameters = null);
34+
Task<dynamic[]> GetAll(string sql, object?[]? parameters = null);
3435

3536
// Execute a read-only query and return the first result, or null if the ResultSet is empty.
3637
Task<T?> GetOptional<T>(string sql, object?[]? parameters = null);
38+
Task<dynamic?> GetOptional(string sql, object?[]? parameters = null);
3739

3840
// Execute a read-only query and return the first result, error if the ResultSet is empty.
3941
Task<T> Get<T>(string sql, object?[]? parameters = null);
42+
Task<dynamic> Get(string sql, object?[]? parameters = null);
4043
}
4144

4245
public interface ILockContext : IDBGetUtils

PowerSync/PowerSync.Common/MDSQLite/MDSQLiteAdapter.cs

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ public async Task<NonQueryResult> ExecuteBatch(string query, object?[][]? parame
157157
public async Task<T> Get<T>(string sql, object?[]? parameters = null)
158158
{
159159
return await ReadLock((ctx) => ctx.Get<T>(sql, parameters));
160-
;
161160
}
162161

163162
public async Task<T[]> GetAll<T>(string sql, object?[]? parameters = null)
@@ -170,6 +169,21 @@ public async Task<T[]> GetAll<T>(string sql, object?[]? parameters = null)
170169
return await ReadLock((ctx) => ctx.GetOptional<T>(sql, parameters));
171170
}
172171

172+
public async Task<dynamic> Get(string sql, object?[]? parameters = null)
173+
{
174+
return await ReadLock((ctx) => ctx.Get(sql, parameters));
175+
}
176+
177+
public async Task<dynamic[]> GetAll(string sql, object?[]? parameters = null)
178+
{
179+
return await ReadLock((ctx) => ctx.GetAll(sql, parameters));
180+
}
181+
182+
public async Task<dynamic?> GetOptional(string sql, object?[]? parameters = null)
183+
{
184+
return await ReadLock((ctx) => ctx.GetOptional(sql, parameters));
185+
}
186+
173187
public async Task<T> ReadTransaction<T>(Func<ITransaction, Task<T>> fn, DBLockOptions? options = null)
174188
{
175189
return await ReadLock((ctx) => InternalTransaction(new MDSQLiteTransaction(readConnection!)!, fn));
@@ -325,4 +339,19 @@ public Task<T[]> GetAll<T>(string sql, object?[]? parameters = null)
325339
{
326340
return connection.GetOptional<T>(sql, parameters);
327341
}
342+
343+
public Task<dynamic> Get(string sql, object?[]? parameters = null)
344+
{
345+
return connection.Get(sql, parameters);
346+
}
347+
348+
public Task<dynamic[]> GetAll(string sql, object?[]? parameters = null)
349+
{
350+
return connection.GetAll(sql, parameters);
351+
}
352+
353+
public Task<dynamic?> GetOptional(string sql, object?[]? parameters = null)
354+
{
355+
return connection.GetOptional(sql, parameters);
356+
}
328357
}

PowerSync/PowerSync.Common/MDSQLite/MDSQLiteConnection.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,30 @@ public async Task<T[]> GetAll<T>(string query, object?[]? parameters = null)
184184
: await Db.QueryAsync<T>(query, dynamicParams, commandType: CommandType.Text)];
185185
}
186186

187+
public async Task<dynamic?> GetOptional(string query, object?[]? parameters = null)
188+
{
189+
DynamicParameters? dynamicParams = PrepareQuery(ref query, parameters);
190+
return dynamicParams == null
191+
? await Db.QueryFirstOrDefaultAsync(query, commandType: CommandType.Text)
192+
: await Db.QueryFirstOrDefaultAsync(query, dynamicParams, commandType: CommandType.Text);
193+
}
194+
195+
public async Task<dynamic> Get(string query, object?[]? parameters = null)
196+
{
197+
DynamicParameters? dynamicParams = PrepareQuery(ref query, parameters);
198+
return dynamicParams == null
199+
? await Db.QueryFirstAsync(query, commandType: CommandType.Text)
200+
: await Db.QueryFirstAsync(query, dynamicParams, commandType: CommandType.Text);
201+
}
202+
203+
public async Task<dynamic[]> GetAll(string query, object?[]? parameters = null)
204+
{
205+
DynamicParameters? dynamicParams = PrepareQuery(ref query, parameters);
206+
return [..dynamicParams == null
207+
? await Db.QueryAsync(query, commandType: CommandType.Text)
208+
: await Db.QueryAsync(query, dynamicParams, commandType: CommandType.Text)];
209+
}
210+
187211
public async Task<NonQueryResult> Execute(string query, object?[]? parameters = null)
188212
{
189213
DynamicParameters? dynamicParams = PrepareQuery(ref query, parameters);

Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,4 +508,20 @@ public async Task GetUploadQueueStatsTest()
508508
Assert.NotNull(stats.Size);
509509
}
510510

511+
[Fact]
512+
public async Task DynamicQueryTest()
513+
{
514+
string id = Guid.NewGuid().ToString();
515+
string description = "new description";
516+
string make = "some make";
517+
await db.Execute(
518+
"insert into assets (id, description, make) values (?, ?, ?)",
519+
[id, description, make]
520+
);
521+
522+
var dynamicAsset = await db.Get("select id, description, make from assets");
523+
Assert.Equal(id, dynamicAsset.id);
524+
Assert.Equal(description, dynamicAsset.description);
525+
Assert.Equal(make, dynamicAsset.make);
526+
}
511527
}

0 commit comments

Comments
 (0)