function UpdateAttributes($index, $attrs, $values, $mva = false)
{
// verify everything
assert(is_string($index));
assert(is_bool($mva));
assert(is_array($attrs));
foreach ($attrs as $attr) {
assert(is_string($attr));
}
assert(is_array($values));
foreach ($values as $id => $entry) {
assert(is_numeric($id));
assert(is_array($entry));
assert(count($entry) == count($attrs));
foreach ($entry as $v) {
if ($mva) {
assert(is_array($v));
foreach ($v as $vv) {
assert(is_int($vv));
}
} else {
assert(is_int($v));
}
}
}
// build request
$this->_MBPush();
$req = pack("N", strlen($index)) . $index;
$req .= pack("N", count($attrs));
foreach ($attrs as $attr) {
$req .= pack("N", strlen($attr)) . $attr;
$req .= pack("N", $mva ? 1 : 0);
}
$req .= pack("N", count($values));
foreach ($values as $id => $entry) {
$req .= sphPackU64($id);
foreach ($entry as $v) {
$req .= pack("N", $mva ? count($v) : $v);
if ($mva) {
foreach ($v as $vv) {
$req .= pack("N", $vv);
}
}
}
}
// connect, send query, get response
if (!($fp = $this->_Connect())) {
$this->_MBPop();
return -1;
}
$len = strlen($req);
$req = pack("nnN", SEARCHD_COMMAND_UPDATE, VER_COMMAND_UPDATE, $len) . $req;
// add header
if (!$this->_Send($fp, $req, $len + 8)) {
$this->_MBPop();
return -1;
}
if (!($response = $this->_GetResponse($fp, VER_COMMAND_UPDATE))) {
$this->_MBPop();
return -1;
}
// parse response
list(, $updated) = unpack("N*", substr($response, 0, 4));
$this->_MBPop();
return $updated;
}