Esempio n. 1
0
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;
}
Esempio n. 2
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);
}