static int fetch_login( struct uldb_mysql_state *state, int user_id, struct userlist_user **p_user) { unsigned char cmdbuf[1024]; int cmdlen; struct userlist_user *u = 0; struct common_mysql_iface *mi = state->mi; struct common_mysql_state *md = state->md; *p_user = 0; if (user_id <= 0) goto fail; if (state->cache_queries && (u = get_login_from_pool(state, user_id))) { *p_user = u; return 1; } snprintf(cmdbuf, sizeof(cmdbuf), "SELECT * FROM %slogins WHERE user_id = %d ;", md->table_prefix, user_id); cmdlen = strlen(cmdbuf); if (mi->simple_query(md, cmdbuf, cmdlen) < 0) goto fail; md->field_count = mysql_field_count(md->conn); if (md->field_count != LOGIN_WIDTH) db_error_field_count_fail(md, LOGIN_WIDTH); if (!(md->res = mysql_store_result(md->conn))) db_error_fail(md); md->row_count = mysql_num_rows(md->res); if (md->row_count < 0) db_error_fail(md); if (!md->row_count) { mi->free_res(md); return 0; } if (md->row_count > 1) goto fail; if (!(md->row = mysql_fetch_row(md->res))) db_error_no_data_fail(md); md->lengths = mysql_fetch_lengths(md->res); if (!(u = allocate_login_on_pool(state, user_id))) goto fail; if (parse_login(state, md->field_count, md->row, md->lengths, u) < 0) goto fail; mi->free_res(md); *p_user = u; return 1; fail: mi->free_res(md); remove_login_from_pool(state, user_id); return -1; }
static int do_create(struct rldb_mysql_state *state) { struct common_mysql_iface *mi = state->mi; struct common_mysql_state *md = state->md; mi->free_res(md); if (mi->simple_fquery(md, create_runheaders_query, md->table_prefix) < 0) db_error_fail(md); if (mi->simple_fquery(md, create_runs_query, md->table_prefix) < 0) db_error_fail(md); if (mi->simple_fquery(md, "INSERT INTO %sconfig VALUES ('run_version', '7') ;", md->table_prefix) < 0) db_error_fail(md); return 0; fail: return -1; }
static int do_open(struct rldb_mysql_state *state) { int run_version = 0; struct common_mysql_iface *mi = state->mi; struct common_mysql_state *md = state->md; if (mi->connect(md) < 0) return -1; if (mi->fquery(md, 1, "SELECT config_val FROM %sconfig WHERE config_key = 'run_version' ;", md->table_prefix) < 0) { err("probably the database is not created, please, create it"); return -1; } if (md->row_count > 1) { err("run_version key is not unique"); return -1; } if (!md->row_count) return do_create(state); if (mi->next_row(state->md) < 0) db_error_fail(md); if (!md->row[0] || mi->parse_int(md, md->row[0], &run_version) < 0) db_error_inv_value_fail(md, "config_val"); mi->free_res(md); if (run_version == 1) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN is_marked TINYINT NOT NULL DEFAULT 0 AFTER last_change_nsec", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN is_saved TINYINT NOT NULL DEFAULT 0 AFTER is_marked", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN saved_status INT NOT NULL DEFAULT 0 AFTER is_saved", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN saved_score INT NOT NULL DEFAULT 0 AFTER saved_status", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN saved_test INT NOT NULL DEFAULT 0 AFTER saved_score", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '2' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 2; } if (run_version == 2) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN run_uuid CHAR(40) DEFAULT NULL AFTER hash", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '3' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 3; } if (run_version == 3) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN passed_mode TINYINT NOT NULL DEFAULT 0 AFTER saved_test", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '4' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 4; } if (run_version == 4) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN eoln_type TINYINT NOT NULL DEFAULT 0 AFTER passed_mode", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '5' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 5; } if (run_version == 5) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN store_flags TINYINT NOT NULL DEFAULT 0 AFTER eoln_type", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '6' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 6; } if (run_version == 6) { if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN token_flags TINYINT NOT NULL DEFAULT 0 AFTER store_flags", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "ALTER TABLE %sruns ADD COLUMN token_count TINYINT NOT NULL DEFAULT 0 AFTER token_flags", md->table_prefix) < 0) return -1; if (mi->simple_fquery(md, "UPDATE %sconfig SET config_val = '7' WHERE config_key = 'run_version' ;", md->table_prefix) < 0) return -1; run_version = 7; } if (run_version != 7) { err("run_version == %d is not supported", run_version); return -1; } return 0; fail: mi->free_res(md); return -1; }