static int put_entry_func( struct rldb_plugin_cnts *cdata, const struct run_entry *re) { struct rldb_mysql_cnts *cs = (struct rldb_mysql_cnts *) cdata; struct rldb_mysql_state *state = cs->plugin_state; struct runlog_state *rls = cs->rl_state; struct run_entry_internal ri; struct timeval curtime; char *cmd_t = 0; size_t cmd_z = 0; FILE *cmd_f = 0; ASSERT(re); ASSERT(re->run_id >= 0); expand_runs(rls, re->run_id); if (rls->runs[re->run_id].status != RUN_EMPTY) return -1; if (re->status == RUN_EMPTY) return -1; // FIXME: check, that time is valid memset(&ri, 0, sizeof(ri)); gettimeofday(&curtime, 0); ri.run_id = re->run_id; ri.contest_id = cs->contest_id; ri.size = re->size; ri.create_time = re->time; ri.create_nsec = re->nsec; ri.user_id = re->user_id; ri.prob_id = re->prob_id; ri.lang_id = re->lang_id; ri.status = re->status; ri.ip_version = 4; if (re->ipv6_flag) ri.ip_version = 6; run_entry_to_ipv6(re, &ri.ip); ri.ssl_flag = re->ssl_flag; if (re->sha1[0] || re->sha1[1] || re->sha1[2] || re->sha1[3] || re->sha1[4]) { ri.hash = unparse_sha1(re->sha1); } #if CONF_HAS_LIBUUID { char uuid_buf[40]; if (re->run_uuid.v[0] || re->run_uuid.v[1] || re->run_uuid.v[2] || re->run_uuid.v[3]) { uuid_unparse((void*) &re->run_uuid, uuid_buf); ri.run_uuid = uuid_buf; } } #endif ri.score = re->score; ri.test_num = re->test; ri.score_adj = re->score_adj; ri.locale_id = re->locale_id; ri.judge_id = re->judge_id; ri.variant = re->variant; ri.pages = re->pages; ri.is_imported = re->is_imported; ri.is_hidden = re->is_hidden; ri.is_readonly = re->is_readonly; if (re->mime_type) { ri.mime_type = (unsigned char*) mime_type_get_type(re->mime_type); } ri.last_change_time = curtime.tv_sec; ri.last_change_nsec = curtime.tv_usec * 1000; ri.is_marked = re->is_marked; ri.is_saved = re->is_saved; ri.saved_status = re->saved_status; ri.saved_score = re->saved_score; ri.saved_test = re->saved_test; ri.passed_mode = re->passed_mode; ri.eoln_type = re->eoln_type; ri.store_flags = re->store_flags; ri.token_flags = re->token_flags; ri.token_count = re->token_count; cmd_f = open_memstream(&cmd_t, &cmd_z); fprintf(cmd_f, "INSERT INTO %sruns VALUES ( ", state->md->table_prefix); state->mi->unparse_spec(state->md, cmd_f, RUNS_ROW_WIDTH, runs_spec, &ri); fprintf(cmd_f, " ) ;"); close_memstream(cmd_f); cmd_f = 0; if (state->mi->simple_query(state->md, cmd_t, cmd_z) < 0) goto fail; xfree(cmd_t); cmd_t = 0; memcpy(&rls->runs[re->run_id], re, sizeof(rls->runs[0])); return 0; fail: if (cmd_f) fclose(cmd_f); xfree(cmd_t); return -1; }
static void generate_update_entry_clause( struct rldb_mysql_state *state, FILE *f, const struct run_entry *re, int flags) { struct timeval curtime; const unsigned char *sep = ""; const unsigned char *comma = ", "; if ((flags & RE_SIZE)) { fprintf(f, "%ssize = %d", sep, re->size); sep = comma; } if ((flags & RE_USER_ID)) { fprintf(f, "%suser_id = %d", sep, re->user_id); sep = comma; } if ((flags & RE_PROB_ID)) { fprintf(f, "%sprob_id = %d", sep, re->prob_id); sep = comma; } if ((flags & RE_LANG_ID)) { fprintf(f, "%slang_id = %d", sep, re->lang_id); sep = comma; } if ((flags & RE_STATUS)) { fprintf(f, "%sstatus = %d", sep, re->status); sep = comma; } if ((flags & RE_SSL_FLAG)) { fprintf(f, "%sssl_flag = %d", sep, re->ssl_flag); sep = comma; } if ((flags & RE_IP)) { int ip_version = 4; if (re->ipv6_flag) ip_version = 6; fprintf(f, "%sip_version = %d", sep, ip_version); sep = comma; ej_ip_t ipv6; run_entry_to_ipv6(re, &ipv6); fprintf(f, "%sip = '%s'", sep, xml_unparse_ipv6(&ipv6)); } if ((flags & RE_SHA1)) { if (!re->sha1[0] && !re->sha1[1] && !re->sha1[2] && !re->sha1[3] && !re->sha1[4]) { fprintf(f, "%shash = NULL", sep); } else { fprintf(f, "%shash = '%s'", sep, unparse_sha1(re->sha1)); } sep =comma; } if ((flags & RE_RUN_UUID)) { #if CONF_HAS_LIBUUID - 0 != 0 if (!re->run_uuid.v[0] && !re->run_uuid.v[1] && !re->run_uuid.v[2] && !re->run_uuid.v[3]) { fprintf(f, "%srun_uuid = NULL", sep); } else { char uuid_buf[40]; uuid_unparse((void*) &re->run_uuid, uuid_buf); fprintf(f, "%srun_uuid = '%s'", sep, uuid_buf); } sep =comma; #endif } if ((flags & RE_SCORE)) { fprintf(f, "%sscore = %d", sep, re->score); sep = comma; } if ((flags & RE_TEST)) { fprintf(f, "%stest_num = %d", sep, re->test); sep = comma; } if ((flags & RE_SCORE_ADJ)) { fprintf(f, "%sscore_adj = %d", sep, re->score_adj); sep = comma; } if ((flags & RE_LOCALE_ID)) { fprintf(f, "%slocale_id = %d", sep, re->locale_id); sep = comma; } if ((flags & RE_JUDGE_ID)) { fprintf(f, "%sjudge_id = %d", sep, re->judge_id); sep = comma; } if ((flags & RE_VARIANT)) { fprintf(f, "%svariant = %d", sep, re->variant); sep = comma; } if ((flags & RE_PAGES)) { fprintf(f, "%spages = %d", sep, re->pages); sep = comma; } if ((flags & RE_IS_IMPORTED)) { fprintf(f, "%sis_imported = %d", sep, re->is_imported); sep = comma; } if ((flags & RE_IS_HIDDEN)) { fprintf(f, "%sis_hidden = %d", sep, re->is_hidden); sep = comma; } if ((flags & RE_IS_READONLY)) { fprintf(f, "%sis_readonly = %d", sep, re->is_readonly); sep = comma; } if ((flags & RE_MIME_TYPE)) { if (re->mime_type > 0) { fprintf(f, "%smime_type = '%s'", sep, mime_type_get_type(re->mime_type)); } else { fprintf(f, "%smime_type = NULL", sep); } sep = comma; } if ((flags & RE_IS_MARKED)) { fprintf(f, "%sis_marked = %d", sep, re->is_marked); sep = comma; } if ((flags & RE_IS_SAVED)) { fprintf(f, "%sis_saved = %d", sep, re->is_saved); sep = comma; } if ((flags & RE_SAVED_STATUS)) { fprintf(f, "%ssaved_status = %d", sep, re->saved_status); sep = comma; } if ((flags & RE_SAVED_SCORE)) { fprintf(f, "%ssaved_score = %d", sep, re->saved_score); sep = comma; } if ((flags & RE_SAVED_TEST)) { fprintf(f, "%ssaved_test = %d", sep, re->saved_test); sep = comma; } if ((flags & RE_PASSED_MODE)) { fprintf(f, "%spassed_mode = %d", sep, !!re->passed_mode); sep = comma; } if ((flags & RE_EOLN_TYPE)) { fprintf(f, "%seoln_type = %d", sep, re->eoln_type); sep = comma; } if ((flags & RE_STORE_FLAGS)) { fprintf(f, "%sstore_flags = %d", sep, re->store_flags); sep = comma; } if ((flags & RE_TOKEN_FLAGS)) { fprintf(f, "%stoken_flags = %d", sep, re->token_flags); sep = comma; } if ((flags & RE_TOKEN_COUNT)) { fprintf(f, "%stoken_count = %d", sep, re->token_count); sep = comma; } gettimeofday(&curtime, 0); fprintf(f, "%slast_change_time = ", sep); state->mi->write_timestamp(state->md, f, 0, curtime.tv_sec); sep = comma; fprintf(f, "%slast_change_nsec = %ld", sep, curtime.tv_usec * 1000); }
void write_runs_dump(const serve_state_t state, FILE *f, const unsigned char *url, unsigned char const *charset) { int total_runs, i, j; struct run_entry re; struct tm *pts; time_t start_time, dur; unsigned char *s; unsigned char statstr[128]; time_t tmp_time; if (url && *url) { fprintf(f, "Content-type: text/plain; charset=%s\n\n", charset); } fprintf(f, "Run_Id" ";Time;Nsec;Time2;Date;Year;Mon;Day;Hour;Min;Sec" ";Dur;Dur_Day;Dur_Hour;Dur_Min;Dur_Sec" ";Size" ";IPV6_Flag;IP;SSL_Flag" ";Sha1" ";User_Id;User_Login;User_Name" ";User_Inv;User_Ban;User_Lock" ";Prob;Variant" ";Lang;Content_Type" ";Stat_Short;Status;Score;Score_Adj;Test" ";Import_Flag;Hidden_Flag;RO_Flag;Locale_Id;Pages;Judge_Id" "\n"); total_runs = run_get_total(state->runlog_state); start_time = run_get_start_time(state->runlog_state); for (i = 0; i < total_runs; i++) { if (run_get_entry(state->runlog_state, i, &re) < 0) { fprintf(f, "%d;Cannot read entry!\n", i); continue; } if (!run_is_valid_status(re.status)) { fprintf(f, "%d;Invalid status %d!\n", i, re.status); continue; } if (re.status == RUN_EMPTY) continue; fprintf(f, "%d;", i); fprintf(f, "%lld;%09d;", re.time, re.nsec); tmp_time = re.time; pts = localtime(&tmp_time); fprintf(f, "%04d%02d%02d%02d%02d%02d;", pts->tm_year + 1900, pts->tm_mon + 1, pts->tm_mday, pts->tm_hour, pts->tm_min, pts->tm_sec); fprintf(f, "%04d%02d%02d;", pts->tm_year + 1900, pts->tm_mon + 1, pts->tm_mday); fprintf(f, "%04d;%02d;%02d;%02d;%02d;%02d;", pts->tm_year + 1900, pts->tm_mon + 1, pts->tm_mday, pts->tm_hour, pts->tm_min, pts->tm_sec); if (state->global->is_virtual) { start_time = run_get_virtual_start_time(state->runlog_state, re.user_id); } dur = re.time - start_time; if (dur < 0) dur = 0; fprintf(f, "%ld;", dur); pts->tm_sec = dur % 60; dur /= 60; pts->tm_min = dur % 60; dur /= 60; pts->tm_hour = dur % 24; dur /= 24; fprintf(f, "%ld;%02d;%02d;%02d;", dur, pts->tm_hour, pts->tm_min, pts->tm_sec); fprintf(f, "%u;", re.size); fprintf(f, "%d;%s;%d;", re.ipv6_flag, xml_unparse_ip(re.a.ip), re.ssl_flag); s = (unsigned char*) re.sha1; for (j = 0; j < 20; j++) fprintf(f, "%02x", *s++); fprintf(f, ";"); fprintf(f, "%d;", re.user_id); if (!(s = teamdb_get_login(state->teamdb_state, re.user_id))) { fprintf(f, "!INVALID TEAM!;"); } else { fprintf(f, "%s;", s); } if (!(s = teamdb_get_name(state->teamdb_state, re.user_id))) { fprintf(f, "!INVALID TEAM!;"); } else { fprintf(f, "%s;", s); } j = teamdb_get_flags(state->teamdb_state, re.user_id); s = ""; if ((j & TEAM_INVISIBLE)) s = "I"; fprintf(f, "%s;", s); s = ""; if ((j & TEAM_BANNED)) s = "B"; fprintf(f, "%s;", s); s = ""; if ((j & TEAM_LOCKED)) s = "L"; fprintf(f, "%s;", s); if (re.status == RUN_VIRTUAL_START || re.status == RUN_VIRTUAL_STOP) { //fprintf(f, "<problem>;<variant>;<lang_short>;<mime_type>;<short_status>;<status>;<score>;<score_adj>;<test>;<is_imported>;<is_hidden>;<is_readonly>;<locale_id>;<pages>;<judge_id>\n"); fprintf(f, ";;;;"); run_status_to_str_short(statstr, sizeof(statstr), re.status); fprintf(f, "%s;", statstr); run_status_str(re.status, statstr, sizeof(statstr), 0, 0); fprintf(f, "%s;", statstr); fprintf(f, ";;;;;;;;\n"); continue; } if (re.prob_id > 0 && re.prob_id <= state->max_prob && state->probs[re.prob_id] && state->probs[re.prob_id]->short_name) { fprintf(f, "%s;", state->probs[re.prob_id]->short_name); } else { fprintf(f, "!INVALID PROBLEM %d!;", re.prob_id); } fprintf(f, "%d;", re.variant); if (!re.lang_id) { fprintf(f, ";%s;", mime_type_get_type(re.mime_type)); } else if (re.lang_id > 0 && re.lang_id <= state->max_lang && state->langs[re.lang_id] && state->langs[re.lang_id]->short_name) { fprintf(f, "%s;;", state->langs[re.lang_id]->short_name); } else { fprintf(f, "!INVALID LANGUAGE %d!;", re.lang_id); } run_status_to_str_short(statstr, sizeof(statstr), re.status); fprintf(f, "%s;", statstr); run_status_str(re.status, statstr, sizeof(statstr), 0, 0); fprintf(f, "%s;", statstr); fprintf(f, "%d;%d;", re.score, re.score_adj); fprintf(f, "%d;", re.test); fprintf(f, "%d;", (re.passed_mode > 0)); fprintf(f, "%d;", re.is_imported); fprintf(f, "%d;", re.is_hidden); fprintf(f, "%d;", re.is_readonly); fprintf(f, "%d;%d;%d", re.locale_id, re.pages, re.judge_id); fprintf(f, "\n"); } }