public function update($query, array $options = array())
{
$params = compact('query', 'options');
$conn =& $this->connection;
$config = $this->_config;
return $this->_filter(__METHOD__, $params, function ($self, $params) use(&$conn, $config) {
$query = $params['query'];
$options = $params['options'];
$params = $query->export($self);
list($_path, $conditions) = (array) $params['conditions'];
$data = $query->data();
foreach (array('id', 'rev') as $key) {
$data["_{$key}"] = isset($data[$key]) ? (string) $data[$key] : null;
unset($data[$key]);
}
$data = (array) $conditions + array_filter((array) $data);
$retry = false;
do {
$result = $conn->put("{$config['database']}/{$_path}", $data, array('type' => 'json'));
$result = is_string($result) ? json_decode($result, true) : $result;
$retry = $retry ? !$retry : $self->invokeMethod('_autoBuild', array($result));
} while ($retry);
if (isset($result['_id']) || isset($result['ok']) && $result['ok'] === true) {
$result = $self->invokeMethod('_format', array($result, $options));
$query->entity()->sync($result['id'], array('rev' => $result['rev']));
return true;
}
if (isset($result['error'])) {
$query->entity()->errors(array($result['error']));
}
return false;
});
}