planetscale 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.buildkite/pipeline.yml +21 -0
  3. data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +56 -3
  4. data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +205 -172
  5. data/.licenses/go/go.uber.org/zap.dep.yml +1 -1
  6. data/.licenses/go/go.uber.org/zap/buffer.dep.yml +1 -1
  7. data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +1 -1
  8. data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +1 -1
  9. data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +1 -1
  10. data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +1 -1
  11. data/README.md +8 -7
  12. data/controller.go +23 -10
  13. data/go.mod +3 -3
  14. data/go.sum +22 -23
  15. data/lib/generators/planetscale/install_generator.rb +5 -5
  16. data/lib/planetscale.rb +12 -12
  17. data/lib/planetscale/version.rb +1 -1
  18. data/planetscale.gemspec +1 -1
  19. data/proxy/planetscale-darwin.so +0 -0
  20. data/proxy/planetscale-linux.so +0 -0
  21. data/vendor/github.com/planetscale/planetscale-go/LICENSE +202 -0
  22. data/vendor/github.com/planetscale/planetscale-go/planetscale/audit_logs.go +136 -0
  23. data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +5 -3
  24. data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +40 -16
  25. data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +13 -6
  26. data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +2 -0
  27. data/vendor/github.com/planetscale/planetscale-go/planetscale/regions.go +52 -0
  28. data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +1 -1
  29. data/vendor/github.com/planetscale/sql-proxy/LICENSE +202 -0
  30. data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +17 -8
  31. data/vendor/go.uber.org/zap/CHANGELOG.md +60 -0
  32. data/vendor/go.uber.org/zap/CONTRIBUTING.md +0 -6
  33. data/vendor/go.uber.org/zap/FAQ.md +8 -0
  34. data/vendor/go.uber.org/zap/Makefile +13 -3
  35. data/vendor/go.uber.org/zap/README.md +4 -4
  36. data/vendor/go.uber.org/zap/buffer/buffer.go +18 -0
  37. data/vendor/go.uber.org/zap/field.go +10 -0
  38. data/vendor/go.uber.org/zap/go.mod +7 -6
  39. data/vendor/go.uber.org/zap/go.sum +25 -27
  40. data/vendor/go.uber.org/zap/http_handler.go +75 -24
  41. data/vendor/go.uber.org/zap/logger.go +11 -7
  42. data/vendor/go.uber.org/zap/options.go +8 -0
  43. data/vendor/go.uber.org/zap/sugar.go +21 -10
  44. data/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go +188 -0
  45. data/vendor/go.uber.org/zap/zapcore/clock.go +50 -0
  46. data/vendor/go.uber.org/zap/zapcore/console_encoder.go +1 -1
  47. data/vendor/go.uber.org/zap/zapcore/entry.go +2 -2
  48. data/vendor/go.uber.org/zap/zapcore/error.go +18 -1
  49. data/vendor/go.uber.org/zap/zapcore/field.go +7 -1
  50. data/vendor/go.uber.org/zap/zapcore/write_syncer.go +1 -2
  51. data/vendor/modules.txt +3 -3
  52. metadata +11 -5
  53. data/vendor/go.uber.org/zap/.travis.yml +0 -23
@@ -26,7 +26,6 @@ import (
26
26
  "os"
27
27
  "runtime"
28
28
  "strings"
29
- "time"
30
29
 
31
30
  "go.uber.org/zap/zapcore"
32
31
  )
@@ -42,14 +41,17 @@ type Logger struct {
42
41
  core zapcore.Core
43
42
 
44
43
  development bool
44
+ addCaller bool
45
+ onFatal zapcore.CheckWriteAction // default is WriteThenFatal
46
+
45
47
  name string
46
48
  errorOutput zapcore.WriteSyncer
47
49
 
48
- addCaller bool
49
- addStack zapcore.LevelEnabler
50
+ addStack zapcore.LevelEnabler
50
51
 
51
52
  callerSkip int
52
- onFatal zapcore.CheckWriteAction // default is WriteThenFatal
53
+
54
+ clock zapcore.Clock
53
55
  }
