Index: src/libchcore/TSQLiteSerializerRowData.cpp =================================================================== diff -u -N -r1875711000138ff9d4185c2e3e74d455533de8a8 -r30297d6aab17483da8e7b8323b4d17ff1a9f78d6 --- src/libchcore/TSQLiteSerializerRowData.cpp (.../TSQLiteSerializerRowData.cpp) (revision 1875711000138ff9d4185c2e3e74d455533de8a8) +++ src/libchcore/TSQLiteSerializerRowData.cpp (.../TSQLiteSerializerRowData.cpp) (revision 30297d6aab17483da8e7b8323b4d17ff1a9f78d6) @@ -23,6 +23,81 @@ BEGIN_CHCORE_NAMESPACE +namespace +{ + struct SQLiteBindValueVisitor : public boost::static_visitor<> + { + private: + SQLiteBindValueVisitor& operator=(const SQLiteBindValueVisitor&); + + public: + SQLiteBindValueVisitor(sqlite::TSQLiteStatement& rStatement, int& rColumn) : m_rStatement(rStatement), m_rColumn(rColumn) {} + + void operator()(bool value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(short value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(unsigned short value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(int value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(unsigned int value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(long value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(unsigned long value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(long long value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(unsigned long long value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(double value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(const TString& value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + void operator()(const TSmartPath& value) const + { + m_rStatement.BindValue(m_rColumn++, value); + } + + int& m_rColumn; + sqlite::TSQLiteStatement& m_rStatement; + }; +} + TSQLiteSerializerRowData::TSQLiteSerializerRowData(size_t stRowID, const TSQLiteColumnDefinitionPtr& spColumnDefinition, bool bAdded) : m_stRowID(stRowID), m_spColumns(spColumnDefinition), @@ -58,107 +133,62 @@ return *this; } -struct BindingVisitor : public boost::static_visitor<> +void TSQLiteSerializerRowData::Flush(const sqlite::TSQLiteDatabasePtr& spDatabase, const TString& strContainerName) { -private: - BindingVisitor& operator=(const BindingVisitor&); + using namespace sqlite; -public: - BindingVisitor(sqlite::TSQLiteStatement& rStatement, int& rColumn) : m_rStatement(rStatement), m_rColumn(rColumn) {} + TSQLiteStatement tStatement(spDatabase); - void operator()(bool value) const + if(m_bAdded) { - m_rStatement.BindValue(m_rColumn++, value); - } + // prepare insert query + TString strQuery = boost::str(boost::wformat(L"INSERT INTO %1%(") % strContainerName).c_str(); + TString strParams; - void operator()(short value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } + for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant) + { + strQuery += boost::str(boost::wformat(_T("%1%,")) % m_spColumns->GetColumnName(iterVariant->first)).c_str(); + strParams += _T("?,"); + } - void operator()(unsigned short value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } + strQuery.TrimRightSelf(_T(",")); + strQuery += _T(") VALUES("); - void operator()(int value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } + strParams.TrimRightSelf(_T(",")); + strQuery += strParams; + strQuery += _T(")"); - void operator()(unsigned int value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } + // exec query + int iColumn = 1; + tStatement.Prepare(strQuery); + for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant) + { + boost::apply_visitor(SQLiteBindValueVisitor(tStatement, iColumn), iterVariant->second); + } - void operator()(long value) const - { - m_rStatement.BindValue(m_rColumn++, value); + tStatement.Step(); } - - void operator()(unsigned long value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - void operator()(long long value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - void operator()(unsigned long long value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - void operator()(double value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - void operator()(const TString& value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - void operator()(const TSmartPath& value) const - { - m_rStatement.BindValue(m_rColumn++, value); - } - - int& m_rColumn; - sqlite::TSQLiteStatement& m_rStatement; -}; - -void TSQLiteSerializerRowData::Flush(const sqlite::TSQLiteDatabasePtr& spDatabase, const TString& strContainerName) -{ - using namespace sqlite; - - TSQLiteStatement tStatement(spDatabase); - - if(m_bAdded) - { - // insert into container_name(col1, col2) values(val1, val2) - } else { - // update container_name set col1=val1, col2=val2 where id=? - TString strPairs = boost::str(boost::wformat(L"UPDATE %1% SET ") % strContainerName).c_str(); + // prepare update query + TString strQuery = boost::str(boost::wformat(L"UPDATE %1% SET ") % strContainerName).c_str(); - int iColumn = 0; for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant) { - strPairs += boost::str(boost::wformat(_T("%1%=?,")) % m_spColumns->GetColumnName(iterVariant->first)).c_str(); + strQuery += boost::str(boost::wformat(_T("%1%=?,")) % m_spColumns->GetColumnName(iterVariant->first)).c_str(); + } + strQuery.TrimRightSelf(_T(",")); + strQuery += _T(" WHERE id=?"); - boost::apply_visitor(BindingVisitor(tStatement, iColumn), iterVariant->second); + int iColumn = 1; + tStatement.Prepare(strQuery); + for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant) + { + boost::apply_visitor(SQLiteBindValueVisitor(tStatement, iColumn), iterVariant->second); } - - strPairs.TrimRightSelf(_T(",")); - strPairs += _T(" WHERE id=?"); tStatement.BindValue(iColumn++, m_stRowID); - - + tStatement.Step(); } }