From fc75070a4f1877ba564e4d30d4bd318e395c3f10 Mon Sep 17 00:00:00 2001
From: Leon Mika <lmika@lmika.org>
Date: Thu, 20 Oct 2022 09:51:53 +1100
Subject: [PATCH] Fixed a few bugs

- Fixed a seg fault bug when cancelling a scan or query when no results are available yet
- Reduce the size of each page to return so that progress indicators work
---
 .../dynamo-browse/controllers/tableread.go    |  4 ++++
 .../providers/dynamo/provider.go              | 24 +++++++++++--------
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/internal/dynamo-browse/controllers/tableread.go b/internal/dynamo-browse/controllers/tableread.go
index 7f6dce7..25889ed 100644
--- a/internal/dynamo-browse/controllers/tableread.go
+++ b/internal/dynamo-browse/controllers/tableread.go
@@ -277,6 +277,10 @@ func (c *TableReadController) handleResultSetFromJobResult(filter string, pushba
 
 		var partialResultsErr models.PartialResultsError
 		if errors.As(err, &partialResultsErr) {
+			if newResultSet == nil {
+				return events.StatusMsg("Operation cancelled")
+			}
+
 			return events.Confirm(applyToN("View the ", len(newResultSet.Items()), "item", "items", " returned so far? "), func(yes bool) tea.Msg {
 				if yes {
 					return c.setResultSetAndFilter(newResultSet, filter, pushbackStack, op)
diff --git a/internal/dynamo-browse/providers/dynamo/provider.go b/internal/dynamo-browse/providers/dynamo/provider.go
index 2488d1f..ce71c90 100644
--- a/internal/dynamo-browse/providers/dynamo/provider.go
+++ b/internal/dynamo-browse/providers/dynamo/provider.go
@@ -115,7 +115,9 @@ func (p *Provider) ScanItems(ctx context.Context, tableName string, filterExpr *
 		input.ExpressionAttributeValues = filterExpr.Values()
 	}
 
-	paginator := dynamodb.NewScanPaginator(p.client, input)
+	paginator := dynamodb.NewScanPaginator(p.client, input, func(opt *dynamodb.ScanPaginatorOptions) {
+		opt.Limit = 100
+	})
 
 	items := make([]models.Item, 0)
 
@@ -136,11 +138,11 @@ outer:
 			if len(items) >= maxItems {
 				break outer
 			}
+		}
 
-			if time.Now().After(nextUpdate) {
-				jobs.PostUpdate(ctx, fmt.Sprintf("found %d items", len(items)))
-				nextUpdate = time.Now().Add(1 * time.Second)
-			}
+		if time.Now().After(nextUpdate) {
+			jobs.PostUpdate(ctx, fmt.Sprintf("found %d items", len(items)))
+			nextUpdate = time.Now().Add(1 * time.Second)
 		}
 	}
 
@@ -159,7 +161,9 @@ func (p *Provider) QueryItems(ctx context.Context, tableName string, filterExpr
 		input.ExpressionAttributeValues = filterExpr.Values()
 	}
 
-	paginator := dynamodb.NewQueryPaginator(p.client, input)
+	paginator := dynamodb.NewQueryPaginator(p.client, input, func(opt *dynamodb.QueryPaginatorOptions) {
+		opt.Limit = 100
+	})
 
 	items := make([]models.Item, 0)
 
@@ -180,11 +184,11 @@ outer:
 			if len(items) >= maxItems {
 				break outer
 			}
+		}
 
-			if time.Now().After(nextUpdate) {
-				jobs.PostUpdate(ctx, fmt.Sprintf("found %d items", len(items)))
-				nextUpdate = time.Now().Add(1 * time.Second)
-			}
+		if time.Now().After(nextUpdate) {
+			jobs.PostUpdate(ctx, fmt.Sprintf("found %d items", len(items)))
+			nextUpdate = time.Now().Add(1 * time.Second)
 		}
 	}