54
56
 
55
57
  // New constructs a new Logger from the provided zapcore.Core and Options. If
@@ -70,6 +72,7 @@ func New(core zapcore.Core, options ...Option) *Logger {
70
72
  core: core,
71
73
  errorOutput: zapcore.Lock(os.Stderr),
72
74
  addStack: zapcore.FatalLevel + 1,
75
+ clock: zapcore.DefaultClock,
73
76
  }
74
77
  return log.WithOptions(options...)
75
78
  }
@@ -84,6 +87,7 @@ func NewNop() *Logger {
84
87
  core: zapcore.NewNopCore(),
85
88
  errorOutput: zapcore.AddSync(ioutil.Discard),
86
89
  addStack: zapcore.FatalLevel + 1,
90
+ clock: zapcore.DefaultClock,
87
91
  }
88
92
  }
89
93
 
@@ -269,7 +273,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry {
269
273
  // log message will actually be written somewhere.
270
274
  ent := zapcore.Entry{
271
275
  LoggerName: log.name,
272
- Time: time.Now(),
276
+ Time: log.clock.Now(),
273
277
  Level: lvl,
274
278
  Message: msg,
275
279
  }
@@ -306,7 +310,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry {
306
310
  if log.addCaller {
307
311
  frame, defined := getCallerFrame(log.callerSkip + callerSkipOffset)
308
312
  if !defined {
309
- fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC())
313
+ fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC())
310
314
  log.errorOutput.Sync()
311
315
  }
312
316
 
@@ -334,7 +338,7 @@ func getCallerFrame(skip int) (frame runtime.Frame, ok bool) {
334
338
  const skipOffset = 2 // skip getCallerFrame and Callers
335
339
 
336
340
  pc := make([]uintptr, 1)
337
- numFrames := runtime.Callers(skip+skipOffset, pc[:])
341
+ numFrames := runtime.Callers(skip+skipOffset, pc)
338
342
  if numFrames < 1 {
339
343
  return
340
344
  }
@@ -138,3 +138,11 @@ func OnFatal(action zapcore.CheckWriteAction) Option {
138
138
  log.onFatal = action
139
139
  })
140
140
  }
141
+
142
+ // WithClock specifies the clock used by the logger to determine the current
143
+ // time for logged entries. Defaults to the system clock with time.Now.
144
+ func WithClock(clock zapcore.Clock) Option {
145
+ return optionFunc(func(log *Logger) {
146
+ log.clock = clock
147
+ })
148
+ }
@@ -222,19 +222,30 @@ func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interf
222
222
  return
223
223
  }
224
224
 
225
- // Format with Sprint, Sprintf, or neither.
226
- msg := template
227
- if msg == "" && len(fmtArgs) > 0 {
228
- msg = fmt.Sprint(fmtArgs...)
229
- } else if msg != "" && len(fmtArgs) > 0 {
230
- msg = fmt.Sprintf(template, fmtArgs...)
231
- }
232
-
225
+ msg := getMessage(template, fmtArgs)
233
226
  if ce := s.base.Check(lvl, msg); ce != nil {
234
227
  ce.Write(s.sweetenFields(context)...)
235
228
  }
236
229
  }
237
230
 
