#ifndef PERSISTENT_STORAGE_H #define PERSISTENT_STORAGE_H #include #include #include "data/access/StorageAccess.h" #include "data/fulltextsearch/FullTextSearchIndex.h" #include "data/search/SearchIndex.h" #include "data/HierarchyCache.h" #include "data/storage/sqlite/SqliteIndexStorage.h" #include "data/storage/sqlite/SqliteBookmarkStorage.h" #include "data/storage/Storage.h" class PersistentStorage : public Storage , public StorageAccess { public: PersistentStorage(const FilePath& dbPath, const FilePath& bookmarkPath); virtual ~PersistentStorage(); virtual Id addNode(const StorageNodeData& data) override; virtual void addSymbol(const StorageSymbol& data) override; virtual void addFile(const StorageFile& data) override; virtual Id addEdge(const StorageEdgeData& data) override; virtual Id addLocalSymbol(const StorageLocalSymbolData& data) override; virtual Id addSourceLocation(const StorageSourceLocationData& data) override; virtual void addOccurrence(const StorageOccurrence& data) override; virtual void addComponentAccess(const StorageComponentAccessData& data) override; virtual void addCommentLocation(const StorageCommentLocationData& data) override; virtual void addError(const StorageErrorData& data) override; virtual void forEachNode(std::function callback) const override; virtual void forEachFile(std::function callback) const override; virtual void forEachSymbol(std::function callback) const override; virtual void forEachEdge(std::function callback) const override; virtual void forEachLocalSymbol(std::function callback) const override; virtual void forEachSourceLocation(std::function callback) const override; virtual void forEachOccurrence(std::function callback) const override; virtual void forEachComponentAccess(std::function callback) const override; virtual void forEachCommentLocation(std::function callback) const override; virtual void forEachError(std::function callback) const override; virtual void startInjection() override; virtual void finishInjection() override; void setMode(const SqliteIndexStorage::StorageModeType mode); FilePath getDbFilePath() const; bool isEmpty() const; bool isIncompatible() const; std::string getProjectSettingsText() const; void setProjectSettingsText(std::string text); void setup(); void clear(); void clearCaches(); std::set getReferenced(const std::set& filePaths); std::set getReferencing(const std::set& filePaths); void clearFileElements(const std::vector& filePaths, std::function updateStatusCallback); std::vector getFileInfoForAllFiles() const; std::set getIncompleteFiles() const; void buildCaches(); void optimizeMemory(); // StorageAccess implementation virtual Id getNodeIdForFileNode(const FilePath& filePath) const override; virtual Id getNodeIdForNameHierarchy(const NameHierarchy& nameHierarchy) const override; virtual std::vector getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const override; virtual NameHierarchy getNameHierarchyForNodeId(Id nodeId) const override; virtual std::vector getNameHierarchiesForNodeIds(const std::vector& nodeIds) const override; virtual NodeType getNodeTypeForNodeWithId(Id nodeId) const override; virtual Id getIdForEdge( Edge::EdgeType type, const NameHierarchy& fromNameHierarchy, const NameHierarchy& toNameHierarchy) const override; virtual StorageEdge getEdgeById(Id edgeId) const override; virtual std::shared_ptr getFullTextSearchLocations( const std::wstring& searchTerm, bool caseSensitive) const override; virtual std::vector getAutocompletionMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const override; std::vector getAutocompletionSymbolMatches( const std::wstring& query, const NodeTypeSet& acceptedNodeTypes, size_t maxResultsCount, size_t maxBestScoredResultsLength) const; std::vector getAutocompletionFileMatches(const std::wstring& query, size_t maxResultsCount) const; std::vector getAutocompletionCommandMatches(const std::wstring& query, NodeTypeSet acceptedNodeTypes) const; virtual std::vector getSearchMatchesForTokenIds(const std::vector& elementIds) const override; virtual std::shared_ptr getGraphForAll() const override; virtual std::shared_ptr getGraphForNodeTypes(NodeTypeSet nodeTypes) const override; virtual std::shared_ptr getGraphForActiveTokenIds( const std::vector& tokenIds, const std::vector& expandedNodeIds, bool* isActiveNamespace = nullptr) const override; virtual std::shared_ptr getGraphForChildrenOfNodeId(Id nodeId) const override; virtual std::shared_ptr getGraphForTrail(Id originId, Id targetId, Edge::TypeMask trailType, size_t depth) const override; virtual std::vector getActiveTokenIdsForId(Id tokenId, Id* declarationId) const override; virtual std::vector getNodeIdsForLocationIds(const std::vector& locationIds) const override; virtual std::shared_ptr getSourceLocationsForTokenIds(const std::vector& tokenIds) const override; virtual std::shared_ptr getSourceLocationsForLocationIds(const std::vector& locationIds) const override; virtual std::shared_ptr getSourceLocationsForFile(const FilePath& filePath) const override; virtual std::shared_ptr getSourceLocationsForLinesInFile( const FilePath& filePath, uint firstLineNumber, uint lastLineNumber ) const override; virtual std::shared_ptr getCommentLocationsInFile(const FilePath& filePath) const override; virtual std::shared_ptr getFileContent(const FilePath& filePath) const override; virtual FileInfo getFileInfoForFilePath(const FilePath& filePath) const override; virtual std::vector getFileInfosForFilePaths(const std::vector& filePaths) const override; virtual StorageStats getStorageStats() const override; virtual ErrorCountInfo getErrorCount() const override; virtual ErrorCountInfo getErrorCount(const std::vector& errors) const; virtual std::vector getErrors() const; virtual std::vector getErrorsLimited() const override; virtual std::shared_ptr getErrorSourceLocationsLimited(std::vector* errors) const override; virtual Id addNodeBookmark(const NodeBookmark& bookmark) override; virtual Id addEdgeBookmark(const EdgeBookmark& bookmark) override; virtual Id addBookmarkCategory(const std::wstring& categoryName) override; virtual void updateBookmark(const Id bookmarkId, const std::wstring& name, const std::wstring& comment, const std::wstring& categoryName) override; virtual void removeBookmark(const Id id) override; virtual void removeBookmarkCategory(const Id id) override; virtual std::vector getAllNodeBookmarks() const override; virtual std::vector getAllEdgeBookmarks() const override; virtual std::vector getAllBookmarkCategories() const override; virtual TooltipInfo getTooltipInfoForTokenIds(const std::vector& tokenIds, TooltipOrigin origin) const override; TooltipSnippet getTooltipSnippetForNode(const StorageNode& node) const; virtual TooltipInfo getTooltipInfoForSourceLocationIdsAndLocalSymbolIds( const std::vector& locationIds, const std::vector& localSymbolIds) const override; private: Id getFileNodeId(const FilePath& filePath) const; std::vector getFileNodeIds(const std::vector& filePaths) const; std::set getFileNodeIds(const std::set& filePaths) const; FilePath getFileNodePath(Id fileId) const; bool getFilePathComplete(const FilePath& filePath) const; bool getFileNodeComplete(Id fileId) const; std::unordered_map> getFileIdToIncludingFileIdMap() const; std::unordered_map> getFileIdToImportingFileIdMap() const; std::set getReferenced(const std::set& filePaths, std::unordered_map> idToReferencingIdMap) const; std::set getReferencing(const std::set& filePaths, std::unordered_map> idToReferencingIdMap) const; std::set getReferencedByIncludes(const std::set& filePaths); std::set getReferencedByImports(const std::set& filePaths); std::set getReferencingByIncludes(const std::set& filePaths); std::set getReferencingByImports(const std::set& filePaths); void addNodesToGraph(const std::vector& nodeIds, Graph* graph, bool addChildCount) const; void addEdgesToGraph(const std::vector& edgeIds, Graph* graph) const; void addNodesWithParentsAndEdgesToGraph( const std::vector& nodeIds, const std::vector& edgeIds, Graph* graphh, bool addChildCount) const; void addAggregationEdgesToGraph(const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const; void addComponentAccessToGraph(Graph* graph) const; void addCompleteFlagsToSourceLocationCollection(SourceLocationCollection* collection) const; void addInheritanceChainsToGraph(const std::vector& nodeIds, Graph* graph) const; void buildFilePathMaps(); void buildSearchIndex(); void buildFullTextSearchIndex() const; void buildMemberEdgeIdOrderMap(); void buildHierarchyCache(); size_t m_preInjectionErrorCount = 0; SearchIndex m_commandIndex; SearchIndex m_symbolIndex; SearchIndex m_fileIndex; mutable FullTextSearchIndex m_fullTextSearchIndex; mutable std::string m_fullTextSearchCodec; SqliteIndexStorage m_sqliteIndexStorage; SqliteBookmarkStorage m_sqliteBookmarkStorage; std::map m_fileNodeIds; std::map m_fileNodePaths; std::map m_fileNodeComplete; std::map m_symbolDefinitionKinds; std::map m_memberEdgeIdOrderMap; HierarchyCache m_hierarchyCache; bool m_hasJavaFiles = false; }; #endif // PERSISTENT_STORAGE_H