internal/database: add CollectInts

A CollectInts function is added as a shortcut for fetching IDs from a
single column.

Change-Id: Ide61b936382545a73dd9e7c623b6d26364cc8608
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/349895
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jamal Carvalho <jamal@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/internal/database/database.go b/internal/database/database.go
index ddfd074..c644334 100644
--- a/internal/database/database.go
+++ b/internal/database/database.go
@@ -538,6 +538,24 @@
 	)
 }
 
+// CollectInts runs the query, which must select for a single INTEGER or BIGINT
+// column, and returns a slice of the resulting ints.
+func (db *DB) CollectInts(ctx context.Context, query string, args ...interface{}) (ints []int, err error) {
+	defer derrors.WrapStack(&err, "DB.CollectInts(%q)", query)
+	err = db.RunQuery(ctx, query, func(rows *sql.Rows) error {
+		var i int
+		if err := rows.Scan(&i); err != nil {
+			return err
+		}
+		ints = append(ints, i)
+		return nil
+	}, args...)
+	if err != nil {
+		return nil, err
+	}
+	return ints, nil
+}
+
 // CollectStrings runs the query, which must select for a single string column, and returns
 // a slice of the resulting strings.
 func (db *DB) CollectStrings(ctx context.Context, query string, args ...interface{}) (ss []string, err error) {