Add SQL query cacheing

This commit is contained in:
Vikram Rangnekar
2019-04-20 00:35:57 -04:00
parent 652b31ce38
commit b666876064
9 changed files with 117 additions and 43 deletions

View File

@ -2,44 +2,74 @@ package serv
import (
"context"
"crypto/sha1"
"encoding/json"
"fmt"
"io"
"strings"
"time"
"github.com/allegro/bigcache"
"github.com/dosco/super-graph/qcode"
"github.com/go-pg/pg"
"github.com/valyala/fasttemplate"
)
var (
cache, _ = bigcache.NewBigCache(bigcache.DefaultConfig(24 * time.Hour))
)
func handleReq(ctx context.Context, w io.Writer, req *gqlReq) error {
qc, err := qcompile.CompileQuery(req.Query)
if err != nil {
var key, finalSQL string
var qc *qcode.QCode
var entry []byte
var err error
cacheEnabled := (conf.EnableTracing == false)
if cacheEnabled {
k := sha1.Sum([]byte(req.Query))
key = string(k[:])
entry, err = cache.Get(key)
}
if len(entry) == 0 || err == bigcache.ErrEntryNotFound {
qc, err = qcompile.CompileQuery(req.Query)
if err != nil {
return err
}
var sqlStmt strings.Builder
if err := pcompile.Compile(&sqlStmt, qc); err != nil {
return err
}
t := fasttemplate.New(sqlStmt.String(), openVar, closeVar)
sqlStmt.Reset()
_, err = t.Execute(&sqlStmt, varMap(ctx, req.Vars))
if err == errNoUserID &&
authFailBlock == authFailBlockPerQuery &&
authCheck(ctx) == false {
return errUnauthorized
}
if err != nil {
return err
}
finalSQL = sqlStmt.String()
} else if err != nil {
return err
} else {
finalSQL = string(entry)
}
var sqlStmt strings.Builder
if err := pcompile.Compile(&sqlStmt, qc); err != nil {
return err
}
t := fasttemplate.New(sqlStmt.String(), openVar, closeVar)
sqlStmt.Reset()
_, err = t.Execute(&sqlStmt, varMap(ctx, req.Vars))
if err == errNoUserID &&
authFailBlock == authFailBlockPerQuery &&
authCheck(ctx) == false {
return errUnauthorized
}
if err != nil {
return err
}
finalSQL := sqlStmt.String()
if conf.DebugLevel > 0 {
fmt.Println(finalSQL)
}
@ -55,6 +85,12 @@ func handleReq(ctx context.Context, w io.Writer, req *gqlReq) error {
et := time.Now()
resp := gqlResp{Data: json.RawMessage(root)}
if cacheEnabled {
if err = cache.Set(key, []byte(finalSQL)); err != nil {
return err
}
}
if conf.EnableTracing {
resp.Extensions = &extensions{newTrace(st, et, qc)}
}