Skip to content

Commit d7aeffe

Browse files
committed
filecache as part of evaluation state
1 parent a68f294 commit d7aeffe

File tree

5 files changed

+52
-30
lines changed

5 files changed

+52
-30
lines changed

dynaml/expression.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type Binding interface {
3535
NoMerge() bool
3636

3737
GetTempName(data []byte) (string, error)
38+
GetFileContent(file string, cached bool) ([]byte, error)
3839

3940
Flow(source yaml.Node, shouldOverride bool) (yaml.Node, Status)
4041
Cascade(outer Binding, template yaml.Node, partial bool, templates ...yaml.Node) (yaml.Node, error)

dynaml/fake_binding_helper_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func (c FakeBinding) GetTempName([]byte) (string, error) {
2020
return "", fmt.Errorf("no temp names")
2121
}
2222

23+
func (c FakeBinding) GetFileContent(file string, cached bool) ([]byte, error) {
24+
return nil, fmt.Errorf("no file access")
25+
}
26+
2327
func (c FakeBinding) Outer() Binding {
2428
return nil
2529
}

dynaml/read.go

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package dynaml
22

33
import (
4-
"io/ioutil"
5-
"net/http"
64
"path"
75
"regexp"
86
"strings"
@@ -11,8 +9,6 @@ import (
119
"github.com/mandelsoft/spiff/yaml"
1210
)
1311

14-
var fileCache = map[string][]byte{}
15-
1612
var templ_pattern = regexp.MustCompile(".*\\s+&template(\\(?|\\s+).*")
1713

1814
func func_read(cached bool, arguments []interface{}, binding Binding) (interface{}, EvaluationInfo, bool) {
@@ -39,30 +35,9 @@ func func_read(cached bool, arguments []interface{}, binding Binding) (interface
3935

4036
}
4137

42-
var err error
43-
44-
data := fileCache[file]
45-
if !cached || data == nil {
46-
debug.Debug("reading %s file %s\n", t, file)
47-
if strings.HasPrefix(file, "http:") || strings.HasPrefix(file, "https:") {
48-
response, err := http.Get(file)
49-
if err != nil {
50-
return info.Error("error getting [%s]: %s", file, err)
51-
} else {
52-
defer response.Body.Close()
53-
contents, err := ioutil.ReadAll(response.Body)
54-
if err != nil {
55-
return info.Error("error getting body [%s]: %s", file, err)
56-
}
57-
data = contents
58-
}
59-
} else {
60-
data, err = ioutil.ReadFile(file)
61-
if err != nil {
62-
return info.Error("error reading [%s]: %s", path.Clean(file), err)
63-
}
64-
}
65-
fileCache[file] = data
38+
data, err := binding.GetFileContent(file, cached)
39+
if err != nil {
40+
return info.Error("read: %s", err)
6641
}
6742
return parse(file, data, t, binding)
6843
}

flow/environment.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ func (e DefaultEnvironment) GetTempName(data []byte) (string, error) {
7878
return e.state.GetTempName(data)
7979
}
8080

81+
func (e DefaultEnvironment) GetFileContent(file string, cached bool) ([]byte, error) {
82+
if e.outer != nil {
83+
return e.outer.GetFileContent(file, cached)
84+
}
85+
return e.state.GetFileContent(file, cached)
86+
}
87+
8188
func (e DefaultEnvironment) Outer() dynaml.Binding {
8289
return e.outer
8390
}

flow/state.go

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@ package flow
33
import (
44
"crypto/sha512"
55
"encoding/base64"
6+
"fmt"
7+
"github.com/mandelsoft/spiff/debug"
68
"io/ioutil"
9+
"net/http"
710
"os"
11+
"path"
12+
"strings"
813
)
914

1015
type State struct {
11-
files map[string]string
16+
files map[string]string // content hash to temp file name
17+
fileCache map[string][]byte // file content cache
1218
}
1319

1420
func NewState() *State {
15-
return &State{map[string]string{}}
21+
return &State{map[string]string{}, map[string][]byte{}}
1622
}
1723

1824
func (s *State) GetTempName(data []byte) (string, error) {
@@ -37,3 +43,32 @@ func (s *State) Cleanup() {
3743
}
3844
s.files = map[string]string{}
3945
}
46+
47+
func (s *State) GetFileContent(file string, cached bool) ([]byte, error) {
48+
var err error
49+
50+
data := s.fileCache[file]
51+
if !cached || data == nil {
52+
debug.Debug("reading file %s\n", file)
53+
if strings.HasPrefix(file, "http:") || strings.HasPrefix(file, "https:") {
54+
response, err := http.Get(file)
55+
if err != nil {
56+
return nil, fmt.Errorf("error getting [%s]: %s", file, err)
57+
} else {
58+
defer response.Body.Close()
59+
contents, err := ioutil.ReadAll(response.Body)
60+
if err != nil {
61+
return nil, fmt.Errorf("error getting body [%s]: %s", file, err)
62+
}
63+
data = contents
64+
}
65+
} else {
66+
data, err = ioutil.ReadFile(file)
67+
if err != nil {
68+
return nil, fmt.Errorf("error reading [%s]: %s", path.Clean(file), err)
69+
}
70+
}
71+
s.fileCache[file] = data
72+
}
73+
return data, nil
74+
}

0 commit comments

Comments
 (0)