Skip to content

Commit 1a5da8b

Browse files
committed
Added ResolveOfflineSyncStatus, bumped sqlite extension and minimum version.
1 parent 6cb2ce6 commit 1a5da8b

File tree

6 files changed

+45
-55
lines changed

6 files changed

+45
-55
lines changed

PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs

Lines changed: 13 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ protected async Task Initialize()
219219
await BucketStorageAdapter.Init();
220220
await LoadVersion();
221221
await UpdateSchema(schema);
222-
await UpdateHasSynced();
222+
await ResolveOfflineSyncStatus();
223223
await Database.Execute("PRAGMA RECURSIVE_TRIGGERS=TRUE");
224224
Ready = true;
225225
Emit(new PowerSyncDBEvent { Initialized = true });
@@ -243,70 +243,33 @@ private async Task LoadVersion()
243243
catch (Exception e)
244244
{
245245
throw new Exception(
246-
$"Unsupported PowerSync extension version. Need >=0.2.0 <1.0.0, got: {sdkVersion}. Details: {e.Message}"
246+
$"Unsupported PowerSync extension version. Need >=0.4.10 <1.0.0, got: {sdkVersion}. Details: {e.Message}"
247247
);
248248
}
249249

250-
// Validate version is >= 0.2.0 and < 1.0.0
251-
if (versionInts[0] != 0 || versionInts[1] < 2 || versionInts[2] < 0)
250+
// Validate version is >= 0.4.10 and < 1.0.0
251+
if (versionInts[0] != 0 || versionInts[1] < 4 || (versionInts[1] == 4 && versionInts[2] < 10))
252252
{
253-
throw new Exception($"Unsupported PowerSync extension version. Need >=0.2.0 <1.0.0, got: {sdkVersion}");
253+
throw new Exception($"Unsupported PowerSync extension version. Need >=0.4.10 <1.0.0, got: {sdkVersion}");
254254
}
255255
}
256256

257-
// protected async resolveOfflineSyncStatus() {
258-
// const result = await this.database.get<{ r: string }>('SELECT powersync_offline_sync_status() as r');
259-
// const parsed = JSON.parse(result.r) as CoreSyncStatus;
260-
261-
// const updatedStatus = new SyncStatus({
262-
// ...this.currentStatus.toJSON(),
263-
// ...coreStatusToJs(parsed)
264-
// });
265-
266-
// if (!updatedStatus.isEqual(this.currentStatus)) {
267-
// this.currentStatus = updatedStatus;
268-
// this.iterateListeners((l) => l.statusChanged?.(this.currentStatus));
269-
// }
270-
// }
271-
// TODO DELETE
272-
private record LastSyncedResult(int priority, string? last_synced_at);
273-
274-
protected async Task UpdateHasSynced()
257+
private record OfflineSyncStatusResult(string r);
258+
protected async Task ResolveOfflineSyncStatus()
275259
{
276-
var results = await Database.GetAll<LastSyncedResult>(
277-
"SELECT priority, last_synced_at FROM ps_sync_state ORDER BY priority DESC"
278-
);
279-
280-
DateTime? lastCompleteSync = null;
281-
List<DB.Crud.SyncPriorityStatus> priorityStatuses = [];
260+
var result = await Database.Get<OfflineSyncStatusResult>("SELECT powersync_offline_sync_status() as r");
261+
var parsed = JsonConvert.DeserializeObject<CoreSyncStatus>(result.r);
282262

283-
// TODO: Will be altered/extended when reporting individual sync priority statuses is supported
284-
foreach (var result in results)
285-
{
286-
var parsedDate = DateTime.Parse(result.last_synced_at + "Z");
287-
288-
if (result.priority == FULL_SYNC_PRIORITY)
289-
{
290-
// This lowest-possible priority represents a complete sync.
291-
lastCompleteSync = parsedDate;
292-
}
293-
}
263+
var parsedSyncStatus = CoreInstructionHelpers.CoreStatusToSyncStatus(parsed!);
264+
var updatedStatus = CurrentStatus.CreateUpdatedStatus(parsedSyncStatus);
294265

295-
var hasSynced = lastCompleteSync != null;
296-
if (hasSynced != CurrentStatus.HasSynced)
266+
if (!updatedStatus.IsEqual(CurrentStatus))
297267
{
298-
CurrentStatus = new SyncStatus(new SyncStatusOptions(CurrentStatus.Options)
299-
{
300-
HasSynced = hasSynced,
301-
LastSyncedAt = lastCompleteSync,
302-
});
303-
268+
CurrentStatus = updatedStatus;
304269
Emit(new PowerSyncDBEvent { StatusChanged = CurrentStatus });
305270
}
306271
}
307272

