So I wrote a backend for this thing:

http://sophia.systems/

It looks really nice, but sadly it doesn't seem to offer cursors that can 
iterate inside the current transaction, as can be seen from the example program 
attached.  The output is:

a: aval
b: bval
c: cval
d: outside

Where I would expect:


a: aval
b: bval
c: cval
d: inside

I haven't been able to find a way around this.  I thought using the "order" ops 
directly rather than the sp_cursor would do it, but it has the same bug :(

It also doesn't support BYO sort order, which means no improved_mboxlist_sort 
support.

*sigh* - back to the drawing board.

Bron.

-- 
  Bron Gondwana
  br...@fastmail.fm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sophia.h"

struct kv {
    const char *k;
    const char *v;
};

int main(char **argv, int argc)
{
    void *env = sp_env();
    sp_setstring(env, "sophia.path", "/tmp/testdb", 0);
    sp_setstring(env, "db", "test", 0);
    sp_open(env);

    struct kv set[] = {
        { "a", "aval" },
        { "b", "bval" },
        { "c", "cval" },
        { NULL, NULL },
    };

    void *db = sp_getobject(env, "db.test");
    int i;
    void *o;

    for (i = 0; set[i].k; i++) {
        o = sp_document(db);
        sp_setstring(o, "key", set[i].k, strlen(set[i].k));
        sp_setstring(o, "value", set[i].v, strlen(set[i].v));
        sp_set(db, o);
    }

    void *t = sp_begin(env);

    o = sp_document(db);
    sp_setstring(o, "key", "d", 1);
    sp_setstring(o, "value", "outside", 7);
    sp_set(db, o);

    o = sp_document(db);
    sp_setstring(o, "key", "d", 1);
    sp_setstring(o, "value", "inside", 6);
    sp_set(t, o);

    o = sp_document(db);
    sp_setstring(o, "order", ">=", 0);

    while ((o = sp_get(t, o))) {
        int keylen;
        char *key = sp_getstring(o, "key", &keylen);
        int valuelen;
        char *value = sp_getstring(o, "value", &valuelen);

        printf("%.*s: %.*s\n", keylen, key, valuelen, value);
    }

    sp_commit(t);

    sp_destroy(env);

    return 0;
}

Reply via email to