From ad24f6db445ab8957c0a92737315bb112846fb12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Fri, 9 Feb 2024 15:40:09 +0100 Subject: [PATCH] v0.0.385 UpdateAndQuerySingle --- goextVersion.go | 4 ++-- sq/scanner.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/goextVersion.go b/goextVersion.go index b7f8743..d29167a 100644 --- a/goextVersion.go +++ b/goextVersion.go @@ -1,5 +1,5 @@ package goext -const GoextVersion = "0.0.384" +const GoextVersion = "0.0.385" -const GoextVersionTimestamp = "2024-02-09T15:20:46+0100" +const GoextVersionTimestamp = "2024-02-09T15:40:09+0100" diff --git a/sq/scanner.go b/sq/scanner.go index 9380982..267af53 100644 --- a/sq/scanner.go +++ b/sq/scanner.go @@ -4,9 +4,11 @@ import ( "context" "database/sql" "errors" + "fmt" "github.com/jmoiron/sqlx" "gogs.mikescher.com/BlackForestBytes/goext/exerr" "gogs.mikescher.com/BlackForestBytes/goext/langext" + "reflect" ) type StructScanMode string @@ -89,6 +91,33 @@ func UpdateSingle[TData any](ctx context.Context, q Queryable, tableName string, return sqlr, nil } +func UpdateAndQuerySingle[TData any](ctx context.Context, q Queryable, tableName string, v TData, idColumn string, mode StructScanMode, sec StructScanSafety) (TData, error) { + + rval := reflect.ValueOf(v) + + idRVal := rval.FieldByName(idColumn) + if !idRVal.IsValid() || idRVal.IsZero() { + return *new(TData), fmt.Errorf("failed to find idColumn '%s' in %T", idColumn, v) + } + + idValue, err := convertValueToDB(q, idRVal.Interface()) + if err != nil { + return *new(TData), err + } + + _, err = UpdateSingle[TData](ctx, q, tableName, v, idColumn) + if err != nil { + return *new(TData), err + } + + pp := PP{} + + //goland:noinspection ALL + sqlstr := fmt.Sprintf("SELECT * FROM %s WHERE %s = :%s", tableName, idColumn, pp.Add(idValue)) + + return QuerySingle[TData](ctx, q, sqlstr, pp, mode, sec) +} + func QuerySingle[TData any](ctx context.Context, q Queryable, sql string, pp PP, mode StructScanMode, sec StructScanSafety) (TData, error) { rows, err := q.Query(ctx, sql, pp) if err != nil {