コード例 #1
0
int
cdb_make_put(struct cdb_make *cdbmp,
	     const void *key, unsigned klen,
	     const void *val, unsigned vlen,
	     enum cdb_put_mode mode)
{
  unsigned hval = cdb_hash(key, klen);
  int r;

  switch(mode) {
    case CDB_PUT_REPLACE:
    case CDB_PUT_INSERT:
    case CDB_PUT_WARN:
    case CDB_PUT_REPLACE0:
      r = findrec(cdbmp, key, klen, hval, mode);
      if (r < 0)
        return -1;
      if (r && mode == CDB_PUT_INSERT)
        return errno = EEXIST, 1;
      break;

    case CDB_PUT_ADD:
      r = 0;
      break;

    default:
      return errno = EINVAL, -1;
  }

  if (_cdb_make_add(cdbmp, hval, key, klen, val, vlen) < 0)
    return -1;

  return r;
}
コード例 #2
0
int
cdb_make_find(struct cdb_make *cdbmp,
              const void *key, unsigned klen,
              enum cdb_put_mode mode)
{
  return findrec(cdbmp, key, klen, cdb_hash(key, klen), mode);
}
コード例 #3
0
ファイル: cdb_find.c プロジェクト: alepharchives/perp
int
cdb_find(struct cdb *C, const uchar_t *key, uint32_t klen)
{
  uint32_t  fp;
  uchar_t   nbuf[8];
  uint32_t  hash, tslots, target;
  
  /* search initialization: */
  C->key = (uchar_t *)key;
  C->klen = klen;
  C->h = hash = cdb_hash(key, klen);

  /* lookup subtable for this hash value: */
  fp = cdb_NTAB(hash) * 8;
  if(cdb_read(C, nbuf, 8, fp) == -1){
      return -1;
  }
  /* subtable offet: */
  C->tbase = upak32_unpack(nbuf);
  /* slots in subtable: */
  C->tslots = tslots = upak32_unpack(nbuf + 4);

  if(tslots == 0){
      /* no slots in this table; key not found: */
      return 0;
  }

  /* target slot for this key: */
  target = cdb_SLOT(hash, tslots);
  C->s0 = target;

  /* probe: */
  return cdb_hash_probe(C, target);
}
コード例 #4
0
ファイル: vdnsdb.c プロジェクト: malfaux/geoipdns
/*
static int check_default(const char *s, int len)
{
	char tst[64];
	register char *x = s;
	if (len!=7) return 0;
	//snprintf(tst,len+1,"%s",s);
	getprint(s,len,tst);
	dbger("checkd(): %s",tst);
	if (*x != 'n') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 'o') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 'm') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 'a') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 't') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 'c') return 0; len--; if(len < 0) return 0; x++;
	if (*x != 'h') return 0; len--; if(len < 0) return 0; x++;
	dbger("match_default_entry");
	return 1;
}
*/
static uint32 gethash(const char *s, uint32 slen)
{
	if (slen == 0) return 0U;
#ifdef SHASTRID
	return sha_hash(s,slen);
#else
	return cdb_hash(s,slen);
#endif
}
コード例 #5
0
ファイル: cdbmodule.c プロジェクト: jkahn/python-cdb
/* ---------------- exported functions ------------------ */
static PyObject *
_wrap_cdb_hash(PyObject *ignore, PyObject *args) {

  char *s;
  int sz;

  if (! PyArg_ParseTuple(args, "s#:hash", &s, &sz))
    return NULL;

  return Py_BuildValue("l", cdb_hash(s, (unsigned int) sz));

}
コード例 #6
0
ファイル: cdb.c プロジェクト: alepharchives/ULib
int cdb_findnext(struct cdb *c,char *key,unsigned int len)
{
  char buf[8];
  uint32 pos;
  uint32 u;

	U_INTERNAL_TRACE("cdb_findnext(%p,%.*s,%u)",c,len,key,len)

  if (!c->loop) {
	 u = cdb_hash(key,len);
	 if (cdb_read(c,buf,8,(u % CDB_NUM_HASH_TABLE_POINTER) * 8) == -1) return -1;
	 uint32_unpack(buf + 4,&c->hslots);
	 if (!c->hslots) return 0;
	 uint32_unpack(buf,&c->hpos);
	 c->khash = u;
	 u /= CDB_NUM_HASH_TABLE_POINTER;
	 u %= c->hslots;
	 u <<= 3;
	 c->kpos = c->hpos + u;
  }

  while (c->loop < c->hslots) {
	 if (cdb_read(c,buf,8,c->kpos) == -1) return -1;
	 uint32_unpack(buf + 4,&pos);
	 if (!pos) return 0;
	 c->loop += 1;
	 c->kpos += 8;
	 if (c->kpos == c->hpos + (c->hslots << 3)) c->kpos = c->hpos;
	 uint32_unpack(buf,&u);
	 if (u == c->khash) {
		if (cdb_read(c,buf,8,pos) == -1) return -1;
		uint32_unpack(buf,&u);
		if (u == len)
	switch(match(c,key,len,pos + 8)) {
	  case -1:
		 return -1;
	  case 1:
		 uint32_unpack(buf + 4,&c->dlen);
		 c->dpos = pos + 8 + len;
		 return 1;
	}
	 }
  }

  U_INTERNAL_TRACE("not found",0)
  return 0;
}
コード例 #7
0
ファイル: cdb.c プロジェクト: Ar0xA/ossec-hids
int cdb_findnext(struct cdb *c,char *key,unsigned int len)
{
  char buf[8];
  uint32 pos;
  uint32 u;

  if (!c->loop) {
    u = cdb_hash(key,len);
    if (cdb_read(c,buf,8,(u << 3) & 2047) == -1) return -1;
    uint32_unpack(buf + 4,&c->hslots);
    if (!c->hslots) return 0;
    uint32_unpack(buf,&c->hpos);
    c->khash = u;
    u >>= 8;
    u %= c->hslots;
    u <<= 3;
    c->kpos = c->hpos + u;
  }
コード例 #8
0
ファイル: cdb.c プロジェクト: alepharchives/cdb64
int cdb_findnext(struct cdb *c,char *key,off_t len)
{
  char buf[entry_size];
  ref_t pos;
  ref_t u;

  if (!c->loop) {
    u = cdb_hash(key,len);
    if (cdb_read(c,buf,entry_size,(u * entry_size) & (256*entry_size - 1)) == -1) return -1;
    ref_unpack(buf + ref_size,&c->hslots);
    if (!c->hslots) return 0;
    ref_unpack(buf,&c->hpos);
    c->khash = u;
    u /= ref_size;
    u %= c->hslots;
    u *= entry_size;
    c->kpos = c->hpos + u;
  }

  while (c->loop < c->hslots) {
    if (cdb_read(c,buf,entry_size,c->kpos) == -1) return -1;
    ref_unpack(buf + ref_size,&pos);
    if (!pos) return 0;
    c->loop += 1;
    c->kpos += 8;
    if (c->kpos == c->hpos + (c->hslots * entry_size)) c->kpos = c->hpos;
    ref_unpack(buf,&u);
    if (u == c->khash) {
      if (cdb_read(c,buf,entry_size,pos) == -1) return -1;
      ref_unpack(buf,&u);
      if (u == len)
	switch(match(c,key,len,pos + entry_size)) {
	  case -1:
	    return -1;
	  case 1:
	    ref_unpack(buf + ref_size,&c->dlen);
	    c->dpos = pos + entry_size + len;
	    return 1;
	}
    }
  }

  return 0;
}
コード例 #9
0
int
cdb_make_put(struct cdb_make *cdbmp,
	     const void *key, unsigned klen,
	     const void *val, unsigned vlen,
	     int flags)
{
  unsigned char rlen[8];
  unsigned hval = cdb_hash(key, klen);
  struct cdb_rl *rl;
  int c, r;

  switch(flags) {
    case CDB_PUT_REPLACE:
    case CDB_PUT_INSERT:
    case CDB_PUT_WARN:
      c = _cdb_make_find(cdbmp, key, klen, hval, &rl);
      if (c < 0)
	return -1;
      if (c) {
	if (flags == CDB_PUT_INSERT)
	  return errno = EEXIST, 1;
	else if (flags == CDB_PUT_REPLACE) {
	  --c;
	  r = 1;
	  break;
	}
	else
	  r = 1;
      }
      /* fall */

    case CDB_PUT_ADD:
      rl = cdbmp->cdb_rec[hval&255];
      if (!rl || rl->cnt >= sizeof(rl->rec)/sizeof(rl->rec[0])) {
 	rl = (struct cdb_rl*)xmalloc(sizeof(struct cdb_rl));
	if (!rl)
	  return errno = ENOMEM, -1;
	rl->cnt = 0;
	rl->next = cdbmp->cdb_rec[hval&255];
	cdbmp->cdb_rec[hval&255] = rl;
      }
      c = rl->cnt;
      r = 0;
      break;

    default:
      return errno = EINVAL, -1;
  }

  if (klen > 0xffffffff - (cdbmp->cdb_dpos + 8) ||
      vlen > 0xffffffff - (cdbmp->cdb_dpos + klen + 8))
    return errno = ENOMEM, -1;
  rl->rec[c].hval = hval;
  rl->rec[c].rpos = cdbmp->cdb_dpos;
  if ((unsigned)c == rl->cnt) {
    ++rl->cnt;
    ++cdbmp->cdb_rcnt;
  }
  cdb_pack(klen, rlen);
  cdb_pack(vlen, rlen + 4);
  if (_cdb_make_write(cdbmp, (const char *)rlen, 8) < 0 ||
      _cdb_make_write(cdbmp, (const char *)key, klen) < 0 ||
      _cdb_make_write(cdbmp, (const char *)val, vlen) < 0)
    return -1;
  return r;
}
コード例 #10
0
ファイル: cdb_make_find.cpp プロジェクト: AleXoundOS/pvpgn
int
cdb_make_exists(struct cdb_make *cdbmp,
                const void *key, unsigned klen)
{
  return _cdb_make_find(cdbmp, key, klen, cdb_hash(key, klen), NULL);
}