@@ -102,6 +102,12 @@ func deprecateUnifiedConnFlags(flagSet *pflag.FlagSet) {
102
102
type Config struct {
103
103
Engine string `debugmap:"visible"`
104
104
URI string `debugmap:"sensitive"`
105
+ DatastoreHost string `debugmap:"sensitive"`
106
+ DatastorePort string `debugmap:"sensitive"`
107
+ DatastoreUsername string `debugmap:"sensitive"`
108
+ DatastorePassword string `debugmap:"sensitive"`
109
+ DatastoreName string `debugmap:"sensitive"`
110
+ DatastoreSSLMode string `debugmap:"sensitive"`
105
111
GCWindow time.Duration `debugmap:"visible"`
106
112
LegacyFuzzing time.Duration `debugmap:"visible"`
107
113
RevisionQuantization time.Duration `debugmap:"visible"`
@@ -153,6 +159,9 @@ type Config struct {
153
159
SpannerMinSessions uint64 `debugmap:"visible"`
154
160
SpannerMaxSessions uint64 `debugmap:"visible"`
155
161
SpannerDatastoreMetricsOption string `debugmap:"visible"`
162
+ SpannerInstanceID string `debugmap:"sensitive"`
163
+ SpannerDatabaseID string `debugmap:"sensitive"`
164
+ SpannerProjectID string `debugmap:"sensitive"`
156
165
157
166
// MySQL
158
167
TablePrefix string `debugmap:"visible"`
@@ -283,12 +292,28 @@ func RegisterDatastoreFlagsWithPrefix(flagSet *pflag.FlagSet, prefix string, opt
283
292
284
293
flagSet .BoolVar (& opts .ExperimentalColumnOptimization , flagName ("datastore-experimental-column-optimization" ), false , "enable experimental column optimization" )
285
294
295
+ flagSet .StringVar (& opts .DatastoreHost , flagName ("datastore-host" ), defaults .DatastoreHost , "database host for datastore connection string" )
296
+ flagSet .StringVar (& opts .DatastorePort , flagName ("datastore-port" ), defaults .DatastorePort , "database port for datastore connection string" )
297
+ flagSet .StringVar (& opts .DatastoreUsername , flagName ("datastore-user" ), defaults .DatastoreUsername , "database username for datastore connection string" )
298
+ flagSet .StringVar (& opts .DatastorePassword , flagName ("datastore-password" ), defaults .DatastorePassword , "database password for datastore connection string" )
299
+ flagSet .StringVar (& opts .DatastoreName , flagName ("datastore-name" ), defaults .DatastoreName , "database name for datastore connection string" )
300
+ flagSet .StringVar (& opts .DatastoreSSLMode , flagName ("datastore-ssl-mode" ), defaults .DatastoreSSLMode , "database SSL mode for datastore connection string" )
301
+ flagSet .StringVar (& opts .SpannerProjectID , flagName ("spanner-datastore-project-id" ), defaults .SpannerProjectID , "spanner project-id for datastore connection string" )
302
+ flagSet .StringVar (& opts .SpannerInstanceID , flagName ("spanner-datastore-instance-id" ), defaults .SpannerInstanceID , "spanner instance-id for datastore connection string" )
303
+ flagSet .StringVar (& opts .SpannerDatabaseID , flagName ("spanner-datastore-database-id" ), defaults .SpannerDatabaseID , "spanner database-id for datastore connection string" )
304
+
286
305
return nil
287
306
}
288
307
289
308
func DefaultDatastoreConfig () * Config {
290
309
return & Config {
291
310
Engine : MemoryEngine ,
311
+ DatastoreHost : "" ,
312
+ DatastorePort : "" ,
313
+ DatastoreUsername : "" ,
314
+ DatastorePassword : "" ,
315
+ DatastoreName : "" ,
316
+ DatastoreSSLMode : "" ,
292
317
GCWindow : 24 * time .Hour ,
293
318
LegacyFuzzing : - 1 ,
294
319
RevisionQuantization : 5 * time .Second ,
@@ -319,6 +344,9 @@ func DefaultDatastoreConfig() *Config {
319
344
RequestHedgingQuantile : 0.95 ,
320
345
SpannerCredentialsFile : "" ,
321
346
SpannerEmulatorHost : "" ,
347
+ SpannerInstanceID : "" ,
348
+ SpannerDatabaseID : "" ,
349
+ SpannerProjectID : "" ,
322
350
TablePrefix : "" ,
323
351
MigrationPhase : "" ,
324
352
FollowerReadDelay : DefaultFollowerReadDelay ,
@@ -343,6 +371,56 @@ func NewDatastore(ctx context.Context, options ...ConfigOption) (datastore.Datas
343
371
o (opts )
344
372
}
345
373
374
+ if opts .URI == "" && ((opts .DatastoreHost != "" && opts .DatastoreUsername != "" && opts .DatastoreName != "" ) || (opts .SpannerDatabaseID != "" && opts .SpannerInstanceID != "" && opts .SpannerProjectID != "" )) {
375
+ switch opts .Engine {
376
+ case PostgresEngine , CockroachEngine :
377
+ sslMode := opts .DatastoreSSLMode
378
+ if sslMode == "" {
379
+ sslMode = "prefer"
380
+ }
381
+
382
+ port := opts .DatastorePort
383
+ if port == "" {
384
+ if opts .Engine == PostgresEngine {
385
+ port = "5432"
386
+ } else {
387
+ port = "26257"
388
+ }
389
+ }
390
+
391
+ userPart := ""
392
+ if opts .DatastoreUsername != "" {
393
+ userPart = opts .DatastoreUsername
394
+ if opts .DatastorePassword != "" {
395
+ userPart = userPart + ":" + opts .DatastorePassword
396
+ }
397
+ userPart = userPart + "@"
398
+ }
399
+
400
+ opts .URI = fmt .Sprintf ("%s://%s%s:%s/%s?sslmode=%s" ,
401
+ opts .Engine , userPart , opts .DatastoreHost , port , opts .DatastoreName , sslMode )
402
+
403
+ case MySQLEngine :
404
+ port := opts .DatastorePort
405
+ if port == "" {
406
+ port = "3306"
407
+ }
408
+ opts .URI = fmt .Sprintf ("%s:%s@(%s:%s)/%s?parseTime=True" ,
409
+ opts .DatastoreUsername , opts .DatastorePassword , opts .DatastoreHost , port , opts .DatastoreName )
410
+
411
+ case SpannerEngine :
412
+ if opts .SpannerDatabaseID != "" && opts .SpannerInstanceID != "" && opts .SpannerProjectID != "" {
413
+ opts .URI = fmt .Sprintf ("projects/%s/instances/%s/databases/%s" ,
414
+ opts .SpannerProjectID , opts .SpannerInstanceID , opts .SpannerDatabaseID )
415
+ } else {
416
+ return nil , fmt .Errorf ("%s engine requires host (project) and database parameters" , SpannerEngine )
417
+ }
418
+
419
+ default :
420
+ return nil , fmt .Errorf ("engine %s does not support connection parameter construction" , opts .Engine )
421
+ }
422
+ }
423
+
346
424
if (opts .Engine == PostgresEngine || opts .Engine == MySQLEngine ) && opts .FollowerReadDelay == DefaultFollowerReadDelay {
347
425
// Set the default follower read delay for postgres and mysql to 0 -
348
426
// this should only be set if read replicas are used.
0 commit comments