Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#pragma src     "/sys/src/libndb"
#pragma lib     "libndb.a"

/*
 *  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;

        Biobufhdr       b;              /* buffered input file */
        uchar           buf[256];       /* and its buffer */

        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; (a)[1] = (v)>>8; (a)[2] = (v)>>16; }
#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; (a)[1] = (v)>>8; (a)[2] = (v)>>16; (a)[3] = (v)>>24; }
#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*);
void            ndbsetval(Ndbtuple*, char*, int);
Ndbtuple*       ndbsnext(Ndbs*, char*, char*);
Ndbtuple*       ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);
void            ndbsetmalloctag(Ndbtuple*, uintptr);