feat: remove data from variables saved to allow.list
This commit is contained in:
parent
5aafff6310
commit
84d55dbc8a
|
@ -9,6 +9,8 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/dosco/super-graph/jsn"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -230,6 +232,8 @@ func (al *List) Load() ([]Item, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (al *List) save(item Item) error {
|
func (al *List) save(item Item) error {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
item.Name = QueryName(item.Query)
|
item.Name = QueryName(item.Query)
|
||||||
item.key = strings.ToLower(item.Name)
|
item.key = strings.ToLower(item.Name)
|
||||||
|
|
||||||
|
@ -298,9 +302,16 @@ func (al *List) save(item Item) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(v.Vars) != 0 && !bytes.Equal(v.Vars, []byte("{}")) {
|
if len(v.Vars) != 0 && !bytes.Equal(v.Vars, []byte("{}")) {
|
||||||
vj, err := json.MarshalIndent(v.Vars, "", " ")
|
buf.Reset()
|
||||||
|
|
||||||
|
if err := jsn.Clear(&buf, v.Vars); err != nil {
|
||||||
|
return fmt.Errorf("failed to clean vars: %w", err)
|
||||||
|
}
|
||||||
|
vj := json.RawMessage(buf.Bytes())
|
||||||
|
|
||||||
|
vj, err = json.MarshalIndent(vj, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to marshal vars: %v", err)
|
return fmt.Errorf("failed to marshal vars: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = f.WriteString(fmt.Sprintf("variables %s\n\n", vj))
|
_, err = f.WriteString(fmt.Sprintf("variables %s\n\n", vj))
|
||||||
|
|
|
@ -921,8 +921,6 @@ func (c *compilerContext) renderExp(ex *qcode.Exp, ti *DBTableInfo, skipNested b
|
||||||
st.Push('(')
|
st.Push('(')
|
||||||
|
|
||||||
case qcode.OpNot:
|
case qcode.OpNot:
|
||||||
//fmt.Printf("1> %s %d %s %s\n", val.Op, len(val.Children), val.Children[0].Op, val.Children[1].Op)
|
|
||||||
|
|
||||||
st.Push(val.Children[0])
|
st.Push(val.Children[0])
|
||||||
st.Push(qcode.OpNot)
|
st.Push(qcode.OpNot)
|
||||||
|
|
||||||
|
|
|
@ -602,7 +602,7 @@ func (t parserType) String() string {
|
||||||
// nodePool.Put(n)
|
// nodePool.Put(n)
|
||||||
// freeList = append(freeList, Frees{n, loc})
|
// freeList = append(freeList, Frees{n, loc})
|
||||||
// } else {
|
// } else {
|
||||||
// fmt.Printf(">>>>(%d) RE_FREE %d %p %s %s\n", loc, freeList[j].loc, freeList[j].n, n.Name, n.Type)
|
// fmt.Printf("(%d) RE_FREE %d %p %s %s\n", loc, freeList[j].loc, freeList[j].n, n.Name, n.Type)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
package jsn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Clear function wipes all scalar values from the json including those directly in an array
|
||||||
|
func Clear(w *bytes.Buffer, v []byte) error {
|
||||||
|
dec := json.NewDecoder(bytes.NewReader(v))
|
||||||
|
|
||||||
|
st := newIntStack()
|
||||||
|
isValue := false
|
||||||
|
inArray := false
|
||||||
|
n := 0
|
||||||
|
|
||||||
|
for {
|
||||||
|
var t json.Token
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if t, err = dec.Token(); err == io.EOF {
|
||||||
|
break
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch v1 := t.(type) {
|
||||||
|
case int:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteByte('0')
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case float64:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`0.0`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case bool:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`false`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case json.Number:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`0`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case nil:
|
||||||
|
if isValue && !inArray {
|
||||||
|
w.WriteString(`null`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case string:
|
||||||
|
if !isValue {
|
||||||
|
if n != 0 {
|
||||||
|
w.WriteByte(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
io := int(dec.InputOffset())
|
||||||
|
w.Write(v[io-len(v1)-2 : io])
|
||||||
|
w.WriteString(`:`)
|
||||||
|
isValue = true
|
||||||
|
|
||||||
|
} else if !inArray {
|
||||||
|
w.WriteString(`""`)
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
|
||||||
|
case json.Delim:
|
||||||
|
switch t.(json.Delim) {
|
||||||
|
case '[':
|
||||||
|
st.Push(n)
|
||||||
|
inArray = true
|
||||||
|
n = 0
|
||||||
|
case ']':
|
||||||
|
n = st.Pop()
|
||||||
|
inArray = false
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
case '{':
|
||||||
|
if n != 0 && !isValue {
|
||||||
|
w.WriteByte(',')
|
||||||
|
}
|
||||||
|
st.Push(n)
|
||||||
|
inArray = false
|
||||||
|
isValue = false
|
||||||
|
n = 0
|
||||||
|
case '}':
|
||||||
|
n = st.Pop()
|
||||||
|
isValue = false
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
w.WriteByte(v[dec.InputOffset()-1])
|
||||||
|
}
|
||||||
|
|
||||||
|
dec.More()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
package jsn
|
||||||
|
|
||||||
|
type intStack struct {
|
||||||
|
stA [20]int
|
||||||
|
st []int
|
||||||
|
top int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new intStack
|
||||||
|
func newIntStack() *intStack {
|
||||||
|
s := &intStack{top: -1}
|
||||||
|
s.st = s.stA[:0]
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the number of items in the intStack
|
||||||
|
func (s *intStack) Len() int {
|
||||||
|
return (s.top + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// View the top item on the intStack
|
||||||
|
func (s *intStack) Peek() int {
|
||||||
|
if s.top == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return s.st[s.top]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop the top item of the intStack and return it
|
||||||
|
func (s *intStack) Pop() int {
|
||||||
|
if s.top == -1 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
s.top--
|
||||||
|
return s.st[(s.top + 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push a value onto the top of the intStack
|
||||||
|
func (s *intStack) Push(value int) {
|
||||||
|
s.top++
|
||||||
|
if len(s.st) <= s.top {
|
||||||
|
s.st = append(s.st, value)
|
||||||
|
} else {
|
||||||
|
s.st[s.top] = value
|
||||||
|
}
|
||||||
|
}
|
|
@ -509,6 +509,34 @@ func TestKeys3(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestClear(t *testing.T) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
json := `{
|
||||||
|
"insert": {
|
||||||
|
"created_at": "now",
|
||||||
|
"test_1a": { "type1": "a", "type2": [{ "a": 2 }] },
|
||||||
|
"name": "Hello",
|
||||||
|
"updated_at": "now",
|
||||||
|
"description": "World"
|
||||||
|
},
|
||||||
|
"user": 123,
|
||||||
|
"tags": [1, 2, "what"]
|
||||||
|
}`
|
||||||
|
|
||||||
|
expected := `{"insert":{"created_at":"","test_1a":{"type1":"","type2":[{"a":0.0}]},"name":"","updated_at":"","description":""},"user":0.0,"tags":[]}`
|
||||||
|
|
||||||
|
err := Clear(&buf, []byte(json))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf.String() != expected {
|
||||||
|
t.Log(buf.String())
|
||||||
|
t.Error("Does not match expected json")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGet(b *testing.B) {
|
func BenchmarkGet(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ func Keys(b []byte) [][]byte {
|
||||||
var k []byte
|
var k []byte
|
||||||
state := expectValue
|
state := expectValue
|
||||||
|
|
||||||
st := newStack()
|
st := newSkipInfoStack()
|
||||||
ae := 0
|
ae := 0
|
||||||
instr := false
|
instr := false
|
||||||
slash := 0
|
slash := 0
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
package jsn
|
||||||
|
|
||||||
|
type skipInfo struct {
|
||||||
|
ss, se int
|
||||||
|
}
|
||||||
|
|
||||||
|
type siStack struct {
|
||||||
|
stA [20]skipInfo
|
||||||
|
st []skipInfo
|
||||||
|
top int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new siStack
|
||||||
|
func newSkipInfoStack() *siStack {
|
||||||
|
s := &siStack{top: -1}
|
||||||
|
s.st = s.stA[:0]
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the number of items in the siStack
|
||||||
|
func (s *siStack) Len() int {
|
||||||
|
return (s.top + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// View the top item on the siStack
|
||||||
|
func (s *siStack) Peek() *skipInfo {
|
||||||
|
if s.top == -1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &s.st[s.top]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pop the top item of the siStack and return it
|
||||||
|
func (s *siStack) Pop() *skipInfo {
|
||||||
|
if s.top == -1 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
s.top--
|
||||||
|
return &s.st[(s.top + 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push a value onto the top of the siStack
|
||||||
|
func (s *siStack) Push(value skipInfo) {
|
||||||
|
s.top++
|
||||||
|
if len(s.st) <= s.top {
|
||||||
|
s.st = append(s.st, value)
|
||||||
|
} else {
|
||||||
|
s.st[s.top] = value
|
||||||
|
}
|
||||||
|
}
|
51
jsn/stack.go
51
jsn/stack.go
|
@ -1,51 +0,0 @@
|
||||||
package jsn
|
|
||||||
|
|
||||||
type skipInfo struct {
|
|
||||||
ss, se int
|
|
||||||
}
|
|
||||||
|
|
||||||
type stack struct {
|
|
||||||
stA [20]skipInfo
|
|
||||||
st []skipInfo
|
|
||||||
top int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new stack
|
|
||||||
func newStack() *stack {
|
|
||||||
s := &stack{top: -1}
|
|
||||||
s.st = s.stA[:0]
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of items in the stack
|
|
||||||
func (s *stack) Len() int {
|
|
||||||
return (s.top + 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// View the top item on the stack
|
|
||||||
func (s *stack) Peek() *skipInfo {
|
|
||||||
if s.top == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &s.st[s.top]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pop the top item of the stack and return it
|
|
||||||
func (s *stack) Pop() *skipInfo {
|
|
||||||
if s.top == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
s.top--
|
|
||||||
return &s.st[(s.top + 1)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push a value onto the top of the stack
|
|
||||||
func (s *stack) Push(value skipInfo) {
|
|
||||||
s.top++
|
|
||||||
if len(s.st) <= s.top {
|
|
||||||
s.st = append(s.st, value)
|
|
||||||
} else {
|
|
||||||
s.st[s.top] = value
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue