1e847ad3c7a58dd7ff2db97818fb146a13c7c1f8
[akaros.git] / user / ndblib / include / ndb.h
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #ifndef ROS_INC_NDB_H
10
11 #define ROS_INC_NDB_H
12
13 #include <fcall.h>
14
15 enum
16 {
17         Ndbalen=        32,     /* max attribute length */
18         Ndbvlen=        64,     /* max value length */
19 };
20
21 struct ndbcache;
22 /*
23  *  the database
24  */
25 struct ndb
26 {
27         struct ndb              *next;
28
29         FILE    *b;             /* buffered input file */
30         uint8_t         buf[256];       /* and its buffer */
31
32         uint32_t                mtime;          /* mtime of db file */
33         struct qid              qid;            /* qid of db file */
34         char            file[128];/* path name of db file */
35         uint32_t                length;         /* length of db file */
36         int             isopen; /* true if the file is open */
37
38         int             nohash;         /* don't look for hash files */
39         struct ndbhf            *hf;            /* open hash files */
40
41         int             ncache;         /* size of tuple cache */
42         struct ndbcache *cache;         /* cached entries */
43 };
44
45 /*
46  *  a parsed entry, doubly linked
47  */
48 struct ndbtuple
49 {
50         char            attr[Ndbalen];          /* attribute name */
51         char            *val;                   /* value(s) */
52         struct ndbtuple *entry;                 /* next tuple in this entry */
53         struct ndbtuple *line;                  /* next tuple on this line */
54         uint32_t                ptr;                    /* (for the application - starts 0) */
55         char            valbuf[Ndbvlen];        /* initial allocation for value */
56 };
57
58 /*
59  *  each hash file is of the form
60  *
61  *              +---------------------------------------+
62  *              |       mtime of db file (4 bytes)      |
63  *              +---------------------------------------+
64  *              |  size of table (in entries - 4 bytes) |
65  *              +---------------------------------------+
66  *              |               hash table              |
67  *              +---------------------------------------+
68  *              |               hash chains             |
69  *              +---------------------------------------+
70  *
71  *  hash collisions are resolved using chained entries added to the
72  *  the end of the hash table.
73  *
74  *  Hash entries are of the form
75  *
76  *              +-------------------------------+
77  *              |       offset  (3 bytes)       |
78  *              +-------------------------------+
79  *
80  *  Chain entries are of the form
81  *
82  *              +-------------------------------+
83  *              |       offset1 (3 bytes)       |
84  *              +-------------------------------+
85  *              |       offset2 (3 bytes)       |
86  *              +-------------------------------+
87  *
88  *  The top bit of an offset set to 1 indicates a pointer to a hash chain entry.
89  */
90 #define NDBULLEN        4               /* unsigned long length in bytes */
91 #define NDBPLEN         3               /* pointer length in bytes */
92 #define NDBHLEN         (2*NDBULLEN)    /* hash file header length in bytes */
93
94 /*
95  *  finger pointing to current point in a search
96  */
97 struct ndbs
98 {
99         struct ndb      *db;    /* data base file being searched */
100         struct ndbhf    *hf;    /* hash file being searched */
101         int     type;
102         uint32_t        ptr;    /* current pointer */
103         uint32_t        ptr1;   /* next pointer */
104         struct ndbtuple *t;     /* last attribute value pair found */
105 };
106
107 struct ndbcache
108 {
109         struct ndbcache *next;
110         char            *attr;
111         char            *val;
112         struct ndbs             s;
113         struct ndbtuple *t;
114 };
115
116 /*
117  *  bit defs for pointers in hash files
118  */
119 #define NDBSPEC         (1<<23)
120 #define NDBCHAIN        NDBSPEC         /* points to a collision chain */
121 #define NDBNAP          (NDBSPEC|1)     /* not a pointer */
122
123 /*
124  *  macros for packing and unpacking pointers
125  */
126 #define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; }
127 #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))
128
129 /*
130  *  macros for packing and unpacking unsigned longs
131  */
132 #define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; }
133 #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))
134
135 #define NDB_IPlen 16
136
137 struct ndbtuple*        csgetval(char*, char*, char*, char*, char*);
138 char*           csgetvalue(char*, char*, char*, char*, struct ndbtuple**);
139 struct ndbtuple*        csipinfo(char*, char*, char*, char**, int);
140 struct ndbtuple*        dnsquery(char*, char*, char*);
141 char*           ipattr(char*);
142 struct ndb*             ndbcat(struct ndb*, struct ndb*);
143 int             ndbchanged(struct ndb*);
144 void            ndbclose(struct ndb*);
145 struct ndbtuple*        ndbconcatenate(struct ndbtuple*, struct ndbtuple*);
146 struct ndbtuple*        ndbdiscard(struct ndbtuple*, struct ndbtuple*);
147 void            ndbfree(struct ndbtuple*);
148 struct ndbtuple*        ndbgetipaddr(struct ndb*, char*);
149 struct ndbtuple*        ndbgetval(struct ndb*,
150                                   struct ndbs*, char*, char*, char*, char*);
151 char*           ndbgetvalue(struct ndb*, struct ndbs*, char*, char*, char*,
152                                  struct ndbtuple**);
153 struct ndbtuple*        ndbfindattr(struct ndbtuple*, struct ndbtuple*, char*);
154 uint32_t                ndbhash(char*, int);
155 struct ndbtuple*        ndbipinfo(struct ndb*, char*, char*, char**, int);
156 struct ndbtuple*        ndblookval(struct ndbtuple*,
157                                    struct ndbtuple*, char*, char*);
158 struct ndbtuple*        ndbnew(char*, char*);
159 struct ndb*             ndbopen(char*);
160 struct ndbtuple*        ndbparse(struct ndb*);
161 int             ndbreopen(struct ndb*);
162 struct ndbtuple*        ndbreorder(struct ndbtuple*, struct ndbtuple*);
163 struct ndbtuple*        ndbsearch(struct ndb*, struct ndbs*, char*, char*);
164 void            ndbsetval(struct ndbtuple*, char*, int);
165 struct ndbtuple*        ndbsnext(struct ndbs*, char*, char*);
166 struct ndbtuple*        ndbsubstitute(struct ndbtuple*, struct ndbtuple*,
167                                       struct ndbtuple*);
168 char*_ndbparsetuple(char *cp, struct ndbtuple **tp);
169 struct ndbtuple*_ndbparseline(char *cp);
170 //void          ndbsetmalloctag(struct ndbtuple*, uintptr_t);
171 static inline void              ndbsetmalloctag(struct ndbtuple*t, uintptr_t v){}
172
173 static inline uintptr_t getcallerpc(void *v){return 0;}
174 static inline void setmalloctag(void *v){}
175
176 void _ndbcacheflush(struct ndb *db);
177 /* No implementation for this, dumped into a garbage file */
178 void setnetmtpt(char *net, int n, char *x);
179
180 #endif /* ROS_INC_NDB_H */