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