public function findOne($p, $cb)
{
if (isset($p['cachekey'])) {
$db = $this;
$this->cache->get($p['cachekey'], function ($r) use($db, $p, $cb) {
if ($r->result !== null) {
$cb(bson_decode($r->result));
} else {
unset($p['cachekey']);
$db->findOne($p, $cb);
}
});
return;
}
if (!isset($p['where'])) {
$p['where'] = [];
}
$this->_params($p);
$o = [];
$s = false;
foreach ($p as $k => $v) {
if ($k === 'sort' || $k === 'hint' || $k === 'explain' || $k === 'snapshot') {
if (!$s) {
$s = true;
}
if ($k === 'sort') {
$o['orderby'] = $v;
} elseif ($k === 'parse_oplog') {
} elseif ($k === 'rp') {
$o['$readPreference'] = $v;
} else {
$o[$k] = $v;
}
}
}
if (empty($o['orderby'])) {
unset($o['orderby']);
}
if ($s) {
$o['query'] = $p['where'];
} else {
$o = $p['where'];
}
$cb = CallbackWrapper::wrap($cb);
if ($this->safeMode) {
static::safeModeEnc($o);
}
try {
$this->request(self::OP_QUERY, pack('V', $p['opts']) . $p['col'] . "" . pack('VV', $p['offset'], -1) . bson_encode($o) . (isset($p['fields']) ? bson_encode($p['fields']) : ''), true, null, function ($conn, $reqId = null) use($p, $cb) {
if (!$conn) {
!$cb || $cb(['$err' => 'Connection error.']);
return;
}
$conn->requests[$reqId] = [$p['col'], $cb, true];
});
} catch (\MongoException $e) {
Daemon::log('MongoClient exception: ' . $e->getMessage() . ': ' . $e->getTraceAsString());
if ($cb !== null) {
$cb(['$err' => $e->getMessage(), '$query' => $o, '$fields' => isset($p['fields']) ? $p['fields'] : null]);
}
}
}