]> gitweb.factorcode.org Git - factor.git/blob - unmaintained/dns/cache/rr/rr.factor
e2ce5239d1a27f893c22eebcc23ad0df8496994f
[factor.git] / unmaintained / dns / cache / rr / rr.factor
1
2 USING: kernel sequences assocs sets locals combinators
3        accessors system math math.functions unicode prettyprint
4        combinators.smart dns ;
5
6 IN: dns.cache.rr
7
8 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
9
10 TUPLE: <entry> time data ;
11
12 : now ( -- seconds ) millis 1000.0 / round >integer ;
13
14 : expired? ( <entry> -- ? ) time>> now <= ;
15
16 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
17
18 : make-cache-key ( obj -- key )
19   [ [ name>> >lower ] [ type>> ] [ class>> ] tri ] output>array ;
20
21 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
22
23 : cache ( -- table ) H{ } ;
24
25 : cache-at     (     obj -- ent ) make-cache-key cache at ;
26 : cache-delete (     obj --     ) make-cache-key cache delete-at ;
27 : cache-set-at ( ent obj --     ) make-cache-key cache set-at ;
28
29 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
30
31 :: cache-get ( OBJ -- rrs/f )
32    [let | ENT [ OBJ cache-at ] |
33      {
34        { [ ENT f =      ] [                  f ] }
35        { [ ENT expired? ] [ OBJ cache-delete f ] }
36        {
37          [ t ]
38          [
39            [let | NAME  [ OBJ name>>       ]
40                   TYPE  [ OBJ type>>       ]
41                   CLASS [ OBJ class>>      ]
42                   TTL   [ ENT time>> now - ] |
43              ENT data>>
44                [| RDATA | T{ rr f NAME TYPE CLASS TTL RDATA } ]
45              map
46            ]
47          ]
48        }
49      }
50      cond
51    ] ;
52
53 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
54
55 :: cache-add ( RR -- )
56    [let | ENT   [ RR cache-at    ]
57           TIME  [ RR ttl>> now + ]
58           RDATA [ RR rdata>>     ] |
59      {
60        { [ ENT f =      ] [ T{ <entry> f TIME V{ RDATA } } RR cache-set-at ] }
61        { [ ENT expired? ] [ RR cache-delete RR cache-add                   ] }
62        { [ t            ] [ TIME ENT time<< RDATA ENT data>> adjoin      ] }
63      }
64      cond
65    ] ;