diff --git a/pkg/services/sqlstore/migrator/dialect.go b/pkg/services/sqlstore/migrator/dialect.go index 0542fbe683c..53b75365a20 100644 --- a/pkg/services/sqlstore/migrator/dialect.go +++ b/pkg/services/sqlstore/migrator/dialect.go @@ -1,10 +1,12 @@ package migrator import ( + "context" "fmt" "strconv" "strings" + "github.com/grafana/grafana/pkg/services/sqlstore/session" "golang.org/x/exp/slices" "xorm.io/xorm" ) @@ -82,6 +84,13 @@ type Dialect interface { // column names to values to use in the where clause. // It returns a query string and a slice of parameters that can be executed against the database. UpdateQuery(tableName string, row map[string]any, where map[string]any) (string, []any, error) + // Insert accepts a table name and a map of column names to insert. + // The insert is executed as part of the provided session. + Insert(ctx context.Context, tx *session.SessionTx, tableName string, row map[string]any) error + // Update accepts a table name, a map of column names to values to update, and a map of + // column names to values to use in the where clause. + // The update is executed as part of the provided session. + Update(ctx context.Context, tx *session.SessionTx, tableName string, row map[string]any, where map[string]any) error } type LockCfg struct { @@ -421,3 +430,23 @@ func (b *BaseDialect) UpdateQuery(tableName string, row map[string]any, where ma return fmt.Sprintf("UPDATE %s SET %s WHERE %s", b.dialect.Quote(tableName), strings.Join(cols, ", "), strings.Join(whereCols, " AND ")), vals, nil } + +func (b *BaseDialect) Insert(ctx context.Context, tx *session.SessionTx, tableName string, row map[string]any) error { + query, args, err := b.InsertQuery(tableName, row) + if err != nil { + return err + } + + _, err = tx.Exec(ctx, query, args...) + return err +} + +func (b *BaseDialect) Update(ctx context.Context, tx *session.SessionTx, tableName string, row map[string]any, where map[string]any) error { + query, args, err := b.UpdateQuery(tableName, row, where) + if err != nil { + return err + } + + _, err = tx.Exec(ctx, query, args...) + return err +} diff --git a/pkg/services/store/entity/sqlstash/sql_storage_server.go b/pkg/services/store/entity/sqlstash/sql_storage_server.go index ad5c93e5e34..19804b9ea24 100644 --- a/pkg/services/store/entity/sqlstash/sql_storage_server.go +++ b/pkg/services/store/entity/sqlstash/sql_storage_server.go @@ -443,31 +443,13 @@ func (s *sqlEntityServer) Create(ctx context.Context, r *entity.CreateEntityRequ } // 1. Add row to the `entity_history` values - query, args, err := s.dialect.InsertQuery("entity_history", values) - if err != nil { - s.log.Error("error building entity history insert", "msg", err.Error()) - return err - } - - s.log.Debug("create", "query", query, "args", args) - - _, err = tx.Exec(ctx, query, args...) - if err != nil { - s.log.Error("error writing entity history", "msg", err.Error()) + if err := s.dialect.Insert(ctx, tx, "entity_history", values); err != nil { + s.log.Error("error inserting entity history", "msg", err.Error()) return err } // 2. Add row to the main `entity` table - query, args, err = s.dialect.InsertQuery("entity", values) - if err != nil { - s.log.Error("error building entity insert sql", "msg", err.Error()) - return err - } - - s.log.Debug("create", "query", query, "args", args) - - _, err = tx.Exec(ctx, query, args...) - if err != nil { + if err := s.dialect.Insert(ctx, tx, "entity", values); err != nil { s.log.Error("error inserting entity", "msg", err.Error()) return err } @@ -666,15 +648,8 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ } // 1. Add the `entity_history` values - query, args, err := s.dialect.InsertQuery("entity_history", values) - if err != nil { - s.log.Error("error building entity history insert", "msg", err.Error()) - return err - } - - _, err = tx.Exec(ctx, query, args...) - if err != nil { - s.log.Error("error writing entity history", "msg", err.Error()) + if err := s.dialect.Insert(ctx, tx, "entity_history", values); err != nil { + s.log.Error("error inserting entity history", "msg", err.Error()) return err } @@ -690,19 +665,15 @@ func (s *sqlEntityServer) Update(ctx context.Context, r *entity.UpdateEntityRequ delete(values, "created_at") delete(values, "created_by") - query, args, err = s.dialect.UpdateQuery( + err = s.dialect.Update( + ctx, + tx, "entity", values, map[string]any{ "guid": current.Guid, }, ) - if err != nil { - s.log.Error("error building entity update sql", "msg", err.Error()) - return err - } - - _, err = tx.Exec(ctx, query, args...) if err != nil { s.log.Error("error updating entity", "msg", err.Error()) return err