Example #1
0
    bool read_all_rows_as_vector(
            auth::user_context_t const &user_context,
            signal_t *interruptor,
            std::vector<ql::datum_t> *rows_out,
            UNUSED admin_err_t *error_out) {
        random_delay(interruptor);
        on_thread_t thread_switcher(home_thread());

        user_context.require_admin_user();

        rows_out->clear();
        for (auto const &item : data) {
            rows_out->push_back(item.second);
        }
        return true;
    }
Example #2
0
    bool write_row(
            auth::user_context_t const &user_context,
            ql::datum_t primary_key,
            UNUSED bool pkey_was_autogenerated,
            ql::datum_t *new_value_inout,
            signal_t *interruptor,
            UNUSED admin_err_t *error_out) {
        random_delay(interruptor);
        on_thread_t thread_switcher(home_thread());

        user_context.require_admin_user();

        if (new_value_inout->has()) {
            /* Not all datums can be serialized into an actual table (r.minval,
            r.maxval and large arrays in particular). To make the in-memory test
            table behave as closely to an actual table as possible, we attempt to
            serialize the datum, check for errors, and then discard the serialization
            result. */
            {
                write_message_t wm;
                ql::serialization_result_t res = ql::datum_serialize(
                    &wm,
                    *new_value_inout,
                    ql::check_datum_serialization_errors_t::YES);
                if (res & ql::serialization_result_t::ARRAY_TOO_BIG) {
                    rfail_typed_target(new_value_inout, "Array too large for disk "
                                       "writes (limit 100,000 elements).");
                } else if (res & ql::serialization_result_t::EXTREMA_PRESENT) {
                    rfail_typed_target(new_value_inout, "`r.minval` and `r.maxval` "
                                       "cannot be written to disk.");
                }
                r_sanity_check(!ql::bad(res));
            }

            ql::datum_t primary_key_2 = new_value_inout->get_field("id", ql::NOTHROW);
            guarantee(primary_key_2.has());
            guarantee(primary_key == primary_key_2);
            data[primary_key.print_primary()] = *new_value_inout;
        } else {
            data.erase(primary_key.print_primary());
        }
        notify_row(primary_key);
        return true;
    }
Example #3
0
    bool read_row(
            auth::user_context_t const &user_context,
            ql::datum_t primary_key,
            signal_t *interruptor,
            ql::datum_t *row_out,
            UNUSED admin_err_t *error_out) {
        random_delay(interruptor);
        on_thread_t thread_switcher(home_thread());

        user_context.require_admin_user();

        auto it = data.find(primary_key.print_primary());
        if (it != data.end()) {
            *row_out = it->second;
        } else {
            *row_out = ql::datum_t();
        }
        return true;
    }
Example #4
0
    // We go back to the home thread because it's nice to libtcmalloc
    // if we free memory on the same thread upon which it was
    // allocated.
    void do_return_home() {
        state = state_go_home;

        DEBUG_VAR bool no_switch = continue_on_thread(home_thread(), this);
        rassert(!no_switch);
    }