-
Notifications
You must be signed in to change notification settings - Fork 1k
Expand file tree
/
Copy pathengine.go
More file actions
128 lines (111 loc) · 3.22 KB
/
engine.go
File metadata and controls
128 lines (111 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package compiler
import (
"context"
"fmt"
"github.com/sqlc-dev/sqlc/internal/analyzer"
"github.com/sqlc-dev/sqlc/internal/config"
"github.com/sqlc-dev/sqlc/internal/dbmanager"
"github.com/sqlc-dev/sqlc/internal/engine/dolphin"
"github.com/sqlc-dev/sqlc/internal/engine/postgresql"
pganalyze "github.com/sqlc-dev/sqlc/internal/engine/postgresql/analyzer"
"github.com/sqlc-dev/sqlc/internal/engine/sqlite"
"github.com/sqlc-dev/sqlc/internal/opts"
"github.com/sqlc-dev/sqlc/internal/sql/catalog"
)
type Compiler struct {
conf config.SQL
combo config.CombinedSettings
catalog *catalog.Catalog
parser Parser
result *Result
analyzer analyzer.Analyzer
client dbmanager.Client
selector selector
schema []string
}
func NewCompiler(conf config.SQL, combo config.CombinedSettings) (*Compiler, error) {
c := &Compiler{conf: conf, combo: combo}
if conf.Database != nil && conf.Database.Managed {
client := dbmanager.NewClient(combo.Global.Servers)
c.client = client
}
// Check if skip_parser is enabled
skipParser := conf.Analyzer.SkipParser != nil && *conf.Analyzer.SkipParser
// If skip_parser is enabled, we must have database analyzer enabled
if skipParser {
if conf.Database == nil {
return nil, fmt.Errorf("skip_parser requires database configuration")
}
if conf.Analyzer.Database != nil && !*conf.Analyzer.Database {
return nil, fmt.Errorf("skip_parser requires database analyzer to be enabled")
}
// Only PostgreSQL is supported for now
if conf.Engine != config.EnginePostgreSQL {
return nil, fmt.Errorf("skip_parser is only supported for PostgreSQL")
}
}
switch conf.Engine {
case config.EngineSQLite:
c.parser = sqlite.NewParser()
c.catalog = sqlite.NewCatalog()
c.selector = newSQLiteSelector()
case config.EngineMySQL:
c.parser = dolphin.NewParser()
c.catalog = dolphin.NewCatalog()
c.selector = newDefaultSelector()
case config.EnginePostgreSQL:
// Skip parser and catalog if skip_parser is enabled
if !skipParser {
c.parser = postgresql.NewParser()
c.catalog = postgresql.NewCatalog()
}
c.selector = newDefaultSelector()
if conf.Database != nil {
if conf.Analyzer.Database == nil || *conf.Analyzer.Database {
c.analyzer = analyzer.Cached(
pganalyze.New(c.client, *conf.Database),
combo.Global,
*conf.Database,
)
}
}
default:
return nil, fmt.Errorf("unknown engine: %s", conf.Engine)
}
return c, nil
}
func (c *Compiler) Catalog() *catalog.Catalog {
return c.catalog
}
func (c *Compiler) ParseCatalog(schema []string) error {
return c.parseCatalog(schema)
}
func (c *Compiler) ParseQueries(queries []string, o opts.Parser) error {
// Check if skip_parser is enabled
skipParser := c.conf.Analyzer.SkipParser != nil && *c.conf.Analyzer.SkipParser
var r *Result
var err error
if skipParser {
// Use database analyzer only, skip parser and catalog
r, err = c.parseQueriesWithAnalyzer(o)
} else {
// Use traditional parser-based approach
r, err = c.parseQueries(o)
}
if err != nil {
return err
}
c.result = r
return nil
}
func (c *Compiler) Result() *Result {
return c.result
}
func (c *Compiler) Close(ctx context.Context) {
if c.analyzer != nil {
c.analyzer.Close(ctx)
}
if c.client != nil {
c.client.Close(ctx)
}
}