| |
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 |
|
| |
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 |
|
| |
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 |