@@ -118,17 +118,18 @@ struct Database {
118118
119119impl Database {
120120 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 ) > {
123124 // XXX: load
124125 None
125126 }
126127 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 ) {
132133 // XXX: store
133134 }
134135}
@@ -138,11 +139,19 @@ struct Logger {
138139 a : ( )
139140}
140141
142+ impl Logger {
143+ pure fn info ( i : & str ) {
144+ unsafe {
145+ io:: println ( ~"workcache: " + i.to_owned());
146+ }
147+ }
148+ }
149+
141150struct Context {
142151 db: @Database,
143152 logger: @Logger,
144153 cfg: @json::Object,
145- freshness : LinearMap < ~str , ~ fn ( & str , & str ) ->bool >
154+ freshness: LinearMap<~str,@pure fn(&str,&str)->bool>
146155}
147156
148157struct Prep {
@@ -213,25 +222,57 @@ impl Prep {
213222 val.to_owned());
214223 }
215224
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+
216248 fn exec < T : Send
217249 Serializable < json:: Serializer >
218250 Deserializable < json:: Deserializer > > (
219251 @mut self , blk : ~fn ( & Exec ) -> T ) -> Work < T > {
252+
220253 let cached = self . ctxt . db . prepare ( self . fn_name ,
221- & self . declared_inputs ) ;
254+ & self . declared_inputs ,
255+ & self . declared_outputs ) ;
222256
223257 match move cached {
224258 None => ( ) ,
225- Some ( ( move _decl_out,
226- move _disc_in,
227- move _disc_out,
259+ Some ( ( move disc_in,
260+ move disc_out,
228261 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+ }
235276 }
236277 }
237278
0 commit comments