1 #include "../../include/db/sqlite3db/sqlite3statement.h"
\r
4 #include <Poco/Logger.h>
\r
5 #include <Poco/FormattingChannel.h>
\r
6 #include <Poco/PatternFormatter.h>
\r
7 #include <Poco/FileChannel.h>
\r
8 #include "../../include/stringfunctions.h"
\r
18 Poco::FastMutex Statement::m_mutex;
\r
19 std::map<sqlite3_stmt *, long> Statement::m_statementcount;
\r
21 Statement::Statement():m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)
\r
26 Statement::Statement(sqlite3_stmt *statement):m_statement(statement),m_rowreturned(false),m_lastinsertrowid(-1)
\r
28 m_parametercount=sqlite3_bind_parameter_count(m_statement);
\r
29 m_resultcolumncount=sqlite3_column_count(m_statement);
\r
33 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);
\r
34 m_statementcount[m_statement]++;
\r
38 Statement::Statement(const Statement &rhs):m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)
\r
43 Statement::~Statement()
\r
48 const bool Statement::Bind(const int column)
\r
50 if(Valid() && column>=0 && column<m_parametercount)
\r
52 if(sqlite3_bind_null(m_statement,column+1)==SQLITE_OK)
\r
67 const bool Statement::Bind(const int column, const int value)
\r
69 if(Valid() && column>=0 && column<m_parametercount)
\r
71 if(sqlite3_bind_int(m_statement,column+1,value)==SQLITE_OK)
\r
86 const bool Statement::Bind(const int column, const double value)
\r
88 if(Valid() && column>=0 && column<m_parametercount)
\r
90 if(sqlite3_bind_double(m_statement,column+1,value)==SQLITE_OK)
\r
105 const bool Statement::Bind(const int column, const std::string &value)
\r
107 if(Valid() && column>=0 && column<m_parametercount)
\r
109 if(sqlite3_bind_text(m_statement,column+1,value.c_str(),value.size(),SQLITE_TRANSIENT)==SQLITE_OK)
\r
124 const bool Statement::Bind(const int column, const void *data, const int length)
\r
126 if(Valid() && column>=0 && column<m_parametercount)
\r
128 if(sqlite3_bind_blob(m_statement,column+1,data,length,SQLITE_TRANSIENT)==SQLITE_OK)
\r
143 void Statement::Finalize()
\r
147 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);
\r
148 m_statementcount[m_statement]--;
\r
149 if(m_statementcount[m_statement]<=0)
\r
151 m_statementcount.erase(m_statement);
\r
152 sqlite3_finalize(m_statement);
\r
158 Statement &Statement::operator=(const Statement &rhs)
\r
164 m_statement=rhs.m_statement;
\r
165 m_parametercount=rhs.m_parametercount;
\r
166 m_resultcolumncount=rhs.m_resultcolumncount;
\r
167 m_rowreturned=rhs.m_rowreturned;
\r
168 m_lastinsertrowid=rhs.m_lastinsertrowid;
\r
172 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);
\r
173 m_statementcount[m_statement]++;
\r
179 const bool Statement::Reset()
\r
183 if(sqlite3_reset(m_statement)==SQLITE_OK)
\r
198 const bool Statement::ResultBlob(const int column, void *data, int &length)
\r
200 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
202 int bloblength=sqlite3_column_bytes(m_statement,column);
\r
203 if(bloblength>length)
\r
207 if(bloblength<length)
\r
211 const void *blobptr=sqlite3_column_blob(m_statement,column);
\r
214 std::copy((unsigned char *)blobptr,(unsigned char *)blobptr+bloblength,(unsigned char *)data);
\r
228 const bool Statement::ResultDouble(const int column, double &result)
\r
230 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
232 result=sqlite3_column_double(m_statement,column);
\r
241 const bool Statement::ResultInt(const int column, int &result)
\r
243 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
245 result=sqlite3_column_int(m_statement,column);
\r
254 const bool Statement::ResultNull(const int column)
\r
256 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
258 if(sqlite3_column_type(m_statement,column)==SQLITE_NULL)
\r
273 const bool Statement::ResultText(const int column, std::string &result)
\r
275 if(Valid() && column>=0 && column<m_resultcolumncount)
\r
277 const unsigned char *cresult=sqlite3_column_text(m_statement,column);
\r
280 result=(char *)cresult;
\r
294 const bool Statement::Step(const bool saveinsertrowid)
\r
296 m_rowreturned=false;
\r
299 int result=sqlite3_step(m_statement);
\r
301 size_t temp=reinterpret_cast<size_t>(m_statement);
\r
302 std::string tempstr("");
\r
303 StringFunctions::Convert(temp,tempstr);
\r
304 Poco::Logger::get("querylog").information("Step : "+tempstr);
\r
306 if(result==SQLITE_OK || result==SQLITE_ROW || result==SQLITE_DONE)
\r
308 if(result==SQLITE_ROW)
\r
310 m_rowreturned=true;
\r
312 if(saveinsertrowid)
\r
314 m_lastinsertrowid=sqlite3_last_insert_rowid(sqlite3_db_handle(m_statement));
\r
329 const bool Statement::Valid()
\r
331 return m_statement ? true : false ;
\r