cmd/tc-collector/reportExistenceChecker.go (46 lines of code) (raw):
package main
import (
"context"
"fmt"
"strconv"
"time"
"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
"golang.org/x/tools/container/intsets"
)
type ReportExistenceChecker struct {
ids intsets.Sparse
}
func (t *ReportExistenceChecker) reset(taskContext context.Context, dbName string, tableName string, db driver.Conn, since time.Time, buildType string) error {
t.ids.Clear()
var rows driver.Rows
var err error
if dbName == "ij" {
// don't filter by machine - product is enough to reduce set
query := "select tc_build_id from report where generated_time > $1 " + "and tc_build_type = '" + buildType + "' order by tc_build_id"
rows, err = db.Query(taskContext, query, since)
} else {
table := "report"
if tableName != "" {
table = tableName
}
query := "select tc_build_id from " + table + " where generated_time > " + strconv.FormatInt(since.Unix(), 10) + " and tc_build_type = '" + buildType + "' order by tc_build_id"
rows, err = db.Query(taskContext, query, since)
}
if err != nil {
return fmt.Errorf("cannot query db %s table %s: %w", dbName, tableName, err)
}
for rows.Next() {
// clickhouse requires explicit type
var id uint32
err = rows.Scan(&id)
if err != nil {
return fmt.Errorf("cannot scan db %s table %s: %w", dbName, tableName, err)
}
t.ids.Insert(int(id))
}
if rows.Err() != nil {
return fmt.Errorf("cannot scan db %s table %s: %w", dbName, tableName, rows.Err())
}
return nil
}
func (t *ReportExistenceChecker) has(id int) bool {
return t.ids.Has(id)
}