GetDatabaseSDLSchema gets the SDL schema of a database.
(ctx context.Context, req *connect.Request[v1pb.GetDatabaseSDLSchemaRequest])
| 617 | |
| 618 | // GetDatabaseSDLSchema gets the SDL schema of a database. |
| 619 | func (s *DatabaseService) GetDatabaseSDLSchema(ctx context.Context, req *connect.Request[v1pb.GetDatabaseSDLSchemaRequest]) (*connect.Response[v1pb.DatabaseSDLSchema], error) { |
| 620 | instanceID, databaseName, err := common.TrimSuffixAndGetInstanceDatabaseID(req.Msg.Name, common.SDLSchemaSuffix) |
| 621 | if err != nil { |
| 622 | return nil, connect.NewError(connect.CodeInvalidArgument, errors.Errorf("%v", err.Error())) |
| 623 | } |
| 624 | |
| 625 | database, err := s.store.GetDatabase(ctx, &store.FindDatabaseMessage{ |
| 626 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 627 | InstanceID: &instanceID, |
| 628 | DatabaseName: &databaseName, |
| 629 | ShowDeleted: true, |
| 630 | }) |
| 631 | if err != nil { |
| 632 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("%v", err.Error())) |
| 633 | } |
| 634 | if database == nil { |
| 635 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database %q not found", databaseName)) |
| 636 | } |
| 637 | dbMetadata, err := s.store.GetDBSchema(ctx, &store.FindDBSchemaMessage{ |
| 638 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 639 | InstanceID: instanceID, |
| 640 | DatabaseName: databaseName, |
| 641 | }) |
| 642 | if err != nil { |
| 643 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("%v", err.Error())) |
| 644 | } |
| 645 | if dbMetadata == nil { |
| 646 | if err := s.schemaSyncer.SyncDatabaseSchema(ctx, database); err != nil { |
| 647 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to sync database schema for database %q, error %v", databaseName, err)) |
| 648 | } |
| 649 | newDBSchema, err := s.store.GetDBSchema(ctx, &store.FindDBSchemaMessage{ |
| 650 | Workspace: common.GetWorkspaceIDFromContext(ctx), |
| 651 | InstanceID: database.InstanceID, |
| 652 | DatabaseName: database.DatabaseName, |
| 653 | }) |
| 654 | if err != nil { |
| 655 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("%v", err.Error())) |
| 656 | } |
| 657 | if newDBSchema == nil { |
| 658 | return nil, connect.NewError(connect.CodeNotFound, errors.Errorf("database schema %q not found", databaseName)) |
| 659 | } |
| 660 | dbMetadata = newDBSchema |
| 661 | } |
| 662 | |
| 663 | metadata := dbMetadata.GetProto() |
| 664 | if metadata == nil { |
| 665 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("database metadata not found for database %q", databaseName)) |
| 666 | } |
| 667 | |
| 668 | format := req.Msg.Format |
| 669 | if format == v1pb.GetDatabaseSDLSchemaRequest_SDL_FORMAT_UNSPECIFIED { |
| 670 | format = v1pb.GetDatabaseSDLSchemaRequest_SINGLE_FILE |
| 671 | } |
| 672 | |
| 673 | switch format { |
| 674 | case v1pb.GetDatabaseSDLSchemaRequest_SINGLE_FILE: |
| 675 | return s.getSingleFileSDL(database.Engine, metadata) |
| 676 | case v1pb.GetDatabaseSDLSchemaRequest_MULTI_FILE: |
nothing calls this directly
no test coverage detected