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); }
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; }
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; }
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; }
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; }