void on_action_trace( const action_trace& at ) { if( filter( at ) ) { //idump((fc::json::to_pretty_string(at))); auto& chain = chain_plug->chain(); auto& db = chain.db(); db.create<action_history_object>( [&]( auto& aho ) { auto ps = fc::raw::pack_size( at ); aho.packed_action_trace.resize(ps); datastream<char*> ds( aho.packed_action_trace.data(), ps ); fc::raw::pack( ds, at ); aho.action_sequence_num = at.receipt.global_sequence; aho.block_num = chain.pending_block_state()->block_num; aho.block_time = chain.pending_block_time(); aho.trx_id = at.trx_id; }); auto aset = account_set( at ); for( auto a : aset ) { record_account_action( a, at ); } } for( const auto& iline : at.inline_traces ) { on_action_trace( iline ); } }
void preload_accounts(const char *conditions) { long acct_count, field_count, field_idx; const char **fields; PGresult *res; res = sql_query ("select idnum, name, password, email, date_part('epoch', creation_time) as creation_time, creation_addr, date_part('epoch', login_time) as login_time, login_addr, date_part('epoch', entry_time) as entry_time, ansi_level, compact_level, term_height, term_width, banned, reputation, quest_points, quest_banned, bank_past, bank_future, metric_units, trust from accounts where %s", conditions); acct_count = PQntuples(res); if (acct_count < 1) return; // Get field names and put them in an array field_count = PQnfields(res); fields = (const char **)malloc(sizeof(const char *) * field_count); for (field_idx = 0; field_idx < field_count; field_idx++) fields[field_idx] = PQfname(res, field_idx); int acct_idx; for (acct_idx = 0; acct_idx < acct_count; acct_idx++) { // Make sure we don't reload one that's already in the cache long idnum = atol(PQgetvalue(res, acct_idx, 0)); if (g_hash_table_lookup(account_cache, GINT_TO_POINTER(idnum))) continue; // Create a new account and load it up struct account *new_acct; CREATE(new_acct, struct account, 1); for (field_idx = 0; field_idx < field_count; field_idx++) account_set(new_acct, fields[field_idx], PQgetvalue(res, acct_idx, field_idx)); load_players(new_acct); load_trusted(new_acct); g_hash_table_insert(account_cache, GINT_TO_POINTER(idnum), new_acct); slog("Account %ld preloaded from database", idnum); } free(fields); }
bool load_account(struct account *account, long idnum) { long acct_count, field_count, field_idx; const char **fields; PGresult *res; res = sql_query("select idnum, name, password, email, " "date_part('epoch', creation_time) as creation_time, " "date_part('epoch', login_time) as login_time, " "date_part('epoch', entry_time) as entry_time, " "creation_addr, login_addr, " "ansi_level, compact_level, term_height, term_width, " "banned, reputation, quest_points, quest_banned, " "bank_past, bank_future, metric_units, trust " "from accounts where idnum=%ld", idnum); acct_count = PQntuples(res); if (acct_count > 1) { errlog("search for account %ld returned more than one match", idnum); return false; } if (acct_count < 1) return false; // Get field names and put them in an array field_count = PQnfields(res); fields = (const char **)malloc(sizeof(const char *) * field_count); for (field_idx = 0; field_idx < field_count; field_idx++) fields[field_idx] = PQfname(res, field_idx); for (field_idx = 0; field_idx < field_count; field_idx++) account_set(account, fields[field_idx], PQgetvalue(res, 0, field_idx)); free(fields); load_players(account); load_trusted(account); slog("Account %d loaded from database", account->id); g_hash_table_insert(account_cache, GINT_TO_POINTER(idnum), account); return true; }