@@ -306,10 +306,21 @@ func deletePresavedEntries(ctx context.Context, entry *data.HistoryEntry, isRetr
306306func handleDumpRequests (ctx context.Context , dumpRequests []* shared.DumpRequest ) error {
307307 db := hctx .GetDb (ctx )
308308 config := hctx .GetConf (ctx )
309- if len (dumpRequests ) > 0 {
310- lib .CheckFatalError (lib .RetrieveAdditionalEntriesFromRemote (ctx , "newclient" ))
311- entries , err := lib .Search (ctx , db , "" , 0 )
309+ if len (dumpRequests ) == 0 {
310+ return nil
311+ }
312+ if config .IsOffline {
313+ return nil
314+ }
315+ lib .CheckFatalError (lib .RetrieveAdditionalEntriesFromRemote (ctx , "newclient" ))
316+ chunkSize := 1000
317+ offset := 0
318+ for {
319+ entries , err := lib .SearchWithOffset (ctx , db , "" , chunkSize , offset )
312320 lib .CheckFatalError (err )
321+ if len (entries ) == 0 {
322+ break
323+ }
313324 var encEntries []* shared.EncHistoryEntry
314325 for _ , entry := range entries {
315326 enc , err := data .EncryptHistoryEntry (config .UserSecret , * entry )
@@ -319,13 +330,17 @@ func handleDumpRequests(ctx context.Context, dumpRequests []*shared.DumpRequest)
319330 reqBody , err := json .Marshal (encEntries )
320331 lib .CheckFatalError (err )
321332 for _ , dumpRequest := range dumpRequests {
322- if ! config .IsOffline {
323- // TODO: Test whether this fails if the data is extremely large? It may need to be chunked
324- _ , err := lib .ApiPost (ctx , "/api/v1/submit-dump?user_id=" + dumpRequest .UserId + "&requesting_device_id=" + dumpRequest .RequestingDeviceId + "&source_device_id=" + config .DeviceId , "application/json" , reqBody )
325- lib .CheckFatalError (err )
326- }
333+ _ , err := lib .ApiPost (ctx , "/api/v1/submit-dump?user_id=" + dumpRequest .UserId + "&requesting_device_id=" + dumpRequest .RequestingDeviceId + "&source_device_id=" + config .DeviceId + "&is_chunk=true" , "application/json" , reqBody )
334+ lib .CheckFatalError (err )
327335 }
328336 }
337+ // Send a final dump response without the `is_chunk` param so that the backend knows we're done
338+ reqBody , err := json .Marshal ([]* shared.EncHistoryEntry {})
339+ lib .CheckFatalError (err )
340+ for _ , dumpRequest := range dumpRequests {
341+ _ , err := lib .ApiPost (ctx , "/api/v1/submit-dump?user_id=" + dumpRequest .UserId + "&requesting_device_id=" + dumpRequest .RequestingDeviceId + "&source_device_id=" + config .DeviceId + "&is_chunk=true" , "application/json" , reqBody )
342+ lib .CheckFatalError (err )
343+ }
329344 return nil
330345}
331346
0 commit comments