1 #include "../../include/db/sqlite3db/sqlite3statement.h"
\r
10 std::map<sqlite3_stmt *, long> Statement::m_statementcount;
\r
12 Statement::Statement()
\r
16 m_resultcolumncount=0;
\r
17 m_rowreturned=false;
\r
18 m_lastinsertrowid=-1;
\r
21 Statement::Statement(sqlite3_stmt *statement)
\r
23 m_statement=statement;
\r
24 m_parametercount=sqlite3_bind_parameter_count(m_statement);
\r
25 m_resultcolumncount=sqlite3_column_count(m_statement);
\r
26 m_rowreturned=false;
\r
27 m_lastinsertrowid=-1;
\r
31 m_statementcount[m_statement]++;
\r
35 Statement::Statement(const Statement &rhs)
\r
39 m_resultcolumncount=0;
\r
40 m_rowreturned=false;
\r
41 m_lastinsertrowid=-1;
\r
45 Statement::~Statement()
\r
51 std::vector<char *>::iterator i;
\r
52 for(i=textptrs.begin(); i!=textptrs.end(); i++)
\r
63 const bool Statement::Bind(const int column)
\r
65 if(Valid() && column>=0 && column<m_parametercount)
\r
67 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
68 //PThread::Guard g(DB::Instance()->m_mutex);
\r
69 if(sqlite3_bind_null(m_statement,column+1)==SQLITE_OK)
\r
84 const bool Statement::Bind(const int column, const int value)
\r
86 if(Valid() && column>=0 && column<m_parametercount)
\r
88 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
89 //PThread::Guard g(DB::Instance()->m_mutex);
\r
90 if(sqlite3_bind_int(m_statement,column+1,value)==SQLITE_OK)
\r
105 const bool Statement::Bind(const int column, const double value)
\r
107 if(Valid() && column>=0 && column<m_parametercount)
\r
109 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
110 //PThread::Guard g(DB::Instance()->m_mutex);
\r
111 if(sqlite3_bind_double(m_statement,column+1,value)==SQLITE_OK)
\r
126 const bool Statement::Bind(const int column, const std::string &value)
\r
128 if(Valid() && column>=0 && column<m_parametercount)
\r
130 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
131 //PThread::Guard g(DB::Instance()->m_mutex);
\r
132 if(sqlite3_bind_text(m_statement,column+1,value.c_str(),value.size(),SQLITE_TRANSIENT)==SQLITE_OK)
\r
147 const bool Statement::Bind(const int column, const void *data, const int length)
\r
149 if(Valid() && column>=0 && column<m_parametercount)
\r
151 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
152 //PThread::Guard g(DB::Instance()->m_mutex);
\r
153 if(sqlite3_bind_blob(m_statement,column+1,data,length,SQLITE_TRANSIENT)==SQLITE_OK)
\r
168 void Statement::Finalize()
\r
172 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
173 PThread::Guard g(DB::Instance()->m_mutex);
\r
174 m_statementcount[m_statement]--;
\r
175 if(m_statementcount[m_statement]<=0)
\r
177 m_statementcount.erase(m_statement);
\r
178 sqlite3_finalize(m_statement);
\r
184 Statement &Statement::operator=(const Statement &rhs)
\r
190 m_statement=rhs.m_statement;
\r
191 m_parametercount=rhs.m_parametercount;
\r
192 m_resultcolumncount=rhs.m_resultcolumncount;
\r
193 m_rowreturned=rhs.m_rowreturned;
\r
197 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
198 PThread::Guard g(DB::Instance()->m_mutex);
\r
199 m_statementcount[m_statement]++;
\r
205 const bool Statement::Reset()
\r
209 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
210 PThread::Guard g(DB::Instance()->m_mutex);
\r
211 if(sqlite3_reset(m_statement)==SQLITE_OK)
\r
226 const bool Statement::ResultBlob(const int column, void *data, int &length)
\r
228 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
230 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
231 //PThread::Guard g(DB::Instance()->m_mutex);
\r
232 int bloblength=sqlite3_column_bytes(m_statement,column);
\r
233 if(bloblength>length)
\r
237 if(bloblength<length)
\r
241 const void *blobptr=sqlite3_column_blob(m_statement,column);
\r
244 std::copy((unsigned char *)blobptr,(unsigned char *)blobptr+bloblength,(unsigned char *)data);
\r
258 const bool Statement::ResultDouble(const int column, double &result)
\r
260 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
262 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
263 //PThread::Guard g(DB::Instance()->m_mutex);
\r
264 result=sqlite3_column_double(m_statement,column);
\r
273 const bool Statement::ResultInt(const int column, int &result)
\r
275 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
277 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
278 //PThread::Guard g(DB::Instance()->m_mutex);
\r
279 result=sqlite3_column_int(m_statement,column);
\r
288 const bool Statement::ResultNull(const int column)
\r
290 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
292 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
293 //PThread::Guard g(DB::Instance()->m_mutex);
\r
294 if(sqlite3_column_type(m_statement,column)==SQLITE_NULL)
\r
309 const bool Statement::ResultText(const int column, std::string &result)
\r
311 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
313 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
314 //PThread::Guard g(DB::Instance()->m_mutex);
\r
315 const unsigned char *cresult=sqlite3_column_text(m_statement,column);
\r
318 result=(char *)cresult;
\r
332 const bool Statement::Step(const bool saveinsertrowid)
\r
334 m_rowreturned=false;
\r
337 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
338 PThread::Guard g(DB::Instance()->m_mutex);
\r
339 int result=sqlite3_step(m_statement);
\r
340 if(result==SQLITE_OK || result==SQLITE_ROW || result==SQLITE_DONE)
\r
342 if(result==SQLITE_ROW)
\r
344 m_rowreturned=true;
\r
346 if(saveinsertrowid)
\r
348 m_lastinsertrowid=sqlite3_last_insert_rowid(DB::Instance()->GetDB());
\r
363 const bool Statement::Valid()
\r
365 //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);
\r
366 PThread::Guard g(DB::Instance()->m_mutex);
\r
367 return m_statement ? true : false ;
\r