// Initialize REST handlers. Call this once on launch. func InitREST(bucket *couchbase.Bucket, dbName string, serverURL string) *context { if dbName == "" { dbName = bucket.Name } dbcontext, err := db.NewDatabaseContext(dbName, bucket) if err != nil { return nil } newdb, err := db.GetDatabase(dbcontext, nil) if err != nil { return nil } newdb.ReadDesignDocument() if dbcontext.ChannelMapper == nil { log.Printf("Channel mapper undefined; using default") // Always have a channel mapper object even if it does nothing: dbcontext.ChannelMapper, _ = channels.NewDefaultChannelMapper() } if dbcontext.Validator == nil { log.Printf("Validator undefined; no validation") } c := &context{ dbcontext: dbcontext, auth: auth.NewAuthenticator(bucket), serverURL: serverURL, } http.Handle("/", createHandler(c)) return c }
// 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 }
func callREST(method, resource string, body string) *httptest.ResponseRecorder { input := bytes.NewBufferString(body) request, _ := http.NewRequest(method, "http://localhost"+resource, input) response := httptest.NewRecorder() mapper, _ := channels.NewChannelMapper(`function(doc) {sync(doc.channels);}`) response.Code = 200 // doesn't seem to be initialized by default; filed Go bug #4188 dbcontext, _ := db.NewDatabaseContext("db", gTestBucket) dbcontext.ChannelMapper = mapper context := &context{dbcontext, nil, ""} handler := createHandler(context) handler.ServeHTTP(response, request) return response }
// Adds a database to the serverContext given its Bucket. func (sc *serverContext) addDatabase(bucket base.Bucket, dbName string, syncFun *string, nag bool) (*context, error) { if dbName == "" { dbName = bucket.GetName() } if match, _ := regexp.MatchString(`^[a-z][-a-z0-9_$()+/]*$`, dbName); !match { return nil, fmt.Errorf("Illegal database name: %s", dbName) } if sc.databases[dbName] != nil { return nil, fmt.Errorf("Duplicate database name %q", dbName) } dbcontext, err := db.NewDatabaseContext(dbName, bucket) if err != nil { return nil, err } if syncFun != nil { if err := dbcontext.ApplySyncFun(*syncFun); err != nil { return nil, err } } if dbcontext.ChannelMapper == nil { if nag { base.Warn("Sync function undefined; using default") } // Always have a channel mapper object even if it does nothing: dbcontext.ChannelMapper, _ = channels.NewDefaultChannelMapper() } c := &context{ dbcontext: dbcontext, auth: dbcontext.Authenticator(), } sc.databases[dbName] = c return c, 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 }