static int se_dbscheme_set(sedb *db) { se *e = se_of(&db->o); sischeme *s = si_scheme(db->index); /* set default scheme */ int rc; if (s->scheme.fields_count == 0) { sffield *field = sf_fieldnew(&e->a, "key"); if (ssunlikely(field == NULL)) return sr_oom(&e->error); rc = sf_fieldoptions(field, &e->a, "string,key(0)"); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } rc = sf_schemeadd(&s->scheme, &e->a, field); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } field = sf_fieldnew(&e->a, "value"); if (ssunlikely(field == NULL)) return sr_oom(&e->error); rc = sf_fieldoptions(field, &e->a, "string"); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } rc = sf_schemeadd(&s->scheme, &e->a, field); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } } /* validate scheme and set keys */ rc = sf_schemevalidate(&s->scheme, &e->a); if (ssunlikely(rc == -1)) { sr_error(&e->error, "incomplete scheme", s->name); return -1; } /* validate io settings */ if (s->mmap && s->direct_io) { sr_error(&e->error, "%s", "incompatible options: mmap and direct_io"); return -1; } /* compression */ s->compression_if = ss_filterof(s->compression_sz); if (ssunlikely(s->compression_if == NULL)) { sr_error(&e->error, "unknown compression type '%s'", s->compression_sz); return -1; } s->compression = s->compression_if != &ss_nonefilter; /* path */ if (s->path == NULL) { char path[1024]; snprintf(path, sizeof(path), "%s/%s", e->rep_conf->path, s->name); s->path = ss_strdup(&e->a, path); if (ssunlikely(s->path == NULL)) return sr_oom(&e->error); } /* backup path */ s->path_backup = e->rep_conf->path_backup; if (e->rep_conf->path_backup) { s->path_backup = ss_strdup(&e->a, e->rep_conf->path_backup); if (ssunlikely(s->path_backup == NULL)) return sr_oom(&e->error); } /* compaction settings */ sicompaction *c = &s->compaction; /* convert periodic times from sec to usec */ c->gc_period_us = c->gc_period * 1000000; c->expire_period_us = c->expire_period * 1000000; /* .. */ db->r->scheme = &s->scheme; db->r->upsert = &s->upsert; db->r->stat = &db->stat; db->r->av = &db->a; db->r->ptr = db->index; return 0; }
static int se_dbscheme_set(sedb *db) { se *e = se_of(&db->o); sischeme *s = si_scheme(db->index); /* set default scheme */ int rc; if (s->scheme.fields_count == 0) { sffield *field = sf_fieldnew(&e->a, "key"); if (ssunlikely(field == NULL)) return sr_oom(&e->error); rc = sf_fieldoptions(field, &e->a, "string,key(0)"); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } rc = sf_schemeadd(&s->scheme, &e->a, field); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } field = sf_fieldnew(&e->a, "value"); if (ssunlikely(field == NULL)) return sr_oom(&e->error); rc = sf_fieldoptions(field, &e->a, "string"); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } rc = sf_schemeadd(&s->scheme, &e->a, field); if (ssunlikely(rc == -1)) { sf_fieldfree(field, &e->a); return sr_oom(&e->error); } } /* validate scheme and set keys */ rc = sf_schemevalidate(&s->scheme, &e->a); if (ssunlikely(rc == -1)) { sr_error(&e->error, "incomplete scheme", s->name); return -1; } /* storage */ if (strcmp(s->storage_sz, "cache") == 0) { s->storage = SI_SCACHE; } else if (strcmp(s->storage_sz, "anti-cache") == 0) { s->storage = SI_SANTI_CACHE; } else if (strcmp(s->storage_sz, "in-memory") == 0) { s->storage = SI_SIN_MEMORY; } else { sr_error(&e->error, "unknown storage type '%s'", s->storage_sz); return -1; } /* compression_copy */ if (s->compression_copy) { s->fmt_storage = SF_SPARSE; } /* compression cold */ s->compression_cold_if = ss_filterof(s->compression_cold_sz); if (ssunlikely(s->compression_cold_if == NULL)) { sr_error(&e->error, "unknown compression type '%s'", s->compression_cold_sz); return -1; } s->compression_cold = s->compression_cold_if != &ss_nonefilter; /* compression hot */ s->compression_hot_if = ss_filterof(s->compression_hot_sz); if (ssunlikely(s->compression_hot_if == NULL)) { sr_error(&e->error, "unknown compression type '%s'", s->compression_hot_sz); return -1; } s->compression_hot = s->compression_hot_if != &ss_nonefilter; /* path */ if (s->path == NULL) { char path[1024]; snprintf(path, sizeof(path), "%s/%s", e->conf.path, s->name); s->path = ss_strdup(&e->a, path); if (ssunlikely(s->path == NULL)) return sr_oom(&e->error); } /* backup path */ s->path_backup = e->conf.backup_path; if (e->conf.backup_path) { s->path_backup = ss_strdup(&e->a, e->conf.backup_path); if (ssunlikely(s->path_backup == NULL)) return sr_oom(&e->error); } db->r->scheme = &s->scheme; db->r->fmt_storage = s->fmt_storage; db->r->fmt_upsert = &s->fmt_upsert; return 0; }