// Adds a database to the ServerContext given its configuration. func (sc *ServerContext) AddDatabaseFromConfig(config *DbConfig) error { server := "http://localhost:8091" pool := "default" bucketName := config.name if config.Server != nil { server = *config.Server } if config.Pool != nil { pool = *config.Pool } if config.Bucket != nil { bucketName = *config.Bucket } dbName := config.name if dbName == "" { dbName = bucketName } base.Log("Opening db /%s as bucket %q, pool %q, server <%s>", dbName, bucketName, pool, server) if err := db.ValidateDatabaseName(dbName); err != nil { return err } // Connect to the bucket and add the database: bucket, err := db.ConnectToBucket(server, pool, bucketName) if err != nil { return err } dbcontext, err := db.NewDatabaseContext(dbName, bucket) if err != nil { return err } if config.Sync != nil { if err := dbcontext.ApplySyncFun(*config.Sync); err != nil { return err } } if dbcontext.ChannelMapper == nil { base.Warn("Database %q sync function undefined; using default", dbName) } // Create default users & roles: if err := sc.installPrincipals(dbcontext, config.Roles, "role"); err != nil { return err } else if err := sc.installPrincipals(dbcontext, config.Users, "user"); err != nil { return err } // Register it so HTTP handlers can find it: if err := sc.registerDatabase(dbcontext); err != nil { return err } return nil }
// Returns the DatabaseContext with the given name func (sc *ServerContext) GetDatabase(name string) (*db.DatabaseContext, error) { sc.lock.RLock() dbc := sc.databases_[name] sc.lock.RUnlock() if dbc != nil { return dbc, nil } else if db.ValidateDatabaseName(name) != nil { return nil, &base.HTTPError{http.StatusBadRequest, "invalid database name '" + name + "'"} } else if sc.config.ConfigServer == nil { return nil, &base.HTTPError{http.StatusNotFound, "no such database '" + name + "'"} } else { // Let's ask the config server if it knows this database: base.Log("Asking config server %q about db %q...", *sc.config.ConfigServer, name) config, err := sc.getDbConfigFromServer(name) if err != nil { return nil, err } if dbc, err = sc.AddDatabaseFromConfig(config); err != nil { return nil, err } return dbc, nil } }
// Adds a database to the ServerContext given its configuration. func (sc *ServerContext) AddDatabaseFromConfig(config *DbConfig) (*db.DatabaseContext, error) { server := "http://localhost:8091" pool := "default" bucketName := config.name if config.Server != nil { server = *config.Server } if config.Pool != nil { pool = *config.Pool } if config.Bucket != nil { bucketName = *config.Bucket } dbName := config.name if dbName == "" { dbName = bucketName } base.Log("Opening db /%s as bucket %q, pool %q, server <%s>", dbName, bucketName, pool, server) if err := db.ValidateDatabaseName(dbName); err != nil { return nil, err } var importDocs, autoImport bool switch config.ImportDocs { case nil, false: case true: importDocs = true case "continuous": importDocs = true autoImport = true default: return nil, fmt.Errorf("Unrecognized value for ImportDocs: %#v", config.ImportDocs) } // Connect to the bucket and add the database: spec := base.BucketSpec{ Server: server, PoolName: pool, BucketName: bucketName, } if config.Username != "" { spec.Auth = config } bucket, err := db.ConnectToBucket(spec) if err != nil { return nil, err } dbcontext, err := db.NewDatabaseContext(dbName, bucket, autoImport) if err != nil { return nil, err } syncFn := "" if config.Sync != nil { syncFn = *config.Sync } if err := dbcontext.ApplySyncFun(syncFn, importDocs); err != nil { return nil, err } if config.RevsLimit != nil && *config.RevsLimit > 0 { dbcontext.RevsLimit = *config.RevsLimit } if dbcontext.ChannelMapper == nil { base.Warn("Database %q sync function undefined; using default", dbName) } // Create default users & roles: if err := sc.installPrincipals(dbcontext, config.Roles, "role"); err != nil { return nil, err } else if err := sc.installPrincipals(dbcontext, config.Users, "user"); err != nil { return nil, err } // Register it so HTTP handlers can find it: if err := sc.registerDatabase(dbcontext); err != nil { dbcontext.Close() return nil, err } return dbcontext, nil }
// Adds a database to the ServerContext given its configuration. func (sc *ServerContext) AddDatabaseFromConfig(config *DbConfig) (*db.DatabaseContext, error) { server := "http://localhost:8091" pool := "default" bucketName := config.name if config.Server != nil { server = *config.Server } if config.Pool != nil { pool = *config.Pool } if config.Bucket != nil { bucketName = *config.Bucket } dbName := config.name if dbName == "" { dbName = bucketName } base.Log("Opening db /%s as bucket %q, pool %q, server <%s>", dbName, bucketName, pool, server) if err := db.ValidateDatabaseName(dbName); err != nil { return nil, err } var importDocs, autoImport bool switch config.ImportDocs { case nil, false: case true: importDocs = true case "continuous": importDocs = true autoImport = true default: return nil, fmt.Errorf("Unrecognized value for ImportDocs: %#v", config.ImportDocs) } // Connect to the bucket and add the database: spec := base.BucketSpec{ Server: server, PoolName: pool, BucketName: bucketName, } if config.Username != "" { spec.Auth = config } bucket, err := db.ConnectToBucket(spec) if err != nil { return nil, err } dbcontext, err := db.NewDatabaseContext(dbName, bucket, autoImport) if err != nil { return nil, err } syncFn := "" if config.Sync != nil { syncFn = *config.Sync } if err := sc.applySyncFunction(dbcontext, syncFn); err != nil { return nil, err } if importDocs { db, _ := db.GetDatabase(dbcontext, nil) if _, err := db.UpdateAllDocChannels(false, true); err != nil { return nil, err } } if config.RevsLimit != nil && *config.RevsLimit > 0 { dbcontext.RevsLimit = *config.RevsLimit } if dbcontext.ChannelMapper == nil { base.Log("Using default sync function 'channel(doc.channels)' for database %q", dbName) } // Create default users & roles: if err := sc.installPrincipals(dbcontext, config.Roles, "role"); err != nil { return nil, err } else if err := sc.installPrincipals(dbcontext, config.Users, "user"); err != nil { return nil, err } // Install bucket-shadower if any: if shadow := config.Shadow; shadow != nil { if err := sc.startShadowing(dbcontext, shadow); err != nil { base.Warn("Database %q: unable to connect to external bucket for shadowing: %v", dbName, err) } } // Register it so HTTP handlers can find it: if err := sc.registerDatabase(dbcontext); err != nil { dbcontext.Close() return nil, err } sc.setDatabaseConfig(config.name, config) return dbcontext, nil }