@@ -118,17 +118,18 @@ struct Database {
118
118
119
119
impl Database {
120
120
pure fn prepare ( _fn_name : & str ,
121
- _declared_inputs : & const WorkMap ) ->
122
- Option < ( WorkMap , WorkMap , WorkMap , ~str ) > {
121
+ _declared_inputs : & const WorkMap ,
122
+ _declared_outputs : & const WorkMap ) ->
123
+ Option < ( WorkMap , WorkMap , ~str ) > {
123
124
// XXX: load
124
125
None
125
126
}
126
127
pure fn cache ( _fn_name : & str ,
127
- _declared_inputs : & WorkMap ,
128
- _declared_outputs : & WorkMap ,
129
- _discovered_inputs : & WorkMap ,
130
- _discovered_outputs : & WorkMap ,
131
- _result : & str ) {
128
+ _declared_inputs : & WorkMap ,
129
+ _declared_outputs : & WorkMap ,
130
+ _discovered_inputs : & WorkMap ,
131
+ _discovered_outputs : & WorkMap ,
132
+ _result : & str ) {
132
133
// XXX: store
133
134
}
134
135
}
@@ -138,11 +139,19 @@ struct Logger {
138
139
a : ( )
139
140
}
140
141
142
+ impl Logger {
143
+ pure fn info ( i : & str ) {
144
+ unsafe {
145
+ io:: println ( ~"workcache: " + i.to_owned());
146
+ }
147
+ }
148
+ }
149
+
141
150
struct Context {
142
151
db: @Database,
143
152
logger: @Logger,
144
153
cfg: @json::Object,
145
- freshness : LinearMap < ~str , ~ fn ( & str , & str ) ->bool >
154
+ freshness: LinearMap<~str,@pure fn(&str,&str)->bool>
146
155
}
147
156
148
157
struct Prep {
@@ -213,25 +222,57 @@ impl Prep {
213
222
val.to_owned());
214
223
}
215
224
225
+ pure fn is_fresh(cat: &str, kind: &str,
226
+ name: &str, val: &str) -> bool {
227
+ let k = kind.to_owned();
228
+ let f = (self.ctxt.freshness.get(&k))(name, val);
229
+ if f {
230
+ self.ctxt.logger.info(fmt!(" %s %s: %s is fresh",
231
+ cat, kind, name) ) ;
232
+ } else {
233
+ self. ctxt . logger . info ( fmt ! ( "%s %s:%s is not fresh" ,
234
+ cat, kind, name) )
235
+ }
236
+ return f;
237
+ }
238
+
239
+ pure fn all_fresh ( cat : & str , map : WorkMap ) -> bool {
240
+ for map. each |k, v| {
241
+ if ! self . is_fresh ( cat, k. kind , k. name , * v) {
242
+ return false ;
243
+ }
244
+ }
245
+ return true ;
246
+ }
247
+
216
248
fn exec < T : Send
217
249
Serializable < json:: Serializer >
218
250
Deserializable < json:: Deserializer > > (
219
251
@mut self , blk : ~fn ( & Exec ) -> T ) -> Work < T > {
252
+
220
253
let cached = self . ctxt . db . prepare ( self . fn_name ,
221
- & self . declared_inputs ) ;
254
+ & self . declared_inputs ,
255
+ & self . declared_outputs ) ;
222
256
223
257
match move cached {
224
258
None => ( ) ,
225
- Some ( ( move _decl_out,
226
- move _disc_in,
227
- move _disc_out,
259
+ Some ( ( move disc_in,
260
+ move disc_out,
228
261
move res) ) => {
229
- // XXX: check deps for freshness, only return if fresh.
230
- let v : T = do io:: with_str_reader ( res) |rdr| {
231
- let j = result:: unwrap ( json:: from_reader ( rdr) ) ;
232
- deserialize ( & json:: Deserializer ( move j) )
233
- } ;
234
- return Work :: new ( self , move Left ( move v) ) ;
262
+
263
+ if self . all_fresh ( "declared input" ,
264
+ self . declared_inputs ) &&
265
+ self . all_fresh ( "declared output" ,
266
+ self . declared_outputs ) &&
267
+ self . all_fresh ( "discovered input" , disc_in) &&
268
+ self . all_fresh ( "discovered output" , disc_out) {
269
+
270
+ let v : T = do io:: with_str_reader ( res) |rdr| {
271
+ let j = result:: unwrap ( json:: from_reader ( rdr) ) ;
272
+ deserialize ( & json:: Deserializer ( move j) )
273
+ } ;
274
+ return Work :: new ( self , move Left ( move v) ) ;
275
+ }
235
276
}
236
277
}
237
278
0 commit comments