static void multi_process(void) { void *env = sp_env(); t( env != NULL ); t( sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, dbrep1) == 0 ); void *db = sp_open(env); t( db != NULL ); int pid = fork(); t( pid != -1 ); if (pid == 0) { /* new process */ void *env2 = sp_env(); t( env2 != NULL ); t( sp_ctl(env2, SPDIR, SPO_CREAT|SPO_RDWR, dbrep1) == 0 ); void *db2 = sp_open(env2); t( db2 == NULL ); t( sp_destroy(env2) == 0 ); /* valgrind: parent db and env are unfreed here, and that * is correct otherwise destroy would * corrupt the database. */ exit(0); } else { int status = 0; t( waitpid(pid, &status, 0) == pid ); t( status == 0 ); } t( sp_destroy(db) == 0 ); t( sp_destroy(env) == 0 ); rmrf(dbrep1); }
static void repository_test4(void) { rmrf("./sophia"); rmrf("./logdir"); rmrf("./dir"); void *env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", "sophia", 0) == 0 ); t( sp_setint(env, "sophia.path_create", 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_open(env) == -1 ); t( sp_destroy(env) == 0 ); t( exists("sophia", "") == 0 ); mkdir("sophia", 0755); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", "sophia", 0) == 0 ); t( sp_setint(env, "sophia.path_create", 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_open(env) == 0 ); t( exists("sophia", "test") == 1 ); t( sp_destroy(env) == 0 ); }
static void single_process_2(void) { void *env = sp_env(); t( env != NULL ); t( sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, dbrep1) == 0 ); t( sp_ctl(env, SPCMP, cmp, NULL) == 0 ); void *db = sp_open(env); t( db != NULL ); void *env2 = sp_env(); t( env != NULL ); t( sp_ctl(env2, SPDIR, SPO_CREAT|SPO_RDWR, dbrep2) == 0 ); t( sp_ctl(env2, SPCMP, cmp, NULL) == 0 ); void *db2 = sp_open(env2); t( db2 != NULL ); uint32_t k = 1; t( sp_set(db2, &k, sizeof(k), &k, sizeof(k)) == 0 ); size_t vsize = 0; void *vp = NULL; t( sp_get(db2, &k, sizeof(k), &vp, &vsize) == 1 ); t( vsize == sizeof(k) ); t( *(uint32_t*)vp == k ); free(vp); k = 3; t( sp_set(db, &k, sizeof(k), &k, sizeof(k)) == 0 ); t( sp_get(db, &k, sizeof(k), &vp, &vsize) == 1 ); t( vsize == sizeof(k) ); t( *(uint32_t*)vp == k ); free(vp); t( sp_destroy(db) == 0 ); t( sp_destroy(env) == 0 ); t( sp_destroy(db2) == 0 ); t( sp_destroy(env2) == 0 ); t( rmrf(dbrep1) == 0 ); t( rmrf(dbrep2) == 0 ); }
static void repository_test4(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.path_create", 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_open(env) == -1 ); t( sp_destroy(env) == 0 ); t( exists(st_r.conf->sophia_dir, "") == 0 ); mkdir(st_r.conf->sophia_dir, 0755); env = sp_env(); t( env != NULL ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setint(env, "sophia.path_create", 0) == 0 ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_open(env) == 0 ); t( exists(st_r.conf->sophia_dir, "test") == 1 ); t( sp_destroy(env) == 0 ); }
void workflow_test(char *injection) { workflow_upsert_n = 0; int i = 0; int j = 0; for (;; i++) { st_scene_rmrf(NULL); fprintf(st_r.output, " %d", i); fflush(NULL); /* open */ void *env = sp_env(); t( env != NULL ); t( sp_setint(env, injection, i) == 0 ); void *db = workflow_open(env); if (db == NULL) { sp_destroy(env); /* close(2) might fail */ continue; } /* write, transaction, read, get, cursor */ int rc = workflow_write_read(env, db); if (rc == -1) { sp_destroy(env); continue; } /* upsert */ rc = workflow_upsert(env, db); if (rc == -1) { sp_destroy(env); continue; } /* branch + compaction */ rc = workflow_compaction(env, db); if (rc == -1) { sp_destroy(env); continue; } /* snapshot */ rc = workflow_snapshot(env, db); if (rc == -1) { sp_destroy(env); continue; } sp_destroy(env); /* recover */ env = sp_env(); t( env != NULL ); t( sp_setint(env, injection, j) == 0 ); db = workflow_open(env); if (db == NULL) { j++; sp_destroy(env); continue; } sp_destroy(env); break; } }
static void scheme_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, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.path", st_r.conf->db_dir, 0) == 0 ); t( sp_setstring(env, "db.test.compression_cold", "zstd", 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", "key_b", 0) == 0 ); t( sp_setstring(env, "db.test.scheme.key_b", "string,key(1)", 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(env) == 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.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 ); char *v = sp_getstring(env, "db.test.compression_cold", 0); t( v != NULL ); t( strcmp(v, "zstd") == 0 ); free(v); v = sp_getstring(env, "db.test.scheme.key", 0); t( v != NULL ); t( strcmp(v, "u32,key(0)") == 0 ); free(v); v = sp_getstring(env, "db.test.scheme.key_b", 0); t( v != NULL ); t( strcmp(v, "string,key(1)") == 0 ); free(v); v = sp_getstring(env, "db.test.scheme.value", 0); t( v != NULL ); t( strcmp(v, "string") == 0 ); free(v); t( sp_destroy(env) == 0 ); }
static void meta_scheduler(void) { void *env = sp_env(); t( env != NULL ); t( sp_setint(env, "scheduler.threads", 2) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_getstring(env, "scheduler.0.trace", NULL) == NULL ); t( sp_open(env) == 0 ); char *v = sp_getstring(env, "scheduler.0.trace", NULL); t( v != NULL ); t( strcmp(v, "malfunction") != 0 ); free(v); v = sp_getstring(env, "scheduler.1.trace", NULL); t( v != NULL ); t( strcmp(v, "malfunction") != 0 ); free(v); v = sp_getstring(env, "scheduler.2.trace", NULL); t( v == NULL ); t( sp_destroy(env) == 0 ); }
static void meta_db(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, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key_b", 0) == 0 ); t( sp_setint(env, "db.test.id", 777) == 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 *s = sp_getstring(db, "name", NULL); t( strcmp(s, "test") == 0 ); free(s); t( sp_getint(db, "id") == 777 ); t( sp_getint(db, "key-count") == 2 ); s = sp_getstring(env, "db.test.index.key", 0); t( s != NULL ); t( strcmp(s, "string") == 0 ); free(s); s = sp_getstring(env, "db.test.index.key_b", 0); t( s != NULL ); t( strcmp(s, "string") == 0 ); free(s); t( sp_destroy(env) == 0 ); }
static void meta_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, "db", "test", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key_b", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_open(env) == 0 ); t( sp_setstring(env, "snapshot", "test_snapshot0", 0) == 0 ); fprintf(st_r.output, "\n"); void *cur = sp_getobject(env, NULL); t( cur != NULL ); fprintf(st_r.output, "\n"); void *o = NULL; while ((o = sp_get(cur, o))) { char *key = sp_getstring(o, "key", 0); char *value = sp_getstring(o, "value", 0); fprintf(st_r.output, "%s", key); if (value) fprintf(st_r.output, " = %s\n", value); else fprintf(st_r.output, " = \n"); } fprintf(st_r.output, "\n"); t( sp_destroy(cur) == 0 ); t( sp_destroy(env) == 0 ); }
static void leak_set(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.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 = 123; void *o = sp_document(db); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); key = 124; o = sp_document(db); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_set(db, o) == 0 ); t( sp_getint(env, "performance.documents") == 2 ); t( sp_setint(env, "db.test.branch", 0) == 0 ); t( sp_getint(env, "performance.documents") == 0 ); t( sp_destroy(env) == 0 ); }
static void meta_empty_key(void) { void *env = sp_env(); t( env != NULL ); t( sp_setint(env, "scheduler.threads", 0) == 0 ); t( sp_setint(env, "log.enable", 0) == 0 ); t( sp_setstring(env, "sophia.path", st_r.conf->sophia_dir, 0) == 0 ); t( sp_setstring(env, "db", "test", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); void *o = sp_object(db); t( sp_setstring(o, "key", "", 0) == 0 ); t( sp_set(db, o) == 0 ); o = sp_object(db); t( sp_setstring(o, "key", "", 0) == 0 ); o = sp_get(db, o); t( o != NULL ); int key_size; void *key = sp_getstring(o, "key", &key_size); t( key_size == 0 ); t( key != NULL ); sp_destroy(o); t( sp_destroy(env) == 0 ); }
static void mt_quota_checkpoint(stc *cx) { cx->env = sp_env(); t( cx->env != NULL ); void *c = sp_ctl(cx->env); t( c != NULL ); t( sp_set(c, "sophia.path", cx->suite->sophiadir) == 0 ); t( sp_set(c, "memory.limit", "524288") == 0 ); /* 512k */ /* use default settings */ t( sp_set(c, "scheduler.threads", "5") == 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 ); cx->db = sp_get(c, "db.test"); t( cx->db != NULL ); t( sp_open(cx->env) == 0 ); char value[1000]; memset(value, 0, sizeof(value)); int i = 0; while (i < 20000) { /* ~ 20Mb */ void *o = sp_object(cx->db); assert(o != NULL); sp_set(o, "key", &i, sizeof(i)); sp_set(o, "value", value, sizeof(value)); int rc = sp_set(cx->db, o); t( rc == 0 ); i++; } t( sp_destroy(cx->env) == 0 ); }
static void gh_29(void) { void *env = sp_env(); t( env != NULL ); t( sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, dbrep) == 0 ); void *db = sp_open(env); t( db != NULL ); int i; for (i = 1; i <= 10; i++) { char key[4]; int len = snprintf(key, sizeof(key), "%d", i); t( sp_set(db, key, len, key, len) == 0 ); } for (i = 1; i <= 10; i++) { char key[4]; int len = snprintf(key, sizeof(key), "%d", i); size_t vsize = 0; void *vp = NULL; t( sp_get(db, key, len, &vp, &vsize) == 1 ); t( vsize == len ); t( memcmp(key, vp, len) == 0 ); free(vp); } t( sp_destroy(db) == 0 ); t( sp_destroy(env) == 0 ); t( rmrf(dbrep) == 0 ); }
static void compact_temperature(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.0.compact_mode", 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.temperature", 1) == 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; while (key < 20) { 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_setint(env, "db.test.compact", 0) == 0 ); t( sp_destroy(env) == 0 ); }
static void github_123(void) { rmrf("./abc"); rmrf("./abc_log"); void *env = sp_env(); t( env != NULL ); char path[] = { '.', '/', 'a', 'b', 'c' }; char path_log[] = { '.', '/', 'a', 'b', 'c', '_', 'l', 'o', 'g' }; char name[] = { 't', 'e', 's', 't' }; t( sp_setstring(env, "sophia.path", path, sizeof(path)) == 0 ); t( sp_setstring(env, "db", name, sizeof(name)) == 0 ); t( sp_setstring(env, "log.path", path_log, sizeof(path_log)) == 0 ); t( sp_open(env) == 0 ); t( exists("./", "abc") == 1 ); t( exists("./", "abc_log") == 1 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_destroy(env) == 0 ); rmrf("./abc"); rmrf("./abc_log"); }
static void snapshot_create_delete(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 ); t( sp_setstring(env, "snapshot", "test_snapshot", 0) == 0 ); void *snapshot = sp_getobject(env, "snapshot.test_snapshot"); t( snapshot != NULL ); t( sp_destroy(snapshot) == 0 ); snapshot = sp_getobject(env, "snapshot.test_snapshot"); t( snapshot == NULL ); t( sp_destroy(env) == 0 ); }
static void checkpoint_test2(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", "test", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); t( sp_open(env) == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint") == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn") == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn_last") == 0 ); t( sp_setint(env, "db.test.compaction.checkpoint", 0) == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint") == 1 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn") == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn_last") == 0 ); t( sp_setint(env, "scheduler.run", 0) == 0 ); t( sp_setint(env, "scheduler.run", 0) == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint") == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn") == 0 ); t( sp_getint(env, "db.test.scheduler.checkpoint_lsn_last") == 0 ); t( sp_destroy(env) == 0 ); }
todo_db_t * todo_db_new (char *path) { int rc; void *env; todo_db_t *db = malloc(sizeof(todo_db_t)); // bail if failed to allocate memoery if (NULL == db) return NULL; env = sp_env(); // error in memoery allocation if (NULL == env) return NULL; // create if not exists in read-write mode rc = sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, path); // turn on garbage collection sp_ctl(env, SPGC, 1); if (-1 == rc) { todo_ferror("%s\n", sp_error(env)); sp_destroy(env); return NULL; } db->env = env; db->path = path; return db; }
static void object_readonly1(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_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 = 7; void *o = sp_object(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 ); o = sp_object(db); t( o != NULL ); t( sp_setstring(o, "order", ">", 0) == 0 ); void *c = sp_cursor(db, o); o = sp_get(c, NULL); t( o != NULL ); t( sp_setstring(o, "key", &key, sizeof(key)) == -1 ); sp_destroy(o); sp_destroy(c); sp_destroy(env); }
static void mt_single_stmt(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", 3) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setint(env, "log.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 ); ssthreadpool p; ss_threadpool_init(&p); t( ss_threadpool_new(&p, &st_r.a, 5, single_stmt_thread, db) == 0 ); t( ss_threadpool_shutdown(&p, &st_r.a) == 0 ); t (sp_getint(env, "db.test.index.count") == 100000 ); t( sp_destroy(env) == 0 ); }
static void mt_multi_stmt_conflict0(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", 3) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setint(env, "log.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 ); /* conflict source */ 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.sync", 0) == 0 ); void *db = sp_getobject(env, "db.test"); t( db != NULL ); t( sp_open(env) == 0 ); ssthreadpool p; ss_threadpool_init(&p); void *ptr[2] = { env, db }; t( ss_threadpool_new(&p, &st_r.a, 5, multi_stmt_conflict_thread0, ptr) == 0 ); t( ss_threadpool_shutdown(&p, &st_r.a) == 0 ); t( sp_destroy(env) == 0 ); }
static void object_set_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_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 = 7; void *o = sp_object(db); t(o != NULL); t( sp_setstring(o, "key", &key, sizeof(key)) == 0 ); t( sp_setstring(o, "value", &key, sizeof(key)) == 0 ); int size = 0; t( *(int*)sp_getstring(o, "key", &size) == key ); t( size == sizeof(key) ); t( *(int*)sp_getstring(o, "value", &size) == key ); t( size == sizeof(key) ); sp_destroy(o); sp_destroy(env); }
static void multipart_schema(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_b", 0) == 0 ); t( sp_setint(env, "db.test.sync", 0) == 0 ); char *v = sp_getstring(env, "db.test.index.key", 0); t( strcmp(v, "string") == 0 ); free(v); v = sp_getstring(env, "db.test.index.key_b", 0); t( strcmp(v, "string") == 0 ); free(v); t( sp_setstring(env, "db.test.index.key_b", "u32", 0) == 0 ); v = sp_getstring(env, "db.test.index.key_b", 0); t( strcmp(v, "u32") == 0 ); free(v); t( sp_open(env) == 0 ); t( sp_setstring(env, "db.test.index.key_b", "string", 0) == -1 ); t( sp_destroy(env) == 0 ); }
static void npr_test4(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", 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 ); 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 ); t( sp_destroy(env) == 0 ); }
static void ddl_constraint(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_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.index", "key-2", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-3", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-4", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-5", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-6", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-7", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-8", 0) == 0 ); t( sp_setstring(env, "db.test.index", "key-9", 0) == -1 ); 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_destroy(env) == 0 ); }
static void transaction_batch_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.scheme", "key", 0) == 0 ); t( sp_setstring(env, "db.test.scheme.key", "u32,key(0)", 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 ); void *tx = sp_begin(env); t( tx != NULL ); uint32_t a = 7; void *o = sp_document(db); t( o != NULL ); t( sp_setstring(o, "key", &a, sizeof(a)) == 0 ); t( sp_set(tx, o) == 0 ); t( sp_setstring(tx, "isolation", "batch", 0) == -1 ); t( sp_destroy(tx) == 0 ); t( sp_destroy(env) == 0 ); }
static void hc_prepare_commit_empty(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_open(env) == 0 ); int rc; void *tx = sp_begin(env); t( tx != NULL ); t( sp_setint(tx, "half_commit", 1) == 0 ); rc = sp_commit(tx); t( rc == 0 ); rc = sp_commit(tx); t( rc == 0 ); t( sp_destroy(env) == 0 ); }
static void gh_5(void) { void *env = sp_env(); t( env != NULL ); t( sp_ctl(env, SPDIR, SPO_CREAT|SPO_RDWR, dbrep) == 0 ); void *db = sp_open(env); t( db != NULL ); char k1[] = "key-1"; char v1[] = "val-1"; t( sp_set(db, k1, sizeof(k1), v1, sizeof(v1)) == 0); char k2[] = "key-10"; char v2[] = "val-10"; t( sp_set(db, k2, sizeof(k2), v2, sizeof(v2)) == 0); size_t ressize = 0; void *res = NULL; t( sp_get(db, k1, sizeof(k1), &res, &ressize) == 1 ); t( ressize == sizeof(v1) ); t( strcmp(v1, res) == 0 ); free(res); t( sp_destroy(db) == 0 ); t( sp_destroy(env) == 0 ); t( rmrf(dbrep) == 0 ); }
static void drop_test(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_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 ); void *txn = sp_begin(env); t( txn != NULL ); sp_destroy(db); /* unref */ t( sp_drop(db) == 0); /* scheduler drop */ void *dbp = sp_getobject(env, "db.test"); t( dbp == NULL ); t( sp_setint(env, "scheduler.run", 0) == 0 ); t( sp_destroy(txn) == 0 ); t( exists(st_r.conf->db_dir, "") == 1 ); t( sp_setint(env, "scheduler.run", 0) == 1 ); /* proceed drop */ t( exists(st_r.conf->db_dir, "") == 0 ); t( sp_destroy(env) == 0 ); }
static void mt_multi_stmt(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", 3) == 0 ); t( sp_setstring(env, "log.path", st_r.conf->log_dir, 0) == 0 ); t( sp_setint(env, "log.rotate_sync", 0) == 0 ); t( sp_setint(env, "log.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 ); seworkerpool p; se_workerpool_init(&p); void *ptr[2] = { env, db }; t( se_workerpool_new(&p, &st_r.r, 5, multi_stmt_thread, ptr) == 0 ); t( se_workerpool_shutdown(&p, &st_r.r) == 0 ); t (sp_getint(env, "db.test.index.count") == 100000 ); t( sp_destroy(env) == 0 ); }