Blame


1 ad017cfb 2005-02-11 devnull /*
2 ad017cfb 2005-02-11 devnull #pragma src "/sys/src/libndb"
3 ad017cfb 2005-02-11 devnull #pragma lib "libndb.a"
4 ad017cfb 2005-02-11 devnull */
5 ad017cfb 2005-02-11 devnull AUTOLIB(ndb)
6 ad017cfb 2005-02-11 devnull
7 ad017cfb 2005-02-11 devnull /*
8 ad017cfb 2005-02-11 devnull * this include file requires includes of <u.h> and <bio.h>
9 ad017cfb 2005-02-11 devnull */
10 ad017cfb 2005-02-11 devnull typedef struct Ndb Ndb;
11 ad017cfb 2005-02-11 devnull typedef struct Ndbtuple Ndbtuple;
12 ad017cfb 2005-02-11 devnull typedef struct Ndbhf Ndbhf;
13 ad017cfb 2005-02-11 devnull typedef struct Ndbs Ndbs;
14 ad017cfb 2005-02-11 devnull typedef struct Ndbcache Ndbcache;
15 ad017cfb 2005-02-11 devnull
16 ad017cfb 2005-02-11 devnull /*
17 ad017cfb 2005-02-11 devnull #pragma incomplete Ndbhf
18 ad017cfb 2005-02-11 devnull #pragma incomplete Ndbcache
19 ad017cfb 2005-02-11 devnull */
20 ad017cfb 2005-02-11 devnull
21 ad017cfb 2005-02-11 devnull enum
22 ad017cfb 2005-02-11 devnull {
23 ad017cfb 2005-02-11 devnull Ndbalen= 32, /* max attribute length */
24 cbeb0b26 2006-04-01 devnull Ndbvlen= 64 /* max value length */
25 ad017cfb 2005-02-11 devnull };
26 ad017cfb 2005-02-11 devnull
27 ad017cfb 2005-02-11 devnull /*
28 ad017cfb 2005-02-11 devnull * the database
29 ad017cfb 2005-02-11 devnull */
30 ad017cfb 2005-02-11 devnull struct Ndb
31 ad017cfb 2005-02-11 devnull {
32 ad017cfb 2005-02-11 devnull Ndb *next;
33 ad017cfb 2005-02-11 devnull
34 ad017cfb 2005-02-11 devnull Biobuf b; /* buffered input file */
35 ad017cfb 2005-02-11 devnull
36 ad017cfb 2005-02-11 devnull ulong mtime; /* mtime of db file */
37 ad017cfb 2005-02-11 devnull Qid qid; /* qid of db file */
38 ad017cfb 2005-02-11 devnull char file[128];/* path name of db file */
39 ad017cfb 2005-02-11 devnull ulong length; /* length of db file */
40 ad017cfb 2005-02-11 devnull
41 ad017cfb 2005-02-11 devnull int nohash; /* don't look for hash files */
42 ad017cfb 2005-02-11 devnull Ndbhf *hf; /* open hash files */
43 ad017cfb 2005-02-11 devnull
44 ad017cfb 2005-02-11 devnull int ncache; /* size of tuple cache */
45 ad017cfb 2005-02-11 devnull Ndbcache *cache; /* cached entries */
46 ad017cfb 2005-02-11 devnull };
47 ad017cfb 2005-02-11 devnull
48 ad017cfb 2005-02-11 devnull /*
49 ad017cfb 2005-02-11 devnull * a parsed entry, doubly linked
50 ad017cfb 2005-02-11 devnull */
51 ad017cfb 2005-02-11 devnull struct Ndbtuple
52 ad017cfb 2005-02-11 devnull {
53 ad017cfb 2005-02-11 devnull char attr[Ndbalen]; /* attribute name */
54 ad017cfb 2005-02-11 devnull char *val; /* value(s) */
55 ad017cfb 2005-02-11 devnull Ndbtuple *entry; /* next tuple in this entry */
56 ad017cfb 2005-02-11 devnull Ndbtuple *line; /* next tuple on this line */
57 ad017cfb 2005-02-11 devnull ulong ptr; /* (for the application - starts 0) */
58 ad017cfb 2005-02-11 devnull char valbuf[Ndbvlen]; /* initial allocation for value */
59 ad017cfb 2005-02-11 devnull };
60 ad017cfb 2005-02-11 devnull
61 ad017cfb 2005-02-11 devnull /*
62 ad017cfb 2005-02-11 devnull * each hash file is of the form
63 ad017cfb 2005-02-11 devnull *
64 ad017cfb 2005-02-11 devnull * +---------------------------------------+
65 ad017cfb 2005-02-11 devnull * | mtime of db file (4 bytes) |
66 ad017cfb 2005-02-11 devnull * +---------------------------------------+
67 ad017cfb 2005-02-11 devnull * | size of table (in entries - 4 bytes) |
68 ad017cfb 2005-02-11 devnull * +---------------------------------------+
69 ad017cfb 2005-02-11 devnull * | hash table |
70 ad017cfb 2005-02-11 devnull * +---------------------------------------+
71 ad017cfb 2005-02-11 devnull * | hash chains |
72 ad017cfb 2005-02-11 devnull * +---------------------------------------+
73 ad017cfb 2005-02-11 devnull *
74 ad017cfb 2005-02-11 devnull * hash collisions are resolved using chained entries added to the
75 ad017cfb 2005-02-11 devnull * the end of the hash table.
76 ad017cfb 2005-02-11 devnull *
77 ad017cfb 2005-02-11 devnull * Hash entries are of the form
78 ad017cfb 2005-02-11 devnull *
79 ad017cfb 2005-02-11 devnull * +-------------------------------+
80 ad017cfb 2005-02-11 devnull * | offset (3 bytes) |
81 ad017cfb 2005-02-11 devnull * +-------------------------------+
82 ad017cfb 2005-02-11 devnull *
83 ad017cfb 2005-02-11 devnull * Chain entries are of the form
84 ad017cfb 2005-02-11 devnull *
85 ad017cfb 2005-02-11 devnull * +-------------------------------+
86 ad017cfb 2005-02-11 devnull * | offset1 (3 bytes) |
87 ad017cfb 2005-02-11 devnull * +-------------------------------+
88 ad017cfb 2005-02-11 devnull * | offset2 (3 bytes) |
89 ad017cfb 2005-02-11 devnull * +-------------------------------+
90 ad017cfb 2005-02-11 devnull *
91 ad017cfb 2005-02-11 devnull * The top bit of an offset set to 1 indicates a pointer to a hash chain entry.
92 ad017cfb 2005-02-11 devnull */
93 ad017cfb 2005-02-11 devnull #define NDBULLEN 4 /* unsigned long length in bytes */
94 ad017cfb 2005-02-11 devnull #define NDBPLEN 3 /* pointer length in bytes */
95 ad017cfb 2005-02-11 devnull #define NDBHLEN (2*NDBULLEN) /* hash file header length in bytes */
96 ad017cfb 2005-02-11 devnull
97 ad017cfb 2005-02-11 devnull /*
98 ad017cfb 2005-02-11 devnull * finger pointing to current point in a search
99 ad017cfb 2005-02-11 devnull */
100 ad017cfb 2005-02-11 devnull struct Ndbs
101 ad017cfb 2005-02-11 devnull {
102 ad017cfb 2005-02-11 devnull Ndb *db; /* data base file being searched */
103 ad017cfb 2005-02-11 devnull Ndbhf *hf; /* hash file being searched */
104 ad017cfb 2005-02-11 devnull int type;
105 ad017cfb 2005-02-11 devnull ulong ptr; /* current pointer */
106 ad017cfb 2005-02-11 devnull ulong ptr1; /* next pointer */
107 ad017cfb 2005-02-11 devnull Ndbtuple *t; /* last attribute value pair found */
108 ad017cfb 2005-02-11 devnull };
109 ad017cfb 2005-02-11 devnull
110 ad017cfb 2005-02-11 devnull /*
111 ad017cfb 2005-02-11 devnull * bit defs for pointers in hash files
112 ad017cfb 2005-02-11 devnull */
113 ad017cfb 2005-02-11 devnull #define NDBSPEC (1<<23)
114 ad017cfb 2005-02-11 devnull #define NDBCHAIN NDBSPEC /* points to a collision chain */
115 ad017cfb 2005-02-11 devnull #define NDBNAP (NDBSPEC|1) /* not a pointer */
116 ad017cfb 2005-02-11 devnull
117 ad017cfb 2005-02-11 devnull /*
118 ad017cfb 2005-02-11 devnull * macros for packing and unpacking pointers
119 ad017cfb 2005-02-11 devnull */
120 ad017cfb 2005-02-11 devnull #define NDBPUTP(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; }
121 ad017cfb 2005-02-11 devnull #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))
122 ad017cfb 2005-02-11 devnull
123 ad017cfb 2005-02-11 devnull /*
124 ad017cfb 2005-02-11 devnull * macros for packing and unpacking unsigned longs
125 ad017cfb 2005-02-11 devnull */
126 ad017cfb 2005-02-11 devnull #define NDBPUTUL(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; (a)[3] = ((v)>>24)&0xFF; }
127 ad017cfb 2005-02-11 devnull #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))
128 ad017cfb 2005-02-11 devnull
129 ad017cfb 2005-02-11 devnull #define NDB_IPlen 16
130 ad017cfb 2005-02-11 devnull
131 ad017cfb 2005-02-11 devnull Ndbtuple* csgetval(char*, char*, char*, char*, char*);
132 ad017cfb 2005-02-11 devnull char* csgetvalue(char*, char*, char*, char*, Ndbtuple**);
133 ad017cfb 2005-02-11 devnull Ndbtuple* csipinfo(char*, char*, char*, char**, int);
134 ad017cfb 2005-02-11 devnull Ndbtuple* dnsquery(char*, char*, char*);
135 ad017cfb 2005-02-11 devnull char* ipattr(char*);
136 ad017cfb 2005-02-11 devnull Ndb* ndbcat(Ndb*, Ndb*);
137 ad017cfb 2005-02-11 devnull int ndbchanged(Ndb*);
138 ad017cfb 2005-02-11 devnull void ndbclose(Ndb*);
139 ad017cfb 2005-02-11 devnull Ndbtuple* ndbconcatenate(Ndbtuple*, Ndbtuple*);
140 ad017cfb 2005-02-11 devnull Ndbtuple* ndbdiscard(Ndbtuple*, Ndbtuple*);
141 ad017cfb 2005-02-11 devnull void ndbfree(Ndbtuple*);
142 ad017cfb 2005-02-11 devnull Ndbtuple* ndbgetipaddr(Ndb*, char*);
143 ad017cfb 2005-02-11 devnull Ndbtuple* ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*);
144 ad017cfb 2005-02-11 devnull char* ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**);
145 ad017cfb 2005-02-11 devnull Ndbtuple* ndbfindattr(Ndbtuple*, Ndbtuple*, char*);
146 ad017cfb 2005-02-11 devnull ulong ndbhash(char*, int);
147 ad017cfb 2005-02-11 devnull Ndbtuple* ndbipinfo(Ndb*, char*, char*, char**, int);
148 ad017cfb 2005-02-11 devnull Ndbtuple* ndblookval(Ndbtuple*, Ndbtuple*, char*, char*);
149 ad017cfb 2005-02-11 devnull Ndbtuple* ndbnew(char*, char*);
150 ad017cfb 2005-02-11 devnull Ndb* ndbopen(char*);
151 ad017cfb 2005-02-11 devnull Ndbtuple* ndbparse(Ndb*);
152 ad017cfb 2005-02-11 devnull int ndbreopen(Ndb*);
153 ad017cfb 2005-02-11 devnull Ndbtuple* ndbreorder(Ndbtuple*, Ndbtuple*);
154 ad017cfb 2005-02-11 devnull Ndbtuple* ndbsearch(Ndb*, Ndbs*, char*, char*);
155 ad017cfb 2005-02-11 devnull long ndbseek(Ndb*, long);
156 ad017cfb 2005-02-11 devnull void ndbsetval(Ndbtuple*, char*, int);
157 ad017cfb 2005-02-11 devnull Ndbtuple* ndbsnext(Ndbs*, char*, char*);
158 ad017cfb 2005-02-11 devnull Ndbtuple* ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);