tadd ndb - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ad017cfbf5530cfc3ae2fafd723cdade2a4405f6
 (DIR) parent 096ff3e14a188992d2dfe59c7fd3f5d6da791331
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 11 Feb 2005 19:40:20 +0000
       
       add ndb
       
       Diffstat:
         A include/ndb.h                       |     158 +++++++++++++++++++++++++++++++
       
       1 file changed, 158 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/include/ndb.h b/include/ndb.h
       t@@ -0,0 +1,158 @@
       +/*
       +#pragma        src        "/sys/src/libndb"
       +#pragma        lib        "libndb.a"
       +*/
       +AUTOLIB(ndb)
       +
       +/*
       + *  this include file requires includes of <u.h> and <bio.h>
       + */
       +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*);