Example #1
0
static int __cdbb_findnext(struct cdbb *a, const char *needle, struct nentry *n,
	int ignorecase)
{
	uint32 kp, dp, ks, vs;
	unsigned char *k, *v;

	if (cdb_nextkey(a->r, &a->kfindpos) != 1)
		return -1;

	kp = cdb_keypos(a->r);
	ks = cdb_keylen(a->r);
	k = alloca(ks);
	cdb_read(a->r, k, ks, kp);

	dp = cdb_datapos(a->r);
	vs = cdb_datalen(a->r);
	/* in some cases we do not need to read e.g. when deleting
	 * or filtering but for simplicity we just do it anyways */
	v = alloca(vs);
	cdb_read(a->r, v, vs, dp);

	/* search value */
	if (ignorecase) {
		if (strcasestr((char *)v, needle) == NULL)
			return 0;
	} else {
		if (strstr((char *)v, needle) == NULL)
			return 0;
	}

	array_catb(&n->k, (char *)k, ks);
	array_catb(&n->e, (char *)v, vs);

	return 1;
}
int cdb_successor (struct cdb *c, char const *key, unsigned int klen)
{
  uint32 kpos ;
  if (key)
  {
    register int r = cdb_find(c, key, klen) ;
    if (r < 1) return r ;
    kpos = c->dpos + c->dlen ;
  }
  else cdb_traverse_init(c, &kpos) ;
  return cdb_nextkey(c, &kpos) ;
}
Example #3
0
int cdbb_copy(struct cdbb *a)
{
	uint32 kfindpos, ks, vs;
	int num = 0;

	if (!cdb_firstkey(a->r, &kfindpos))
		return 0;

	do {
		ks = cdb_keylen(a->r);
		vs = cdb_datalen(a->r);
		num += __cdbb_copy(a, ks, vs);
	} while (cdb_nextkey(a->r, &kfindpos) == 1);

	return num;
}