sql/ticker: make routine database detection work.
authorMarko Kreen <markokr@gmail.com>
Thu, 30 Apr 2009 10:06:54 +0000 (13:06 +0300)
committerMarko Kreen <markokr@gmail.com>
Thu, 30 Apr 2009 10:06:54 +0000 (13:06 +0300)
Previously databases were only detected at startup.

sql/ticker/pgqd.c

index 3243aa5f151730e36ad333cdf9347abe5d08fb95..e5b79d3ef571438ad2a645ec3fa041017ac03559 100644 (file)
@@ -133,16 +133,28 @@ const char *make_connstr(const char *dbname)
 static void launch_db(const char *dbname)
 {
        struct PgDatabase *db;
+       struct List *elem;
 
+       /* check of already exists */
+       statlist_for_each(elem, &database_list) {
+               db = container_of(elem, struct PgDatabase, head);
+               if (strcmp(db->name, dbname) == 0)
+                       return;
+       }
+
+       /* create new db entry */
        db = calloc(1, sizeof(*db));
        db->name = strdup(dbname);
        statlist_init(&db->maint_item_list, "maint_item_list");
        list_init(&db->head);
        statlist_append(&database_list, &db->head);
 
+       /* start working on it */
        launch_ticker(db);
 }
 
+static void detect_dbs(void);
+
 static void detect_handler(struct PgSocket *db, void *arg, enum PgEvent ev, PGresult *res)
 {
        int i;
@@ -159,18 +171,23 @@ static void detect_handler(struct PgSocket *db, void *arg, enum PgEvent ev, PGre
                        launch_db(s);
                }
                PQclear(res);
-               db_free(db_template);
-               db_template = NULL;
+               db_disconnect(db);
+               db_sleep(db, cf.check_period);
+               break;
+       case DB_TIMEOUT:
+               detect_dbs();
                break;
        default:
-               fatal("failure");
+               db_disconnect(db);
+               db_sleep(db, cf.check_period);
        }
 }
 
 static void detect_dbs(void)
 {
        const char *cstr = make_connstr(cf.initial_database);
-       db_template = db_create(detect_handler, NULL);
+       if (!db_template)
+               db_template = db_create(detect_handler, NULL);
        db_connect(db_template, cstr);
        free(cstr);
 }