function Rserve_eval($socket, $command, $attr = NULL)
{
    $pkt = mkp_str(3, $command);
    socket_send($socket, $pkt, strlen($pkt), 0);
    $r = get_rsp($socket);
    $res = int32($r);
    $sc = $res >> 24 & 127;
    $rr = $res & 255;
    if ($rr != 1) {
        echo "eval failed with error code " . $sc;
        return FALSE;
    }
    if (int8($r, 16) != 10) {
        echo "invalid response (expecting SEXP)";
        return FALSE;
    }
    $i = 20;
    return parse_SEXP($r, $i, &$attr);
}
Пример #2
0
function Rserve_assign_raw($socket, $name, $what)
{
    // CMD_setSEXP
    $bl = strlen($what);
    if ($bl > 16777088) {
        trigger_error("Body in Rserve_assign_raw is too big ({$bl} bytes), only small QAP packets are currently supported.");
    }
    $n = strlen($name) + 1;
    $name .= chr(0);
    while (($n & 3) != 0) {
        $name .= chr(1);
        $n++;
    }
    // [CMD_setSEXP][DT_STRING(name)][DT_SEXP([XT_RAW, (i32) len, what])] = payload + 4 + 4 + 8
    $pkt = mkint32(0x20) . mkint32($n + $bl + 16) . mkint32(0) . mkint32(0) . chr(4) . mkint24($n) . $name . chr(10) . mkint24($bl + 8) . chr(37) . mkint24($bl + 4) . mkint32($bl) . $what;
    socket_send($socket, $pkt, strlen($pkt), 0);
    $r = get_rsp($socket);
    $res = int32($r);
    $sc = $res >> 24 & 127;
    $rr = $res & 255;
    if ($rr != 1) {
        echo "eval failed with error code " . $sc;
        return FALSE;
    }
    return TRUE;
}