sqlTx = psql.BeginTx[any](msg.DBConn, pctx.GenTOCtx(o.DBConnTo))
}
- var replaceF []func(index int, holder string) (replaceTo string)
- if c.DBDriverName == "postgres" {
- replaceF = append(replaceF, func(index int, holder string) (replaceTo string) {
- return fmt.Sprintf("$%d", index+1)
- })
+ var replaceF psql.ReplaceF
+ switch msg.DBDriverName {
+ case "postgres":
+ replaceF = psql.PlaceHolderB
+ default:
+ replaceF = psql.PlaceHolderA
}
sqlTx.DoPlaceHolder(psql.SqlFunc[any]{Sql: msg.DBInsert}, &LogI{
Prefix: strings.TrimSpace(msg.Prefix),
Base: strings.TrimSpace(fmt.Sprintln(msg.Base_string...)),
Msgs: strings.TrimSpace(fmt.Sprintln(msg.Msgs...)),
- }, replaceF...)
+ }, replaceF)
if _, err := sqlTx.Fin(); err != nil {
log.Println(err)
// PlaceHolder will replaced by ?
func (t *SqlTx[T]) SimplePlaceHolderA(sql string, ptr any) *SqlTx[T] {
- return t.DoPlaceHolder(SqlFunc[T]{
- Sql: sql,
- }, ptr)
+ return t.DoPlaceHolder(SqlFunc[T]{Sql: sql}, ptr, PlaceHolderA)
}
// PlaceHolder will replaced by $%d
func (t *SqlTx[T]) SimplePlaceHolderB(sql string, ptr any) *SqlTx[T] {
- return t.DoPlaceHolder(SqlFunc[T]{
- Sql: sql,
- }, ptr, func(index int, holder string) (replaceTo string) {
- return fmt.Sprintf("$%d", index+1)
- })
+ return t.DoPlaceHolder(SqlFunc[T]{Sql: sql}, ptr, PlaceHolderB)
}
-func (t *SqlTx[T]) DoPlaceHolder(sqlf SqlFunc[T], ptr any, replaceF ...func(index int, holder string) (replaceTo string)) *SqlTx[T] {
+type ReplaceF func(index int, holder string) (replaceTo string)
+
+var (
+ // "?"
+ PlaceHolderA ReplaceF = func(index int, holder string) (replaceTo string) {
+ return "?"
+ }
+ // "$%d"
+ PlaceHolderB ReplaceF = func(index int, holder string) (replaceTo string) {
+ return fmt.Sprintf("$%d", index+1)
+ }
+)
+
+func (t *SqlTx[T]) DoPlaceHolder(sqlf SqlFunc[T], ptr any, replaceF ReplaceF) *SqlTx[T] {
dataR := reflect.ValueOf(ptr).Elem()
index := 0
for i := 0; i < dataR.NumField(); i++ {
if field.IsValid() && field.CanSet() {
replaceS := "{" + dataR.Type().Field(i).Name + "}"
if strings.Contains(sqlf.Sql, replaceS) {
- if len(replaceF) == 0 {
- sqlf.Sql = strings.ReplaceAll(sqlf.Sql, replaceS, "?")
- } else {
- sqlf.Sql = strings.ReplaceAll(sqlf.Sql, replaceS, replaceF[0](index, replaceS))
- index += 1
- }
+ sqlf.Sql = strings.ReplaceAll(sqlf.Sql, replaceS, replaceF(index, replaceS))
+ index += 1
sqlf.Args = append(sqlf.Args, field.Interface())
}
}
"context"
"database/sql"
"errors"
- "fmt"
"sync"
"testing"
"time"
insertLog123 := SqlFunc[any]{Sql: "insert into log123 values ({Msg},{Msg2})"}
{
tx := BeginTx[any](db, context.Background())
- tx.DoPlaceHolder(insertLog123, &logg{Msg: 1, Msg2: "a"})
- tx.DoPlaceHolder(insertLog123, &logg{Msg: 2, Msg2: "b"})
+ tx.DoPlaceHolder(insertLog123, &logg{Msg: 1, Msg2: "a"}, PlaceHolderA)
+ tx.DoPlaceHolder(insertLog123, &logg{Msg: 2, Msg2: "b"}, PlaceHolderA)
if _, e := tx.Fin(); e != nil {
t.Log(e)
}
{
selectLog123 := SqlFunc[[]logg]{Sql: "select msg as Msg, msg2 as Msg2 from log123 where msg = {Msg}"}
tx := BeginTx[[]logg](db, context.Background())
- tx.DoPlaceHolder(selectLog123, &logg{Msg: 2, Msg2: "b"})
+ tx.DoPlaceHolder(selectLog123, &logg{Msg: 2, Msg2: "b"}, PlaceHolderA)
tx.AfterQF(func(ctxVP *[]logg, rows *sql.Rows, txE *error) {
*ctxVP, *txE = DealRows(rows, func() logg { return logg{} })
})
if _, e := BeginTx[any](db, context.Background(), &sql.TxOptions{}).DoPlaceHolder(SqlFunc[any]{
Sql: "insert into test (created) values ({Created})",
- }, &test1{"1"}, func(index int, holder string) (replaceTo string) {
- return fmt.Sprintf("$%d", index+1)
- }).Fin(); e != nil {
+ }, &test1{"1"}, PlaceHolderB).Fin(); e != nil {
t.Fatal(e)
}