diff --git a/src/lib/data/SqliteStorage.cpp b/src/lib/data/SqliteStorage.cpp index ca2b196b..ac986d81 100644 --- a/src/lib/data/SqliteStorage.cpp +++ b/src/lib/data/SqliteStorage.cpp @@ -112,11 +112,14 @@ Id SqliteStorage::addNode(int type, const std::string& serializedName, int defin ); Id id = m_database.lastRowId(); - m_database.execDML(( + CppSQLite3Statement stmt = m_database.compileStatement(( "INSERT INTO node(id, type, serialized_name, definition_type) VALUES(" - + std::to_string(id) + ", " + std::to_string(type) + ", '" + serializedName + "', " + std::to_string(definitionType) + ");" + + std::to_string(id) + ", " + std::to_string(type) + ", ?, " + std::to_string(definitionType) + ");" ).c_str()); + stmt.bind(1, serializedName.c_str()); + stmt.execDML(); + return id; } @@ -438,7 +441,27 @@ StorageNode SqliteStorage::getNodeById(Id id) const StorageNode SqliteStorage::getNodeBySerializedName(const std::string& serializedName) const { - return getFirst("WHERE serialized_name == '" + serializedName + "'"); + CppSQLite3Statement stmt = m_database.compileStatement( + "SELECT id, type, serialized_name, definition_type FROM node WHERE serialized_name == ? LIMIT 1;" + ); + + stmt.bind(1, serializedName.c_str()); + CppSQLite3Query q = stmt.execQuery(); + + if (!q.eof()) + { + const Id id = q.getIntField(0, 0); + const int type = q.getIntField(1, -1); + const std::string serializedName = q.getStringField(2, ""); + const int definitionType = q.getIntField(3, 0); + + if (id != 0 && type != -1) + { + return StorageNode(id, type, serializedName, definitionType); + } + } + + return StorageNode(); } std::vector SqliteStorage::getNodesByIds(const std::vector& nodeIds) const diff --git a/src/lib/utility/scheduling/TaskGroupParallel.cpp b/src/lib/utility/scheduling/TaskGroupParallel.cpp index bb24d9b4..5ef60ea9 100644 --- a/src/lib/utility/scheduling/TaskGroupParallel.cpp +++ b/src/lib/utility/scheduling/TaskGroupParallel.cpp @@ -23,7 +23,7 @@ Task::TaskState TaskGroupParallel::update() { for (size_t i = 0; i < m_tasks.size(); i++) { - std::thread(&TaskGroupParallel::processTask, this, m_tasks[i]).detach(); + m_threads.push_back(std::thread(&TaskGroupParallel::processTask, this, m_tasks[i])); std::lock_guard lock(m_activeTaskCountMutex); m_activeTaskCount++; @@ -47,6 +47,11 @@ Task::TaskState TaskGroupParallel::update() void TaskGroupParallel::exit() { + for (size_t i = 0; i < m_threads.size(); i++) + { + m_threads[i].join(); + } + m_threads.clear(); } void TaskGroupParallel::interrupt() diff --git a/src/lib/utility/scheduling/TaskGroupParallel.h b/src/lib/utility/scheduling/TaskGroupParallel.h index c80893c9..76ad9f7c 100644 --- a/src/lib/utility/scheduling/TaskGroupParallel.h +++ b/src/lib/utility/scheduling/TaskGroupParallel.h @@ -23,6 +23,9 @@ private: volatile bool m_interrupt; bool m_running; + + std::vector m_threads; + volatile int m_activeTaskCount; std::mutex m_activeTaskCountMutex; }; diff --git a/src/lib_gui/qt/element/QtCodeArea.cpp b/src/lib_gui/qt/element/QtCodeArea.cpp index 343d582e..134c1dc5 100644 --- a/src/lib_gui/qt/element/QtCodeArea.cpp +++ b/src/lib_gui/qt/element/QtCodeArea.cpp @@ -110,7 +110,7 @@ QtCodeArea::QtCodeArea( m_highlighter = new QtHighlighter(document()); std::string displayCode = m_code; - if (*displayCode.rbegin() == '\n') + if (!displayCode.empty() && *displayCode.rbegin() == '\n') { displayCode.pop_back(); }