#pragma once #include #include class SlabAllocator; class SnapshotPayloadParseState { enum class ParseStageName { None, Global, MetaData, Databases, Dataset, KeyValuePair, }; struct ParseStage { ParseStageName name; long long arraylen = 0; long long arraycur = 0; std::array, 2> arrvalues; ParseStage() { for (auto &pair : arrvalues) { pair.first = nullptr; pair.second = 0; } } }; std::stack stackParse; std::vector vecqueuedKeys; std::vector vecqueuedKeysCb; std::vector vecqueuedVals; std::vector vecqueuedValsCb; std::atomic insertsInFlight; std::unique_ptr m_spallocator; dict *dictLongLongMetaData = nullptr; size_t cbQueued = 0; static const size_t queuedBatchLimit = 64*1024*1024; // 64 MB int current_database = -1; ParseStageName getNextStage(); void flushQueuedKeys(); public: SnapshotPayloadParseState(); ~SnapshotPayloadParseState(); long long getMetaDataLongLong(const char *field) const; const char *getStateDebugName(); size_t depth() const; void trimState(); void pushArray(long long size); void pushValue(const char *rgch, long long cch); void pushValue(long long value); bool shouldThrottle() const { return insertsInFlight > (cserver.cthreads*4); } };