diff --git a/src/app/qt/element/QtCodeFile.cpp b/src/app/qt/element/QtCodeFile.cpp index 2f249f6d..ce54feed 100644 --- a/src/app/qt/element/QtCodeFile.cpp +++ b/src/app/qt/element/QtCodeFile.cpp @@ -360,7 +360,7 @@ void QtCodeFile::clickedMaximizeButton() } else { - MessageShowFile(m_filePath.str(), 0, 0).dispatch(); + MessageShowFile(m_filePath, 0, 0).dispatch(); } m_minimizeButton->setEnabled(true); diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index 98f6141e..f48aa887 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -114,10 +114,10 @@ void CodeController::handleMessage(MessageShowFile* message) params.startLineNumber = message->startLineNumber; params.endLineNumber = message->endLineNumber; - std::shared_ptr textAccess = TextAccess::createFromFile(message->filePath); + std::shared_ptr textAccess = m_storageAccess->getFileContent(message->filePath); params.code = textAccess->getText(); - params.locationFile = m_storageAccess->getTokenLocationsForFile(message->filePath); + params.locationFile = m_storageAccess->getTokenLocationsForFile(message->filePath.str()); getView()->showCodeFile(params); } @@ -221,7 +221,7 @@ std::vector CodeController::getSnippetsForActiveTok std::vector CodeController::getSnippetsForFile(std::shared_ptr file) const { - std::shared_ptr textAccess = TextAccess::createFromFile(file->getFilePath().str()); + std::shared_ptr textAccess = m_storageAccess->getFileContent(file->getFilePath()); std::deque ranges; diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index 1514afe8..40c354a3 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -3,6 +3,7 @@ #include "data/graph/Node.h" #include "data/location/TokenLocation.h" #include "utility/logging/logging.h" +#include "utility/text/TextAccess.h" #include "utility/utility.h" #include "utility/utilityString.h" @@ -80,12 +81,16 @@ Id SqliteStorage::addNode(int type, Id nameId) Id SqliteStorage::addFile(Id nameId, const std::string& filePath, const std::string& modificationTime) { Id id = addNode(Node::NODE_FILE, nameId); + std::shared_ptr content = TextAccess::createFromFile(filePath); - m_database.execDML(( - "INSERT INTO file(id, path, modification_time) VALUES(" - + std::to_string(id) + ", '" + filePath + "', '" + modificationTime + "');" + CppSQLite3Statement stmt = m_database.compileStatement(( + "INSERT INTO file(id, path, modification_time, content) VALUES(" + + std::to_string(id) + ", '" + filePath + "', '" + modificationTime + "', ?);" ).c_str()); + stmt.bind(1, content->getText().c_str()); + stmt.execDML(); + return id; } @@ -449,6 +454,20 @@ std::vector SqliteStorage::getAllFiles() const return getAllFiles("SELECT file.id, node.name_id, file.path, file.modification_time FROM file INNER JOIN node ON file.id = node.id;"); } +std::shared_ptr SqliteStorage::getFileContentByPath(const std::string& filePath) const +{ + CppSQLite3Query q = m_database.execQuery(( + "SELECT content FROM file WHERE path = '" + filePath + "';" + ).c_str()); + + if (!q.eof()) + { + return TextAccess::createFromString(q.getStringField(0, "")); + } + + return TextAccess::createFromFile(filePath); +} + void SqliteStorage::setNodeType(int type, Id nodeId) { m_database.execDML(( @@ -721,6 +740,7 @@ void SqliteStorage::setupTables() "id INTEGER NOT NULL, " "path TEXT, " "modification_time TEXT, " + "content TEXT, " "PRIMARY KEY(id), " "FOREIGN KEY(id) REFERENCES node(id) ON DELETE CASCADE);" ); diff --git a/src/lib/data/SqliteStorage.h b/src/lib/data/SqliteStorage.h index d091bd1f..2a180cec 100644 --- a/src/lib/data/SqliteStorage.h +++ b/src/lib/data/SqliteStorage.h @@ -14,6 +14,8 @@ #include "data/location/TokenLocationCollection.h" #include "data/StorageTypes.h" +class TextAccess; + class SqliteStorage { public: @@ -71,6 +73,7 @@ public: StorageFile getFileByName(const std::string& fileName) const; StorageFile getFileByPath(const std::string& filePath) const; std::vector getAllFiles() const; + std::shared_ptr getFileContentByPath(const std::string& filePath) const; void setNodeType(int type, Id nodeId); diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index ab1ec26b..e0a70c46 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -1149,6 +1149,11 @@ std::shared_ptr Storage::getTokenLocationOfParentScope(const return file; } +std::shared_ptr Storage::getFileContent(const FilePath& filePath) const +{ + return m_sqliteStorage.getFileContentByPath(filePath.str()); +} + const SearchIndex& Storage::getSearchIndex() const { return m_tokenIndex; @@ -1293,7 +1298,7 @@ Id Storage::addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type, Parse return edgeId; } -Id Storage::getFileNodeId(const FilePath& filePath) +Id Storage::getFileNodeId(const FilePath& filePath) const { std::map::const_iterator it = m_fileNodeIds.find(filePath); diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index b129693d..1c4c695d 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -152,9 +152,10 @@ public: ) const; virtual TokenLocationCollection getErrorTokenLocations(std::vector* errorMessages) const; - virtual std::shared_ptr getTokenLocationOfParentScope(const TokenLocation* child) const; + virtual std::shared_ptr getFileContent(const FilePath& filePath) const; + const SearchIndex& getSearchIndex() const; private: @@ -166,7 +167,7 @@ private: Id addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type); Id addEdge(Id sourceNodeId, Id targetNodeId, Edge::EdgeType type, ParseLocation location); - Id getFileNodeId(const FilePath& filePath); + Id getFileNodeId(const FilePath& filePath) const; Id getLastVisibleParentNodeId(const Id nodeId) const; std::vector getAllChildNodeIds(const Id nodeId) const; @@ -191,7 +192,7 @@ private: SearchIndex m_tokenIndex; SqliteStorage m_sqliteStorage; - std::map m_fileNodeIds; + mutable std::map m_fileNodeIds; HierarchyCache m_hierarchyCache; TokenLocationCollection m_errorLocationCollection; diff --git a/src/lib/data/access/StorageAccess.h b/src/lib/data/access/StorageAccess.h index 782465a5..78e4e755 100644 --- a/src/lib/data/access/StorageAccess.h +++ b/src/lib/data/access/StorageAccess.h @@ -13,6 +13,7 @@ struct FileInfo; class Graph; +class TextAccess; class TokenLocation; class TokenLocationCollection; class TokenLocationFile; @@ -51,6 +52,8 @@ public: virtual TokenLocationCollection getErrorTokenLocations(std::vector* errorMessages) const = 0; virtual std::shared_ptr getTokenLocationOfParentScope(const TokenLocation* child) const = 0; + + virtual std::shared_ptr getFileContent(const FilePath& filePath) const = 0; }; #endif // STORAGE_ACCESS_H diff --git a/src/lib/data/access/StorageAccessProxy.cpp b/src/lib/data/access/StorageAccessProxy.cpp index 6654d10f..757edbbc 100644 --- a/src/lib/data/access/StorageAccessProxy.cpp +++ b/src/lib/data/access/StorageAccessProxy.cpp @@ -224,3 +224,13 @@ std::shared_ptr StorageAccessProxy::getTokenLocationOfParentS return std::make_shared(""); } + +std::shared_ptr StorageAccessProxy::getFileContent(const FilePath& filePath) const +{ + if (hasSubject()) + { + return m_subject->getFileContent(filePath); + } + + return nullptr; +} diff --git a/src/lib/data/access/StorageAccessProxy.h b/src/lib/data/access/StorageAccessProxy.h index 7c3e3aa0..934872e9 100644 --- a/src/lib/data/access/StorageAccessProxy.h +++ b/src/lib/data/access/StorageAccessProxy.h @@ -42,9 +42,10 @@ public: ) const; virtual TokenLocationCollection getErrorTokenLocations(std::vector* errorMessages) const; - virtual std::shared_ptr getTokenLocationOfParentScope(const TokenLocation* child) const; + virtual std::shared_ptr getFileContent(const FilePath& filePath) const; + private: StorageAccess* m_subject; }; diff --git a/src/lib/utility/ConfigManager.cpp b/src/lib/utility/ConfigManager.cpp index 8cdd7506..f157e68f 100644 --- a/src/lib/utility/ConfigManager.cpp +++ b/src/lib/utility/ConfigManager.cpp @@ -18,6 +18,11 @@ std::shared_ptr ConfigManager::createAndLoad(const std::shared_pt return configManager; } +void ConfigManager::clear() +{ + m_values.clear(); +} + bool ConfigManager::getValue(const std::string& key, std::string& value) const { std::multimap::const_iterator it = m_values.find(key); @@ -246,13 +251,19 @@ bool ConfigManager::createXmlDocument(bool saveAsFile, const std::string filepat for(std::multimap::iterator it = m_values.begin(); it != m_values.end(); ++it) { + if (!it->first.size() || !it->second.size()) + { + continue; + } + std::vector tokens = utility::splitToVector(it->first, "/"); + TiXmlElement* element = doc.RootElement(); TiXmlElement* child; - while(tokens.size() > 1) + while (tokens.size() > 1) { child = element->FirstChildElement(tokens.front().c_str()); - if(!child) + if (!child) { child = new TiXmlElement(tokens.front().c_str()); element->LinkEndChild(child); diff --git a/src/lib/utility/ConfigManager.h b/src/lib/utility/ConfigManager.h index 87f3ed13..0aeed0fc 100644 --- a/src/lib/utility/ConfigManager.h +++ b/src/lib/utility/ConfigManager.h @@ -15,6 +15,8 @@ public: static std::shared_ptr createEmpty(); static std::shared_ptr createAndLoad(const std::shared_ptr textAccess); + void clear(); + bool getValue(const std::string& key, std::string& value) const; bool getValue(const std::string& key, int& value) const; bool getValue(const std::string& key, float& value) const; @@ -46,6 +48,7 @@ private: void parseSubtree(TiXmlNode* parentElement, const std::string& currentPath); bool createXmlDocument(bool saveAsFile, std::string filepath, std::string& output); + std::multimap m_values; }; diff --git a/src/lib/utility/messaging/type/MessageShowFile.h b/src/lib/utility/messaging/type/MessageShowFile.h index cf1c15ee..f296b266 100644 --- a/src/lib/utility/messaging/type/MessageShowFile.h +++ b/src/lib/utility/messaging/type/MessageShowFile.h @@ -1,13 +1,15 @@ #ifndef MESSAGE_SHOW_FILE_H #define MESSAGE_SHOW_FILE_H +#include "utility/file/FilePath.h" #include "utility/messaging/Message.h" #include "utility/types.h" -class MessageShowFile: public Message +class MessageShowFile + : public Message { public: - MessageShowFile(const std::string& filePath, uint startLineNumber, uint endLineNumber) + MessageShowFile(const FilePath& filePath, uint startLineNumber, uint endLineNumber) : filePath(filePath) , startLineNumber(startLineNumber) , endLineNumber(endLineNumber) @@ -19,7 +21,7 @@ public: return "MessageShowFile"; } - const std::string filePath; + const FilePath filePath; const uint startLineNumber; const uint endLineNumber; };