예제 #1
0
파일: bandb.c 프로젝트: ChatLounge/ChatIRCd
static void
db_error_cb(const char *errstr)
{
	char buf[256];
	rb_snprintf(buf, sizeof(buf), "! :%s", errstr);
	rb_helper_write(bandb_helper, "%s", buf);
	rb_sleep(2 << 30, 0);
	exit(1);
}
예제 #2
0
파일: bandb.c 프로젝트: thors/ircd-ratbox
static void
db_error_cb(const char *errstr, void *data)
{
	rb_helper *helper = (rb_helper *)data;
	char buf[256];
	snprintf(buf, sizeof(buf), "! :%s", errstr);
	rb_helper_write(helper, "%s", buf);
	rb_sleep(INT_MAX-1, 0);
	exit(1);
}
예제 #3
0
void
rsdb_exec(rsdb_callback cb, const char *format, ...)
{
	static char buf[BUFSIZE * 4];
	va_list args;
	char *errmsg;
	unsigned int i;
	int j;

	va_start(args, format);
	i = rs_vsnprintf(buf, sizeof(buf), format, args);
	va_end(args);

	if(i >= sizeof(buf))
	{
		mlog("fatal error: length problem with compiling sql");
	}

	if((i = sqlite3_exec(rb_bandb, buf, (cb ? rsdb_callback_func : NULL), (void *)((uintptr_t)cb), &errmsg)))
	{
		switch (i)
		{
		case SQLITE_BUSY:
			for(j = 0; j < 5; j++)
			{
				rb_sleep(0, 500000);
				if(!sqlite3_exec
				   (rb_bandb, buf, (cb ? rsdb_callback_func : NULL), (void *)((uintptr_t)cb), &errmsg))
					return;
			}

			/* failed, fall through to default */
			mlog("fatal error: problem with db file: %s", errmsg);
			break;

		default:
			mlog("fatal error: problem with db file: %s", errmsg);
			break;
		}
	}
}
예제 #4
0
void
rsdb_exec_fetch(struct rsdb_table *table, const char *format, ...)
{
    static char buf[BUFSIZE * 4];
    va_list args;
    char *errmsg;
    char **data;
    int pos;
    unsigned int retval;
    int i, j;

    va_start(args, format);
    retval = vsnprintf(buf, sizeof(buf), format, args);
    va_end(args);

    if(retval >= sizeof(buf)) {
        mlog("fatal error: length problem with compiling sql");
    }

    if((retval =
            sqlite3_get_table(rb_bandb, buf, &data, &table->row_count, &table->col_count, &errmsg))) {
        int success = 0;

        switch (retval) {
        case SQLITE_BUSY:
            for(i = 0; i < 5; i++) {
                rb_sleep(0, 500000);
                if(!sqlite3_get_table
                   (rb_bandb, buf, &data, &table->row_count, &table->col_count,
                    &errmsg)) {
                    success++;
                    break;
                }
            }

            if(success)
                break;

            mlog("fatal error: problem with db file: %s", errmsg);
            break;

        default:
            mlog("fatal error: problem with db file: %s", errmsg);
            break;
        }
    }

    /* we need to be able to free data afterward */
    table->arg = data;

    if(table->row_count == 0) {
        table->row = NULL;
        return;
    }

    /* sqlite puts the column names as the first row */
    pos = table->col_count;
    table->row = rb_malloc(sizeof(char **) * table->row_count);
    for(i = 0; i < table->row_count; i++) {
        table->row[i] = rb_malloc(sizeof(char *) * table->col_count);

        for(j = 0; j < table->col_count; j++) {
            table->row[i][j] = data[pos++];
        }
    }
}