Introduce (Get|Select|Exec)Builder (#20029)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
8802c6c9d6
Коммит
9c851e996c
@@ -35,17 +35,24 @@ func (w *StoreTestWrapper) DriverName() string {
|
||||
return w.orig.DriverName()
|
||||
}
|
||||
|
||||
type Builder interface {
|
||||
ToSql() (string, []interface{}, error)
|
||||
}
|
||||
|
||||
// sqlxExecutor exposes sqlx operations. It is used to enable some internal store methods to
|
||||
// accept both transactions (*sqlxTxWrapper) and common db handlers (*sqlxDbWrapper).
|
||||
type sqlxExecutor interface {
|
||||
Get(dest interface{}, query string, args ...interface{}) error
|
||||
GetBuilder(dest interface{}, builder Builder) error
|
||||
NamedExec(query string, arg interface{}) (sql.Result, error)
|
||||
Exec(query string, args ...interface{}) (sql.Result, error)
|
||||
ExecBuilder(builder Builder) (sql.Result, error)
|
||||
ExecRaw(query string, args ...interface{}) (sql.Result, error)
|
||||
NamedQuery(query string, arg interface{}) (*sqlx.Rows, error)
|
||||
QueryRowX(query string, args ...interface{}) *sqlx.Row
|
||||
QueryX(query string, args ...interface{}) (*sqlx.Rows, error)
|
||||
Select(dest interface{}, query string, args ...interface{}) error
|
||||
SelectBuilder(dest interface{}, builder Builder) error
|
||||
}
|
||||
|
||||
// namedParamRegex is used to capture all named parameters and convert them
|
||||
@@ -105,6 +112,15 @@ func (w *sqlxDBWrapper) Get(dest interface{}, query string, args ...interface{})
|
||||
return w.DB.GetContext(ctx, dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxDBWrapper) GetBuilder(dest interface{}, builder Builder) error {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return w.Get(dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxDBWrapper) NamedExec(query string, arg interface{}) (sql.Result, error) {
|
||||
if w.DB.DriverName() == model.DatabaseDriverPostgres {
|
||||
query = namedParamRegex.ReplaceAllStringFunc(query, strings.ToLower)
|
||||
@@ -127,6 +143,15 @@ func (w *sqlxDBWrapper) Exec(query string, args ...interface{}) (sql.Result, err
|
||||
return w.ExecRaw(query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxDBWrapper) ExecBuilder(builder Builder) (sql.Result, error) {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return w.Exec(query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxDBWrapper) ExecNoTimeout(query string, args ...interface{}) (sql.Result, error) {
|
||||
query = w.DB.Rebind(query)
|
||||
|
||||
@@ -212,6 +237,15 @@ func (w *sqlxDBWrapper) Select(dest interface{}, query string, args ...interface
|
||||
return w.DB.SelectContext(ctx, dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxDBWrapper) SelectBuilder(dest interface{}, builder Builder) error {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return w.Select(dest, query, args...)
|
||||
}
|
||||
|
||||
type sqlxTxWrapper struct {
|
||||
*sqlx.Tx
|
||||
queryTimeout time.Duration
|
||||
@@ -240,6 +274,15 @@ func (w *sqlxTxWrapper) Get(dest interface{}, query string, args ...interface{})
|
||||
return w.Tx.GetContext(ctx, dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxTxWrapper) GetBuilder(dest interface{}, builder Builder) error {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return w.Get(dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxTxWrapper) Exec(query string, args ...interface{}) (sql.Result, error) {
|
||||
query = w.Tx.Rebind(query)
|
||||
|
||||
@@ -258,6 +301,15 @@ func (w *sqlxTxWrapper) ExecNoTimeout(query string, args ...interface{}) (sql.Re
|
||||
return w.Tx.ExecContext(context.Background(), query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxTxWrapper) ExecBuilder(builder Builder) (sql.Result, error) {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return w.Exec(query, args...)
|
||||
}
|
||||
|
||||
// ExecRaw is like Exec but without any rebinding of params. You need to pass
|
||||
// the exact param types of your target database.
|
||||
func (w *sqlxTxWrapper) ExecRaw(query string, args ...interface{}) (sql.Result, error) {
|
||||
@@ -375,6 +427,15 @@ func (w *sqlxTxWrapper) Select(dest interface{}, query string, args ...interface
|
||||
return w.Tx.SelectContext(ctx, dest, query, args...)
|
||||
}
|
||||
|
||||
func (w *sqlxTxWrapper) SelectBuilder(dest interface{}, builder Builder) error {
|
||||
query, args, err := builder.ToSql()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return w.Select(dest, query, args...)
|
||||
}
|
||||
|
||||
func removeSpace(r rune) rune {
|
||||
// Strip everything except ' '
|
||||
// This also strips out more than one space,
|
||||
|
||||
Ссылка в новой задаче
Block a user