diff --git a/executor.go b/executor.go index f3623ec..7c7537c 100644 --- a/executor.go +++ b/executor.go @@ -23,6 +23,7 @@ import ( "encoding/hex" "encoding/json" "errors" + "github.com/eatmoreapple/juice/cache" "github.com/eatmoreapple/juice/driver" "github.com/eatmoreapple/juice/internal/reflectlite" @@ -94,22 +95,21 @@ var _ SQLRowsExecutor = (*invalidExecutor)(nil) // sqlRowsExecutor implements the SQLRowsExecutor interface. type sqlRowsExecutor struct { - session Session - statement Statement - driver driver.Driver - middlewares MiddlewareGroup + session Session + statement Statement + statementHandler StatementHandler + driver driver.Driver + middlewares MiddlewareGroup } // QueryContext executes the query and returns the result. func (e *sqlRowsExecutor) QueryContext(ctx context.Context, param Param) (*sql.Rows, error) { - handler := NewSQLRowsStatementHandler(e.driver, e.session, e.middlewares...) - return handler.QueryContext(ctx, e.Statement(), param) + return e.statementHandler.QueryContext(ctx, e.Statement(), param) } // ExecContext executes the query and returns the result. func (e *sqlRowsExecutor) ExecContext(ctx context.Context, param Param) (sql.Result, error) { - handler := NewSQLRowsStatementHandler(e.driver, e.session, e.middlewares...) - return handler.ExecContext(ctx, e.Statement(), param) + return e.statementHandler.ExecContext(ctx, e.Statement(), param) } // Statement returns the xmlSQLStatement. diff --git a/juice.go b/juice.go index 1e90166..0ef65b9 100644 --- a/juice.go +++ b/juice.go @@ -19,6 +19,7 @@ package juice import ( "context" "database/sql" + "github.com/eatmoreapple/juice/cache" "github.com/eatmoreapple/juice/driver" ) @@ -55,11 +56,13 @@ func (e *Engine) executor(v any) (*sqlRowsExecutor, error) { if err != nil { return nil, err } + handler := NewSQLRowsStatementHandler(e.driver, e.DB(), e.middlewares...) return &sqlRowsExecutor{ - statement: stat, - session: e.DB(), - driver: e.driver, - middlewares: e.middlewares, + statement: stat, + statementHandler: handler, + session: e.DB(), + driver: e.driver, + middlewares: e.middlewares, }, nil } diff --git a/statement.go b/statement.go index d185ceb..5c86021 100644 --- a/statement.go +++ b/statement.go @@ -19,8 +19,9 @@ package juice import ( "context" "database/sql" - "github.com/eatmoreapple/juice/driver" "regexp" + + "github.com/eatmoreapple/juice/driver" ) type Statement interface { @@ -33,6 +34,11 @@ type Statement interface { Build(translator driver.Translator, param Param) (query string, args []any, err error) } +type StatementHandler interface { + ExecContext(ctx context.Context, statement Statement, param Param) (sql.Result, error) + QueryContext(ctx context.Context, statement Statement, param Param) (*sql.Rows, error) +} + var formatRegexp = regexp.MustCompile(`\$\{ *?([a-zA-Z0-9_\.]+) *?\}`) // xmlSQLStatement defines a sql xmlSQLStatement. @@ -164,10 +170,12 @@ func (s *SQLRowsStatementHandler) ExecContext(ctx context.Context, statement Sta return execHandler(ctx, query, args...) } +var _ StatementHandler = (*SQLRowsStatementHandler)(nil) + // NewSQLRowsStatementHandler creates a new instance of SQLRowsStatementHandler // with the provided driver, session, and an optional list of middlewares. This // function is typically used to initialize the handler before executing SQL statements. -func NewSQLRowsStatementHandler(driver driver.Driver, session Session, middlewares ...Middleware) *SQLRowsStatementHandler { +func NewSQLRowsStatementHandler(driver driver.Driver, session Session, middlewares ...Middleware) StatementHandler { return &SQLRowsStatementHandler{ driver: driver, middlewares: middlewares,