summaryrefslogtreecommitdiff
path: root/src/c
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-09-02 11:57:25 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-09-02 11:57:25 -0400
commit48a39b87c0f2b01c85e1bb78072387e30ab0f235 (patch)
treece3a9139ccc98bb2c4d7034e44138b10c2221545 /src/c
parentb4398c433195b75d5e03d0774b1128fae14e9f41 (diff)
Initializing database connection
Diffstat (limited to 'src/c')
-rw-r--r--src/c/driver.c31
-rw-r--r--src/c/urweb.c22
2 files changed, 52 insertions, 1 deletions
diff --git a/src/c/driver.c b/src/c/driver.c
index 5300371d..365566c9 100644
--- a/src/c/driver.c
+++ b/src/c/driver.c
@@ -52,8 +52,37 @@ static pthread_cond_t queue_cond = PTHREAD_COND_INITIALIZER;
#define MAX_RETRIES 5
static void *worker(void *data) {
- int me = *(int *)data;
+ int me = *(int *)data, retries_left = MAX_RETRIES;;
lw_context ctx = lw_init(1024, 1024);
+
+ while (1) {
+ failure_kind fk = lw_begin_init(ctx);
+
+ if (fk == SUCCESS) {
+ lw_db_init(ctx);
+ printf("Database connection initialized.\n");
+ break;
+ } else if (fk == BOUNDED_RETRY) {
+ if (retries_left) {
+ printf("Initialization error triggers bounded retry: %s\n", lw_error_message(ctx));
+ --retries_left;
+ } else {
+ printf("Fatal initialization error (out of retries): %s\n", lw_error_message(ctx));
+ lw_free(ctx);
+ return NULL;
+ }
+ } else if (fk == UNLIMITED_RETRY)
+ printf("Initialization error triggers unlimited retry: %s\n", lw_error_message(ctx));
+ else if (fk == FATAL) {
+ printf("Fatal initialization error: %s\n", lw_error_message(ctx));
+ lw_free(ctx);
+ return NULL;
+ } else {
+ printf("Unknown lw_handle return code!\n");
+ lw_free(ctx);
+ return NULL;
+ }
+ }
while (1) {
char buf[lw_bufsize+1], *back = buf, *s;
diff --git a/src/c/urweb.c b/src/c/urweb.c
index 3d79e1a3..cc6e4f0b 100644
--- a/src/c/urweb.c
+++ b/src/c/urweb.c
@@ -16,6 +16,8 @@ struct lw_context {
char *heap, *heap_front, *heap_back;
char **inputs;
+ void *db;
+
jmp_buf jmp_buf;
char error_message[ERROR_BUF_LEN];
@@ -34,11 +36,21 @@ lw_context lw_init(size_t page_len, size_t heap_len) {
ctx->inputs = calloc(lw_inputs_len, sizeof(char *));
+ ctx->db = NULL;
+
ctx->error_message[0] = 0;
return ctx;
}
+void lw_set_db(lw_context ctx, void *db) {
+ ctx->db = db;
+}
+
+void *lw_get_db(lw_context ctx) {
+ return ctx->db;
+}
+
void lw_free(lw_context ctx) {
free(ctx->page);
free(ctx->heap);
@@ -63,8 +75,18 @@ void lw_reset(lw_context ctx) {
memset(ctx->inputs, 0, lw_inputs_len * sizeof(char *));
}
+void lw_db_init(lw_context);
void lw_handle(lw_context, char *);
+failure_kind lw_begin_init(lw_context ctx) {
+ int r = setjmp(ctx->jmp_buf);
+
+ if (r == 0)
+ lw_db_init(ctx);
+
+ return r;
+}
+
failure_kind lw_begin(lw_context ctx, char *path) {
int r = setjmp(ctx->jmp_buf);