Index: src/libchcore/TSQLiteSerializerContainer.cpp =================================================================== diff -u -N -r8068e0c351055554340ac9755d1bc846893bf2b8 -rc22b1c58209159971a479a90c5fc2b79030f7674 --- src/libchcore/TSQLiteSerializerContainer.cpp (.../TSQLiteSerializerContainer.cpp) (revision 8068e0c351055554340ac9755d1bc846893bf2b8) +++ src/libchcore/TSQLiteSerializerContainer.cpp (.../TSQLiteSerializerContainer.cpp) (revision c22b1c58209159971a479a90c5fc2b79030f7674) @@ -79,10 +79,30 @@ void TSQLiteSerializerContainer::DeleteRows(const TRemovedObjects& setObjects) { size_t stCount = setObjects.GetCount(); - while (stCount-- != 0) + + auto iterRows = m_mapRows.begin(); + size_t stInputIndex = 0; + while(stInputIndex < stCount && iterRows != m_mapRows.end()) { - DeleteRow(setObjects.GetAt(stCount)); + object_id_t idInput = setObjects.GetAt(stInputIndex); + object_id_t idRows = iterRows->first; + + if(idInput < idRows) + ++stInputIndex; + else if(idInput > idRows) + ++iterRows; + else + { + // equals + iterRows = m_mapRows.erase(iterRows); + ++stInputIndex; + } } + + while(stCount > 0) + { + m_setDeleteItems.insert(setObjects.GetAt(--stCount)); + } } ISerializerRowReaderPtr TSQLiteSerializerContainer::GetRowReader() @@ -144,27 +164,20 @@ void TSQLiteSerializerContainer::FlushDeletions() { - // delete from m_strName WHERE id IN (???) + size_t stCount = m_setDeleteItems.size(); + if(stCount == 0) + return; + TSQLiteStatement tStatement(m_spDB); - const size_t stMaxToRemoveAtOnce = 10; + TString strQuery = boost::str(boost::wformat(L"DELETE FROM %1% WHERE id=?1") % m_strName).c_str(); + tStatement.Prepare(strQuery.c_str()); - // delete items in chunks - std::set::const_iterator iterToDelete = m_setDeleteItems.begin(); - while (iterToDelete != m_setDeleteItems.end()) + for (object_id_t idObj : m_setDeleteItems) { - TString strItemsToRemove; - size_t stToRemove = stMaxToRemoveAtOnce; - while (iterToDelete != m_setDeleteItems.end() && (--stToRemove) != 0) - { - strItemsToRemove += boost::str(boost::wformat(L"%1%,") % *iterToDelete).c_str(); - ++iterToDelete; - } - strItemsToRemove.TrimRightSelf(_T(",")); + tStatement.ClearBindings(); + tStatement.BindValue(1, idObj); - TString strQuery = boost::str(boost::wformat(L"DELETE FROM %1% WHERE id IN (%2%)") % m_strName % strItemsToRemove).c_str(); - tStatement.Prepare(strQuery.c_str()); - DBTRACE1_D(_T("Executing query: %s\n"), strQuery.c_str()); tStatement.Step(); }