Пример #1
0
         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 );
            }
         }
Пример #2
0
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);
}
Пример #3
0
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;
}