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); }
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); }
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; } } }
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++]; } } }