init
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
package store
|
||||
|
||||
import "context"
|
||||
|
||||
// Counts is the summary behind GET /api/v1/system/info.
|
||||
type Counts struct {
|
||||
Projects int64
|
||||
Deployments int64
|
||||
Blobs int64
|
||||
// CASBytes is the size of the blobs the store believes are on disk. It is
|
||||
// the deduplicated total, so it is smaller — usually much smaller — than the
|
||||
// sum of the deployments' sizes.
|
||||
CASBytes int64
|
||||
}
|
||||
|
||||
// Counts gathers the summary in one round trip.
|
||||
//
|
||||
// The subqueries are counted separately rather than joined: a join would have
|
||||
// to fan out over deployment_files and then collapse again, which on a large
|
||||
// manifest is thousands of times the work for the same four numbers.
|
||||
func (d *DB) Counts(ctx context.Context) (Counts, error) {
|
||||
var c Counts
|
||||
err := d.r.QueryRowContext(ctx, `
|
||||
SELECT (SELECT count(*) FROM projects),
|
||||
(SELECT count(*) FROM deployments),
|
||||
(SELECT count(*) FROM blobs WHERE present = 1),
|
||||
(SELECT coalesce(sum(size), 0) FROM blobs WHERE present = 1)`).
|
||||
Scan(&c.Projects, &c.Deployments, &c.Blobs, &c.CASBytes)
|
||||
return c, err
|
||||
}
|
||||
Reference in New Issue
Block a user