UpdateDatabase updates a database.
(ctx context.Context, patch *UpdateDatabaseMessage)
| 339 | |
| 340 | // UpdateDatabase updates a database. |
| 341 | func (s *Store) UpdateDatabase(ctx context.Context, patch *UpdateDatabaseMessage) (*DatabaseMessage, error) { |
| 342 | set := qb.Q() |
| 343 | |
| 344 | if v := patch.ProjectID; v != nil { |
| 345 | set.Comma("project = ?", *v) |
| 346 | } |
| 347 | if v := patch.EnvironmentID; v != nil { |
| 348 | if *v == "" { |
| 349 | set.Comma("environment = NULL") |
| 350 | } else { |
| 351 | set.Comma("environment = ?", *v) |
| 352 | } |
| 353 | } |
| 354 | if v := patch.Deleted; v != nil { |
| 355 | set.Comma("deleted = ?", *v) |
| 356 | } |
| 357 | if fs := patch.MetadataUpdates; len(fs) > 0 { |
| 358 | database, err := s.GetDatabase(ctx, &FindDatabaseMessage{ |
| 359 | InstanceID: &patch.InstanceID, |
| 360 | DatabaseName: &patch.DatabaseName, |
| 361 | }) |
| 362 | if err != nil { |
| 363 | return nil, errors.Wrapf(err, "failed to get database %q", common.FormatDatabase(patch.InstanceID, patch.DatabaseName)) |
| 364 | } |
| 365 | md := proto.CloneOf(database.Metadata) |
| 366 | for _, f := range fs { |
| 367 | f(md) |
| 368 | } |
| 369 | metadataBytes, err := protojson.Marshal(md) |
| 370 | if err != nil { |
| 371 | return nil, err |
| 372 | } |
| 373 | set.Comma("metadata = ?", metadataBytes) |
| 374 | } |
| 375 | |
| 376 | if set.Len() == 0 { |
| 377 | return nil, errors.New("no fields to update") |
| 378 | } |
| 379 | |
| 380 | q := qb.Q().Space("UPDATE db SET ? WHERE instance = ? AND name = ?", set, patch.InstanceID, patch.DatabaseName) |
| 381 | |
| 382 | query, args, err := q.ToSQL() |
| 383 | if err != nil { |
| 384 | return nil, errors.Wrapf(err, "failed to build sql") |
| 385 | } |
| 386 | |
| 387 | if _, err := s.GetDB().ExecContext(ctx, query, args...); err != nil { |
| 388 | return nil, err |
| 389 | } |
| 390 | |
| 391 | // Invalidate and update database cache. |
| 392 | s.removeDatabaseCache(ctx, patch.InstanceID, patch.DatabaseName) |
| 393 | return s.GetDatabase(ctx, &FindDatabaseMessage{InstanceID: &patch.InstanceID, DatabaseName: &patch.DatabaseName, ShowDeleted: true}) |
| 394 | } |
| 395 | |
| 396 | // BatchUpdateDatabases update databases in batch. |
| 397 | func (s *Store) BatchUpdateDatabases(ctx context.Context, databases []*DatabaseMessage, update *BatchUpdateDatabases) error { |
nothing calls this directly
no test coverage detected