From 7c9be1819e2667e88e5c68054d73cf7195880116 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Jan 2026 12:04:59 +0200 Subject: [PATCH 1/2] Added GetUploadQueueStats. --- .../Client/PowerSyncDatabase.cs | 24 +++++++++++++++++++ .../Client/PowerSyncDatabaseTests.cs | 17 +++++++++++++ 2 files changed, 41 insertions(+) diff --git a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs index 420a0c1..c220478 100644 --- a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs +++ b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs @@ -420,6 +420,30 @@ await Database.WriteTransaction(async tx => Closed = true; } + private record UploadQueueStatsResult(int size, int count); + /// + /// Get upload queue size estimate and count. + /// + public async Task GetUploadQueueStats(bool includeSize = false) + { + if (includeSize) + { + var result = await Database.Get( + $"SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM {PSInternalTable.CRUD}" + ); + + return new UploadQueueStats(result.count, result.size); + } + else + { + var result = await Database.Get( + $"SELECT count(*) as count FROM {PSInternalTable.CRUD}" + ); + return new UploadQueueStats(result.count); + } + } + + /// /// Get a batch of crud data to upload. /// diff --git a/Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs b/Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs index 9bbceb4..ed34b5c 100644 --- a/Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs +++ b/Tests/PowerSync/PowerSync.Common.Tests/Client/PowerSyncDatabaseTests.cs @@ -6,6 +6,9 @@ namespace PowerSync.Common.Tests.Client; using PowerSync.Common.Client; +/// +/// dotnet test -v n --framework net8.0 --filter "PowerSyncDatabaseTests" +/// public class PowerSyncDatabaseTests : IAsyncLifetime { private PowerSyncDatabase db = default!; @@ -454,4 +457,18 @@ await db.WriteTransaction(async tx => var afterTx = await db.GetAll("SELECT * FROM assets"); Assert.Equal(2, afterTx.Length); } + + [Fact(Timeout = 5000)] + public async Task GetUploadQueueStatsTest() + { + for (var i = 0; i < 100; i++) + { + await db.Execute("INSERT INTO assets (id) VALUES(?)", ["0" + i + "-writelock"]); + } + + var stats = await db.GetUploadQueueStats(true); + Assert.Equal(100, stats.Count); + Assert.NotNull(stats.Size); + } + } From c2817cd0a3bf9e1a07a114f66c5749dfd6f06c55 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Jan 2026 15:21:22 +0200 Subject: [PATCH 2/2] Using read transaction for upload queue stats. --- .../Client/PowerSyncDatabase.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs index c220478..f0f3166 100644 --- a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs +++ b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs @@ -426,21 +426,24 @@ private record UploadQueueStatsResult(int size, int count); /// public async Task GetUploadQueueStats(bool includeSize = false) { - if (includeSize) + return await ReadTransaction(async tx => { - var result = await Database.Get( - $"SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM {PSInternalTable.CRUD}" - ); + if (includeSize) + { + var result = await tx.Get( + $"SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM {PSInternalTable.CRUD}" + ); - return new UploadQueueStats(result.count, result.size); - } - else - { - var result = await Database.Get( - $"SELECT count(*) as count FROM {PSInternalTable.CRUD}" - ); - return new UploadQueueStats(result.count); - } + return new UploadQueueStats(result.count, result.size); + } + else + { + var result = await tx.Get( + $"SELECT count(*) as count FROM {PSInternalTable.CRUD}" + ); + return new UploadQueueStats(result.count); + } + }); }