static void cache_invalidate(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32",0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_open(env) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); int i = 0; while (i < 185) { void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); i = 185; while (i < 370) { void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( i == 370 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); void *cur = sp_cursor(env); t( cur != NULL ); o = sp_object(db); i = 0; while ((o = sp_get(cur, o))) { t( *(int*)sp_getstring(o, "key", NULL) == i ); if (i == 200) { t( sp_setint(env, "db.test.branch", 0) == 0 ); } i++; } t( i == 371 ); t( sp_destroy(cur) == 0 ); t( sp_getint(env, "db.test.index.read_disk") == 3 ); t( sp_getint(env, "db.test.index.read_cache") == 722 ); t( sp_destroy(env) == 0 ); }
static inline int workflow_write_read(void *env, void *db) { /* write */ void *o = sp_document(db); if (o == NULL) return -1; uint32_t key = 123; int rc; rc = sp_setstring(o, "key", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); return -1; } rc = sp_setstring(o, "value", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); return -1; } rc = sp_set(db, o); if (rc == -1) return -1; /* transaction */ void *tx = sp_begin(env); if (tx == NULL) return -1; o = sp_document(db); if (o == NULL) return -1; key = 123; rc = sp_setstring(o, "key", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); sp_destroy(tx); return -1; } rc = sp_setstring(o, "value", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); sp_destroy(tx); return -1; } rc = sp_set(tx, o); if (rc == -1) { sp_destroy(tx); return -1; } o = sp_document(db); if (o == NULL) return -1; rc = sp_setstring(o, "key", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); sp_destroy(tx); return -1; } o = sp_get(tx, o); if (o == NULL) { sp_destroy(tx); return -1; } sp_destroy(o); rc = sp_commit(tx); if (rc == -1) return -1; /* read */ o = sp_document(db); if (o == NULL) return -1; rc = sp_setstring(o, "key", &key, sizeof(key)); if (rc == -1) { sp_destroy(o); return -1; } o = sp_get(db, o); if (o == NULL) return -1; sp_destroy(o); /* cursor */ void *c = sp_cursor(env); if (c == NULL) return -1; o = sp_document(db); if (o == NULL) { sp_destroy(c); return -1; } o = sp_get(c, o); if (o == NULL) { sp_destroy(c); return -1; } sp_destroy(o); sp_destroy(c); return 0; }
static void tpr_test1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "log.two_phase_recover", 1) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); t( sp_open(env) == 0 ); int key = 7; int value = 8; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); key = 7; value = 9; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); t( sp_destroy(env) == 0 ); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "log.two_phase_recover", 1) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); char *v = sp_getstring(env, "db.test.status", NULL); t( strcmp(v, "recover") == 0 ); free(v); void *tx = sp_begin(env); t( tx != NULL ); key = 7; value = 8; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 1) == 0 ); t( sp_commit(tx) == 0 ); /* skip */ tx = sp_begin(env); t( tx != NULL ); key = 7; value = 9; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 2) == 0 ); t( sp_commit(tx) == 0 ); /* commit */ t( sp_open(env) == 0 ); v = sp_getstring(env, "db.test.status", NULL); t( strcmp(v, "online") == 0 ); free(v); o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(int*)sp_getstring(o, "value", NULL) == 9 ); t( sp_getint(o, "lsn") == 2ULL ); t( sp_destroy(o) == 0 ); t( sp_destroy(env) == 0 ); }
static void snapshot_test1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); int key = 0; while (key < 10) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_getint(env, "scheduler.snapshot_active") == 0 ); t( sp_getint(env, "scheduler.snapshot_ssn") == 0 ); t( sp_getint(env, "scheduler.snapshot_ssn_last") == 0 ); t( sp_setint(env, "scheduler.snapshot", 0) == 0 ); t( sp_getint(env, "scheduler.snapshot_active") == 1 ); t( sp_getint(env, "scheduler.snapshot_ssn") == 1 ); t( sp_getint(env, "scheduler.snapshot_ssn_last") == 0 ); int rc; while ( (rc = sp_setint(env, "scheduler.run", 0)) > 0 ); t( rc == 0 ); t( sp_getint(env, "scheduler.snapshot_active") == 0 ); t( sp_getint(env, "scheduler.snapshot_ssn") == 0 ); t( sp_getint(env, "scheduler.snapshot_ssn_last") == 1 ); while (key < 15) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_destroy(env) == 0 ); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( sp_open(env) == 0 ); key = 0; while (key < 10) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); o = sp_get(db, o); t( o != NULL ); sp_destroy(o); key++; } t( sp_destroy(env) == 0 ); }
* BSD License */ #include <libsr.h> #include <libst.h> #include <sham.h> static void method_unsupported(stc *cx srunused) { void *env = sp_env(); t( env != NULL ); void *o = sp_object(env); t(o == NULL); void *c = sp_ctl(env); o = sp_get(c, "sham.error"); t( o != NULL ); char *value = sp_get(o, "value", NULL); t( value != NULL ); t( strstr(value, "unsupported") != NULL ); sp_destroy(o); sp_destroy(env); } stgroup *method_group(void) { stgroup *group = st_group("method"); st_groupadd(group, st_test("unsupported", method_unsupported)); return group; }
static void npr_test1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "sophia.recover", 1) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.test.scheme.key", "u32,key(0)", 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "value", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); char *v = sp_getstring(env, "db.test.status", NULL); t( strcmp(v, "online") == 0 ); free(v); int key = 7; int value = 8; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); key = 7; value = 9; o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); t( sp_destroy(env) == 0 ); /* recover */ env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "sophia.recover", 3 /* << */) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_open(env) == 0 ); /* online */ t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.test.scheme.key", "u32,key(0)", 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "value", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); /* online */ v = sp_getstring(env, "db.test.status", NULL); t( strcmp(v, "online") == 0 ); free(v); t( sp_open(env) == 0 ); /* recover */ void *tx = sp_begin(env); t( tx != NULL ); key = 7; value = 8; o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 1) == 0 ); t( sp_commit(tx) == 0 ); /* skip */ tx = sp_begin(env); t( tx != NULL ); key = 7; value = 9; o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 2) == 0 ); t( sp_commit(tx) == 0 ); /* commit */ /* retry duplicate */ tx = sp_begin(env); t( tx != NULL ); o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 2) == 0 ); t( sp_commit(tx) == 0 ); /* skip from in-memory scheme */ /* retry duplicate with lower lsn */ tx = sp_begin(env); t( tx != NULL ); o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setint(tx, "lsn", 1) == 0 ); t( sp_commit(tx) == 0 ); /* skip from in-memory scheme */ t( sp_open(env) == 0 ); /* online */ o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(int*)sp_getstring(o, "value", NULL) == 9 ); t( sp_getint(o, "lsn") == 2ULL ); t( sp_destroy(o) == 0 ); t( sp_destroy(env) == 0 ); }
static void prefix_test1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_open(env) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); char key[] = "a"; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); char keyb[] = "ab"; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", keyb, sizeof(keyb)) == 0 ); t( sp_set(db, o) == 0 ); char keyc[] = "aba"; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", keyc, sizeof(keyc)) == 0 ); t( sp_set(db, o) == 0 ); char keyd[] = "abac"; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", keyd, sizeof(keyd)) == 0 ); t( sp_set(db, o) == 0 ); char keye[] = "bbac"; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", keye, sizeof(keye)) == 0 ); t( sp_set(db, o) == 0 ); char prefix[] = "ab"; void *c = sp_cursor(env); t( c != NULL ); o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "order", "<=", 0) == 0 ); t( sp_setstring(o, "prefix", prefix, sizeof(prefix)) == 0 ); o = sp_get(c, o); t( strcmp((char*)sp_getstring(o, "key", NULL), "ab") == 0 ); o = sp_get(c, o); t( o == NULL ); t( sp_destroy(env) == 0 ); }
static void compact_delete_node0(stc *cx srunused) { void *env = sp_env(); t( env != NULL ); void *c = sp_ctl(env); t( c != NULL ); t( sp_set(c, "sham.path", cx->suite->shamdir) == 0 ); t( sp_set(c, "scheduler.threads", "0") == 0 ); t( sp_set(c, "log.path", cx->suite->logdir) == 0 ); t( sp_set(c, "db", "test") == 0 ); t( sp_set(c, "db.test.path", cx->suite->dir) == 0 ); t( sp_set(c, "db.test.sync", "0") == 0 ); t( sp_set(c, "db.test.index.cmp", "u32", NULL) == 0 ); t( sp_set(c, "compaction.0.branch_wm", "1") == 0 ); void *db = sp_get(c, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int key = 0; while (key < 20) { void *o = sp_object(db); t( o != NULL ); t( sp_set(o, "key", &key, sizeof(key)) == 0 ); t( sp_set(o, "value", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_set(c, "db.test.branch") == 0 ); t( sp_set(c, "db.test.compact") == 0 );
static void mt_set_get_document_multipart_cursor(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setstring(env, "db.test.format", "document", 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key_b", 0) == 0 ); t( sp_setstring(env, "db.test.index.key_b", "u32", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); struct document { uint32_t value; char used0[89]; uint32_t key_a; char used1[15]; uint32_t key_b; char used2[10]; } sspacked; struct document doc; memset(&doc, 'x', sizeof(doc)); uint32_t n = 500000; uint32_t i; for (i = 0; i < n; i++) { doc.key_a = i; doc.key_b = i; doc.value = doc.key_a ^ doc.key_b; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &doc.key_a, sizeof(doc.key_a)) == 0 ); t( sp_setstring(o, "key_b", &doc.key_b, sizeof(doc.key_b)) == 0 ); t( sp_setstring(o, "value", &doc, sizeof(doc)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } i = 0; void *o = sp_document(db); t( o != NULL ); void *cursor = sp_cursor(env); t( cursor != NULL ); while ((o = sp_get(cursor, o))) { int valuesize = 0; struct document *ret = (struct document*)sp_getstring(o, "value", &valuesize); t( valuesize == sizeof(doc) ); t( ret->key_a == i ); t( ret->key_b == i ); print_current(i); i++; } sp_destroy(cursor); t( i == n ); t( sp_destroy(env) == 0 ); }
static void mt_set_snapshot_recover_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 300000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } t( sp_setint(env, "log.rotate", 0) == 0 ); t( sp_setint(env, "scheduler.snapshot", 0) == 0 ); fprintf(st_r.output, " (snapshot.."); fflush(st_r.output); for (;;) { int active = sp_getint(env, "scheduler.snapshot_active"); if (!active) break; } fprintf(st_r.output, "done)"); t( sp_destroy(env) == 0 ); fprintf(st_r.output, "(recover.."); fflush(st_r.output); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 5) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); fprintf(st_r.output, "done)"); srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
static void mt_set_checkpoint_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); char value[100]; memset(value, 0, sizeof(value)); uint32_t n = 300000; uint32_t i, k; srand(82351); for (i = 0; i < n; i++) { k = rand(); *(uint32_t*)value = k; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); print_current(i); } t( sp_setint(env, "log.rotate", 0) == 0 ); t( sp_setint(env, "scheduler.checkpoint", 0) == 0 ); fprintf(st_r.output, " (checkpoint.."); fflush(st_r.output); for (;;) { int active = sp_getint(env, "scheduler.checkpoint_active"); if (!active) break; } fprintf(st_r.output, "done)"); /* This works only with thread = 1. * * Real data flush can happed before index got * collected and any other worker trigger * checkpoint complete. */ t( sp_setint(env, "log.gc", 0) == 0 ); t( sp_getint(env, "log.files") == 1 ); srand(82351); for (i = 0; i < n; i++) { k = rand(); void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); print_current(i); } t( sp_destroy(env) == 0 ); }
static void secondary_index_test_unique0(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); /* unique */ t( sp_setstring(env, "db", "primary", 0) == 0 ); t( sp_setstring(env, "db.primary.scheme", "a", 0) == 0 ); t( sp_setstring(env, "db.primary.scheme.a", "u32,key(0)", 0) == 0 ); t( sp_setstring(env, "db.primary.scheme", "b", 0) == 0 ); t( sp_setstring(env, "db.primary.scheme.b", "u32", 0) == 0 ); t( sp_setint(env, "db.primary.sync", 0) == 0 ); /* unique */ t( sp_setstring(env, "db", "secondary", 0) == 0 ); t( sp_setstring(env, "db.secondary.scheme", "a", 0) == 0 ); t( sp_setstring(env, "db.secondary.scheme.a", "u32", 0) == 0 ); t( sp_setstring(env, "db.secondary.scheme", "b", 0) == 0 ); t( sp_setstring(env, "db.secondary.scheme.b", "u32,key(0)", 0) == 0 ); t( sp_setint(env, "db.secondary.sync", 0) == 0 ); void *primary = sp_getobject(env, "db.primary"); void *secondary = sp_getobject(env, "db.secondary"); t( primary != NULL ); t( secondary != NULL ); t( sp_open(env) == 0 ); void *tx; void *po, *so; uint32_t a, b; tx = sp_begin(env); a = 0; b = 3; po = sp_document(primary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, po) == 0 ); so = sp_document(secondary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, so) == 0 ); t( sp_commit(tx) == 0 ); tx = sp_begin(env); a = 1; b = 2; po = sp_document(primary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, po) == 0 ); so = sp_document(secondary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, so) == 0 ); t( sp_commit(tx) == 0 ); tx = sp_begin(env); a = 2; b = 1; po = sp_document(primary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, po) == 0 ); so = sp_document(secondary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, so) == 0 ); t( sp_commit(tx) == 0 ); tx = sp_begin(env); a = 3; b = 0; po = sp_document(primary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, po) == 0 ); so = sp_document(secondary); sp_setstring(po, "a", &a, sizeof(a)); sp_setstring(po, "b", &b, sizeof(b)); t( sp_set(tx, so) == 0 ); t( sp_commit(tx) == 0 ); uint32_t current_a = 0; uint32_t current_b = 3; void *cur = sp_cursor(env); po = sp_document(primary); sp_setstring(po, "order", ">=", 0); while ((po = sp_get(cur, po))) { t( *(uint32_t*)sp_getstring(po, "a", NULL) == current_a ); t( *(uint32_t*)sp_getstring(po, "b", NULL) == current_b ); current_a++; current_b--; } sp_destroy(cur); current_a = 3; current_b = 0; cur = sp_cursor(env); so = sp_document(secondary); sp_setstring(so, "order", ">=", 0); while ((so = sp_get(cur, so))) { t( *(uint32_t*)sp_getstring(so, "a", NULL) == current_a ); t( *(uint32_t*)sp_getstring(so, "b", NULL) == current_b ); current_a--; current_b++; } sp_destroy(cur); sp_destroy(env); }
static void anticache_promote0(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "memory.anticache", 100 * 1024 * 1024) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setstring(env, "db.test.storage", "anti-cache", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(db) == 0 ); int key = 0; while (key < 10) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_getint(env, "scheduler.anticache_active") == 0 ); t( sp_getint(env, "scheduler.anticache_asn") == 0 ); t( sp_getint(env, "scheduler.anticache_asn_last") == 0 ); t( sp_setint(env, "scheduler.anticache", 0) == 0 ); t( sp_getint(env, "scheduler.anticache_active") == 1 ); t( sp_getint(env, "scheduler.anticache_asn") == 1 ); t( sp_getint(env, "scheduler.anticache_asn_last") == 0 ); t( sp_setint(env, "scheduler.run", 0) == 1 ); t( sp_setint(env, "scheduler.run", 0) == 1 ); t( sp_setint(env, "scheduler.run", 0) == 0 ); t( sp_getint(env, "scheduler.anticache_active") == 0 ); t( sp_getint(env, "scheduler.anticache_asn") == 0 ); t( sp_getint(env, "scheduler.anticache_asn_last") == 1 ); key = 0; while (key < 10) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); o = sp_get(db, o); t( o != NULL ); sp_destroy(o); key++; } t( sp_destroy(env) == 0 ); }
SPMAT *comp_AAT(SPMAT *A) #endif { SPMAT *AAT; SPROW *r, *r2; row_elt *elts, *elts2; int i, idx, idx2, j, m, minim, n, num_scan, tmp1; Real ip; if ( ! A ) error(E_NULL,"comp_AAT"); m = A->m; n = A->n; /* set up column access paths */ if ( ! A->flag_col ) sp_col_access(A); AAT = sp_get(m,m,10); for ( i = 0; i < m; i++ ) { /* initialisation */ r = &(A->row[i]); elts = r->elt; /* set up scan lists for this row */ if ( r->len > scan_len ) set_scan(r->len); for ( j = 0; j < r->len; j++ ) { col_list[j] = elts[j].col; scan_row[j] = elts[j].nxt_row; scan_idx[j] = elts[j].nxt_idx; } num_scan = r->len; /* scan down the rows for next non-zero not associated with a diagonal entry */ for ( ; ; ) { minim = m; for ( idx = 0; idx < num_scan; idx++ ) { tmp1 = scan_row[idx]; minim = ( tmp1 >= 0 && tmp1 < minim ) ? tmp1 : minim; } if ( minim >= m ) break; r2 = &(A->row[minim]); if ( minim > i ) { ip = sprow_ip(r,r2,n); sp_set_val(AAT,minim,i,ip); sp_set_val(AAT,i,minim,ip); } /* update scan entries */ elts2 = r2->elt; for ( idx = 0; idx < num_scan; idx++ ) { if ( scan_row[idx] != minim || scan_idx[idx] < 0 ) continue; idx2 = scan_idx[idx]; scan_row[idx] = elts2[idx2].nxt_row; scan_idx[idx] = elts2[idx2].nxt_idx; } } /* set the diagonal entry */ sp_set_val(AAT,i,i,sprow_sqr(r,n)); } return AAT; }
/* * n_vars is the number of variables to be considered, * d is the data array of variables d[0],...,d[n_vars-1], * pred determines which estimate is required: BLUE, BLUP, or BLP */ void gls(DATA **d /* pointer to DATA array */, int n_vars, /* length of DATA array (to consider) */ enum GLS_WHAT pred, /* what type of prediction is requested */ DPOINT *where, /* prediction location */ double *est /* output: array that holds the predicted values and variances */) { GLM *glm = NULL; /* to be copied to/from d */ static MAT *X0 = MNULL, *C0 = MNULL, *MSPE = MNULL, *CinvC0 = MNULL, *Tmp1 = MNULL, *Tmp2 = MNULL, *Tmp3, *R = MNULL; static VEC *blup = VNULL, *tmpa = VNULL, *tmpb = VNULL; volatile unsigned int i, rows_C; unsigned int j, k, l = 0, row, col, start_i, start_j, start_X, global; VARIOGRAM *v = NULL; static enum GLS_WHAT last_pred = GLS_INIT; /* the initial value */ double c_value, *X_ori; if (d == NULL) { /* clean up */ if (X0 != MNULL) M_FREE(X0); if (C0 != MNULL) M_FREE(C0); if (MSPE != MNULL) M_FREE(MSPE); if (CinvC0 != MNULL) M_FREE(CinvC0); if (Tmp1 != MNULL) M_FREE(Tmp1); if (Tmp2 != MNULL) M_FREE(Tmp2); if (Tmp3 != MNULL) M_FREE(Tmp3); if (R != MNULL) M_FREE(R); if (blup != VNULL) V_FREE(blup); if (tmpa != VNULL) V_FREE(tmpa); if (tmpb != VNULL) V_FREE(tmpb); last_pred = GLS_INIT; return; } #ifndef HAVE_SPARSE if (gl_sparse) { pr_warning("sparse matrices not supported: compile with --with-sparse"); gl_sparse = 0; } #endif if (DEBUG_COV) { printlog("we're at %s X: %g Y: %g Z: %g\n", IS_BLOCK(where) ? "block" : "point", where->x, where->y, where->z); } if (pred != UPDATE) /* it right away: */ last_pred = pred; assert(last_pred != GLS_INIT); if (d[0]->glm == NULL) { /* allocate and initialize: */ glm = new_glm(); d[0]->glm = (void *) glm; } else glm = (GLM *) d[0]->glm; glm->mu0 = v_resize(glm->mu0, n_vars); MSPE = m_resize(MSPE, n_vars, n_vars); if (pred == GLS_BLP || UPDATE_BLP) { X_ori = where->X; for (i = 0; i < n_vars; i++) { /* mu(0) */ glm->mu0->ve[i] = calc_mu(d[i], where); blup = v_copy(glm->mu0, v_resize(blup, glm->mu0->dim)); where->X += d[i]->n_X; /* shift to next x0 entry */ } where->X = X_ori; /* ... and set back */ for (i = 0; i < n_vars; i++) { /* Cij(0,0): */ for (j = 0; j <= i; j++) { v = get_vgm(LTI(d[i]->id,d[j]->id)); MSPE->me[i][j] = MSPE->me[j][i] = COVARIANCE0(v, where, where, d[j]->pp_norm2); } } fill_est(NULL, blup, MSPE, n_vars, est); /* in case of empty neighbourhood */ } /* xxx */ /* logprint_variogram(v, 1); */ /* * selection dependent problem dimensions: */ for (i = rows_C = 0; i < n_vars; i++) rows_C += d[i]->n_sel; if (rows_C == 0) { /* empty selection list(s) */ if (pred == GLS_BLP || UPDATE_BLP) debug_result(blup, MSPE, pred); return; } for (i = 0, global = 1; i < n_vars && global; i++) global = (d[i]->sel == d[i]->list && d[i]->n_list == d[i]->n_original); /* * global things: enter whenever (a) first time, (b) local selections or * (c) the size of the problem grew since the last call (e.g. simulation) */ if ((glm->C == NULL && glm->spC == NULL) || !global || rows_C > glm->C->m) { /* * fill y: */ glm->y = get_y(d, glm->y, n_vars); if (pred != UPDATE) { if (! gl_sparse) { glm->C = m_resize(glm->C, rows_C, rows_C); m_zero(glm->C); } #ifdef HAVE_SPARSE else { if (glm->C == NULL) { glm->spC = sp_get(rows_C, rows_C, gl_sparse); /* d->spLLT = spLLT = sp_get(rows_C, rows_C, gl_sparse); */ } else { glm->spC = sp_resize(glm->spC, rows_C, rows_C); /* d->spLLT = spLLT = sp_resize(spLLT, rows_C, rows_C); */ } sp_zero(glm->spC); } #endif glm->X = get_X(d, glm->X, n_vars); M_DEBUG(glm->X, "X"); glm->CinvX = m_resize(glm->CinvX, rows_C, glm->X->n); glm->XCinvX = m_resize(glm->XCinvX, glm->X->n, glm->X->n); glm->beta = v_resize(glm->beta, glm->X->n); for (i = start_X = start_i = 0; i < n_vars; i++) { /* row var */ /* fill C, mu: */ for (j = start_j = 0; j <= i; j++) { /* col var */ v = get_vgm(LTI(d[i]->id,d[j]->id)); for (k = 0; k < d[i]->n_sel; k++) { /* rows */ row = start_i + k; for (l = 0, col = start_j; col <= row && l < d[j]->n_sel; l++, col++) { if (pred == GLS_BLUP) c_value = GCV(v, d[i]->sel[k], d[j]->sel[l]); else c_value = COVARIANCE(v, d[i]->sel[k], d[j]->sel[l]); /* on the diagonal, if necessary, add measurement error variance */ if (d[i]->colnvariance && i == j && k == l) c_value += d[i]->sel[k]->variance; if (! gl_sparse) glm->C->me[row][col] = c_value; #ifdef HAVE_SPARSE else { if (c_value != 0.0) sp_set_val(glm->spC, row, col, c_value); } #endif } /* for l */ } /* for k */ start_j += d[j]->n_sel; } /* for j */ start_i += d[i]->n_sel; if (d[i]->n_sel > 0) start_X += d[i]->n_X - d[i]->n_merge; } /* for i */ /* if (d[0]->colnvmu) glm->C = convert_vmuC(glm->C, d[0]); */ if (d[0]->variance_fn) { glm->mu = get_mu(glm->mu, glm->y, d, n_vars); convert_C(glm->C, glm->mu, d[0]->variance_fn); } if (DEBUG_COV && pred == GLS_BLUP) printlog("[using generalized covariances: max_val - semivariance()]"); if (! gl_sparse) { M_DEBUG(glm->C, "Covariances (x_i, x_j) matrix C (lower triangle only)"); } #ifdef HAVE_SPARSE else { SM_DEBUG(glm->spC, "Covariances (x_i, x_j) sparse matrix C (lower triangle only)") } #endif /* check for singular C: */ if (! gl_sparse && gl_cn_max > 0.0) { for (i = 0; i < rows_C; i++) /* row */ for (j = i+1; j < rows_C; j++) /* col > row */ glm->C->me[i][j] = glm->C->me[j][i]; /* fill symmetric */ if (is_singular(glm->C, gl_cn_max)) { pr_warning("Covariance matrix (nearly) singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ return; } } /* * factorize C: */ if (! gl_sparse) LDLfactor(glm->C); #ifdef HAVE_SPARSE else { sp_compact(glm->spC, 0.0); spCHfactor(glm->spC); } #endif } /* if (pred != UPDATE) */ if (pred != GLS_BLP && !UPDATE_BLP) { /* C-1 X and X'C-1 X, beta */ /* * calculate CinvX: */ tmpa = v_resize(tmpa, rows_C); for (i = 0; i < glm->X->n; i++) { tmpa = get_col(glm->X, i, tmpa); if (! gl_sparse) tmpb = LDLsolve(glm->C, tmpa, tmpb); #ifdef HAVE_SPARSE else tmpb = spCHsolve(glm->spC, tmpa, tmpb); #endif set_col(glm->CinvX, i, tmpb); } /* * calculate X'C-1 X: */ glm->XCinvX = mtrm_mlt(glm->X, glm->CinvX, glm->XCinvX); /* X'C-1 X */ M_DEBUG(glm->XCinvX, "X'C-1 X"); if (gl_cn_max > 0.0 && is_singular(glm->XCinvX, gl_cn_max)) { pr_warning("X'C-1 X matrix (nearly) singular at location [%g,%g,%g]: skipping...", where->x, where->y, where->z); m_free(glm->C); glm->C = MNULL; /* assure re-entrance if global */ return; } m_inverse(glm->XCinvX, glm->XCinvX); /* * calculate beta: */ tmpa = vm_mlt(glm->CinvX, glm->y, tmpa); /* X'C-1 y */ glm->beta = vm_mlt(glm->XCinvX, tmpa, glm->beta); /* (X'C-1 X)-1 X'C-1 y */ V_DEBUG(glm->beta, "beta"); M_DEBUG(glm->XCinvX, "Cov(beta), (X'C-1 X)-1"); M_DEBUG(R = get_corr_mat(glm->XCinvX, R), "Corr(beta)"); } /* if pred != GLS_BLP */ } /* if redo the heavy part */
void *env = sp_env(); t( env != NULL ); void *c = sp_ctl(env); t( c != NULL ); t( sp_set(c, "sophia.path", cx->suite->sophiadir) == 0 ); t( sp_set(c, "compaction.0.branch_wm", "1") == 0 ); t( sp_set(c, "scheduler.threads", "0") == 0 ); t( sp_set(c, "log.path", cx->suite->logdir) == 0 ); t( sp_set(c, "log.sync", "0") == 0 ); t( sp_set(c, "log.rotate_sync", "0") == 0 ); t( sp_set(c, "db", "test") == 0 ); t( sp_set(c, "db.test.path", cx->suite->dir) == 0 ); t( sp_set(c, "db.test.sync", "0") == 0 ); t( sp_set(c, "db.test.index.cmp", "u32", NULL) == 0 ); void *db = sp_get(c, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); void *o = sp_get(c, "db.test.index.branch_count"); t( o != NULL ); t( strcmp( sp_get(o, "value", NULL), "1") == 0 ); sp_destroy(o); o = sp_get(c, "db.test.index.node_count"); t( o != NULL ); t( strcmp( sp_get(o, "value", NULL), "1") == 0 ); sp_destroy(o); int i = 0; while ( i < 100 ) { void *o = sp_object(db);
static void recover_loop(void) { int seedprev = -1; int seed = 3424118; int seedorigin = seed; int run = 10; int count = 1040; while (run >= 0) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int i = 0; if (seedprev != -1) { srand(seedprev); while (i < count) { int k = rand(); void *o = sp_object(db); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(int*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); i++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); } srand(seed); i = 0; while (i < count) { int k = rand(); void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); t( sp_setstring(o, "value", &k, sizeof(k)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( sp_destroy(env) == 0 ); seedprev = seed; seed = time(NULL); run--; } void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); srand(seedorigin); int i = 0; while (i < count) { int k = rand(); void *o = sp_object(db); t( sp_setstring(o, "key", &k, sizeof(k)) == 0 ); o = sp_get(db, o); t( o != NULL ); t( *(int*)sp_getstring(o, "value", NULL) == k ); sp_destroy(o); i++; } t( sp_destroy(env) == 0 ); }
*/ #include <libsr.h> #include <libst.h> #include <sophia.h> static void ctl_version(stc *cx srunused) { void *env = sp_env(); t( env != NULL ); void *c = sp_ctl(env); t( c != NULL ); void *o = sp_get(c, "sophia.version"); t( o != NULL ); t( strcmp(sp_get(o, "value", NULL), "1.2.1") == 0 ); sp_destroy(o); t( sp_destroy(env) == 0 ); } static void ctl_error_injection(stc *cx srunused) { void *env = sp_env(); t( env != NULL ); void *c = sp_ctl(env); t( c != NULL );
static void compact_delete_node1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.test.scheme.key", "u32,key", 0) == 0 ); t( sp_setstring(env, "db.test.scheme", "value", 0) == 0 ); t( sp_setint(env, "db.test.node_size", 716800/* 700K */) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int key = 0; char value[100]; memset(value, 0, sizeof(value)); while (key < 13000) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 2 ); key = 0; while (key < 6511 ) { void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_delete(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 1 ); void *o = sp_document(db); void *cur = sp_cursor(env); while ((o = sp_get(cur, o))) { int keysize; void *keyptr = sp_getstring(o, "key", &keysize); t( *(uint32_t*)keyptr == key ); void *ko = sp_document(db); t( ko != NULL ); t( sp_setstring(ko, "key", keyptr, keysize) == 0 ); t( sp_delete(db, ko) == 0 ); key++; } sp_destroy(cur); t( key == 13000 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 1 ); t( sp_destroy(env) == 0 ); }
static void cursor_md_test0(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setstring(env, "db", "t0", 0) == 0 ); t( sp_setstring(env, "db", "t1", 0) == 0 ); t( sp_setstring(env, "db.t0.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.t1.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.t0.scheme", "value", 0) == 0 ); t( sp_setstring(env, "db.t1.scheme", "value", 0) == 0 ); t( sp_setstring(env, "db.t0.scheme.key", "u32,key", 0) == 0 ); t( sp_setstring(env, "db.t1.scheme.key", "u32,key", 0) == 0 ); t( sp_setint(env, "db.t0.sync", 0) == 0 ); t( sp_setint(env, "db.t1.sync", 0) == 0 ); void *t0 = sp_getobject(env, "db.t0"); t( t0 != NULL ); void *t1 = sp_getobject(env, "db.t1"); t( t1 != NULL ); t( sp_open(env) == 0 ); uint32_t key = 7; uint32_t value = 7; void *o = sp_document(t0); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(t0, o) == 0 ); o = sp_document(t1); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(t1, o) == 0 ); void *c = sp_cursor(env); value = 8; o = sp_document(t0); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(t0, o) == 0 ); o = sp_document(t1); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(t1, o) == 0 ); o = sp_document(t0); o = sp_get(c, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", 0) == 7 ); o = sp_get(c, o); t( o == NULL ); o = sp_document(t1); o = sp_get(c, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", 0) == 7 ); o = sp_get(c, o); t( o == NULL ); sp_destroy(c); o = sp_document(t0); sp_setstring(o, "order", ">", 0); o = sp_get(t0, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", 0) == 8 ); o = sp_get(t0, o); t( o == NULL ); o = sp_document(t1); sp_setstring(o, "order", ">", 0); o = sp_get(t1, o); t( o != NULL ); t( *(uint32_t*)sp_getstring(o, "value", 0) == 8 ); o = sp_get(t1, o); t( o == NULL ); t( sp_destroy(env) == 0 ); }
//-------------------------------------------------------------------------- void Hqp_IpRedSpBKP::init(const Hqp_Program *qp) { IVEC *degree, *neigh_start, *neighs; SPMAT *QCTC; SPROW *r1, *r2; int i, j; int len, dim; Real sum; _n = qp->c->dim; _me = qp->b->dim; _m = qp->d->dim; dim = _n + _me; // reallocations _pivot = px_resize(_pivot, dim); _blocks = px_resize(_blocks, dim); _zw = v_resize(_zw, _m); _scale = v_resize(_scale, _n); _r12 = v_resize(_r12, dim); _xy = v_resize(_xy, dim); // store C' for further computations // analyze structure of C'*C _CT = sp_transp(qp->C, _CT); sp_ones(_CT); v_ones(_zw); QCTC = sp_get(_n, _n, 10); r1 = _CT->row; for (i=0; i<_n; i++, r1++) { r2 = r1; for (j=i; j<_n; j++, r2++) { sum = sprow_inprod(r1, _zw, r2); if (sum != 0.0) { sp_set_val(QCTC, i, j, sum); if (i != j) sp_set_val(QCTC, j, i, sum); } } } _CTC_degree = iv_resize(_CTC_degree, _n); _CTC_neigh_start = iv_resize(_CTC_neigh_start, _n + 1); _CTC_neighs = sp_rcm_scan(QCTC, SMNULL, SMNULL, _CTC_degree, _CTC_neigh_start, _CTC_neighs); // initialize structure of reduced qp QCTC = sp_add(qp->Q, QCTC, QCTC); // determine RCM ordering degree = iv_get(dim); neigh_start = iv_get(dim + 1); neighs = sp_rcm_scan(QCTC, qp->A, SMNULL, degree, neigh_start, IVNULL); _QP2J = sp_rcm_order(degree, neigh_start, neighs, _QP2J); _sbw = sp_rcm_sbw(neigh_start, neighs, _QP2J); _J2QP = px_inv(_QP2J, _J2QP); iv_free(degree); iv_free(neigh_start); iv_free(neighs); len = 1 + (int)(log((double)dim) / log(2.0)); sp_free(_J); sp_free(_J_raw); _J_raw = sp_get(dim, dim, len); _J = SMNULL; // fill up data (to allocate _J_raw) sp_into_symsp(QCTC, -1.0, _J_raw, _QP2J, 0, 0); spT_into_symsp(qp->A, 1.0, _J_raw, _QP2J, 0, _n); sp_into_symsp(qp->A, 1.0, _J_raw, _QP2J, _n, 0); sp_free(QCTC); // prepare iterations update(qp); }
static void compact_delete_node1(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "compaction.0.branch_wm", 1) == 0 ); t( sp_setint(env, "compaction.node_size", 524288 /* 512K */) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int key = 0; char value[100]; memset(value, 0, sizeof(value)); while (key < 13000) { void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 2 ); key = 0; while (key < 5511 ) { void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_delete(db, o) == 0 ); key++; } t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 1 ); void *o = sp_object(db); void *cur = sp_cursor(db, o); while ((o = sp_get(cur, NULL))) { t( sp_delete(db, o) == 0 ); key++; sp_destroy(o); } sp_destroy(cur); t( key == 13000 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_setint(env, "db.test.compact", 0) == 0 ); t( sp_getint(env, "db.test.index.node_count") == 1 ); t( sp_destroy(env) == 0 ); }
static void backup_test0(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "backup.path", st_r.conf->backup_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int i = 0; while ( i < 100 ) { void *o = sp_object(db); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( sp_getint(env, "backup.active") == 0 ); t( sp_setint(env, "backup.run", 0) == 0 ); /* state 0 */ t( sp_getint(env, "backup.active") == 1 ); /* state 1 + 2 */ t( sp_setint(env, "scheduler.run", 0) == 1 ); /* index backup completion */ t( sp_setint(env, "scheduler.run", 0) == 1 ); /* state 3 */ t( sp_setint(env, "scheduler.run", 0) == 0 ); t( sp_getint(env, "backup.active") == 0 ); t( sp_getint(env, "backup.last") == 1 ); t( sp_getint(env, "backup.last_complete") == 1 ); t( sp_destroy(env) == 0 ); /* recover backup */ char path[1024]; snprintf(path, sizeof(path), "%s/1", st_r.conf->backup_dir); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", path, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "backup.path", st_r.conf->backup_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); /* ensure correct bsn recover */ t( sp_getint(env, "metric.bsn") == 1 ); void *o = sp_object(db); t( o != NULL ); void *cur = sp_cursor(env); t( cur != NULL ); i = 0; while ((o = sp_get(cur, o))) { t( *(int*)sp_getstring(o, "key", NULL) == i ); i++; } t( i == 100 ); t( sp_destroy(cur) == 0 ); t( sp_destroy(env) == 0 ); }
DWORD CPublisher::StoreInDatabase(CTrade& Trade) { USES_CONVERSION; DWORD dwTries = MAX_DBRECONNECTION_TRIES; bool bOk = false; DWORD dwRes = ERROR_SUCCESS; long lMaxSeqNum; long lMinSeqNum; long lStructureMissed; TDBFailsStore::iterator it; do { try { switch(Trade.siStatus) { case NEW_FLAG: case UPD_FLAG: { CClientRecordset rs; CStoredProc<> sp(m_ConnectionDest, L"usp_TradeFeed_1_New"); sp << Trade.vcAcronym; sp << _bstr_t(_variant_t((long)Trade.nTradeID)); sp << (int)( Trade.vcAction == ACTION_BUY ? 1 : 0 ); sp << (int)Trade.fUnits; sp << Trade.fPrice; sp << Trade.dtTradeDate; sp << Trade.vcSymbol; sp << int(0); // Contract Type s Stock sp << CDBNull(); sp << CDBNull(); sp << CDBNull(); sp << CDBNull(); sp << CDBNull(); sp << (int)1; //update enabled sp << CDBNull(); rs.Open (sp); if (rs.IsEOF()) { rs.Close(); _com_issue_error(E_FAIL); } lMaxSeqNum = rs[L"iMaxSeqNum"]; lMinSeqNum = rs[L"iMinSeqNum"]; lStructureMissed = rs[L"iStructureMissed"]; rs.Close(); if ( lMaxSeqNum == -1 && lStructureMissed == -1 ) { if (lMinSeqNum == -1) // unknown error { _com_issue_error( E_FAIL ); } else { dwRes = ERROR_ALREADY_EXISTS; if ( ReProcessTrade(Trade, lMinSeqNum) == ERROR_SUCCESS ) dwRes = ERROR_SUCCESS; break; } } CTracer::Trace(CTracer::enMtInformation, _T("Trade '%d' stored in database."), Trade.nTradeID); InterlockedIncrement((LPLONG)&m_dwDBStored); CStoredProc<> sp_get(m_ConnectionDest, L"usp_TradeSeq_Get"); sp_get << (int)lMinSeqNum; sp_get << (int)lMaxSeqNum; sp_get << CDBNull(); sp_get << (UCHAR)1; rs.Open (sp_get); if(rs.IsEOF()) { CTracer::Trace(CTracer::enMtError, _T("Failed to retrieve trade from database - trade with ExecID '%d' does not exist."), Trade.nTradeID); dwRes = ERROR_NO_DATA_DETECTED; } else { HRESULT hRes; while (!rs.IsEOF() && GetMode() == MODE_INTRADAY) { if ( FAILED(hRes = FillTradeUpdate(rs, Trade)) ) { CTracer::Trace(CTracer::enMtError, _T("Failed to fill TradeUpdate message.")); dwRes = ERROR_INVALID_PARAMETER; } else if(hRes == S_FALSE) { CTracer::Trace(CTracer::enMtError, _T("Failed to retrieve trade from database - trade with ExecID '%d' does not exist."), Trade.nTradeID); dwRes = ERROR_NO_DATA_DETECTED; } Publish(Trade); if (::WaitForSingleObject(GetStopEventHandle(), CSettings::m_nPublishDelayTime) == WAIT_OBJECT_0) { return _ERROR_NEED_TO_STOP; } rs.MoveNext(); } } } break; case DEL_FLAG: { CClientRecordset rs; CStoredProc<> sp(m_ConnectionDest, L"usp_TradeFeed_1_Del"); sp << _bstr_t(_variant_t((long)Trade.nTradeID)); sp << Trade.dtTradeDate; rs.Open (sp); if(rs.IsEOF()) { rs.Close(); _com_issue_error(E_FAIL); } lMaxSeqNum = rs[L"iMaxSeqNum"]; lMinSeqNum = rs[L"iMinSeqNum"]; rs.Close(); if (lMaxSeqNum == -1 && lMinSeqNum == -1) // unknown error _com_issue_error(E_FAIL); if (lMinSeqNum == -1) // already exists { dwRes = ERROR_ALREADY_EXISTS; if ( ReProcessTrade(Trade, lMaxSeqNum) == ERROR_SUCCESS ) dwRes = ERROR_SUCCESS; break; } if (lMaxSeqNum == -1) { CTracer::Trace(CTracer::enMtWarning, _T("Failed to delete trade in database - trade with the same ExecID '%d' either does not exist or was already deleted."), Trade.nTradeID); dwRes = ERROR_NOT_FOUND; break; } CTracer::Trace(CTracer::enMtInformation, _T("Trade '%d' deleted from database."), Trade.nTradeID); InterlockedIncrement((LPLONG)&m_dwDBDeleted); CStoredProc<> sp_get(m_ConnectionDest, L"usp_TradeSeq_Get"); sp_get << (int)lMaxSeqNum; sp_get << (int)lMaxSeqNum; sp_get << CDBNull(); sp_get << (unsigned char)1; rs.Open (sp_get); if(rs.IsEOF()) { CTracer::Trace(CTracer::enMtError, _T("Failed to retrieve trade from database - trade with ExecID '%d' does not exist."), Trade.nTradeID); dwRes = ERROR_NO_DATA_DETECTED; } else if (GetMode() == MODE_INTRADAY) { HRESULT hRes; if(FAILED(hRes = FillTradeUpdate(rs, Trade))) { CTracer::Trace(CTracer::enMtError, _T("Failed to fill TradeUpdate message.")); dwRes = ERROR_INVALID_PARAMETER; } else if(hRes == S_FALSE) { CTracer::Trace(CTracer::enMtError, _T("Failed to retrieve trade from database - trade with the same ExecID '%d' does not exist."), Trade.nTradeID); dwRes = ERROR_NO_DATA_DETECTED; } Publish(Trade); if (::WaitForSingleObject(GetStopEventHandle(), CSettings::m_nPublishDelayTime) == WAIT_OBJECT_0) { return _ERROR_NEED_TO_STOP; } } break; } default: dwRes = ERROR_INVALID_PARAMETER; break; } bOk = true; } catch(_com_error& e) { _bstr_t bsError = "Failed to store trade in database : " + m_ConnectionDest.GetErrorMessage(); CTracer::Trace(CTracer::enMtError, bsError); pair<TDBFailsStore::iterator, bool> pairResult = m_DBFails.insert(Trade.nTradeID); if (--dwTries) { Reconnect(); } else { CTracer::Trace(CTracer::enMtError, _T("CRITICAL ERROR : FAILED TO STORE TRADE IN DATABASE.")); if(false)//Uncomment this Oleg StoreInFile(Trade) != 0 { CTracer::Trace(CTracer::enMtError, _T("CRITICAL ERROR : FAILED TO STORE TRADE IN FILE.")); CTracer::Trace(CTracer::enMtError, _T("MANUAL INTERVENTION IS REQUIRED. THE APPLICATION IS STOPPED.")); ExitProcess(-1); } else { BroadcastError(e.Error(), bsError); dwRes = ERROR_REMOTE_STORAGE_NOT_ACTIVE; bOk = true; } } } } while(!bOk); return dwRes; };
int main(int argc, char *argv[]) { (void)argc; (void)argv; /* open or create environment and database */ void *env = sp_env(); sp_setstring(env, "sophia.path", "_test", 0); sp_setstring(env, "db", "test", 0); sp_setstring(env, "db.test.index", "key", 0); sp_setstring(env, "db.test.index", "key_j", 0); sp_setstring(env, "db.test.index", "key_k", 0); sp_setstring(env, "db.test.index.key", "u32", 0); sp_setstring(env, "db.test.index.key_j", "u32", 0); sp_setstring(env, "db.test.index.key_k", "u32", 0); void *db = sp_getobject(env, "db.test"); int rc = sp_open(env); if (rc == -1) goto error; /* set */ uint32_t i = 0; uint32_t j = 0; uint32_t k = 0; for (i = 0; i <= 2; i++) { for (j = 0; j <= 2; j++) { for (k = 0; k <= 2; k++) { void *o = sp_document(db); sp_setstring(o, "key", &i, sizeof(i)); sp_setstring(o, "key_j", &j, sizeof(j)); sp_setstring(o, "key_k", &k, sizeof(k)); rc = sp_set(db, o); if (rc == -1) goto error; } } } /* get random key */ i = 1; j = 2; k = 0; void *o = sp_document(db); sp_setstring(o, "key", &i, sizeof(i)); sp_setstring(o, "key_j", &j, sizeof(j)); sp_setstring(o, "key_k", &k, sizeof(k)); o = sp_get(db, o); assert(o != NULL); sp_destroy(o); /* do forward iteration */ void *cursor = sp_cursor(env); o = sp_document(db); while ((o = sp_get(cursor, o))) { i = *(uint32_t*)sp_getstring(o, "key", NULL); j = *(uint32_t*)sp_getstring(o, "key_j", NULL); k = *(uint32_t*)sp_getstring(o, "key_k", NULL); printf("%"PRIu32".%"PRIu32".%"PRIu32 "\n", i, j, k); } sp_destroy(cursor); /* finish work */ sp_destroy(env); return 0; error:; int size; char *error = sp_getstring(env, "sophia.error", &size); printf("error: %s\n", error); free(error); sp_destroy(env); return 1; }
static void snapshot_recover_get(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int i = 0; while ( i < 100 ) { void *o = sp_object(db); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( sp_setstring(env, "snapshot", "test_snapshot", 0) == 0 ); void *snapshot = sp_getobject(env, "snapshot.test_snapshot"); t( snapshot != NULL ); i = 0; while ( i < 100 ) { void *o = sp_object(db); int value = i + 1; t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); i++; } int64_t lsn = sp_getint(env, "snapshot.test_snapshot.lsn"); t( sp_destroy(env) == 0 ); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_setint(env, "log.sync", 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); /* recover snapshot */ t( sp_setstring(env, "snapshot", "test_snapshot", 0) == 0 ); snapshot = sp_getobject(env, "snapshot.test_snapshot"); t( snapshot != NULL ); t( sp_setint(env, "snapshot.test_snapshot.lsn", lsn) == 0 ); t( sp_open(env) == 0 ); db = sp_getobject(env, "db.test"); t( db != NULL ); i = 0; while ( i < 100 ) { void *o = sp_object(db); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); o = sp_get(db, o); t( *(int*)sp_getstring(o, "value", NULL) == i + 1 ); t( sp_destroy(o) == 0 ); i++; } i = 0; while ( i < 100 ) { void *o = sp_object(db); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); o = sp_get(snapshot, o); t( *(int*)sp_getstring(o, "value", NULL) == i ); t( sp_destroy(o) == 0 ); i++; } t( sp_destroy(env) == 0 ); }
static void snapshot_cursor(void) { void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.index.key", "u32", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); int i = 0; while ( i < 100 ) { void *o = sp_object(db); t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &i, sizeof(i)) == 0 ); t( sp_set(db, o) == 0 ); i++; } t( sp_setstring(env, "snapshot", "test_snapshot", 0) == 0 ); void *snapshot = sp_getobject(env, "snapshot.test_snapshot"); t( snapshot != NULL ); i = 0; while ( i < 100 ) { void *o = sp_object(db); int value = i + 1; t( sp_setstring(o, "key", &i, sizeof(i)) == 0 ); t( sp_setstring(o, "value", &value, sizeof(value)) == 0 ); t( sp_set(db, o) == 0 ); i++; } i = 0; void *o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "order", ">=", 0) == 0 ); void *cur = sp_cursor(db, o); while ((o = sp_get(cur, NULL))) { t( *(int*)sp_getstring(o, "key", NULL) == i ); t( *(int*)sp_getstring(o, "value", NULL) == i + 1); i++; t( sp_destroy(o) == 0 ); } sp_destroy(cur); i = 0; o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "order", ">=", 0) == 0 ); cur = sp_cursor(snapshot, o); while ((o = sp_get(cur, NULL))) { t( *(int*)sp_getstring(o, "key", NULL) == i ); t( *(int*)sp_getstring(o, "value", NULL) == i ); i++; t( sp_destroy(o) == 0 ); } sp_destroy(cur); t( sp_destroy(env) == 0 ); }