#ifndef PERSISTENT_STORAGE_H #define PERSISTENT_STORAGE_H #include #include #include "utility/file/FilePath.h" #include "data/access/StorageAccess.h" #include "data/fulltextsearch/FullTextSearchIndex.h" #include "data/graph/token_component/TokenComponentAccess.h" #include "data/location/TokenLocationCollection.h" #include "data/parser/ParserClient.h" #include "data/parser/ParseLocation.h" #include "data/search/SearchIndex.h" #include "data/HierarchyCache.h" #include "data/SqliteStorage.h" #include "data/Storage.h" #include "data/parser/ParserClientImpl.h" class PersistentStorage : public Storage , public StorageAccess { public: PersistentStorage(const FilePath& dbPath); virtual ~PersistentStorage(); virtual Id addNode(int type, const std::string& serializedName); virtual void addFile(const Id id, const std::string& filePath, const std::string& modificationTime); virtual void addSymbol(const Id id, int definitionKind); virtual Id addEdge(int type, Id sourceId, Id targetId); virtual Id addLocalSymbol(const std::string& name); virtual Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type); virtual void addOccurrence(Id elementId, Id sourceLocationId); virtual void addComponentAccess(Id nodeId , int type); virtual void addCommentLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol); virtual void addError(const std::string& message, const FilePath& filePath, uint startLine, uint startCol, bool fatal, bool indexed); virtual Id addNodeBookmark(const NodeBookmark& bookmark); virtual Id addEdgeBookmark(const EdgeBookmark& bookmark); virtual Id addBookmarkCategory(const BookmarkCategory& category); virtual std::vector getAllNodeBookmarks() const; virtual NodeBookmark getNodeBookmarkById(const Id bookmarkId) const; virtual bool checkNodeBookmarkExistsByTokens(const std::vector& tokenNames) const; virtual void removeNodeBookmark(Id id); virtual void editNodeBookmark(const NodeBookmark& bookmark); virtual std::vector getAllEdgeBookmarks() const; virtual EdgeBookmark getEdgeBookmarkById(const Id bookmarkId) const; virtual bool checkEdgeBookmarkExistsByTokens(const std::vector& tokenNames) const; virtual void removeEdgeBookmark(Id id); virtual void editEdgeBookmark(const EdgeBookmark& bookmark); virtual bool checkBookmarkCategoryExists(const std::string& name) const; virtual std::vector getAllBookmarkCategories() const; virtual void removeBookmarkCategory(Id id); virtual void forEachNode(std::function callback) const; virtual void forEachFile(std::function callback) const; virtual void forEachSymbol(std::function callback) const; virtual void forEachEdge(std::function callback) const; virtual void forEachLocalSymbol(std::function callback) const; virtual void forEachSourceLocation(std::function callback) const; virtual void forEachOccurrence(std::function callback) const; virtual void forEachComponentAccess(std::function callback) const; virtual void forEachCommentLocation(std::function callback) const; virtual void forEachError(std::function callback) const; virtual void startInjection(); virtual void finishInjection(); void setMode(const SqliteStorage::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 getInfoOnAllFiles() const; void buildCaches(); void optimizeMemory(); // StorageAccess implementation virtual Id getNodeIdForFileNode(const FilePath& filePath) const; virtual Id getNodeIdForNameHierarchy(const NameHierarchy& nameHierarchy) const; virtual std::vector getNodeIdsForNameHierarchies(const std::vector nameHierarchies) const; virtual NameHierarchy getNameHierarchyForNodeId(Id nodeId) const; virtual std::vector getNameHierarchiesForNodeIds(const std::vector nodeIds) const; virtual Node::NodeType getNodeTypeForNodeWithId(Id nodeId) const; virtual bool checkNodeExistsByName(const std::string& serializedName) const; virtual Id getIdForEdge( Edge::EdgeType type, const NameHierarchy& fromNameHierarchy, const NameHierarchy& toNameHierarchy) const; virtual StorageEdge getEdgeById(Id edgeId) const; virtual bool checkEdgeExists(Id edgeId) const; virtual std::shared_ptr getFullTextSearchLocations( const std::string& searchTerm, bool caseSensitive) const; virtual std::vector getAutocompletionMatches(const std::string& query) const; std::vector getAutocompletionSymbolMatches(const std::string& query, size_t maxResultsCount) const; std::vector getAutocompletionFileMatches(const std::string& query, size_t maxResultsCount) const; std::vector getAutocompletionCommandMatches(const std::string& query) const; virtual std::vector getSearchMatchesForTokenIds(const std::vector& elementIds) const; virtual std::shared_ptr getGraphForAll() const; virtual std::shared_ptr getGraphForActiveTokenIds(const std::vector& tokenIds, bool* isActiveNamespace = nullptr) const; virtual std::vector getActiveTokenIdsForId(Id tokenId, Id* declarationId) const; virtual std::vector getNodeIdsForLocationIds(const std::vector& locationIds) const; virtual std::shared_ptr getTokenLocationsForTokenIds( const std::vector& tokenIds ) const; virtual std::shared_ptr getTokenLocationsForLocationIds( const std::vector& locationIds ) const; virtual std::shared_ptr getTokenLocationsForFile(const std::string& filePath) const; virtual std::shared_ptr getTokenLocationsForLinesInFile( const std::string& filePath, uint firstLineNumber, uint lastLineNumber ) const; virtual std::shared_ptr getCommentLocationsInFile(const FilePath& filePath) const; virtual std::shared_ptr getFileContent(const FilePath& filePath) const; virtual FileInfo getFileInfoForFilePath(const FilePath& filePath) const; virtual std::vector getFileInfosForFilePaths(const std::vector& filePaths) const; virtual StorageStats getStorageStats() const; virtual ErrorCountInfo getErrorCount() const; virtual std::vector getErrors() const; virtual std::shared_ptr getErrorTokenLocations(std::vector* errors) const; 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; 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); Id getLastVisibleParentNodeId(const Id nodeId) const; std::vector getAllChildNodeIds(const Id nodeId) const; void addNodesToGraph(const std::vector& nodeIds, Graph* graph) const; void addEdgesToGraph(const std::vector& edgeIds, Graph* graph) const; void addNodesWithChildrenAndEdgesToGraph( const std::vector& nodeIds, const std::vector& edgeIds, Graph* graph) const; void addAggregationEdgesToGraph(const Id nodeId, const std::vector& edgesToAggregate, Graph* graph) const; void addComponentAccessToGraph(Graph* graph) const; void buildSearchIndex(); void buildFilePathMaps(); void buildFullTextSearchIndex() const; void buildHierarchyCache(); size_t m_preInjectionErrorCount; SearchIndex m_commandIndex; SearchIndex m_symbolIndex; SearchIndex m_fileIndex; mutable FullTextSearchIndex m_fullTextSearchIndex; SqliteStorage m_sqliteStorage; mutable std::map m_fileNodeIds; mutable std::map m_fileNodePaths; HierarchyCache m_hierarchyCache; }; #endif // PERSISTENT_STORAGE_H