From d8a88fdb8cf6abfdfc5f81bbf44d732810fb0c6e Mon Sep 17 00:00:00 2001 From: truanv Date: Mon, 25 Nov 2024 16:36:56 +0700 Subject: [PATCH] #chore(query): exec query string (raw Query Builder) --- runtime/builder/query_string.go | 49 ++++++++++++++++++++++++++++ runtime/raw/query_string.go | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 runtime/builder/query_string.go create mode 100644 runtime/raw/query_string.go diff --git a/runtime/builder/query_string.go b/runtime/builder/query_string.go new file mode 100644 index 00000000..1b9fa4c0 --- /dev/null +++ b/runtime/builder/query_string.go @@ -0,0 +1,49 @@ +package builder + +import ( + "context" + "fmt" + "github.com/steebchen/prisma-client-go/engine" + "github.com/steebchen/prisma-client-go/engine/protocol" + "github.com/steebchen/prisma-client-go/logger" + "time" +) + +type QueryString struct { + // Engine holds the implementation of how queries are processed + Engine engine.Engine + + // Start time of the request for tracing + Start time.Time + + // Query string + Query string + + TxResult chan []byte +} + +func NewQueryString() QueryString { + return QueryString{ + Start: time.Now(), + } +} + +func (q QueryString) Exec(ctx context.Context, into interface{}) error { + payload := protocol.GQLRequest{ + Query: q.Query, + Variables: map[string]interface{}{}, + } + return q.Do(ctx, payload, into) +} + +func (q QueryString) Do(ctx context.Context, payload interface{}, into interface{}) error { + if q.Engine == nil { + return fmt.Errorf("client.Prisma.Connect() needs to be called before sending queries") + } + + err := q.Engine.Do(ctx, payload, into) + now := time.Now() + totalDuration := now.Sub(q.Start) + logger.Debug.Printf("[timing] TOTAL %q", totalDuration) + return err +} diff --git a/runtime/raw/query_string.go b/runtime/raw/query_string.go new file mode 100644 index 00000000..a024f5b5 --- /dev/null +++ b/runtime/raw/query_string.go @@ -0,0 +1,57 @@ +package raw + +import ( + "context" + "github.com/steebchen/prisma-client-go/runtime/builder" + "github.com/steebchen/prisma-client-go/runtime/transaction" +) + +func (r Raw) QueryString(query string) QueryStringExec { + queryStr := builder.NewQueryString() + queryStr.Engine = r.Engine + queryStr.Query = query + + return QueryStringExec{ + query: queryStr, + } +} + +type QueryStringExec struct { + query builder.QueryString +} + +func (r QueryStringExec) ExtractQuery() builder.QueryString { + return r.query +} + +type TxQueryStringResult struct { + query builder.QueryString + result *transaction.Result +} + +func NewTxQueryStringResult() TxQueryStringResult { + return TxQueryStringResult{ + result: &transaction.Result{}, + } +} + +func (r TxQueryStringResult) ExtractQuery() builder.QueryString { + return r.query +} + +func (r TxQueryStringResult) IsTx() {} + +func (r TxQueryStringResult) Into(v interface{}) error { + return r.result.Get(r.query.TxResult, &v) +} + +func (r QueryStringExec) Tx() TxQueryStringResult { + v := NewTxQueryStringResult() + v.query = r.ExtractQuery() + v.query.TxResult = make(chan []byte, 1) + return v +} + +func (r QueryStringExec) Exec(ctx context.Context, into interface{}) error { + return r.query.Exec(ctx, into) +}