xref: /plan9/sys/include/ndb.h (revision 6a3b066f6369d5d77e8aa368b8ece6c2b23e8e88)
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