Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

NVHash.cc

Go to the documentation of this file.
00001 #include"NVHash.h"
00002 #include"Error.h"
00003 
00004 #include<fcntl.h>
00005 #include<sys/stat.h>
00006 #include<sys/types.h>
00007 
00008 using namespace std;
00009 
00010 void NVHash::make_current()
00011 {
00012         nvoff_t hdata;
00013 
00014         if (mem_p && is_current())
00015                 return;
00016 
00017         NVlist::make_current();
00018         if ((hdata = getdata()) == 0) {
00019                 hashtab = NULL;
00020                 hashsz = 0;
00021         } else {
00022                 hashtab =
00023                     (nvoff_t *) (mem_p + hdata + sizeof(unsigned long));
00024                 hashsz = *(unsigned long *) (mem_p + hdata);
00025         }
00026 }
00027 
00028 void NVHash::sclear(void)
00029 {
00030         unsigned long i;
00031         for (i = 0; i < hashsz; i++)
00032                 NVlist::sclear((char *) &(hashtab[i]) - mem_p);
00033 }
00034 
00035 int NVHash::sis_empty(void)
00036 {
00037         unsigned long i;
00038         for (i = 0; i < hashsz; i++)
00039                 if (hashtab[i])
00040                         return 0;
00041         return 1;
00042 }
00043 
00044 void NVHash::sadd(unsigned long h, const char *data, size_t szdata)
00045 {
00046         NVlist::sprepend((char *) &(hashtab[h]) - mem_p, data, szdata);
00047 }
00048 
00049 void NVHash::sprint(ostream & os)
00050 {
00051         unsigned long i;
00052         for (i = 0; i < hashsz; i++)
00053                 NVlist::sprint((char *) &(hashtab[i]) - mem_p, os);
00054 }
00055 
00056 NVHash::NVHash(const char *dbname, unsigned long hashsz, int flags)
00057 :NVlist()
00058 {
00059         open(dbname, hashsz, flags);
00060 }
00061 
00062 void NVHash::open(const char *dbname, unsigned long nhashsz, int flags)
00063 {
00064         NVlist::open(dbname, flags);
00065         if (!hashtab) {
00066                 lock(ExclLock);
00067                 if (!hashtab) {
00068                         nvoff_t ht =
00069                             nvalloc(sizeof(unsigned long) +
00070                                     nhashsz * sizeof(nvoff_t));
00071                         unsigned long i;
00072                         setdata(ht);
00073 
00074                         hashsz = (*(unsigned long *) (mem_p + ht)) =
00075                             nhashsz;
00076                         hashtab =
00077                             (nvoff_t *) (mem_p + ht +
00078                                          sizeof(unsigned long));
00079 
00080                         for (i = 0; i < hashsz; i++)
00081                                 hashtab[i] = 0;
00082                 }
00083                 lock(UnLock);
00084         }
00085         // The hashsz and hashtab variables will be updated at the next
00086         // make_current method-invocation
00087 }
00088 
00089 void NVHash::clear(void)
00090 {
00091         lock(ExclLock);
00092         sclear();
00093         lock(UnLock);
00094 }
00095 
00096 int NVHash::is_empty(void)
00097 {
00098         int r;
00099         lock(ShrdLock);
00100         r = sis_empty();
00101         lock(UnLock);
00102         return r;
00103 }
00104 
00105 void NVHash::add(unsigned long h, const char *data, size_t szdata)
00106 {
00107         lock(ExclLock);
00108         sadd(h, data, szdata);
00109         lock(UnLock);
00110 }
00111 
00112 void NVHash::print(ostream & os)
00113 {
00114         lock(ShrdLock);
00115         sprint(os);
00116         lock(UnLock);
00117 }

Generated on Fri Aug 20 10:58:07 2004 for NewsCache by doxygen 1.3.6-20040222