Skip to content

Commit dcf1a36

Browse files
authored
fix: Late setup for format and stage (cloudquery#14528)
Shouldn't attempt to `CREATE STAGE` and `CREATE FORMAT` before migrate starts so we can have `cloudquery migrate` with fewer permissions required.
1 parent e4e113b commit dcf1a36

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

plugins/destination/snowflake/client/client.go

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"encoding/json"
77
"fmt"
8+
"sync"
89

910
"github.com/cloudquery/plugin-sdk/v4/plugin"
1011
"github.com/cloudquery/plugin-sdk/v4/writers/batchwriter"
@@ -19,12 +20,15 @@ type Client struct {
1920
logger zerolog.Logger
2021
spec Spec
2122
writer *batchwriter.BatchWriter
23+
24+
setupWriteOnce *sync.Once
2225
}
2326

24-
func New(ctx context.Context, logger zerolog.Logger, spec []byte, _ plugin.NewClientOptions) (plugin.Client, error) {
27+
func New(_ context.Context, logger zerolog.Logger, spec []byte, _ plugin.NewClientOptions) (plugin.Client, error) {
2528
var err error
2629
c := &Client{
27-
logger: logger.With().Str("module", "sf-dest").Logger(),
30+
logger: logger.With().Str("module", "sf-dest").Logger(),
31+
setupWriteOnce: &sync.Once{},
2832
}
2933
if err := json.Unmarshal(spec, &c.spec); err != nil {
3034
return nil, fmt.Errorf("failed to unmarshal snowflake spec: %w", err)
@@ -43,12 +47,6 @@ func New(ctx context.Context, logger zerolog.Logger, spec []byte, _ plugin.NewCl
4347
return nil, err
4448
}
4549
c.db = db
46-
if _, err := c.db.ExecContext(ctx, createOrReplaceFileFormat); err != nil {
47-
return nil, fmt.Errorf("failed to create file format %s: %w", createOrReplaceFileFormat, err)
48-
}
49-
if _, err := c.db.ExecContext(ctx, createOrReplaceStage); err != nil {
50-
return nil, fmt.Errorf("failed to create stage %s: %w", createOrReplaceStage, err)
51-
}
5250
return c, nil
5351
}
5452

plugins/destination/snowflake/client/write.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ const (
2020
)
2121

2222
func (c *Client) Write(ctx context.Context, msgs <-chan message.WriteMessage) error {
23+
if err := c.setupWrite(ctx); err != nil {
24+
return err
25+
}
26+
2327
if err := c.writer.Write(ctx, msgs); err != nil {
2428
return err
2529
}
@@ -68,6 +72,20 @@ func (c *Client) WriteTableBatch(ctx context.Context, name string, msgs message.
6872
return err
6973
}
7074

75+
func (c *Client) setupWrite(ctx context.Context) error {
76+
var setupErr error
77+
c.setupWriteOnce.Do(func() {
78+
if _, err := c.db.ExecContext(ctx, createOrReplaceFileFormat); err != nil {
79+
setupErr = fmt.Errorf("failed to create file format %s: %w", createOrReplaceFileFormat, err)
80+
return
81+
}
82+
if _, err := c.db.ExecContext(ctx, createOrReplaceStage); err != nil {
83+
setupErr = fmt.Errorf("failed to create stage %s: %w", createOrReplaceStage, err)
84+
}
85+
})
86+
return setupErr
87+
}
88+
7189
// escapePath properly escapes the `\` character in window's file paths.
7290
func escapePath(p string) string {
7391
return strings.ReplaceAll(p, "\\", "\\\\")

0 commit comments

Comments
 (0)