Quellcode durchsuchen

Support caching results

Lucas Stadler vor 9 Jahren
Ursprung
Commit
9675e544dd
1 geänderte Dateien mit 87 neuen und 3 gelöschten Zeilen
  1. 87 3
      go/inquire/inquire.go

+ 87 - 3
go/inquire/inquire.go

@ -2,6 +2,7 @@ package main
2 2
3 3
import (
4 4
	"bytes"
5
	"encoding/gob"
5 6
	"encoding/json"
6 7
	"flag"
7 8
	"fmt"
@ -29,17 +30,24 @@ type PageInfo struct {
29 30
}
30 31
31 32
var config = struct {
32
	output string
33
	output    string
34
	cachePath string
33 35
}{}
34 36
35 37
func init() {
36 38
	flag.StringVar(&config.output, "output", "text", "what format to output")
39
	flag.StringVar(&config.cachePath, "cache", "inquire.db", "path to the cache file")
37 40
}
38 41
39 42
func main() {
40 43
	flag.Parse()
41 44
42
	u := flag.Args()[0]
45
	if flag.NArg() != 1 {
46
		fmt.Fprintf(os.Stderr, "Usage: %s [flags] <url>\n", os.Args[0])
47
		os.Exit(1)
48
	}
49
	u := flag.Arg(0)
50
43 51
	url, err := url.Parse(u)
44 52
	if err != nil {
45 53
		fmt.Fprintln(os.Stderr, err)
@ -50,12 +58,37 @@ func main() {
50 58
		u = "http://" + u
51 59
	}
52 60
53
	info, err := GetPageInfo(u)
61
	db, err := openCache(config.cachePath)
62
	if err != nil {
63
		fmt.Fprintln(os.Stderr, err)
64
	}
65
66
	var info *PageInfo
67
68
	cached := isCached(db, u)
69
	if cached {
70
		info, err = GetPageInfoFromCache(db, u)
71
	} else {
72
		info, err = GetPageInfo(u)
73
	}
74
54 75
	if err != nil {
55 76
		fmt.Fprintln(os.Stderr, err)
56 77
		os.Exit(1)
57 78
	}
58 79
80
	if !cached {
81
		err = storeInCache(db, u, info)
82
		if err != nil {
83
			fmt.Fprintln(os.Stderr, err)
84
		}
85
86
		err = writeCache(db, config.cachePath)
87
		if err != nil {
88
			fmt.Fprintln(os.Stderr, err)
89
		}
90
	}
91
59 92
	switch config.output {
60 93
	case "text":
61 94
		fmt.Printf("url: %s\ntitle: %s\ndescription: %s\nimage: %s\n",
@ -90,6 +123,57 @@ func main() {
90 123
	}
91 124
}
92 125
126
type Cache map[string][]byte
127
128
func openCache(path string) (Cache, error) {
129
	f, err := os.Open(path)
130
	if err != nil {
131
		if os.IsNotExist(err) {
132
			return Cache{}, nil
133
		}
134
135
		return nil, err
136
	}
137
138
	dec := gob.NewDecoder(f)
139
	var db Cache
140
	err = dec.Decode(&db)
141
	return db, err
142
}
143
144
func isCached(db Cache, u string) bool {
145
	_, ok := db[u]
146
	return ok
147
}
148
149
func GetPageInfoFromCache(db Cache, u string) (*PageInfo, error) {
150
	rawInfo := db[u]
151
	var info *PageInfo
152
	err := json.Unmarshal(rawInfo, &info)
153
	return info, err
154
}
155
156
func storeInCache(db Cache, u string, info *PageInfo) error {
157
	rawInfo, err := json.Marshal(info)
158
	if err != nil {
159
		return err
160
	}
161
	db[u] = rawInfo
162
	return nil
163
}
164
165
func writeCache(db Cache, path string) error {
166
	f, err := os.Create(path)
167
	if err != nil {
168
		return err
169
	}
170
	defer f.Close()
171
172
	enc := gob.NewEncoder(f)
173
	err = enc.Encode(db)
174
	return err
175
}
176
93 177
func GetPageInfo(u string) (*PageInfo, error) {
94 178
	res, err := http.Get(u)
95 179
	if err != nil {