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
00086
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 }