int main(int argc, char *argv[]) { PGconn *conn; StringInfoData conn_info; int num_options; num_options = pgut_getopt(argc, argv, options); /* command-line arguments is not necessary */ if (num_options != argc) ereport(ERROR, (errcode(EINVAL), errmsg("too many argumetns"))); /* can't specified the mode two or more */ if ((mode_list && (mode_size || mode_report || mode_snapshot || mode_delete)) || (mode_size && (mode_report || mode_snapshot || mode_delete)) || (mode_report && (mode_snapshot || mode_delete)) || (mode_snapshot && mode_delete)) ereport(ERROR, (errcode(EINVAL), errmsg("can't specify two or more mode"))); /* connect to database */ initStringInfo(&conn_info); if (dbname && dbname[0]) appendStringInfo(&conn_info, "dbname=%s ", dbname); if (host && host[0]) appendStringInfo(&conn_info, "host=%s ", host); if (port && port[0]) appendStringInfo(&conn_info, "port=%s ", port); if (username && username[0]) appendStringInfo(&conn_info, "user=%s ", username); conn = pgut_connect(conn_info.data, prompt_password, ERROR); termStringInfo(&conn_info); /* execute a specified operation */ if (mode_list) do_list(conn, instid); else if (mode_size) do_size(conn); else if (mode_report) do_report(conn, mode_report, instid, beginid, endid, begindate, enddate, output); else if (mode_snapshot) do_snapshot(conn, mode_snapshot); else if (mode_delete) do_delete(conn, mode_delete); else ereport(ERROR, (errcode(EINVAL), errmsg("please specify operation option (-l, -s, -r, -S, -D)"))); pgut_disconnect(conn); return 0; }
/* * writer_main */ void * writer_main(void *arg) { int items; reload_params(); set_connect_privileges(); while (shutdown_state < COLLECTOR_SHUTDOWN) { /* update settings if reloaded */ if (writer_reload_time < collector_reload_time) { writer_reload_time = collector_reload_time; pthread_mutex_lock(&reload_lock); reload_params(); pthread_mutex_unlock(&reload_lock); } /* send queued items into the repository server */ if (recv_writer_queue() == 0) { /* disconnect if there are no works for a long time */ if (writer_conn != NULL && writer_conn_last_used + WRITER_CONN_KEEP_SECS < time(NULL)) { pgut_disconnect(writer_conn); writer_conn = NULL; elog(DEBUG2, "disconnect unused writer connection"); } } usleep(200 * 1000); /* 200ms */ } /* flush remaining items */ if ((items = recv_writer_queue()) > 0) elog(WARNING, "writer discards %d items", items); pgut_disconnect(writer_conn); writer_conn = NULL; shutdown_progress(WRITER_SHUTDOWN); return NULL; }
void disconnect(void) { if (connection) { pgut_disconnect(connection); connection = NULL; } }
/* * load guc variables */ static void reload_params(void) { pgut_disconnect(writer_conn); writer_conn = NULL; if (my_repository_server != NULL && strcmp(my_repository_server, repository_server) != 0) { free(my_repository_server); my_repository_server = pgut_strdup(repository_server); set_connect_privileges(); } free(my_repository_server); my_repository_server = pgut_strdup(repository_server); }