@@ -102,6 +102,12 @@ func deprecateUnifiedConnFlags(flagSet *pflag.FlagSet) {
102102type Config struct {
103103 Engine string `debugmap:"visible"`
104104 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"`
105111 GCWindow time.Duration `debugmap:"visible"`
106112 LegacyFuzzing time.Duration `debugmap:"visible"`
107113 RevisionQuantization time.Duration `debugmap:"visible"`
@@ -153,6 +159,9 @@ type Config struct {
153159 SpannerMinSessions uint64 `debugmap:"visible"`
154160 SpannerMaxSessions uint64 `debugmap:"visible"`
155161 SpannerDatastoreMetricsOption string `debugmap:"visible"`
162+ SpannerInstanceID string `debugmap:"sensitive"`
163+ SpannerDatabaseID string `debugmap:"sensitive"`
164+ SpannerProjectID string `debugmap:"sensitive"`
156165
157166 // MySQL
158167 TablePrefix string `debugmap:"visible"`
@@ -283,12 +292,28 @@ func RegisterDatastoreFlagsWithPrefix(flagSet *pflag.FlagSet, prefix string, opt
283292
284293 flagSet .BoolVar (& opts .ExperimentalColumnOptimization , flagName ("datastore-experimental-column-optimization" ), false , "enable experimental column optimization" )
285294
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+
286305 return nil
287306}
288307
289308func DefaultDatastoreConfig () * Config {
290309 return & Config {
291310 Engine : MemoryEngine ,
311+ DatastoreHost : "" ,
312+ DatastorePort : "" ,
313+ DatastoreUsername : "" ,
314+ DatastorePassword : "" ,
315+ DatastoreName : "" ,
316+ DatastoreSSLMode : "" ,
292317 GCWindow : 24 * time .Hour ,
293318 LegacyFuzzing : - 1 ,
294319 RevisionQuantization : 5 * time .Second ,
@@ -319,6 +344,9 @@ func DefaultDatastoreConfig() *Config {
319344 RequestHedgingQuantile : 0.95 ,
320345 SpannerCredentialsFile : "" ,
321346 SpannerEmulatorHost : "" ,
347+ SpannerInstanceID : "" ,
348+ SpannerDatabaseID : "" ,
349+ SpannerProjectID : "" ,
322350 TablePrefix : "" ,
323351 MigrationPhase : "" ,
324352 FollowerReadDelay : DefaultFollowerReadDelay ,
@@ -343,6 +371,56 @@ func NewDatastore(ctx context.Context, options ...ConfigOption) (datastore.Datas
343371 o (opts )
344372 }
345373
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+
346424 if (opts .Engine == PostgresEngine || opts .Engine == MySQLEngine ) && opts .FollowerReadDelay == DefaultFollowerReadDelay {
347425 // Set the default follower read delay for postgres and mysql to 0 -
348426 // this should only be set if read replicas are used.
0 commit comments