From 27bf5108ab5ca04bd8b472fff6bc12af2c50ab41 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Mon, 12 Oct 2015 11:42:19 +0200 Subject: [PATCH] data: fixed file clearing to clear only elements with no more source_locations --- src/lib/data/SqliteStorage.cpp | 21 +++++++++++++++++++-- src/lib/data/Storage.cpp | 4 ++-- src/lib/data/Storage.h | 4 ++-- src/lib/data/parser/ParserClient.h | 4 ++-- src/lib/data/parser/cxx/TaskParseCxx.cpp | 18 +++++++++--------- src/lib/data/parser/cxx/TaskParseCxx.h | 2 +- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index ba63fe46..8639ae87 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -162,9 +162,26 @@ void SqliteStorage::removeNameHierarchyElement(Id id) void SqliteStorage::removeElementsWithLocationInFiles(const std::vector& fileIds) { + CppSQLite3Query q = m_database.execQuery(( + "SELECT id, element_id FROM source_location WHERE file_node_id IN (" + utility::join(utility::toStrings(fileIds), ',') + ");" + ).c_str()); + + std::vector sourceLocationIds; + std::vector elementIds; + while (!q.eof()) + { + sourceLocationIds.push_back(q.getIntField(0, 0)); + elementIds.push_back(q.getIntField(1, 0)); + q.nextRow(); + } + m_database.execDML(( - "DELETE FROM element WHERE id IN (SELECT element_id FROM source_location " - "WHERE source_location.file_node_id IN (" + utility::join(utility::toStrings(fileIds), ',') + "));" + "DELETE FROM source_location WHERE id IN (" + utility::join(utility::toStrings(sourceLocationIds), ',') + ");" + ).c_str()); + + m_database.execDML(( + "DELETE FROM element WHERE element.id IN (" + utility::join(utility::toStrings(elementIds), ',') + ") AND element.id NOT IN " + "( SELECT source_location.element_id FROM source_location WHERE source_location.element_id == element.id );" ).c_str()); } diff --git a/src/lib/data/Storage.cpp b/src/lib/data/Storage.cpp index d56c1d04..217c155f 100644 --- a/src/lib/data/Storage.cpp +++ b/src/lib/data/Storage.cpp @@ -156,12 +156,12 @@ void Storage::finishParsing() buildHierarchyCache(); } -void Storage::prepareParsingFile() +void Storage::prepareParsingFile(const FilePath& filePath) { m_sqliteStorage.beginTransaction(); } -void Storage::finishParsingFile() +void Storage::finishParsingFile(const FilePath& filePath) { m_sqliteStorage.commitTransaction(); } diff --git a/src/lib/data/Storage.h b/src/lib/data/Storage.h index 50efac70..57819375 100644 --- a/src/lib/data/Storage.h +++ b/src/lib/data/Storage.h @@ -41,8 +41,8 @@ public: virtual void startParsing(); virtual void finishParsing(); - virtual void prepareParsingFile(); - virtual void finishParsingFile(); + virtual void prepareParsingFile(const FilePath& filePath); + virtual void finishParsingFile(const FilePath& filePath); virtual void onError(const ParseLocation& location, const std::string& message); virtual size_t getErrorCount() const; diff --git a/src/lib/data/parser/ParserClient.h b/src/lib/data/parser/ParserClient.h index 2916c157..08d5918d 100644 --- a/src/lib/data/parser/ParserClient.h +++ b/src/lib/data/parser/ParserClient.h @@ -58,8 +58,8 @@ public: virtual void startParsing() = 0; virtual void finishParsing() = 0; - virtual void prepareParsingFile() = 0; - virtual void finishParsingFile() = 0; + virtual void prepareParsingFile(const FilePath& filePath) = 0; + virtual void finishParsingFile(const FilePath& filePath) = 0; virtual void onError(const ParseLocation& location, const std::string& message) = 0; virtual size_t getErrorCount() const = 0; diff --git a/src/lib/data/parser/cxx/TaskParseCxx.cpp b/src/lib/data/parser/cxx/TaskParseCxx.cpp index a15bcd8f..27f0bf22 100644 --- a/src/lib/data/parser/cxx/TaskParseCxx.cpp +++ b/src/lib/data/parser/cxx/TaskParseCxx.cpp @@ -29,7 +29,7 @@ void TaskParseCxx::enter() for (const FilePath& path : m_parser.getFileRegister()->getUnparsedSourceFilePaths()) { - m_sourcePaths.push(path.absolute().str()); + m_sourcePaths.push(path.absolute()); } m_client->startParsing(); @@ -37,7 +37,7 @@ void TaskParseCxx::enter() Task::TaskState TaskParseCxx::update() { - std::string sourcePath; + FilePath sourcePath; bool isSource = false; FileRegister* fileRegister = m_parser.getFileRegister(); @@ -53,11 +53,11 @@ Task::TaskState TaskParseCxx::update() std::vector unparsedHeaders = fileRegister->getUnparsedIncludeFilePaths(); if (unparsedHeaders.size()) { - sourcePath = unparsedHeaders[0].str(); + sourcePath = unparsedHeaders[0]; } } - if (!sourcePath.size()) + if (sourcePath.empty()) { return Task::STATE_FINISHED; } @@ -65,19 +65,19 @@ Task::TaskState TaskParseCxx::update() std::stringstream ss; ss << "analyzing files (ESC to quit): ["; ss << fileRegister->getParsedFilesCount() << "/" << fileRegister->getFilesCount() << "] "; - ss << sourcePath; + ss << sourcePath.str(); MessageStatus(ss.str(), false, true).dispatch(); - m_client->prepareParsingFile(); + m_client->prepareParsingFile(sourcePath); - m_parser.runTool(std::vector(1, sourcePath)); + m_parser.runTool(std::vector(1, sourcePath.str())); - m_client->finishParsingFile(); + m_client->finishParsingFile(sourcePath); if (isSource) { - fileRegister->markSourceFileParsed(sourcePath); + fileRegister->markSourceFileParsed(sourcePath.str()); } return Task::STATE_RUNNING; diff --git a/src/lib/data/parser/cxx/TaskParseCxx.h b/src/lib/data/parser/cxx/TaskParseCxx.h index e942d890..b084300b 100644 --- a/src/lib/data/parser/cxx/TaskParseCxx.h +++ b/src/lib/data/parser/cxx/TaskParseCxx.h @@ -32,7 +32,7 @@ private: const Parser::Arguments m_arguments; const std::vector m_files; - std::queue m_sourcePaths; + std::queue m_sourcePaths; utility::TimePoint m_start; };