package helpers
import (
"database/sql"
"encoding/json"
"xorm.io/builder"
)
type StructBuilder struct {
BD *builder.Builder
db *sql.DB
}
func NewBuilder(db *sql.DB) *StructBuilder {
bd := builder.Dialect(builder.POSTGRES)
return &StructBuilder{db: db, BD: bd}
}
func (h *StructBuilder) FindOne(dest ...any) error {
query, err := h.BD.ToBoundSQL()
if err != nil {
return err
}
row := h.db.QueryRow(query)
if err := row.Scan(dest...); err != nil {
return err
}
return nil
}
func (h *StructBuilder) FindAll(src any, dest ...any) error {
var (
res []map[string]interface{} = []map[string]interface{}{}
destParse []any = []any{}
)
query, err := h.BD.ToBoundSQL()
if err != nil {
return err
}
rows, err := h.db.Query(query)
if err != nil {
return err
}
cols, err := rows.Columns()
if err != nil {
return err
}
for rows.Next() {
data := make(map[string]interface{})
if err := rows.Scan(dest...); err != nil {
return err
}
destByte, err := json.Marshal(dest)
if err != nil {
return err
}
if err := json.Unmarshal(destByte, &destParse); err != nil {
return err
}
for i, v := range cols {
data[v] = destParse[i]
}
res = append(res, data)
}
resByte, err := json.Marshal(&res)
if err != nil {
return err
}
if err := json.Unmarshal(resByte, src); err != nil {
return err
}
return nil
}
func (h *StructBuilder) Exec() error {
query, args, err := h.BD.ToSQL()
if err != nil {
return err
}
if _, err := h.db.Exec(query, args...); err != nil {
return err
}
return nil
}