Esempio n. 1
0
static PyObject *
sophia_cursor_next_value(SophiaCursor *cursor)
{
    if (sophia_stop_iteration(cursor))
        return NULL;
    
    const char *value = sp_value(cursor->cursor);
    size_t vsize = sp_valuesize(cursor->cursor);
    
    if (value == NULL || vsize == 0) {
        PyErr_SetString(SophiaError, "cursor failed");
        return NULL;
    }
    
    return PyBytes_FromStringAndSize(value, (Py_ssize_t)vsize);
}
Esempio n. 2
0
sphia_iterator_node_t *
sphia_iterator_next (sphia_iterator_t *self) {
  sphia_iterator_node_t *node = NULL;
  size_t keysize = 0;
  size_t valuesize = 0;
  const char *key = NULL;
  const char *value = NULL;

  if (NULL == self->cursor) {
    self->cursor = sp_cursor(self->db
      , self->direction
      , self->last_key
      , self->last_keysize);
    if (NULL == self->cursor) return NULL;
  }

  if (0 == sp_fetch(self->cursor)) return NULL;

  if (!(node = malloc(sizeof(sphia_iterator_node_t))))
    return NULL;

  node->key = NULL;
  node->value = NULL;

  if (!(key = sp_key(self->cursor)) || !(value = sp_value(self->cursor))) {
    free(node);
    return NULL;
  }

  keysize = sp_keysize(self->cursor);
  valuesize = sp_valuesize(self->cursor);

  // record so we can create a
  // cursor at this position
  self->last_key = key;
  self->last_keysize = keysize;

  if (!(node->key = sphia_strdup(key))
    || !(node->value = sphia_strdup(value))) {
    sphia_iterator_node_free(node);
    return NULL;
  }

  return node;
}
Esempio n. 3
0
static int
rangefwd(int n)
{
	void *c = sp_cursor(db, SPGTE, NULL, 0);
	if (c == NULL) {
		printf("cursor failed: %s\n", sp_error(db));
		return 1;
	}
	while (sp_fetch(c)) {
		const char *k = sp_key(c);
		size_t sz = sp_valuesize(c);
		(void)k;
		(void)sz;
		keytraversed++;
	}
	sp_destroy(c);
	return 0;
}
Esempio n. 4
0
File: db.c Progetto: jwerle/todo.c
char *
todo_db_reduce (todo_db_t *db, char *(*fn)(char *curkey, char *curvalue, char *nextkey, char *nextvalue, todo_db_t *db)) {
  void *c = sp_cursor(db->dbh, SPGT, NULL, 0);
  char *reduced = NULL;
  char *tmp = "";
  int i = 0;
  char *ckey, *cvalue;
  char *nkey, *nvalue;

  if (NULL == c) {
    return NULL;
  }

  while (sp_fetch(c)) {
    // next value
    if (i++ % 2) {
      nkey = strndup(sp_key(c), sp_keysize(c));
      nvalue = strndup(sp_value(c), sp_valuesize(c));
      reduced = fn(ckey, cvalue, nkey, nvalue, db);
      free(nkey);
      free(nvalue);
    } else {
      ckey =  strdup(sp_key(c));
      cvalue = strdup(sp_value(c));
    }

    if (NULL != reduced) break;
  }

  if (NULL == reduced) {
    reduced = fn(ckey, cvalue, tmp, tmp, db);
  }


  sp_destroy(c);

  return reduced;
}
Esempio n. 5
0
static PyObject *
sophia_cursor_next_item(SophiaCursor *cursor)
{
    size_t ksize, vsize;
    const char *key, *value;
    PyObject *rv, *pkey, *pvalue;
    
    if (sophia_stop_iteration(cursor))
        return NULL;
    
    key = sp_key(cursor->cursor);
    ksize = sp_keysize(cursor->cursor);
    value = sp_value(cursor->cursor);
    vsize = sp_valuesize(cursor->cursor);
    
    if (key == NULL || value == NULL || ksize == 0 || vsize == 0) {
        PyErr_SetString(SophiaError, "cursor failed");
        return NULL;
    }
    
    pkey = PyBytes_FromStringAndSize(key, (Py_ssize_t)ksize);
    pvalue = PyBytes_FromStringAndSize(value, (Py_ssize_t)vsize);
    
    if (!(pkey && pvalue)) {
        Py_XDECREF(pkey);
        Py_XDECREF(pvalue);
        return NULL;
    }

    rv = PyTuple_Pack(2, pkey, pvalue);
    
    Py_DECREF(pkey);
    Py_DECREF(pvalue);
    
    return rv;
}