Index: src/libchcore/TSQLiteSerializerContainer.cpp =================================================================== diff -u -N -r293e52b38d46653068006262172018a0f0d0a31c -r5693271a6736f524997e3951fc7b7b6323bc6447 --- src/libchcore/TSQLiteSerializerContainer.cpp (.../TSQLiteSerializerContainer.cpp) (revision 293e52b38d46653068006262172018a0f0d0a31c) +++ src/libchcore/TSQLiteSerializerContainer.cpp (.../TSQLiteSerializerContainer.cpp) (revision 5693271a6736f524997e3951fc7b7b6323bc6447) @@ -26,6 +26,7 @@ #include "TSQLiteSerializerRowReader.h" #include #include "TRemovedObjects.h" +#include "SerializerTrace.h" BEGIN_CHCORE_NAMESPACE @@ -100,10 +101,44 @@ { FlushDeletions(); + // group rows that can be executed with one preparation + std::map> mapGroups; + std::map>::iterator iterMapGroups; + for(RowMap::iterator iterRows = m_mapRows.begin(); iterRows != m_mapRows.end(); ++iterRows) { - iterRows->second->Flush(m_spDB, m_strName); + TRowID rowID = iterRows->second->GetChangeIdentification(); + iterMapGroups = mapGroups.find(rowID); + if(iterMapGroups == mapGroups.end()) + iterMapGroups = mapGroups.insert(std::make_pair(rowID, std::vector())).first; + + iterMapGroups->second.push_back(iterRows->second); } + + TSQLiteStatement tStatement(m_spDB); + + for(iterMapGroups = mapGroups.begin(); iterMapGroups != mapGroups.end(); ++iterMapGroups) + { + if(iterMapGroups->first.HasAny()) + { + std::vector& rGroupRows = iterMapGroups->second; + + // query is generated from the first item in a group + TString strQuery = rGroupRows.front()->GetQuery(m_strName); + + DBTRACE2(_T("Preparing query for %lu records: %s\n"), (unsigned long)iterMapGroups->second.size(), (PCTSTR)strQuery); + + tStatement.Prepare(strQuery); + + for(std::vector::iterator iterRow = iterMapGroups->second.begin(); iterRow != iterMapGroups->second.end(); ++iterRow) + { + (*iterRow)->BindParamsAndExec(tStatement); + tStatement.ClearBindings(); + } + + tStatement.Close(); + } + } } void TSQLiteSerializerContainer::FlushDeletions()