static int sn_storagescheme(snstorage *s, snconfig *c, snlog *l) { if (c->databases == 0) { sn_log(l, "no databases to use"); return -1; } int size = c->databases * sizeof(sndb); s->count = c->databases; s->storage = sn_malloc(size); if (snunlikely(s->storage == NULL)) return -1; memset(s->storage, 0, size); int i = 0; while (i < c->databases) { sndb *db = &s->storage[i]; snconfigdb *scheme = sn_configscheme_match(c, i); char namesz[32]; char *name = NULL; char *path = NULL; char *key = NULL; if (scheme) { name = scheme->name; path = scheme->path; key = scheme->key; } if (name == NULL) { snprintf(namesz, sizeof(namesz), "db_%d", i); name = namesz; } if (key == NULL) { key = "string"; } db->id = i; db->db = NULL; db->name = sn_strdup(name); if (snunlikely(db->name == NULL)) return -1; db->key = sn_strdup(key); if (snunlikely(db->key == NULL)) return -1; if (scheme) db->keytype = scheme->keytype; else db->keytype = SN_KEYSTRING; db->path = NULL; if (path) { db->path = sn_strdup(path); if (snunlikely(db->path == NULL)) return -1; } i++; } return 0; }
void skynet_error(skynet_context *context, const char *msg, ...) { static uint32_t logger = 0; if (logger == 0) { logger = SNServer::Get()->GetHandle().FindName("logger"); } if (logger == 0) { return; } char tmp[LOG_MESSAGE_SIZE]; char *data = NULL; va_list va; va_start(va, msg); int len = sn_vsprintf(tmp, LOG_MESSAGE_SIZE, msg, va); va_end(va); if (len != -1 && len < LOG_MESSAGE_SIZE) { data = skynet_strdup(tmp); } else { int max_size = LOG_MESSAGE_SIZE; for (;;) { max_size *= 2; data = (char *)sn_malloc(max_size); va_start(va, msg); len = sn_vsprintf(data, max_size, msg, va); va_end(va); if (len != -1 && len < max_size) { break; } sn_free(data); } } sn_message smsg; if (context == NULL) { smsg.source = 0; } else { smsg.source = context->Handle(); } smsg.session = 0; smsg.data = data; smsg.sz = len | (PTYPE_TEXT << HANDLE_REMOTE_SHIFT); SNServer::Get()->ContextPush(logger, &smsg); }