308-
309-
310273
/// <summary>
311274
/// Replace the schema with a new version. This is for advanced use cases - typically the schema should just be specified once in the constructor.
312275
/// Cannot be used while connected - this should only be called before <see cref="Connect"/>.

PowerSync/PowerSync.Common/Client/Sync/Stream/CoreInstructions.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,12 @@ public static DB.Crud.SyncPriorityStatus PriorityToStatus(SyncPriorityStatus sta
142142
};
143143
}
144144

145-
public static DB.Crud.SyncStatusOptions CoreStatusToSyncStatus(CoreSyncStatus status)
145+
public static DB.Crud.SyncStatus CoreStatusToSyncStatus(CoreSyncStatus status)
146+
{
147+
return new DB.Crud.SyncStatus(CoreStatusToSyncStatusOptions(status));
148+
}
149+
150+
public static DB.Crud.SyncStatusOptions CoreStatusToSyncStatusOptions(CoreSyncStatus status)
146151
{
147152
var coreCompleteSync =
148153
status.PriorityStatus.FirstOrDefault(s => s.Priority == SyncProgress.FULL_SYNC_PRIORITY);

PowerSync/PowerSync.Common/Client/Sync/Stream/StreamingSyncImplementation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ async Task HandleInstruction(Instruction instruction)
537537
}
538538
break;
539539
case UpdateSyncStatus syncStatus:
540-
UpdateSyncStatus(CoreInstructionHelpers.CoreStatusToSyncStatus(syncStatus.Status));
540+
UpdateSyncStatus(CoreInstructionHelpers.CoreStatusToSyncStatusOptions(syncStatus.Status));
541541
break;
542542
case EstablishSyncStream establishSyncStream:
543543
if (receivingLines != null)

PowerSync/PowerSync.Common/DB/Crud/SyncStatus.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,27 @@ public SyncPriorityStatus StatusForPriority(int priority)
152152
};
153153
}
154154

155+
/// <summary>
156+
/// Creates an updated SyncStatus by merging the current status with the provided updated status.
157+
/// </summary>
158+
public SyncStatus CreateUpdatedStatus(SyncStatus updatedStatus)
159+
{
160+
var updatedOptions = updatedStatus.Options;
161+
var currentOptions = Options;
162+
163+
var parsedOptions = new SyncStatusOptions
164+
{
165+
Connected = updatedOptions.Connected ?? currentOptions.Connected,
166+
Connecting = updatedOptions.Connecting ?? currentOptions.Connecting,
167+
LastSyncedAt = updatedOptions.LastSyncedAt ?? currentOptions.LastSyncedAt,
168+
HasSynced = updatedOptions.HasSynced ?? currentOptions.HasSynced,
169+
PriorityStatusEntries = updatedOptions.PriorityStatusEntries ?? currentOptions.PriorityStatusEntries,
170+
DataFlow = updatedOptions.DataFlow ?? currentOptions.DataFlow,
171+
};
172+
173+
return new SyncStatus(parsedOptions);
174+
}
175+
155176
private string SerializeObject()
156177
{
157178
return JsonConvert.SerializeObject(new { Options, UploadErrorMessage = Options.DataFlow?.UploadError?.Message, DownloadErrorMessage = DataFlowStatus.DownloadError?.Message });

Tests/PowerSync/PowerSync.Common.IntegrationTests/SyncIntegrationTests.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ public async Task InitializeAsync()
4242
await db.Init();
4343
var connector = new NodeConnector(userId);
4444

45-
await ClearAllData();
46-
4745
Console.WriteLine($"Using User ID: {userId}");
4846
try
4947
{

Tools/Setup/Setup.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
using System.Collections.Generic;
66
using System.IO.Compression;
77

8+
/// <summary>
9+
/// Execute with `dotnet run --project Tools/Setup`
10+
/// </summary>
811
public class PowerSyncSetup
912
{
10-
private const string VERSION = "0.4.9";
13+
private const string VERSION = "0.4.10";
1114

1215
private const string GITHUB_BASE_URL = $"https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v{VERSION}";
1316
private const string MAVEN_BASE_URL = $"https://repo1.maven.org/maven2/com/powersync/powersync-sqlite-core/{VERSION}";

0 commit comments

Comments
 (0)