diff --git a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs index 420a0c1..f0f3166 100644 --- a/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs +++ b/PowerSync/PowerSync.Common/Client/PowerSyncDatabase.cs @@ -420,6 +420,33 @@ 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) + { + return await ReadTransaction(async tx => + { + 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 tx.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); + } + }