function import_process_data(&$user, &$data, $more = array())
{
    #
    # First do some sanity-checking on the data before
    # we bother to create a sheet.
    #
    $rsp = import_ensure_valid_data($data);
    if (!$rsp['ok']) {
        return $rsp;
    }
    #
    # CAN I HAS MAH SHEET?
    #
    $sheet_rsp = sheets_create_sheet($user, $more);
    if (!$sheet_rsp['ok']) {
        return $sheet_rsp;
    }
    $sheet = $sheet_rsp['sheet'];
    #
    # OMG!!! IT'S FULL OF DOTS!!!!
    #
    $more['skip_validation'] = 1;
    # see above
    $dots_rsp = dots_import_dots($user, $sheet_rsp['sheet'], $data, $more);
    # No soup for sheet! Or is it the other way around...
    if (!$dots_rsp['ok']) {
        sheets_delete_sheet($sheet);
    } else {
        $dots_rsp['sheet'] = $sheet;
        $count_rsp = sheets_update_dot_count_for_sheet($sheet);
        $dots_rsp['update_sheet_count'] = $count_rsp['ok'];
        if ($more['return_dots']) {
            $dots_rsp['dots'] = dots_get_dots_for_sheet($sheet, $sheet['user_id']);
        }
    }
    return $dots_rsp;
}
function dots_delete_dot(&$dot, $more = array())
{
    #
    # Update the search and extras table (check to see that
    # we haven't already done this, for example if we're in
    # the process of deleting a user or a sheet)
    #
    if (!isset($more['skip_update_search'])) {
        $search_rsp = dots_search_remove_dot($dot);
        if (!$search_rsp['ok']) {
            # What?
        }
        $extras_rsp = dots_search_extras_remove_dot($dot);
        if (!$extras_rsp['ok']) {
            # What?
        }
    }
    #
    # Okay. Let's start deleting the dot itself!
    #
    $user = users_get_by_id($dot['user_id']);
    $enc_id = AddSlashes($dot['id']);
    $sql = "DELETE FROM Dots WHERE id='{$enc_id}'";
    $rsp = db_write_users($user['cluster_id'], $sql);
    if (!$rsp['ok']) {
        return $rsp;
    }
    if (!isset($more['skip_update_sheet'])) {
        $sheet = sheets_get_sheet($dot['sheet_id']);
        $rsp2 = sheets_update_dot_count_for_sheet($sheet);
        $rsp['update_sheet_count'] = $rsp2['ok'];
    }
    #
    # Update the extras table
    #
    $extras_rsp = dots_search_extras_remove_dot($dot);
    if (!$extras_rsp['ok']) {
        # What?
    }
    #
    # Update the lookup table
    #
    $lookup_update = array('deleted' => time());
    $lookup_rsp = dots_lookup_update($dot, $lookup_update);
    if (!$lookup_rsp['ok']) {
        # What?
    }
    #
    if ($rsp['ok']) {
        $cache_keys = array("dot_{$dot['id']}", "dot_bookends_{$dot['id']}", "dot_bookends_{$dot['id']}_public", "dots_for_sheet_{$dot['sheet_id']}", "dots_for_sheet_{$dot['sheet_id']}_public", "dots_count_for_sheet_{$dot['sheet_id']}", "sheet_extent_{$dot['sheet_id']}", "sheet_extent_{$dot['sheet_id']}_public");
        foreach ($cache_keys as $key) {
            cache_unset($key);
        }
    }
    return $rsp;
}