Clone
ixen <ixen@copyhandler.com>
committed
on 05 Jun 14
Added serialization support for subtasks - delete, copymove, fastmove (CH-58).
LoggerImprovements + 5 more
/libchcore/TSQLiteSerializerRowData.cpp (+15 -2)
21 21 #include "TSQLiteStatement.h"
22 22 #include <boost/format.hpp>
23 23 #include <atltrace.h>
24 24 #include "TSerializerException.h"
25 25 #include "ErrorCodes.h"
26 26
27 27 BEGIN_CHCORE_NAMESPACE
28 28
29 29 namespace
30 30 {
31 31         struct SQLiteBindValueVisitor : public boost::static_visitor<>
32 32         {
33 33         private:
34 34                 SQLiteBindValueVisitor& operator=(const SQLiteBindValueVisitor&);
35 35
36 36         public:
37 37                 SQLiteBindValueVisitor(sqlite::TSQLiteStatement& rStatement, int& rColumn) : m_rStatement(rStatement), m_rColumn(rColumn) {}
38 38
39 39                 void operator()(bool value) const
40 40                 {
  41                         ATLTRACE(_T("- param(bool): %ld\n"), value ? 1l : 0l);
41 42                         m_rStatement.BindValue(m_rColumn++, value);
42 43                 }
43 44
44 45                 void operator()(short value) const
45 46                 {
  47                         ATLTRACE(_T("- param(short): %d\n"), value);
46 48                         m_rStatement.BindValue(m_rColumn++, value);
47 49                 }
48 50
49 51                 void operator()(unsigned short value) const
50 52                 {
  53                         ATLTRACE(_T("- param(ushort): %u\n"), value);
51 54                         m_rStatement.BindValue(m_rColumn++, value);
52 55                 }
53 56
54 57                 void operator()(int value) const
55 58                 {
  59                         ATLTRACE(_T("- param(int): %ld\n"), value);
56 60                         m_rStatement.BindValue(m_rColumn++, value);
57 61                 }
58 62
59 63                 void operator()(unsigned int value) const
60 64                 {
  65                         ATLTRACE(_T("- param(uint): %lu\n"), value);
61 66                         m_rStatement.BindValue(m_rColumn++, value);
62 67                 }
63 68
64 69                 void operator()(long value) const
65 70                 {
  71                         ATLTRACE(_T("- param(long): %ld\n"), value);
66 72                         m_rStatement.BindValue(m_rColumn++, value);
67 73                 }
68 74
69 75                 void operator()(unsigned long value) const
70 76                 {
  77                         ATLTRACE(_T("- param(ulong): %lu\n"), value);
71 78                         m_rStatement.BindValue(m_rColumn++, value);
72 79                 }
73 80
74 81                 void operator()(long long value) const
75 82                 {
  83                         ATLTRACE(_T("- param(longlong): %I64d\n"), value);
76 84                         m_rStatement.BindValue(m_rColumn++, value);
77 85                 }
78 86
79 87                 void operator()(unsigned long long value) const
80 88                 {
  89                         ATLTRACE(_T("- param(ulonglong): %I64u\n"), value);
81 90                         m_rStatement.BindValue(m_rColumn++, value);
82 91                 }
83 92
84 93                 void operator()(double value) const
85 94                 {
  95                         ATLTRACE(_T("- param(double): %f\n"), value);
86 96                         m_rStatement.BindValue(m_rColumn++, value);
87 97                 }
88 98
89 99                 void operator()(const TString& value) const
90 100                 {
  101                         ATLTRACE(_T("- param(string): '%s'\n"), (PCTSTR)value);
91 102                         m_rStatement.BindValue(m_rColumn++, value);
92 103                 }
93 104
94 105                 void operator()(const TSmartPath& value) const
95 106                 {
  107                         ATLTRACE(_T("- param(path): %s\n"), value.ToString());
96 108                         m_rStatement.BindValue(m_rColumn++, value);
97 109                 }
98 110
99 111                 int& m_rColumn;
100 112                 sqlite::TSQLiteStatement& m_rStatement;
101 113         };
102 114 }
103 115
104 116 TSQLiteSerializerRowData::TSQLiteSerializerRowData(size_t stRowID, const TSQLiteColumnDefinitionPtr& spColumnDefinition, bool bAdded) :
105 117         m_stRowID(stRowID),
106 118         m_spColumns(spColumnDefinition),
107 119         m_bAdded(bAdded)
108 120 {
109 121 }
110 122
111 123 TSQLiteSerializerRowData::~TSQLiteSerializerRowData()
112 124 {
113 125 }
114 126
115 127 ISerializerRowData& TSQLiteSerializerRowData::operator%(const TRowData& rData)
 
156 168
157 169                 strQuery.TrimRightSelf(_T(","));
158 170                 strQuery += _T(") VALUES(?,");
159 171
160 172                 strParams.TrimRightSelf(_T(","));
161 173                 strQuery += strParams;
162 174                 strQuery += _T(")");
163 175
164 176                 // exec query
165 177                 int iColumn = 1;
166 178                 tStatement.Prepare(strQuery);
167 179                 tStatement.BindValue(iColumn++, m_stRowID);
168 180                 for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant)
169 181                 {
170 182                         boost::apply_visitor(SQLiteBindValueVisitor(tStatement, iColumn), iterVariant->second);
171 183                 }
172 184
173 185                 ATLTRACE(_T("Executing query: %s\n"), (PCTSTR)strQuery);
174 186                 tStatement.Step();
175 187         }
176           else
  188         else if(!m_mapValues.empty())
177 189         {
178 190                 // prepare update query
179 191                 TString strQuery = boost::str(boost::wformat(L"UPDATE %1% SET ") % strContainerName).c_str();
180 192
181 193                 for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant)
182 194                 {
183 195                         strQuery += boost::str(boost::wformat(_T("%1%=?,")) % m_spColumns->GetColumnName(iterVariant->first)).c_str();
184 196                 }
185 197
186 198                 strQuery.TrimRightSelf(_T(","));
187 199                 strQuery += _T(" WHERE id=?");
188 200
189 201                 int iColumn = 1;
  202
  203                 ATLTRACE(_T("Executing query: %s\n"), (PCTSTR)strQuery);
190 204                 tStatement.Prepare(strQuery);
191 205                 for(MapVariants::iterator iterVariant = m_mapValues.begin(); iterVariant != m_mapValues.end(); ++iterVariant)
192 206                 {
193 207                         boost::apply_visitor(SQLiteBindValueVisitor(tStatement, iColumn), iterVariant->second);
194 208                 }
195 209                 tStatement.BindValue(iColumn++, m_stRowID);
196 210
197                   ATLTRACE(_T("Executing query: %s\n"), (PCTSTR)strQuery);
198 211                 tStatement.Step();
199 212
200 213                 int iChanges = tStatement.Changes();
201 214                 _ASSERTE(iChanges == 1);
202 215                 if(iChanges != 1)
203 216                         THROW_SERIALIZER_EXCEPTION(eErr_InvalidData, _T("Update query did not update record in the database"));
204 217         }
205 218 }
206 219
207 220 END_CHCORE_NAMESPACE