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