commit ad017cfbf5530cfc3ae2fafd723cdade2a4405f6 from: rsc date: Fri Feb 11 19:40:20 2005 UTC add ndb commit - 096ff3e14a188992d2dfe59c7fd3f5d6da791331 commit + ad017cfbf5530cfc3ae2fafd723cdade2a4405f6 blob - /dev/null blob + deb4968bc1679b52abdaacf81218f6e53af1c286 (mode 644) --- /dev/null +++ include/ndb.h @@ -0,0 +1,158 @@ +/* +#pragma src "/sys/src/libndb" +#pragma lib "libndb.a" +*/ +AUTOLIB(ndb) + +/* + * this include file requires includes of and + */ +typedef struct Ndb Ndb; +typedef struct Ndbtuple Ndbtuple; +typedef struct Ndbhf Ndbhf; +typedef struct Ndbs Ndbs; +typedef struct Ndbcache Ndbcache; + +/* +#pragma incomplete Ndbhf +#pragma incomplete Ndbcache +*/ + +enum +{ + Ndbalen= 32, /* max attribute length */ + Ndbvlen= 64, /* max value length */ +}; + +/* + * the database + */ +struct Ndb +{ + Ndb *next; + + Biobuf b; /* buffered input file */ + + ulong mtime; /* mtime of db file */ + Qid qid; /* qid of db file */ + char file[128];/* path name of db file */ + ulong length; /* length of db file */ + + int nohash; /* don't look for hash files */ + Ndbhf *hf; /* open hash files */ + + int ncache; /* size of tuple cache */ + Ndbcache *cache; /* cached entries */ +}; + +/* + * a parsed entry, doubly linked + */ +struct Ndbtuple +{ + char attr[Ndbalen]; /* attribute name */ + char *val; /* value(s) */ + Ndbtuple *entry; /* next tuple in this entry */ + Ndbtuple *line; /* next tuple on this line */ + ulong ptr; /* (for the application - starts 0) */ + char valbuf[Ndbvlen]; /* initial allocation for value */ +}; + +/* + * each hash file is of the form + * + * +---------------------------------------+ + * | mtime of db file (4 bytes) | + * +---------------------------------------+ + * | size of table (in entries - 4 bytes) | + * +---------------------------------------+ + * | hash table | + * +---------------------------------------+ + * | hash chains | + * +---------------------------------------+ + * + * hash collisions are resolved using chained entries added to the + * the end of the hash table. + * + * Hash entries are of the form + * + * +-------------------------------+ + * | offset (3 bytes) | + * +-------------------------------+ + * + * Chain entries are of the form + * + * +-------------------------------+ + * | offset1 (3 bytes) | + * +-------------------------------+ + * | offset2 (3 bytes) | + * +-------------------------------+ + * + * The top bit of an offset set to 1 indicates a pointer to a hash chain entry. + */ +#define NDBULLEN 4 /* unsigned long length in bytes */ +#define NDBPLEN 3 /* pointer length in bytes */ +#define NDBHLEN (2*NDBULLEN) /* hash file header length in bytes */ + +/* + * finger pointing to current point in a search + */ +struct Ndbs +{ + Ndb *db; /* data base file being searched */ + Ndbhf *hf; /* hash file being searched */ + int type; + ulong ptr; /* current pointer */ + ulong ptr1; /* next pointer */ + Ndbtuple *t; /* last attribute value pair found */ +}; + +/* + * bit defs for pointers in hash files + */ +#define NDBSPEC (1<<23) +#define NDBCHAIN NDBSPEC /* points to a collision chain */ +#define NDBNAP (NDBSPEC|1) /* not a pointer */ + +/* + * macros for packing and unpacking pointers + */ +#define NDBPUTP(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; } +#define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16)) + +/* + * macros for packing and unpacking unsigned longs + */ +#define NDBPUTUL(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; (a)[3] = ((v)>>24)&0xFF; } +#define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24)) + +#define NDB_IPlen 16 + +Ndbtuple* csgetval(char*, char*, char*, char*, char*); +char* csgetvalue(char*, char*, char*, char*, Ndbtuple**); +Ndbtuple* csipinfo(char*, char*, char*, char**, int); +Ndbtuple* dnsquery(char*, char*, char*); +char* ipattr(char*); +Ndb* ndbcat(Ndb*, Ndb*); +int ndbchanged(Ndb*); +void ndbclose(Ndb*); +Ndbtuple* ndbconcatenate(Ndbtuple*, Ndbtuple*); +Ndbtuple* ndbdiscard(Ndbtuple*, Ndbtuple*); +void ndbfree(Ndbtuple*); +Ndbtuple* ndbgetipaddr(Ndb*, char*); +Ndbtuple* ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*); +char* ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**); +Ndbtuple* ndbfindattr(Ndbtuple*, Ndbtuple*, char*); +ulong ndbhash(char*, int); +Ndbtuple* ndbipinfo(Ndb*, char*, char*, char**, int); +Ndbtuple* ndblookval(Ndbtuple*, Ndbtuple*, char*, char*); +Ndbtuple* ndbnew(char*, char*); +Ndb* ndbopen(char*); +Ndbtuple* ndbparse(Ndb*); +int ndbreopen(Ndb*); +Ndbtuple* ndbreorder(Ndbtuple*, Ndbtuple*); +Ndbtuple* ndbsearch(Ndb*, Ndbs*, char*, char*); +long ndbseek(Ndb*, long); +void ndbsetval(Ndbtuple*, char*, int); +Ndbtuple* ndbsnext(Ndbs*, char*, char*); +Ndbtuple* ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);