static void mt_multi_stmt(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, "scheduler.threads", "3") == 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 ); cx->db = sp_get(c, "db.test"); t( cx->db != NULL ); t( sp_open(cx->env) == 0 ); ssa a; ss_aopen(&a, &ss_stda); srscheme cmp; sr_schemeinit(&cmp); srkey *part = sr_schemeadd(&cmp, &a); t( sr_keysetname(part, &a, "key") == 0 ); t( sr_keyset(part, &a, "u32") == 0 ); ssinjection ij; memset(&ij, 0, sizeof(ij)); srerror error; sr_errorinit(&error); srseq seq; sr_seqinit(&seq); sscrcf crc = ss_crc32c_function(); sr r; sr_init(&r, &error, &a, &seq, SF_KV, SF_SRAW, &cmp, &ij, crc, NULL); soworkers w; so_workersinit(&w); void *ptr[2] = { cx->env, cx->db }; t( so_workersnew(&w, &r, 5, multi_stmt_thread, (void*)ptr) == 0 ); t( so_workersshutdown(&w, &r) == 0 ); sr_schemefree(&cmp, &a); void *o = sp_get(c, "db.test.index.count"); t( o != NULL ); t( strcmp( sp_get(o, "value", NULL), "100000") == 0 ); sp_destroy(o); t( sp_destroy(cx->env) == 0 ); }
static void sr_scheme_saveload(void) { srscheme cmp; sr_schemeinit(&cmp); srkey *part = sr_schemeadd(&cmp, &st_r.a); t( sr_keysetname(part, &st_r.a, "key") == 0 ); t( sr_keyset(part, &st_r.a, "u32") == 0 ); ssbuf buf; ss_bufinit(&buf); t( sr_schemesave(&cmp, &st_r.a, &buf) == 0 ); sr_schemefree(&cmp, &st_r.a); sr_schemeinit(&cmp); t( sr_schemeload(&cmp, &st_r.a, buf.s, ss_bufused(&buf)) == 0 ); t( cmp.count == 1 ); t( strcmp(cmp.parts[0].name, "key") == 0 ); t( cmp.parts[0].type == SS_U32 ); sr_schemefree(&cmp, &st_r.a); ss_buffree(&buf, &st_r.a); }
void si_schemefree(sischeme *s, sr *r) { if (s->name) { ss_free(r->a, s->name); s->name = NULL; } if (s->path) { ss_free(r->a, s->path); s->path = NULL; } if (s->path_backup) { ss_free(r->a, s->path_backup); s->path_backup = NULL; } if (s->storage_sz) { ss_free(r->a, s->storage_sz); s->storage_sz = NULL; } if (s->compression_sz) { ss_free(r->a, s->compression_sz); s->compression_sz = NULL; } if (s->compression_branch_sz) { ss_free(r->a, s->compression_branch_sz); s->compression_branch_sz = NULL; } if (s->fmt_sz) { ss_free(r->a, s->fmt_sz); s->fmt_sz = NULL; } if (s->cache_sz) { ss_free(r->a, s->cache_sz); s->cache_sz = NULL; } sr_schemefree(&s->scheme, r->a); }
int si_schemerecover(sischeme *s, sr *r) { sdscheme c; sd_schemeinit(&c); char path[PATH_MAX]; snprintf(path, sizeof(path), "%s/scheme", s->path); int rc; rc = sd_schemerecover(&c, r, path); if (ssunlikely(rc == -1)) goto error; ssiter i; ss_iterinit(sd_schemeiter, &i); rc = ss_iteropen(sd_schemeiter, &i, r, &c, 1); if (ssunlikely(rc == -1)) goto error; while (ss_iterhas(sd_schemeiter, &i)) { sdschemeopt *opt = ss_iterof(sd_schemeiter, &i); switch (opt->id) { case SI_SCHEME_FORMAT: s->fmt = sd_schemeu32(opt); char *name; if (s->fmt == SF_KV) name = "kv"; else if (s->fmt == SF_DOCUMENT) name = "document"; else goto error; ss_free(r->a, s->fmt_sz); s->fmt_sz = ss_strdup(r->a, name); if (ssunlikely(s->fmt_sz == NULL)) goto error; break; case SI_SCHEME_FORMAT_STORAGE: s->fmt_storage = sd_schemeu32(opt); break; case SI_SCHEME_SCHEME: { sr_schemefree(&s->scheme, r->a); sr_schemeinit(&s->scheme); ssbuf buf; ss_bufinit(&buf); rc = sr_schemeload(&s->scheme, r->a, sd_schemesz(opt), opt->size); if (ssunlikely(rc == -1)) goto error; ss_buffree(&buf, r->a); break; } case SI_SCHEME_NODE_SIZE: s->node_size = sd_schemeu64(opt); break; case SI_SCHEME_NODE_PAGE_SIZE: s->node_page_size = sd_schemeu32(opt); break; case SI_SCHEME_COMPRESSION_KEY: s->compression_key = sd_schemeu32(opt); break; case SI_SCHEME_COMPRESSION: { char *name = sd_schemesz(opt); ssfilterif *cif = ss_filterof(name); if (ssunlikely(cif == NULL)) goto error; s->compression_if = cif; s->compression = s->compression_if != &ss_nonefilter; ss_free(r->a, s->compression_sz); s->compression_sz = ss_strdup(r->a, cif->name); if (ssunlikely(s->compression_sz == NULL)) goto error; break; } case SI_SCHEME_COMPRESSION_BRANCH: { char *name = sd_schemesz(opt); ssfilterif *cif = ss_filterof(name); if (ssunlikely(cif == NULL)) goto error; s->compression_branch_if = cif; s->compression_branch = s->compression_branch_if != &ss_nonefilter; ss_free(r->a, s->compression_branch_sz); s->compression_branch_sz = ss_strdup(r->a, cif->name); if (ssunlikely(s->compression_branch_sz == NULL)) goto error; break; } case SI_SCHEME_AMQF: s->amqf = sd_schemeu32(opt); break; case SI_SCHEME_CACHE_MODE: s->cache_mode = sd_schemeu32(opt); break; case SI_SCHEME_EXPIRE: s->expire = sd_schemeu32(opt); break; default: /* skip unknown */ break; } ss_iternext(sd_schemeiter, &i); } sd_schemefree(&c, r); return 0; error: sd_schemefree(&c, r); return -1; }