#ifndef PERSISTENT_STORAGE_H #define PERSISTENT_STORAGE_H #include #include #include "utility/file/FilePath.h" #include "data/access/StorageAccess.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 addFile(const std::string& name, const std::string& filePath, const std::string& modificationTime); virtual Id addNode(int type, const std::string& serializedName, int definitionType); virtual Id addEdge(int type, Id sourceId, Id targetId); virtual Id addLocalSymbol(const std::string& name); virtual void addSourceLocation(Id elementId, Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type); virtual void addComponentAccess(Id edgeId , int type); virtual void addCommentLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol); virtual void addError(const std::string& message, bool fatal, const std::string& filePath, uint startLine, uint startCol); virtual void forEachFile(std::function callback) const; virtual void forEachNode(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 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(); FilePath getDbFilePath() const; Version getVersion() const; void init(); void clear(); void clearCaches(); std::set getDependingFilePaths(const std::set& filePaths); std::set getDependingFilePaths(const FilePath& filePath); void clearFileElements(const std::vector& filePaths); void removeUnusedNames(); std::vector getInfoOnAllFiles() const; void logStats() const; void startParsing(); void finishParsing(); // StorageAccess implementation virtual Id getIdForNodeWithNameHierarchy(const NameHierarchy& nameHierarchy) const; virtual Id getIdForEdge( Edge::EdgeType type, const NameHierarchy& fromNameHierarchy, const NameHierarchy& toNameHierarchy) const; virtual NameHierarchy getNameHierarchyForNodeWithId(Id nodeId) const; virtual Node::NodeType getNodeTypeForNodeWithId(Id nodeId) const; virtual std::shared_ptr getFullTextSearchLocations(const std::string& searchTerm) const; virtual std::vector getAutocompletionMatches(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) const; virtual std::vector getActiveTokenIdsForId(Id tokenId, Id* declarationId) const; virtual std::vector getNodeIdsForLocationIds(const std::vector& locationIds) const; virtual std::vector getLocalSymbolIdsForLocationIds(const std::vector& locationIds) const; virtual std::vector getTokenIdsForMatches(const std::vector& matches) const; virtual Id getTokenIdForFileNode(const FilePath& filePath) const; virtual std::vector getTokenIdsForAggregationEdge(Id sourceId, Id targetId) 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 TokenLocationCollection getErrorTokenLocations(std::vector* errors) 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 ErrorCountInfo getErrorCount() const; virtual StorageStats getStorageStats() const; private: Id getFileNodeId(const FilePath& filePath) const; FilePath getFileNodePath(Id fileId) const; 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, Graph* graph) const; void addComponentAccessToGraph(Graph* graph) const; void buildSearchIndex(); void buildHierarchyCache(); void optimizeFTSTable(); void log(std::string type, std::string str, const ParseLocation& location) const; int m_preInjectionErrorCount; SearchIndex m_commandIndex; SearchIndex m_elementIndex; SqliteStorage m_sqliteStorage; mutable std::map m_fileNodeIds; HierarchyCache m_hierarchyCache; }; #endif // PERSISTENT_STORAGE_H