static void perform(void) { word last_report_day = 9; // Initialise database { db_init(conf[conf_db_server], conf[conf_db_user], conf[conf_db_password], conf[conf_db_name]); word e; if((e=database_upgrade(vstpdb))) { _log(CRITICAL, "Error %d in upgrade_database(). Aborting.", e); exit(1); } } { time_t now = time(NULL); struct tm * broken = localtime(&now); if(broken->tm_hour >= REPORT_HOUR) { last_report_day = broken->tm_wday; } } while(run) { stats[ConnectAttempt]++; int run_receive = !open_stompy(STOMPY_PORT); while(run_receive && run) { holdoff = 0; { time_t now = time(NULL); struct tm * broken = localtime(&now); if(broken->tm_hour >= REPORT_HOUR && broken->tm_wday != last_report_day) { last_report_day = broken->tm_wday; report_stats(); } } word r = read_stompy(body, FRAME_SIZE, 64); _log(DEBUG, "read_stompy() returned %d.", r); if(!r && run && run_receive) { if(db_start_transaction()) { run_receive = false; } if(run_receive) process_frame(body); if(!db_errored) { if(db_commit_transaction()) { db_rollback_transaction(); run_receive = false; } else { // Send ACK if(ack_stompy()) { _log(CRITICAL, "Failed to write message ack. Error %d %s", errno, strerror(errno)); run_receive = false; } } } else { // DB error occurred during processing of frame. db_rollback_transaction(); run_receive = false; } } else if(run && run_receive) { if(r != 3) { run_receive = false; _log(CRITICAL, "Receive error %d on stompy connection.", r); } else { // Don't report these because it is normal on VSTP stream // _log(MINOR, "Receive timeout on stompy connection."); } } } // while(run_receive && run) close_stompy(); { word i; if(holdoff < 256) holdoff += 38; else holdoff = 256; for(i = 0; i < holdoff + 64 && run; i++) sleep(1); } } // while(run) if(interrupt) { _log(CRITICAL, "Terminating due to interrupt."); } db_disconnect(); report_stats(); }
static void perform(void) { word last_report_day = 9; word stompy_timeout = true; // Initialise database connection while(db_init(conf[conf_db_server], conf[conf_db_user], conf[conf_db_password], conf[conf_db_name]) && run) { _log(CRITICAL, "Failed to initialise database connection. Will retry..."); word i; for(i = 0; i < 64 && run; i++) sleep(1); } create_database(); handle = 0xfff0; { time_t now = time(NULL); struct tm * broken = localtime(&now); if(broken->tm_hour >= REPORT_HOUR) { last_report_day = broken->tm_wday; } last_message_count_report = now; message_count = message_count_rel = 0; } // Status status_last_td_processed = 0; { word describer; for(describer = 0; describer < DESCRIBERS; describer++) { status_last_td_actual[describer] = last_td_processed[describer] = 0; timeout_reported[describer] = false; } } // Signalling { word i,j; for(i = 0; i < DESCRIBERS; i++) { for(j = 0; j < SIG_BYTES; j++) { signalling[i][j] = 0xffff; } } } while(run) { stats[ConnectAttempt]++; int run_receive = !open_stompy(STOMPY_PORT); while(run_receive && run) { holdoff = 0; { time_t now = time(NULL); struct tm * broken = localtime(&now); if(broken->tm_hour >= REPORT_HOUR && broken->tm_wday != last_report_day) { last_report_day = broken->tm_wday; report_stats(); } if(now - last_message_count_report > MESSAGE_COUNT_REPORT_INTERVAL) { char query[256]; sprintf(query, "INSERT INTO message_count VALUES('tddb', %ld, %d)", now, message_count); if(!db_query(query)) { message_count = 0; last_message_count_report = now; } sprintf(query, "INSERT INTO message_count VALUES('tddbrel', %ld, %d)", now, message_count_rel); if(!db_query(query)) { message_count_rel = 0; } } } int r = read_stompy(body, FRAME_SIZE, 64); _log(DEBUG, "read_stompy() returned %d.", r); if(!r && run && run_receive) { if(stompy_timeout) { _log(MINOR, "TD message stream - Receive OK."); stompy_timeout = false; } if(db_start_transaction()) { run_receive = false; } if(run_receive) process_frame(body); if(!db_errored) { if(db_commit_transaction()) { db_rollback_transaction(); run_receive = false; } else { // Send ACK if(ack_stompy()) { _log(CRITICAL, "Failed to write message ack. Error %d %s", errno, strerror(errno)); run_receive = false; } } } else { // DB error. db_rollback_transaction(); run_receive = false; } } else if(run && run_receive) { if(r != 3) { run_receive = false; _log(CRITICAL, "Receive error %d on stompy connection.", r); } else { if(!stompy_timeout) _log(MINOR, "TD message stream - Receive timeout."); stompy_timeout = true; } } if(run) check_timeout(); } // while(run_receive && run) close_stompy(); if(run) check_timeout(); { word i; if(holdoff < 256) holdoff += 34; else holdoff = 256; for(i = 0; i < holdoff + 64 && run; i++) sleep(1); } } if(interrupt) { _log(CRITICAL, "Terminating due to interrupt."); } db_disconnect(); report_stats(); }