Files
upstream-mirror 0f4df23290
Some checks failed
kotlin / test (push) Has been skipped
python / test (push) Has been skipped
typescript / test (push) Has been skipped
go / build darwin/amd64 (push) Has been cancelled
go / build linux/amd64 (push) Has been cancelled
go / build windows/amd64 (push) Has been cancelled
go / build darwin/arm64 (push) Has been cancelled
go / build linux/arm64 (push) Has been cancelled
go / build windows/arm64 (push) Has been cancelled
go / test (push) Has been cancelled
go / vuln_check (push) Has been cancelled
snapshot of https://github.com/sqlc-dev/sqlc.git (main, 2026-09-16; blobs > 131072B omitted)
2026-09-16 02:17:34 +05:00

165 lines
4.2 KiB
Go

package bundler
import (
"context"
"errors"
"fmt"
"log/slog"
"os"
"strings"
"google.golang.org/protobuf/proto"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/info"
"github.com/sqlc-dev/sqlc/internal/plugin"
"github.com/sqlc-dev/sqlc/internal/quickdb"
pb "github.com/sqlc-dev/sqlc/internal/quickdb/v1"
)
var ErrNoProject = errors.New(`project uploads require a cloud project
If you don't have a project, you can create one from the sqlc Cloud
dashboard at https://dashboard.sqlc.dev/. If you have a project, ensure
you've set its id as the value of the "project" field within the "cloud"
section of your sqlc configuration. The id will look similar to
"01HA8TWGMYPHK0V2GGMB3R2TP9".`)
var ErrNoAuthToken = errors.New(`project uploads require an auth token
If you don't have an auth token, you can create one from the sqlc Cloud
dashboard at https://dashboard.sqlc.dev/. If you have an auth token, ensure
you've set it as the value of the SQLC_AUTH_TOKEN environment variable.`)
type Uploader struct {
configPath string
config *config.Config
dir string
client pb.QuickClient
}
type QuerySetArchive struct {
Name string
Queries []string
Schema []string
Request *plugin.GenerateRequest
}
func NewUploader(configPath, dir string, conf *config.Config) *Uploader {
return &Uploader{
configPath: configPath,
config: conf,
dir: dir,
}
}
func (up *Uploader) Validate() error {
if up.config.Cloud.Project == "" {
return ErrNoProject
}
if up.config.Cloud.AuthToken == "" {
return ErrNoAuthToken
}
if up.client == nil {
client, err := quickdb.NewClientFromConfig(up.config.Cloud)
if err != nil {
return fmt.Errorf("client init failed: %w", err)
}
up.client = client
}
return nil
}
var envvars = []string{
"GITHUB_REPOSITORY",
"GITHUB_REF",
"GITHUB_REF_NAME",
"GITHUB_REF_TYPE",
"GITHUB_SHA",
}
func annotate() map[string]string {
labels := map[string]string{}
for _, ev := range envvars {
key := strings.ReplaceAll(strings.ToLower(ev), "_", ".")
labels[key] = os.Getenv(ev)
}
return labels
}
func BuildRequest(ctx context.Context, dir, configPath string, results []*QuerySetArchive, tags []string) (*pb.UploadArchiveRequest, error) {
conf, err := readFile(dir, configPath)
if err != nil {
return nil, err
}
res := &pb.UploadArchiveRequest{
SqlcVersion: info.Version,
Config: conf,
Tags: tags,
Annotations: annotate(),
}
for i, result := range results {
schema, err := readFiles(dir, result.Schema)
if err != nil {
return nil, err
}
queries, err := readFiles(dir, result.Queries)
if err != nil {
return nil, err
}
name := result.Name
if name == "" {
name = fmt.Sprintf("queryset_%d", i)
}
genreq, err := proto.Marshal(result.Request)
if err != nil {
return nil, err
}
res.QuerySets = append(res.QuerySets, &pb.QuerySet{
Name: name,
Schema: schema,
Queries: queries,
CodegenRequest: &pb.File{
Name: "codegen_request.pb",
Contents: genreq,
},
})
}
return res, nil
}
func (up *Uploader) buildRequest(ctx context.Context, results []*QuerySetArchive, tags []string) (*pb.UploadArchiveRequest, error) {
return BuildRequest(ctx, up.dir, up.configPath, results, tags)
}
func (up *Uploader) DumpRequestOut(ctx context.Context, result []*QuerySetArchive) error {
req, err := up.buildRequest(ctx, result, []string{})
if err != nil {
return err
}
slog.Info("config", "file", req.Config.Name, "bytes", len(req.Config.Contents))
for _, qs := range req.QuerySets {
slog.Info("codegen_request", "queryset", qs.Name, "file", "codegen_request.pb")
for _, file := range qs.Schema {
slog.Info("schema", "queryset", qs.Name, "file", file.Name, "bytes", len(file.Contents))
}
for _, file := range qs.Queries {
slog.Info("query", "queryset", qs.Name, "file", file.Name, "bytes", len(file.Contents))
}
}
return nil
}
func (up *Uploader) Upload(ctx context.Context, result []*QuerySetArchive, tags []string) error {
if err := up.Validate(); err != nil {
return err
}
req, err := up.buildRequest(ctx, result, tags)
if err != nil {
return err
}
if _, err := up.client.UploadArchive(ctx, req); err != nil {
return fmt.Errorf("upload error: %w", err)
}
return nil
}