1219b2ee8SDavid du Colombier #pragma src "/sys/src/libndb" 23e12c5d1SDavid du Colombier #pragma lib "libndb.a" 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier /* 53e12c5d1SDavid du Colombier * this include file requires includes of <u.h> and <bio.h> 63e12c5d1SDavid du Colombier */ 73e12c5d1SDavid du Colombier typedef struct Ndb Ndb; 83e12c5d1SDavid du Colombier typedef struct Ndbtuple Ndbtuple; 93e12c5d1SDavid du Colombier typedef struct Ndbhf Ndbhf; 103e12c5d1SDavid du Colombier typedef struct Ndbs Ndbs; 119a747e4fSDavid du Colombier typedef struct Ndbcache Ndbcache; 123e12c5d1SDavid du Colombier 1312fd1c83SDavid du Colombier #pragma incomplete Ndbhf 1412fd1c83SDavid du Colombier #pragma incomplete Ndbcache 1512fd1c83SDavid du Colombier 163e12c5d1SDavid du Colombier enum 173e12c5d1SDavid du Colombier { 183e12c5d1SDavid du Colombier Ndbalen= 32, /* max attribute length */ 193e12c5d1SDavid du Colombier Ndbvlen= 64, /* max value length */ 203e12c5d1SDavid du Colombier }; 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier /* 233e12c5d1SDavid du Colombier * the database 243e12c5d1SDavid du Colombier */ 253e12c5d1SDavid du Colombier struct Ndb 263e12c5d1SDavid du Colombier { 273e12c5d1SDavid du Colombier Ndb *next; 283e12c5d1SDavid du Colombier 29219b2ee8SDavid du Colombier Biobufhdr b; /* buffered input file */ 309a747e4fSDavid du Colombier uchar buf[256]; /* and its buffer */ 313e12c5d1SDavid du Colombier 323e12c5d1SDavid du Colombier ulong mtime; /* mtime of db file */ 333e12c5d1SDavid du Colombier Qid qid; /* qid of db file */ 349a747e4fSDavid du Colombier char file[128];/* path name of db file */ 35219b2ee8SDavid du Colombier ulong length; /* length of db file */ 363e12c5d1SDavid du Colombier 377dd7cddfSDavid du Colombier int nohash; /* don't look for hash files */ 383e12c5d1SDavid du Colombier Ndbhf *hf; /* open hash files */ 399a747e4fSDavid du Colombier 409a747e4fSDavid du Colombier int ncache; /* size of tuple cache */ 419a747e4fSDavid du Colombier Ndbcache *cache; /* cached entries */ 423e12c5d1SDavid du Colombier }; 433e12c5d1SDavid du Colombier 443e12c5d1SDavid du Colombier /* 453e12c5d1SDavid du Colombier * a parsed entry, doubly linked 463e12c5d1SDavid du Colombier */ 473e12c5d1SDavid du Colombier struct Ndbtuple 483e12c5d1SDavid du Colombier { 493e12c5d1SDavid du Colombier char attr[Ndbalen]; /* attribute name */ 5095a264b3SDavid du Colombier char *val; /* value(s) */ 513e12c5d1SDavid du Colombier Ndbtuple *entry; /* next tuple in this entry */ 523e12c5d1SDavid du Colombier Ndbtuple *line; /* next tuple on this line */ 533e12c5d1SDavid du Colombier ulong ptr; /* (for the application - starts 0) */ 5495a264b3SDavid du Colombier char valbuf[Ndbvlen]; /* initial allocation for value */ 553e12c5d1SDavid du Colombier }; 563e12c5d1SDavid du Colombier 573e12c5d1SDavid du Colombier /* 583e12c5d1SDavid du Colombier * each hash file is of the form 593e12c5d1SDavid du Colombier * 603e12c5d1SDavid du Colombier * +---------------------------------------+ 613e12c5d1SDavid du Colombier * | mtime of db file (4 bytes) | 623e12c5d1SDavid du Colombier * +---------------------------------------+ 633e12c5d1SDavid du Colombier * | size of table (in entries - 4 bytes) | 643e12c5d1SDavid du Colombier * +---------------------------------------+ 653e12c5d1SDavid du Colombier * | hash table | 663e12c5d1SDavid du Colombier * +---------------------------------------+ 673e12c5d1SDavid du Colombier * | hash chains | 683e12c5d1SDavid du Colombier * +---------------------------------------+ 693e12c5d1SDavid du Colombier * 703e12c5d1SDavid du Colombier * hash collisions are resolved using chained entries added to the 713e12c5d1SDavid du Colombier * the end of the hash table. 723e12c5d1SDavid du Colombier * 733e12c5d1SDavid du Colombier * Hash entries are of the form 743e12c5d1SDavid du Colombier * 753e12c5d1SDavid du Colombier * +-------------------------------+ 763e12c5d1SDavid du Colombier * | offset (3 bytes) | 773e12c5d1SDavid du Colombier * +-------------------------------+ 783e12c5d1SDavid du Colombier * 793e12c5d1SDavid du Colombier * Chain entries are of the form 803e12c5d1SDavid du Colombier * 813e12c5d1SDavid du Colombier * +-------------------------------+ 823e12c5d1SDavid du Colombier * | offset1 (3 bytes) | 833e12c5d1SDavid du Colombier * +-------------------------------+ 843e12c5d1SDavid du Colombier * | offset2 (3 bytes) | 853e12c5d1SDavid du Colombier * +-------------------------------+ 863e12c5d1SDavid du Colombier * 873e12c5d1SDavid du Colombier * The top bit of an offset set to 1 indicates a pointer to a hash chain entry. 883e12c5d1SDavid du Colombier */ 893e12c5d1SDavid du Colombier #define NDBULLEN 4 /* unsigned long length in bytes */ 903e12c5d1SDavid du Colombier #define NDBPLEN 3 /* pointer length in bytes */ 913e12c5d1SDavid du Colombier #define NDBHLEN (2*NDBULLEN) /* hash file header length in bytes */ 923e12c5d1SDavid du Colombier 933e12c5d1SDavid du Colombier /* 943e12c5d1SDavid du Colombier * finger pointing to current point in a search 953e12c5d1SDavid du Colombier */ 963e12c5d1SDavid du Colombier struct Ndbs 973e12c5d1SDavid du Colombier { 983e12c5d1SDavid du Colombier Ndb *db; /* data base file being searched */ 993e12c5d1SDavid du Colombier Ndbhf *hf; /* hash file being searched */ 1003e12c5d1SDavid du Colombier int type; 1013e12c5d1SDavid du Colombier ulong ptr; /* current pointer */ 1023e12c5d1SDavid du Colombier ulong ptr1; /* next pointer */ 1033e12c5d1SDavid du Colombier Ndbtuple *t; /* last attribute value pair found */ 1043e12c5d1SDavid du Colombier }; 1053e12c5d1SDavid du Colombier 1063e12c5d1SDavid du Colombier /* 1073e12c5d1SDavid du Colombier * bit defs for pointers in hash files 1083e12c5d1SDavid du Colombier */ 1093e12c5d1SDavid du Colombier #define NDBSPEC (1<<23) 1103e12c5d1SDavid du Colombier #define NDBCHAIN NDBSPEC /* points to a collision chain */ 1113e12c5d1SDavid du Colombier #define NDBNAP (NDBSPEC|1) /* not a pointer */ 1123e12c5d1SDavid du Colombier 1133e12c5d1SDavid du Colombier /* 1143e12c5d1SDavid du Colombier * macros for packing and unpacking pointers 1153e12c5d1SDavid du Colombier */ 1163e12c5d1SDavid du Colombier #define NDBPUTP(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; } 1173e12c5d1SDavid du Colombier #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16)) 1183e12c5d1SDavid du Colombier 1193e12c5d1SDavid du Colombier /* 1203e12c5d1SDavid du Colombier * macros for packing and unpacking unsigned longs 1213e12c5d1SDavid du Colombier */ 1223e12c5d1SDavid du Colombier #define NDBPUTUL(v,a) { (a)[0] = v; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; } 1233e12c5d1SDavid du Colombier #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24)) 1243e12c5d1SDavid du Colombier 1257dd7cddfSDavid du Colombier #define NDB_IPlen 16 1267dd7cddfSDavid du Colombier 1277dd7cddfSDavid du Colombier Ndbtuple* csgetval(char*, char*, char*, char*, char*); 12857837e0bSDavid du Colombier char* csgetvalue(char*, char*, char*, char*, Ndbtuple**); 1297dd7cddfSDavid du Colombier Ndbtuple* csipinfo(char*, char*, char*, char**, int); 1307dd7cddfSDavid du Colombier Ndbtuple* dnsquery(char*, char*, char*); 131956c0eafSDavid du Colombier char* ipattr(char*); 132956c0eafSDavid du Colombier Ndb* ndbcat(Ndb*, Ndb*); 133956c0eafSDavid du Colombier int ndbchanged(Ndb*); 134956c0eafSDavid du Colombier void ndbclose(Ndb*); 135956c0eafSDavid du Colombier Ndbtuple* ndbconcatenate(Ndbtuple*, Ndbtuple*); 136956c0eafSDavid du Colombier Ndbtuple* ndbdiscard(Ndbtuple*, Ndbtuple*); 137956c0eafSDavid du Colombier void ndbfree(Ndbtuple*); 138956c0eafSDavid du Colombier Ndbtuple* ndbgetipaddr(Ndb*, char*); 139956c0eafSDavid du Colombier Ndbtuple* ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*); 14057837e0bSDavid du Colombier char* ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**); 14157837e0bSDavid du Colombier Ndbtuple* ndbfindattr(Ndbtuple*, Ndbtuple*, char*); 142956c0eafSDavid du Colombier ulong ndbhash(char*, int); 143956c0eafSDavid du Colombier Ndbtuple* ndbipinfo(Ndb*, char*, char*, char**, int); 144956c0eafSDavid du Colombier Ndbtuple* ndblookval(Ndbtuple*, Ndbtuple*, char*, char*); 14595a264b3SDavid du Colombier Ndbtuple* ndbnew(char*, char*); 146956c0eafSDavid du Colombier Ndb* ndbopen(char*); 147956c0eafSDavid du Colombier Ndbtuple* ndbparse(Ndb*); 148956c0eafSDavid du Colombier int ndbreopen(Ndb*); 149956c0eafSDavid du Colombier Ndbtuple* ndbreorder(Ndbtuple*, Ndbtuple*); 150956c0eafSDavid du Colombier Ndbtuple* ndbsearch(Ndb*, Ndbs*, char*, char*); 15195a264b3SDavid du Colombier void ndbsetval(Ndbtuple*, char*, int); 152956c0eafSDavid du Colombier Ndbtuple* ndbsnext(Ndbs*, char*, char*); 153956c0eafSDavid du Colombier Ndbtuple* ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*); 154*1a4050f5SDavid du Colombier void ndbsetmalloctag(Ndbtuple*, uintptr); 155