1package dbtxn 2 3import ( 4 "context" 5 "database/sql" 6 "fmt" 7 "strings" 8) 9 10// ExecuteDBQuery handles executing one single statement, while properly releasing its resources. 11// - ctx: Required 12// - db: Required 13// - config: Optional, may be nil 14// - query: Required 15func ExecuteDBQuery(ctx context.Context, db *sql.DB, params map[string]string, query string) error { 16 17 parsedQuery := parseQuery(params, query) 18 19 stmt, err := db.PrepareContext(ctx, parsedQuery) 20 if err != nil { 21 return err 22 } 23 defer stmt.Close() 24 25 return execute(ctx, stmt) 26} 27 28// ExecuteTxQuery handles executing one single statement, while properly releasing its resources. 29// - ctx: Required 30// - tx: Required 31// - config: Optional, may be nil 32// - query: Required 33func ExecuteTxQuery(ctx context.Context, tx *sql.Tx, params map[string]string, query string) error { 34 35 parsedQuery := parseQuery(params, query) 36 37 stmt, err := tx.PrepareContext(ctx, parsedQuery) 38 if err != nil { 39 return err 40 } 41 defer stmt.Close() 42 43 return execute(ctx, stmt) 44} 45 46func execute(ctx context.Context, stmt *sql.Stmt) error { 47 if _, err := stmt.ExecContext(ctx); err != nil { 48 return err 49 } 50 return nil 51} 52 53func parseQuery(m map[string]string, tpl string) string { 54 55 if m == nil || len(m) <= 0 { 56 return tpl 57 } 58 59 for k, v := range m { 60 tpl = strings.Replace(tpl, fmt.Sprintf("{{%s}}", k), v, -1) 61 } 62 return tpl 63} 64