MCPcopy Create free account
hub / github.com/bytebase/bytebase / UpdateDatabase

Method UpdateDatabase

backend/api/v1/database_service.go:278–369  ·  view source on GitHub ↗

UpdateDatabase updates a database.

(ctx context.Context, req *connect.Request[v1pb.UpdateDatabaseRequest])

Source from the content-addressed store, hash-verified

276
277// UpdateDatabase updates a database.
278func (s *DatabaseService) UpdateDatabase(ctx context.Context, req *connect.Request[v1pb.UpdateDatabaseRequest]) (*connect.Response[v1pb.Database], error) {
279 if req.Msg.Database == nil {
280 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("database must be set"))
281 }
282 if len(req.Msg.GetUpdateMask().GetPaths()) == 0 {
283 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("update_mask must be set"))
284 }
285
286 // Use the helper function to get the database
287 instanceID, databaseName, err := common.GetInstanceDatabaseID(req.Msg.Database.Name)
288 if err != nil {
289 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Wrapf(err, "failed to parse %q", req.Msg.Database.Name))
290 }
291 databaseMessage, err := s.store.GetDatabase(ctx, &store.FindDatabaseMessage{
292 Workspace: common.GetWorkspaceIDFromContext(ctx),
293 InstanceID: &instanceID,
294 DatabaseName: &databaseName,
295 })
296 if err != nil {
297 return nil, connect.NewError(connect.CodeInternal, errors.Wrapf(err, "failed to get database"))
298 }
299 if databaseMessage == nil {
300 return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database %q not found", req.Msg.Database.Name))
301 }
302 if databaseMessage.Deleted {
303 return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database %q was deleted", req.Msg.Database.Name))
304 }
305
306 var project *store.ProjectMessage
307 patch := &store.UpdateDatabaseMessage{
308 InstanceID: databaseMessage.InstanceID,
309 DatabaseName: databaseMessage.DatabaseName,
310 }
311 for _, path := range req.Msg.UpdateMask.Paths {
312 switch path {
313 case "project":
314 projectID, err := common.GetProjectID(req.Msg.Database.Project)
315 if err != nil {
316 return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("%v", err.Error()))
317 }
318 project, err = s.store.GetProject(ctx, &store.FindProjectMessage{
319 Workspace: common.GetWorkspaceIDFromContext(ctx),
320 ResourceID: &projectID,
321 ShowDeleted: true,
322 })
323 if err != nil {
324 return nil, connect.NewError(connect.CodeInternal, errors.Errorf("%v", err.Error()))
325 }
326 if project == nil {
327 return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("project %q not found", projectID))
328 }
329 if project.Deleted {
330 return nil, connect.NewError(connect.CodeFailedPrecondition, errors.Errorf("project %q is deleted", projectID))
331 }
332 patch.ProjectID = &project.ResourceID
333 case "labels":
334 patch.MetadataUpdates = append(patch.MetadataUpdates, func(dm *storepb.DatabaseMetadata) {
335 dm.Labels = req.Msg.Database.Labels

Callers 1

BatchUpdateDatabasesMethod · 0.95

Calls 12

convertToDatabaseMethod · 0.95
GetInstanceDatabaseIDFunction · 0.92
GetProjectIDFunction · 0.92
GetEnvironmentIDFunction · 0.92
ErrorfMethod · 0.80
GetEnvironmentByIDMethod · 0.80
GetDatabaseMethod · 0.65
GetProjectMethod · 0.65
UpdateDatabaseMethod · 0.65
GetUpdateMaskMethod · 0.45
ErrorMethod · 0.45

Tested by

no test coverage detected