QueryResultV8 Query::executeV8 (v8::Isolate* isolate, QueryRegistry* registry) { // Now start the execution: try { QueryResultV8 res = prepare(registry); if (res.code != TRI_ERROR_NO_ERROR) { return res; } uint32_t j = 0; QueryResultV8 result(TRI_ERROR_NO_ERROR); result.result = v8::Array::New(isolate); triagens::basics::Json stats; AqlItemBlock* value; while (nullptr != (value = _engine->getSome(1, ExecutionBlock::DefaultBatchSize))) { auto doc = value->getDocumentCollection(0); size_t const n = value->size(); // reserve space for n additional results at once /// json.reserve(n); for (size_t i = 0; i < n; ++i) { AqlValue val = value->getValue(i, 0); if (! val.isEmpty()) { result.result->Set(j++, val.toV8(isolate, _trx, doc)); } } delete value; } stats = _engine->_stats.toJson(); _trx->commit(); cleanupPlanAndEngine(TRI_ERROR_NO_ERROR); enterState(FINALIZATION); result.warnings = warningsToJson(TRI_UNKNOWN_MEM_ZONE); result.stats = stats.steal(); if (_profile != nullptr && profiling()) { result.profile = _profile->toJson(TRI_UNKNOWN_MEM_ZONE); } return result; } catch (triagens::basics::Exception const& ex) { cleanupPlanAndEngine(ex.code()); return QueryResultV8(ex.code(), ex.message() + getStateString()); } catch (std::bad_alloc const&) { cleanupPlanAndEngine(TRI_ERROR_OUT_OF_MEMORY); return QueryResultV8(TRI_ERROR_OUT_OF_MEMORY, TRI_errno_string(TRI_ERROR_OUT_OF_MEMORY) + getStateString()); } catch (std::exception const& ex) { cleanupPlanAndEngine(TRI_ERROR_INTERNAL); return QueryResultV8(TRI_ERROR_INTERNAL, ex.what() + getStateString()); } catch (...) { cleanupPlanAndEngine(TRI_ERROR_INTERNAL); return QueryResult(TRI_ERROR_INTERNAL, TRI_errno_string(TRI_ERROR_INTERNAL) + getStateString()); } }