Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Address comments
  • Loading branch information
kyleconroy committed Oct 20, 2023
commit ea2001bdc589cc3c3d4dfea7cc2ed92ab875865c
186 changes: 92 additions & 94 deletions internal/analyzer/pb/pb.pb.go → internal/analysis/analysis.pb.go

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 43 additions & 23 deletions internal/analyzer/analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ package analyzer

import (
"context"
"encoding/json"
"fmt"
"hash/fnv"
"os"
"path/filepath"

"golang.org/x/exp/slog"
"google.golang.org/protobuf/proto"

"github.com/sqlc-dev/sqlc/internal/analyzer/pb"
"github.com/sqlc-dev/sqlc/internal/analysis"
"github.com/sqlc-dev/sqlc/internal/cache"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/info"
Expand All @@ -18,43 +20,56 @@ import (
)

type CachedAnalyzer struct {
a Analyzer
configPath string
config []byte
db config.Database
a Analyzer
config config.Config
configBytes []byte
db config.Database
}

func Cached(a Analyzer, cp string, db config.Database) *CachedAnalyzer {
func Cached(a Analyzer, c config.Config, db config.Database) *CachedAnalyzer {
return &CachedAnalyzer{
a: a,
configPath: cp,
db: db,
a: a,
config: c,
db: db,
}
}

func (c *CachedAnalyzer) Analyze(ctx context.Context, n ast.Node, q string, schema []string, np *named.ParamSet) (*pb.Analysis, error) {
// Create a new error here

func (c *CachedAnalyzer) Analyze(ctx context.Context, n ast.Node, q string, schema []string, np *named.ParamSet) (*analysis.Analysis, error) {
result, rerun, err := c.analyze(ctx, n, q, schema, np)
if rerun {
if err != nil {
slog.Warn("first analysis failed with error", "err", err)
}
return c.a.Analyze(ctx, n, q, schema, np)
}
return result, err
}

func (c *CachedAnalyzer) analyze(ctx context.Context, n ast.Node, q string, schema []string, np *named.ParamSet) (*analysis.Analysis, bool, error) {
// Only cache queries for managed databases. We can't be certain the the
// database is in an unchanged state otherwise
if !c.db.Managed {
return c.a.Analyze(ctx, n, q, schema, np)
return nil, true, nil
}

dir, err := cache.AnalysisDir()
if err != nil {
return nil, err
return nil, true, err
}

if c.config == nil {
c.config, err = os.ReadFile(c.configPath)
if c.configBytes == nil {
c.configBytes, err = json.Marshal(c.config)
if err != nil {
return nil, err
return nil, true, err
}
}

// Calculate cache key
h := fnv.New64()
h.Write([]byte(info.Version))
h.Write(c.config)
h.Write(c.configBytes)
for _, m := range schema {
h.Write([]byte(m))
}
Expand All @@ -65,32 +80,37 @@ func (c *CachedAnalyzer) Analyze(ctx context.Context, n ast.Node, q string, sche
if _, err := os.Stat(path); err == nil {
contents, err := os.ReadFile(path)
if err != nil {
return nil, err
return nil, true, err
}
var a pb.Analysis
return &a, proto.Unmarshal(contents, &a)
var a analysis.Analysis
if err := proto.Unmarshal(contents, &a); err != nil {
return nil, true, err
}
return &a, false, nil
}

result, err := c.a.Analyze(ctx, n, q, schema, np)

if err == nil {
contents, err := proto.Marshal(result)
if err != nil {
return nil, err
slog.Warn("unable to marshal analysis", "err", err)
return result, false, nil
}
if err := os.WriteFile(path, contents, 0644); err != nil {
return nil, err
slog.Warn("saving analysis to disk failed", "err", err)
return result, false, nil
}
}

return result, err
return result, false, err
}

func (c *CachedAnalyzer) Close(ctx context.Context) error {
return c.a.Close(ctx)
}

type Analyzer interface {
Analyze(context.Context, ast.Node, string, []string, *named.ParamSet) (*pb.Analysis, error)
Analyze(context.Context, ast.Node, string, []string, *named.ParamSet) (*analysis.Analysis, error)
Close(context.Context) error
}
14 changes: 5 additions & 9 deletions internal/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,18 @@ import (
"path/filepath"
)

// The cache directory defaults to ~/.cache/sqlc. This location can be overriden
// by the SQLCCACHE or XDG_CACHE_HOME environment variable.
// The cache directory defaults to os.UserCacheDir(). This location can be
// overridden by the SQLCCACHE environment variable.
//
// Currently the cache stores two types of data: plugins and query analysis
func Dir() (string, error) {
cache := os.Getenv("SQLCCACHE")
if cache != "" {
return cache, nil
}
cacheHome := os.Getenv("XDG_CACHE_HOME")
if cacheHome == "" {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
cacheHome = filepath.Join(home, ".cache")
cacheHome, err := os.UserCacheDir()
if err != nil {
return "", err
}
return filepath.Join(cacheHome, "sqlc"), nil
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ func Generate(ctx context.Context, dir, filename string, o *Options) (map[string
errout := &stderrs[i]

grp.Go(func() error {
combo := config.Combine(configPath, *conf, sql.SQL)
combo := config.Combine(*conf, sql.SQL)
if sql.Plugin != nil {
combo.Codegen = *sql.Plugin
}
Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/vet.go
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ func (c *checker) DSN(dsn string) (string, error) {

func (c *checker) checkSQL(ctx context.Context, s config.SQL) error {
// TODO: Create a separate function for this logic so we can
combo := config.Combine(c.ConfigPath, *c.Conf, s)
combo := config.Combine(*c.Conf, s)

// TODO: This feels like a hack that will bite us later
joined := make([]string, 0, len(s.Schema))
Expand Down
2 changes: 1 addition & 1 deletion internal/compiler/analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package compiler
import (
"sort"

analyzer "github.com/sqlc-dev/sqlc/internal/analyzer/pb"
analyzer "github.com/sqlc-dev/sqlc/internal/analysis"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/source"
"github.com/sqlc-dev/sqlc/internal/sql/ast"
Expand Down
2 changes: 1 addition & 1 deletion internal/compiler/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func NewCompiler(conf config.SQL, combo config.CombinedSettings) (*Compiler, err
if conf.Analyzer.Database == nil || *conf.Analyzer.Database {
c.analyzer = analyzer.Cached(
pganalyze.New(c.client, *conf.Database),
combo.Path,
combo.Global,
*conf.Database,
)
}
Expand Down
4 changes: 1 addition & 3 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,6 @@ func ParseConfig(rd io.Reader) (Config, error) {
}

type CombinedSettings struct {
Path string
Global Config
Package SQL
Go SQLGo
Expand All @@ -252,9 +251,8 @@ type CombinedSettings struct {
Codegen Codegen
}

func Combine(path string, conf Config, pkg SQL) CombinedSettings {
func Combine(conf Config, pkg SQL) CombinedSettings {
cs := CombinedSettings{
Path: path,
Global: conf,
Package: pkg,
Rename: map[string]string{},
Expand Down
2 changes: 1 addition & 1 deletion internal/engine/postgresql/analyzer/analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/jackc/pgx/v5/pgconn"
"github.com/jackc/pgx/v5/pgxpool"

core "github.com/sqlc-dev/sqlc/internal/analyzer/pb"
core "github.com/sqlc-dev/sqlc/internal/analysis"
"github.com/sqlc-dev/sqlc/internal/config"
pb "github.com/sqlc-dev/sqlc/internal/quickdb/v1"
"github.com/sqlc-dev/sqlc/internal/sql/ast"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
syntax = "proto3";

package analyzer.pb;
package analysis;

option go_package = "github.com/sqlc-dev/sqlc/internal/analyzer/pb";
option go_package = "github.com/sqlc-dev/sqlc/internal/analysis";

message Identifier {
string catalog = 1;
Expand Down