Blame


1 d957951b 2005-02-11 devnull #include <u.h>
2 d957951b 2005-02-11 devnull #include <libc.h>
3 d957951b 2005-02-11 devnull #include <bio.h>
4 d957951b 2005-02-11 devnull #include <ndb.h>
5 d957951b 2005-02-11 devnull
6 d957951b 2005-02-11 devnull struct Ndbcache
7 d957951b 2005-02-11 devnull {
8 d957951b 2005-02-11 devnull Ndbcache *next;
9 d957951b 2005-02-11 devnull char *attr;
10 d957951b 2005-02-11 devnull char *val;
11 d957951b 2005-02-11 devnull Ndbs s;
12 fa325e9b 2020-01-10 cross Ndbtuple *t;
13 d957951b 2005-02-11 devnull };
14 d957951b 2005-02-11 devnull
15 d957951b 2005-02-11 devnull enum
16 d957951b 2005-02-11 devnull {
17 cbeb0b26 2006-04-01 devnull Maxcached= 128
18 d957951b 2005-02-11 devnull };
19 d957951b 2005-02-11 devnull
20 d957951b 2005-02-11 devnull static void
21 d957951b 2005-02-11 devnull ndbcachefree(Ndbcache *c)
22 d957951b 2005-02-11 devnull {
23 d957951b 2005-02-11 devnull free(c->val);
24 d957951b 2005-02-11 devnull free(c->attr);
25 d957951b 2005-02-11 devnull if(c->t)
26 d957951b 2005-02-11 devnull ndbfree(c->t);
27 d957951b 2005-02-11 devnull free(c);
28 d957951b 2005-02-11 devnull }
29 d957951b 2005-02-11 devnull
30 d957951b 2005-02-11 devnull static Ndbtuple*
31 d957951b 2005-02-11 devnull ndbcopy(Ndb *db, Ndbtuple *from_t, Ndbs *from_s, Ndbs *to_s)
32 d957951b 2005-02-11 devnull {
33 d957951b 2005-02-11 devnull Ndbtuple *first, *to_t, *last, *line;
34 d957951b 2005-02-11 devnull int newline;
35 d957951b 2005-02-11 devnull
36 d957951b 2005-02-11 devnull *to_s = *from_s;
37 d957951b 2005-02-11 devnull to_s->t = nil;
38 d957951b 2005-02-11 devnull to_s->db = db;
39 d957951b 2005-02-11 devnull
40 d957951b 2005-02-11 devnull newline = 1;
41 d957951b 2005-02-11 devnull last = nil;
42 d957951b 2005-02-11 devnull first = nil;
43 d957951b 2005-02-11 devnull line = nil;
44 d957951b 2005-02-11 devnull for(; from_t != nil; from_t = from_t->entry){
45 d957951b 2005-02-11 devnull to_t = ndbnew(from_t->attr, from_t->val);
46 d957951b 2005-02-11 devnull
47 d957951b 2005-02-11 devnull /* have s point to matching tuple */
48 d957951b 2005-02-11 devnull if(from_s->t == from_t)
49 d957951b 2005-02-11 devnull to_s->t = to_t;
50 d957951b 2005-02-11 devnull
51 d957951b 2005-02-11 devnull if(newline)
52 d957951b 2005-02-11 devnull line = to_t;
53 d957951b 2005-02-11 devnull else
54 d957951b 2005-02-11 devnull last->line = to_t;
55 d957951b 2005-02-11 devnull
56 d957951b 2005-02-11 devnull if(last != nil)
57 d957951b 2005-02-11 devnull last->entry = to_t;
58 d957951b 2005-02-11 devnull else {
59 d957951b 2005-02-11 devnull first = to_t;
60 d957951b 2005-02-11 devnull line = to_t;
61 d957951b 2005-02-11 devnull }
62 d957951b 2005-02-11 devnull to_t->entry = nil;
63 d957951b 2005-02-11 devnull to_t->line = line;
64 d957951b 2005-02-11 devnull last = to_t;
65 d957951b 2005-02-11 devnull newline = from_t->line != from_t->entry;
66 d957951b 2005-02-11 devnull }
67 d957951b 2005-02-11 devnull return first;
68 d957951b 2005-02-11 devnull }
69 d957951b 2005-02-11 devnull
70 d957951b 2005-02-11 devnull /*
71 d957951b 2005-02-11 devnull * if found, move to front
72 d957951b 2005-02-11 devnull */
73 d957951b 2005-02-11 devnull int
74 d957951b 2005-02-11 devnull _ndbcachesearch(Ndb *db, Ndbs *s, char *attr, char *val, Ndbtuple **t)
75 d957951b 2005-02-11 devnull {
76 d957951b 2005-02-11 devnull Ndbcache *c, **l;
77 d957951b 2005-02-11 devnull
78 d957951b 2005-02-11 devnull *t = nil;
79 d957951b 2005-02-11 devnull c = nil;
80 d957951b 2005-02-11 devnull for(l = &db->cache; *l != nil; l = &(*l)->next){
81 d957951b 2005-02-11 devnull c = *l;
82 d957951b 2005-02-11 devnull if(strcmp(c->attr, attr) == 0 && strcmp(c->val, val) == 0)
83 d957951b 2005-02-11 devnull break;
84 d957951b 2005-02-11 devnull }
85 d957951b 2005-02-11 devnull if(*l == nil)
86 d957951b 2005-02-11 devnull return -1;
87 d957951b 2005-02-11 devnull
88 d957951b 2005-02-11 devnull /* move to front */
89 d957951b 2005-02-11 devnull *l = c->next;
90 d957951b 2005-02-11 devnull c->next = db->cache;
91 d957951b 2005-02-11 devnull db->cache = c;
92 d957951b 2005-02-11 devnull
93 d957951b 2005-02-11 devnull *t = ndbcopy(db, c->t, &c->s, s);
94 d957951b 2005-02-11 devnull return 0;
95 d957951b 2005-02-11 devnull }
96 d957951b 2005-02-11 devnull
97 d957951b 2005-02-11 devnull Ndbtuple*
98 d957951b 2005-02-11 devnull _ndbcacheadd(Ndb *db, Ndbs *s, char *attr, char *val, Ndbtuple *t)
99 d957951b 2005-02-11 devnull {
100 d957951b 2005-02-11 devnull Ndbcache *c, **l;
101 d957951b 2005-02-11 devnull
102 d957951b 2005-02-11 devnull c = mallocz(sizeof *c, 1);
103 d957951b 2005-02-11 devnull if(c == nil)
104 d957951b 2005-02-11 devnull return nil;
105 d957951b 2005-02-11 devnull c->attr = strdup(attr);
106 d957951b 2005-02-11 devnull if(c->attr == nil)
107 d957951b 2005-02-11 devnull goto err;
108 d957951b 2005-02-11 devnull c->val = strdup(val);
109 d957951b 2005-02-11 devnull if(c->val == nil)
110 d957951b 2005-02-11 devnull goto err;
111 d957951b 2005-02-11 devnull c->t = ndbcopy(db, t, s, &c->s);
112 d957951b 2005-02-11 devnull if(c->t == nil && t != nil)
113 d957951b 2005-02-11 devnull goto err;
114 d957951b 2005-02-11 devnull
115 d957951b 2005-02-11 devnull /* add to front */
116 d957951b 2005-02-11 devnull c->next = db->cache;
117 d957951b 2005-02-11 devnull db->cache = c;
118 d957951b 2005-02-11 devnull
119 d957951b 2005-02-11 devnull /* trim list */
120 d957951b 2005-02-11 devnull if(db->ncache < Maxcached){
121 d957951b 2005-02-11 devnull db->ncache++;
122 d957951b 2005-02-11 devnull return t;
123 d957951b 2005-02-11 devnull }
124 d957951b 2005-02-11 devnull for(l = &db->cache; (*l)->next; l = &(*l)->next)
125 d957951b 2005-02-11 devnull ;
126 d957951b 2005-02-11 devnull c = *l;
127 d957951b 2005-02-11 devnull *l = nil;
128 d957951b 2005-02-11 devnull err:
129 d957951b 2005-02-11 devnull ndbcachefree(c);
130 d957951b 2005-02-11 devnull return t;
131 d957951b 2005-02-11 devnull }
132 d957951b 2005-02-11 devnull
133 d957951b 2005-02-11 devnull void
134 d957951b 2005-02-11 devnull _ndbcacheflush(Ndb *db)
135 d957951b 2005-02-11 devnull {
136 d957951b 2005-02-11 devnull Ndbcache *c;
137 d957951b 2005-02-11 devnull
138 d957951b 2005-02-11 devnull while(db->cache != nil){
139 d957951b 2005-02-11 devnull c = db->cache;
140 d957951b 2005-02-11 devnull db->cache = c->next;
141 d957951b 2005-02-11 devnull ndbcachefree(c);
142 d957951b 2005-02-11 devnull }
143 d957951b 2005-02-11 devnull db->ncache = 0;
144 d957951b 2005-02-11 devnull }