tndb.h - 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
       ---
       tndb.h (4400B)
       ---
            1 /*
            2 #pragma        src        "/sys/src/libndb"
            3 #pragma        lib        "libndb.a"
            4 */
            5 AUTOLIB(ndb)
            6 
            7 /*
            8  *  this include file requires includes of <u.h> and <bio.h>
            9  */
           10 typedef struct Ndb        Ndb;
           11 typedef struct Ndbtuple        Ndbtuple;
           12 typedef struct Ndbhf        Ndbhf;
           13 typedef struct Ndbs        Ndbs;
           14 typedef struct Ndbcache        Ndbcache;
           15 
           16 /*
           17 #pragma incomplete Ndbhf
           18 #pragma incomplete Ndbcache
           19 */
           20 
           21 enum
           22 {
           23         Ndbalen=        32,        /* max attribute length */
           24         Ndbvlen=        64        /* max value length */
           25 };
           26 
           27 /*
           28  *  the database
           29  */
           30 struct Ndb
           31 {
           32         Ndb                *next;
           33 
           34         Biobuf        b;                /* buffered input file */
           35 
           36         ulong                mtime;                /* mtime of db file */
           37         Qid                qid;                /* qid of db file */
           38         char                file[128];/* path name of db file */
           39         ulong                length;                /* length of db file */
           40 
           41         int                nohash;                /* don't look for hash files */
           42         Ndbhf                *hf;                /* open hash files */
           43 
           44         int                ncache;                /* size of tuple cache */
           45         Ndbcache        *cache;                /* cached entries */
           46 };
           47 
           48 /*
           49  *  a parsed entry, doubly linked
           50  */
           51 struct Ndbtuple
           52 {
           53         char                attr[Ndbalen];                /* attribute name */
           54         char                *val;                        /* value(s) */
           55         Ndbtuple        *entry;                        /* next tuple in this entry */
           56         Ndbtuple        *line;                        /* next tuple on this line */
           57         ulong                ptr;                        /* (for the application - starts 0) */
           58         char                valbuf[Ndbvlen];        /* initial allocation for value */
           59 };
           60 
           61 /*
           62  *  each hash file is of the form
           63  *
           64  *                +---------------------------------------+
           65  *                |        mtime of db file (4 bytes)        |
           66  *                +---------------------------------------+
           67  *                |  size of table (in entries - 4 bytes)        |
           68  *                +---------------------------------------+
           69  *                |                hash table                |
           70  *                +---------------------------------------+
           71  *                |                hash chains                |
           72  *                +---------------------------------------+
           73  *
           74  *  hash collisions are resolved using chained entries added to the
           75  *  the end of the hash table.
           76  *
           77  *  Hash entries are of the form
           78  *
           79  *                +-------------------------------+
           80  *                |        offset        (3 bytes)         |
           81  *                +-------------------------------+
           82  *
           83  *  Chain entries are of the form
           84  *
           85  *                +-------------------------------+
           86  *                |        offset1        (3 bytes)         |
           87  *                +-------------------------------+
           88  *                |        offset2        (3 bytes)         |
           89  *                +-------------------------------+
           90  *
           91  *  The top bit of an offset set to 1 indicates a pointer to a hash chain entry.
           92  */
           93 #define NDBULLEN        4                /* unsigned long length in bytes */
           94 #define NDBPLEN                3                /* pointer length in bytes */
           95 #define NDBHLEN                (2*NDBULLEN)        /* hash file header length in bytes */
           96 
           97 /*
           98  *  finger pointing to current point in a search
           99  */
          100 struct Ndbs
          101 {
          102         Ndb        *db;        /* data base file being searched */
          103         Ndbhf        *hf;        /* hash file being searched */
          104         int        type;
          105         ulong        ptr;        /* current pointer */
          106         ulong        ptr1;        /* next pointer */
          107         Ndbtuple *t;        /* last attribute value pair found */
          108 };
          109 
          110 /*
          111  *  bit defs for pointers in hash files
          112  */
          113 #define NDBSPEC         (1<<23)
          114 #define NDBCHAIN        NDBSPEC                /* points to a collision chain */
          115 #define NDBNAP                (NDBSPEC|1)        /* not a pointer */
          116 
          117 /*
          118  *  macros for packing and unpacking pointers
          119  */
          120 #define NDBPUTP(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; }
          121 #define NDBGETP(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16))
          122 
          123 /*
          124  *  macros for packing and unpacking unsigned longs
          125  */
          126 #define NDBPUTUL(v,a) { (a)[0] = (v)&0xFF; (a)[1] = ((v)>>8)&0xFF; (a)[2] = ((v)>>16)&0xFF; (a)[3] = ((v)>>24)&0xFF; }
          127 #define NDBGETUL(a) ((a)[0] | ((a)[1]<<8) | ((a)[2]<<16) | ((a)[3]<<24))
          128 
          129 #define NDB_IPlen 16
          130 
          131 Ndbtuple*        csgetval(char*, char*, char*, char*, char*);
          132 char*                csgetvalue(char*, char*, char*, char*, Ndbtuple**);
          133 Ndbtuple*        csipinfo(char*, char*, char*, char**, int);
          134 Ndbtuple*        dnsquery(char*, char*, char*);
          135 char*                ipattr(char*);
          136 Ndb*                ndbcat(Ndb*, Ndb*);
          137 int                ndbchanged(Ndb*);
          138 void                ndbclose(Ndb*);
          139 Ndbtuple*        ndbconcatenate(Ndbtuple*, Ndbtuple*);
          140 Ndbtuple*        ndbdiscard(Ndbtuple*, Ndbtuple*);
          141 void                ndbfree(Ndbtuple*);
          142 Ndbtuple*        ndbgetipaddr(Ndb*, char*);
          143 Ndbtuple*        ndbgetval(Ndb*, Ndbs*, char*, char*, char*, char*);
          144 char*                ndbgetvalue(Ndb*, Ndbs*, char*, char*, char*, Ndbtuple**);
          145 Ndbtuple*        ndbfindattr(Ndbtuple*, Ndbtuple*, char*);
          146 ulong                ndbhash(char*, int);
          147 Ndbtuple*        ndbipinfo(Ndb*, char*, char*, char**, int);
          148 Ndbtuple*        ndblookval(Ndbtuple*, Ndbtuple*, char*, char*);
          149 Ndbtuple*        ndbnew(char*, char*);
          150 Ndb*                ndbopen(char*);
          151 Ndbtuple*        ndbparse(Ndb*);
          152 int                ndbreopen(Ndb*);
          153 Ndbtuple*        ndbreorder(Ndbtuple*, Ndbtuple*);
          154 Ndbtuple*        ndbsearch(Ndb*, Ndbs*, char*, char*);
          155 long                ndbseek(Ndb*, long);
          156 void                ndbsetval(Ndbtuple*, char*, int);
          157 Ndbtuple*        ndbsnext(Ndbs*, char*, char*);
          158 Ndbtuple*        ndbsubstitute(Ndbtuple*, Ndbtuple*, Ndbtuple*);