231
+ // getMessage format with Sprint, Sprintf, or neither.
232
+ func getMessage(template string, fmtArgs []interface{}) string {
233
+ if len(fmtArgs) == 0 {
234
+ return template
235
+ }
236
+
237
+ if template != "" {
238
+ return fmt.Sprintf(template, fmtArgs...)
239
+ }
240
+
241
+ if len(fmtArgs) == 1 {
242
+ if str, ok := fmtArgs[0].(string); ok {
243
+ return str
244
+ }
245
+ }
246
+ return fmt.Sprint(fmtArgs...)
247
+ }
248
+
238
249
  func (s *SugaredLogger) sweetenFields(args []interface{}) []Field {
239
250
  if len(args) == 0 {
240
251
  return nil
@@ -255,7 +266,7 @@ func (s *SugaredLogger) sweetenFields(args []interface{}) []Field {
255
266
 
256
267
  // Make sure this element isn't a dangling key.
257
268
  if i == len(args)-1 {
258
- s.base.DPanic(_oddNumberErrMsg, Any("ignored", args[i]))
269
+ s.base.Error(_oddNumberErrMsg, Any("ignored", args[i]))
259
270
  break
260
271
  }
261
272
 
@@ -276,7 +287,7 @@ func (s *SugaredLogger) sweetenFields(args []interface{}) []Field {
276
287
 
277
288
  // If we encountered any invalid key-value pairs, log an error.
278
289
  if len(invalid) > 0 {
279
- s.base.DPanic(_nonStringKeyErrMsg, Array("invalid", invalid))
290
+ s.base.Error(_nonStringKeyErrMsg, Array("invalid", invalid))
280
291
  }
281
292
  return fields
282
293
  }
@@ -0,0 +1,188 @@
1
+ // Copyright (c) 2021 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ package zapcore
22
+
23
+ import (
24
+ "bufio"
25
+ "sync"
26
+ "time"
27
+
28
+ "go.uber.org/multierr"
29
+ )
30
+
31
+ const (
32
+ // _defaultBufferSize specifies the default size used by Buffer.
33
+ _defaultBufferSize = 256 * 1024 // 256 kB
34
+
35
+ // _defaultFlushInterval specifies the default flush interval for
36
+ // Buffer.
37
+ _defaultFlushInterval = 30 * time.Second
38
+ )
39
+
40
+ // A BufferedWriteSyncer is a WriteSyncer that buffers writes in-memory before
41
+ // flushing them to a wrapped WriteSyncer after reaching some limit, or at some
42
+ // fixed interval--whichever comes first.
43
+ //
44
+ // BufferedWriteSyncer is safe for concurrent use. You don't need to use
45
+ // zapcore.Lock for WriteSyncers with BufferedWriteSyncer.
46
+ type BufferedWriteSyncer struct {
47
+ // WS is the WriteSyncer around which BufferedWriteSyncer will buffer
48
+ // writes.
49
+ //
50
+ // This field is required.
51
+ WS WriteSyncer
52
+
53
+ // Size specifies the maximum amount of data the writer will buffered
54
+ // before flushing.
55
+ //
56
+ // Defaults to 256 kB if unspecified.
57
+ Size int
58
+
59
+ // FlushInterval specifies how often the writer should flush data if
60
+ // there have been no writes.
61
+ //
62
+ // Defaults to 30 seconds if unspecified.
63
+ FlushInterval time.Duration
64
+
65
+ // Clock, if specified, provides control of the source of time for the
66
+ // writer.
67
+ //
68
+ // Defaults to the system clock.
69
+ Clock Clock
70
+
71
+ // unexported fields for state
72
+ mu sync.Mutex
73
+ initialized bool // whether initialize() has run
74
+ writer *bufio.Writer
75
+ ticker *time.Ticker
76
+ stop chan struct{} // closed when flushLoop should stop
77
+ stopped bool // whether Stop() has run
78
+ done chan struct{} // closed when flushLoop has stopped
79
+ }
80
+
81
+ func (s *BufferedWriteSyncer) initialize() {
82
+ size := s.Size
83
+ if size == 0 {
84
+ size = _defaultBufferSize
85
+ }
86
+
87
+ flushInterval := s.FlushInterval
88
+ if flushInterval == 0 {
89
+ flushInterval = _defaultFlushInterval
90
+ }
91
+
92
+ if s.Clock == nil {
93
+ s.Clock = DefaultClock
94
+ }
95
+
96
+ s.ticker = s.Clock.NewTicker(flushInterval)
97
+ s.writer = bufio.NewWriterSize(s.WS, size)
98
+ s.stop = make(chan struct{})
99
+ s.done = make(chan struct{})
100
+ s.initialized = true
101
+ go s.flushLoop()
102
+ }
103
+
104
+ // Write writes log data into buffer syncer directly, multiple Write calls will be batched,
105
+ // and log data will be flushed to disk when the buffer is full or periodically.
106
+ func (s *BufferedWriteSyncer) Write(bs []byte) (int, error) {
107
+ s.mu.Lock()
108
+ defer s.mu.Unlock()
109
+
110
+ if !s.initialized {
111
+ s.initialize()
112
+ }
113
+
114
+ // To avoid partial writes from being flushed, we manually flush the existing buffer if:
115
+ // * The current write doesn't fit into the buffer fully, and
116
+ // * The buffer is not empty (since bufio will not split large writes when the buffer is empty)
117
+ if len(bs) > s.writer.Available() && s.writer.Buffered() > 0 {
118
+ if err := s.writer.Flush(); err != nil {
119
+ return 0, err
120
+ }
121
+ }
122
+
123
+ return s.writer.Write(bs)
124
+ }
125
+
126
+ // Sync flushes buffered log data into disk directly.
127
+ func (s *BufferedWriteSyncer) Sync() error {
128
+ s.mu.Lock()
129
+ defer s.mu.Unlock()
130
+
131
+ var err error
132
+ if s.initialized {
133
+ err = s.writer.Flush()
134
+ }
135
+
136
+ return multierr.Append(err, s.WS.Sync())
137
+ }
138
+
139
+ // flushLoop flushes the buffer at the configured interval until Stop is
140
+ // called.
141
+ func (s *BufferedWriteSyncer) flushLoop() {
142
+ defer close(s.done)
143
+
144
+ for {
145
+ select {
146
+ case <-s.ticker.C:
147
+ // we just simply ignore error here
148
+ // because the underlying bufio writer stores any errors
149
+ // and we return any error from Sync() as part of the close
150
+ _ = s.Sync()
151
+ case <-s.stop:
152
+ return
153
+ }
154
+ }
155
+ }
156
+
157
+ // Stop closes the buffer, cleans up background goroutines, and flushes
158
+ // remaining unwritten data.
159
+ func (s *BufferedWriteSyncer) Stop() (err error) {
160
+ var stopped bool
161
+
162
+ // Critical section.
163
+ func() {
164
+ s.mu.Lock()
165
+ defer s.mu.Unlock()
166
+
167
+ if !s.initialized {
168
+ return
169
+ }
170
+
171
+ stopped = s.stopped
172
+ if stopped {
173
+ return
174
+ }
175
+ s.stopped = true
176
+
177
+ s.ticker.Stop()
178
+ close(s.stop) // tell flushLoop to stop
179
+ <-s.done // and wait until it has
180
+ }()
181
+
182
+ // Don't call Sync on consecutive Stops.
183
+ if !stopped {
184
+ err = s.Sync()
185
+ }
186
+
187
+ return err
188
+ }
@@ -0,0 +1,50 @@
1
+ // Copyright (c) 2021 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ package zapcore
22
+
23
+ import (
24
+ "time"
25
+ )
26
+
27
+ // DefaultClock is the default clock used by Zap in operations that require
28
+ // time. This clock uses the system clock for all operations.
29
+ var DefaultClock = systemClock{}
30
+
31
+ // Clock is a source of time for logged entries.
32
+ type Clock interface {
33
+ // Now returns the current local time.
34
+ Now() time.Time
35
+
36
+ // NewTicker returns *time.Ticker that holds a channel
37
+ // that delivers "ticks" of a clock.
38
+ NewTicker(time.Duration) *time.Ticker
39
+ }
40
+
41
+ // systemClock implements default Clock that uses system time.
42
+ type systemClock struct{}
43
+
44
+ func (systemClock) Now() time.Time {
45
+ return time.Now()
46
+ }
47
+
48
+ func (systemClock) NewTicker(duration time.Duration) *time.Ticker {
49
+ return time.NewTicker(duration)
50
+ }
@@ -56,7 +56,7 @@ type consoleEncoder struct {
56
56
  // encoder configuration, it will omit any element whose key is set to the empty
57
57
  // string.
58
58
  func NewConsoleEncoder(cfg EncoderConfig) Encoder {
59
- if len(cfg.ConsoleSeparator) == 0 {
59
+ if cfg.ConsoleSeparator == "" {
60
60
  // Use a default delimiter of '\t' for backwards compatibility
61
61
  cfg.ConsoleSeparator = "\t"
62
62
  }
@@ -208,7 +208,7 @@ func (ce *CheckedEntry) Write(fields ...Field) {
208
208
  // If the entry is dirty, log an internal error; because the
209
209
  // CheckedEntry is being used after it was returned to the pool,
210
210
  // the message may be an amalgamation from multiple call sites.
211
- fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry)
211
+ fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", ce.Time, ce.Entry)
212
212
  ce.ErrorOutput.Sync()
213
213
  }
214
214
  return
@@ -221,7 +221,7 @@ func (ce *CheckedEntry) Write(fields ...Field) {
221
221
  }
222
222
  if ce.ErrorOutput != nil {
223
223
  if err != nil {
224
- fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err)
224
+ fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", ce.Time, err)
225
225
  ce.ErrorOutput.Sync()
226
226
  }
227
227
  }
@@ -22,6 +22,7 @@ package zapcore
22
22
 
23
23
  import (
24
24
  "fmt"
25
+ "reflect"
25
26
  "sync"
26
27
  )
27
28
 
@@ -42,7 +43,23 @@ import (
42
43
  // ...
43
44
  // ],
44
45
  // }
45
- func encodeError(key string, err error, enc ObjectEncoder) error {
46
+ func encodeError(key string, err error, enc ObjectEncoder) (retErr error) {
47
+ // Try to capture panics (from nil references or otherwise) when calling
48
+ // the Error() method
49
+ defer func() {
50
+ if rerr := recover(); rerr != nil {
51
+ // If it's a nil pointer, just say "<nil>". The likeliest causes are a
52
+ // error that fails to guard against nil or a nil pointer for a
53
+ // value receiver, and in either case, "<nil>" is a nice result.
54
+ if v := reflect.ValueOf(err); v.Kind() == reflect.Ptr && v.IsNil() {
55
+ enc.AddString(key, "<nil>")
56
+ return
57
+ }
58
+
59
+ retErr = fmt.Errorf("PANIC=%v", rerr)
60
+ }
61
+ }()
62
+
46
63
  basic := err.Error()
47
64
  enc.AddString(key, basic)
48
65
 
@@ -92,6 +92,10 @@ const (
92
92
  ErrorType
93
93
  // SkipType indicates that the field is a no-op.
94
94
  SkipType
95
+
96
+ // InlineMarshalerType indicates that the field carries an ObjectMarshaler
97
+ // that should be inlined.
98
+ InlineMarshalerType
95
99
  )
96
100
 
97
101
  // A Field is a marshaling operation used to add a key-value pair to a logger's
@@ -115,6 +119,8 @@ func (f Field) AddTo(enc ObjectEncoder) {
115
119
  err = enc.AddArray(f.Key, f.Interface.(ArrayMarshaler))
116
120
  case ObjectMarshalerType:
117
121
  err = enc.AddObject(f.Key, f.Interface.(ObjectMarshaler))
122
+ case InlineMarshalerType:
123
+ err = f.Interface.(ObjectMarshaler).MarshalLogObject(enc)
118
124
  case BinaryType:
119
125
  enc.AddBinary(f.Key, f.Interface.([]byte))
120
126
  case BoolType:
@@ -167,7 +173,7 @@ func (f Field) AddTo(enc ObjectEncoder) {
167
173
  case StringerType:
168
174
  err = encodeStringer(f.Key, f.Interface, enc)
169
175
  case ErrorType:
170
- encodeError(f.Key, f.Interface.(error), enc)
176
+ err = encodeError(f.Key, f.Interface.(error), enc)
171
177
  case SkipType:
172
178
  break
173
179
  default: