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