ziv@2233
|
1 structure ToyCache : sig
|
ziv@2233
|
2 val cache : Cache.cache
|
ziv@2233
|
3 end = struct
|
ziv@2233
|
4
|
ziv@2231
|
5
|
ziv@2231
|
6 (* Mono *)
|
ziv@2231
|
7
|
ziv@2231
|
8 open Mono
|
ziv@2231
|
9
|
ziv@2231
|
10 val dummyLoc = ErrorMsg.dummySpan
|
ziv@2231
|
11 val stringTyp = (TFfi ("Basis", "string"), dummyLoc)
|
ziv@2231
|
12 val optionStringTyp = (TOption stringTyp, dummyLoc)
|
ziv@2231
|
13 fun withTyp typ = map (fn exp => (exp, typ))
|
ziv@2231
|
14
|
ziv@2231
|
15 fun ffiAppCache' (func, index, argTyps) =
|
ziv@2265
|
16 EFfiApp ("Sqlcache", func ^ Int.toString index, argTyps)
|
ziv@2231
|
17
|
ziv@2231
|
18 fun check (index, keys) =
|
ziv@2231
|
19 ffiAppCache' ("check", index, withTyp stringTyp keys)
|
ziv@2231
|
20
|
ziv@2231
|
21 fun store (index, keys, value) =
|
ziv@2231
|
22 ffiAppCache' ("store", index, (value, stringTyp) :: withTyp stringTyp keys)
|
ziv@2231
|
23
|
ziv@2231
|
24 fun flush (index, keys) =
|
ziv@2231
|
25 ffiAppCache' ("flush", index, withTyp optionStringTyp keys)
|
ziv@2231
|
26
|
ziv@2286
|
27 fun lock (index, keys) =
|
ziv@2286
|
28 raise Fail "ToyCache doesn't yet implement lock"
|
ziv@2286
|
29
|
ziv@2231
|
30
|
ziv@2231
|
31 (* Cjr *)
|
ziv@2231
|
32
|
ziv@2231
|
33 open Print
|
ziv@2231
|
34 open Print.PD
|
ziv@2231
|
35
|
ziv@2231
|
36 fun setupQuery {index, params} =
|
ziv@2231
|
37 let
|
ziv@2231
|
38
|
ziv@2231
|
39 val i = Int.toString index
|
ziv@2231
|
40
|
ziv@2231
|
41 fun paramRepeat itemi sep =
|
ziv@2231
|
42 let
|
ziv@2231
|
43 fun f n =
|
ziv@2231
|
44 if n < 0 then ""
|
ziv@2231
|
45 else if n = 0 then itemi (Int.toString 0)
|
ziv@2231
|
46 else f (n-1) ^ sep ^ itemi (Int.toString n)
|
ziv@2231
|
47 in
|
ziv@2231
|
48 f (params - 1)
|
ziv@2231
|
49 end
|
ziv@2231
|
50
|
ziv@2231
|
51 fun paramRepeatInit itemi sep =
|
ziv@2231
|
52 if params = 0 then "" else sep ^ paramRepeat itemi sep
|
ziv@2231
|
53
|
ziv@2231
|
54 val args = paramRepeatInit (fn p => "uw_Basis_string p" ^ p) ", "
|
ziv@2231
|
55
|
ziv@2231
|
56 val decls = paramRepeat (fn p => "uw_Basis_string param" ^ i ^ "_"
|
ziv@2231
|
57 ^ p ^ " = NULL;")
|
ziv@2231
|
58 "\n"
|
ziv@2231
|
59
|
ziv@2231
|
60 val sets = paramRepeat (fn p => "param" ^ i ^ "_" ^ p
|
ziv@2231
|
61 ^ " = strdup(p" ^ p ^ ");")
|
ziv@2231
|
62 "\n"
|
ziv@2231
|
63
|
ziv@2231
|
64 val frees = paramRepeat (fn p => "free(param" ^ i ^ "_" ^ p ^ ");")
|
ziv@2231
|
65 "\n"
|
ziv@2231
|
66
|
ziv@2231
|
67 val eqs = paramRepeatInit (fn p => "strcmp(param" ^ i ^ "_" ^ p
|
ziv@2231
|
68 ^ ", p" ^ p ^ ")")
|
ziv@2231
|
69 " || "
|
ziv@2231
|
70
|
ziv@2231
|
71 (* Using [!=] instead of [==] to mimic [strcmp]. *)
|
ziv@2231
|
72 val eqsNull = paramRepeatInit (fn p => "(p" ^ p ^ " == NULL || "
|
ziv@2231
|
73 ^ "!strcmp(param" ^ i ^ "_"
|
ziv@2231
|
74 ^ p ^ ", p" ^ p ^ "))")
|
ziv@2231
|
75 " && "
|
ziv@2231
|
76
|
ziv@2231
|
77 in
|
ziv@2231
|
78 Print.box
|
ziv@2231
|
79 [string "static char *cacheQuery",
|
ziv@2231
|
80 string i,
|
ziv@2231
|
81 string " = NULL;",
|
ziv@2231
|
82 newline,
|
ziv@2231
|
83 string "static char *cacheWrite",
|
ziv@2231
|
84 string i,
|
ziv@2231
|
85 string " = NULL;",
|
ziv@2231
|
86 newline,
|
ziv@2231
|
87 string decls,
|
ziv@2231
|
88 newline,
|
ziv@2231
|
89 string "static uw_Basis_string uw_Sqlcache_check",
|
ziv@2231
|
90 string i,
|
ziv@2231
|
91 string "(uw_context ctx",
|
ziv@2231
|
92 string args,
|
ziv@2231
|
93 string ") {",
|
ziv@2231
|
94 newline,
|
ziv@2262
|
95 string "if (cacheWrite",
|
ziv@2231
|
96 string i,
|
ziv@2231
|
97 (* ASK: is returning the pointer okay? Should we duplicate? *)
|
ziv@2231
|
98 string " == NULL",
|
ziv@2231
|
99 string eqs,
|
ziv@2231
|
100 string ") {",
|
ziv@2231
|
101 newline,
|
ziv@2231
|
102 string "puts(\"SQLCACHE: miss ",
|
ziv@2231
|
103 string i,
|
ziv@2231
|
104 string ".\");",
|
ziv@2231
|
105 newline,
|
ziv@2231
|
106 string "uw_recordingStart(ctx);",
|
ziv@2231
|
107 newline,
|
ziv@2231
|
108 string "return NULL;",
|
ziv@2231
|
109 newline,
|
ziv@2231
|
110 string "} else {",
|
ziv@2231
|
111 newline,
|
ziv@2231
|
112 string "puts(\"SQLCACHE: hit ",
|
ziv@2231
|
113 string i,
|
ziv@2231
|
114 string ".\");",
|
ziv@2231
|
115 newline,
|
ziv@2262
|
116 string " if (cacheWrite",
|
ziv@2231
|
117 string i,
|
ziv@2262
|
118 string " != NULL) { uw_write(ctx, cacheWrite",
|
ziv@2262
|
119 string i,
|
ziv@2262
|
120 string "); }",
|
ziv@2231
|
121 newline,
|
ziv@2231
|
122 string "return cacheQuery",
|
ziv@2231
|
123 string i,
|
ziv@2231
|
124 string ";",
|
ziv@2231
|
125 newline,
|
ziv@2231
|
126 string "} };",
|
ziv@2231
|
127 newline,
|
ziv@2231
|
128 string "static uw_unit uw_Sqlcache_store",
|
ziv@2231
|
129 string i,
|
ziv@2231
|
130 string "(uw_context ctx, uw_Basis_string s",
|
ziv@2231
|
131 string args,
|
ziv@2231
|
132 string ") {",
|
ziv@2231
|
133 newline,
|
ziv@2231
|
134 string "free(cacheQuery",
|
ziv@2231
|
135 string i,
|
ziv@2231
|
136 string "); free(cacheWrite",
|
ziv@2231
|
137 string i,
|
ziv@2231
|
138 string ");",
|
ziv@2231
|
139 newline,
|
ziv@2231
|
140 string frees,
|
ziv@2231
|
141 newline,
|
ziv@2231
|
142 string "cacheQuery",
|
ziv@2231
|
143 string i,
|
ziv@2231
|
144 string " = strdup(s); cacheWrite",
|
ziv@2231
|
145 string i,
|
ziv@2231
|
146 string " = uw_recordingRead(ctx);",
|
ziv@2231
|
147 newline,
|
ziv@2231
|
148 string sets,
|
ziv@2231
|
149 newline,
|
ziv@2231
|
150 string "puts(\"SQLCACHE: store ",
|
ziv@2231
|
151 string i,
|
ziv@2231
|
152 string ".\");",
|
ziv@2231
|
153 newline,
|
ziv@2231
|
154 string "return uw_unit_v;",
|
ziv@2231
|
155 newline,
|
ziv@2231
|
156 string "};",
|
ziv@2231
|
157 newline,
|
ziv@2231
|
158 string "static uw_unit uw_Sqlcache_flush",
|
ziv@2231
|
159 string i,
|
ziv@2231
|
160 string "(uw_context ctx",
|
ziv@2231
|
161 string args,
|
ziv@2231
|
162 string ") {",
|
ziv@2231
|
163 newline,
|
ziv@2231
|
164 string "if (cacheQuery",
|
ziv@2231
|
165 string i,
|
ziv@2231
|
166 string " != NULL",
|
ziv@2231
|
167 string eqsNull,
|
ziv@2231
|
168 string ") {",
|
ziv@2231
|
169 newline,
|
ziv@2231
|
170 string "free(cacheQuery",
|
ziv@2231
|
171 string i,
|
ziv@2231
|
172 string ");",
|
ziv@2231
|
173 newline,
|
ziv@2231
|
174 string "cacheQuery",
|
ziv@2231
|
175 string i,
|
ziv@2231
|
176 string " = NULL;",
|
ziv@2231
|
177 newline,
|
ziv@2262
|
178 string "free(cacheWrite",
|
ziv@2262
|
179 string i,
|
ziv@2262
|
180 string ");",
|
ziv@2262
|
181 newline,
|
ziv@2262
|
182 string "cacheWrite",
|
ziv@2262
|
183 string i,
|
ziv@2262
|
184 string " = NULL;",
|
ziv@2262
|
185 newline,
|
ziv@2231
|
186 string "puts(\"SQLCACHE: flush ",
|
ziv@2231
|
187 string i,
|
ziv@2231
|
188 string ".\");}",
|
ziv@2231
|
189 newline,
|
ziv@2231
|
190 string "else { puts(\"SQLCACHE: keep ",
|
ziv@2231
|
191 string i,
|
ziv@2231
|
192 string ".\"); } return uw_unit_v;",
|
ziv@2231
|
193 newline,
|
ziv@2231
|
194 string "};",
|
ziv@2231
|
195 newline,
|
ziv@2231
|
196 newline]
|
ziv@2231
|
197 end
|
ziv@2231
|
198
|
ziv@2231
|
199 val setupGlobal = string "/* No global setup for toy cache. */"
|
ziv@2231
|
200
|
ziv@2233
|
201
|
ziv@2233
|
202 (* Bundled up. *)
|
ziv@2233
|
203
|
ziv@2286
|
204 val cache = {check = check, store = store, flush = flush, lock = lock,
|
ziv@2233
|
205 setupQuery = setupQuery, setupGlobal = setupGlobal}
|
ziv@2233
|
206
|
ziv@2231
|
207 end
|