github.com/aacfactory/fns-contrib/databases/sql@v1.2.84/dac/specifications/returning.go (about)

     1  package specifications
     2  
     3  import (
     4  	"context"
     5  	"github.com/aacfactory/errors"
     6  	"github.com/aacfactory/fns-contrib/databases/sql"
     7  )
     8  
     9  func WriteInsertReturning[T any](ctx context.Context, rows sql.Rows, returning []string, entries []T) (affected int64, err error) {
    10  	spec, specErr := GetSpecification(ctx, Instance[T]())
    11  	if specErr != nil {
    12  		err = errors.Warning("sql: write returning value into entries failed").WithCause(specErr)
    13  		return
    14  	}
    15  	i := 0
    16  	for rows.Next() {
    17  		generics := acquireGenerics(len(returning))
    18  		scanErr := rows.Scan(generics...)
    19  		if scanErr != nil {
    20  			releaseGenerics(generics)
    21  			err = errors.Warning("sql: write returning value into entries failed").WithCause(scanErr)
    22  			return
    23  		}
    24  		entry := entries[i]
    25  		wErr := generics.WriteTo(spec, returning, &entry)
    26  		if wErr != nil {
    27  			releaseGenerics(generics)
    28  			err = errors.Warning("sql: write returning value into entries failed").WithCause(wErr)
    29  			return
    30  		}
    31  		entries[i] = entry
    32  		affected++
    33  		i++
    34  	}
    35  	return
    36  }