#include "../../include/db/sqlite3db/sqlite3statement.h"\r
\r
+#ifdef QUERY_LOG\r
+#include <Poco/Logger.h>\r
+#include <Poco/FormattingChannel.h>\r
+#include <Poco/PatternFormatter.h>\r
+#include <Poco/FileChannel.h>\r
+#include "../../include/stringfunctions.h"\r
+#endif\r
+\r
#ifdef XMEM\r
#include <xmem.h>\r
#endif\r
namespace SQLite3DB\r
{\r
\r
+Poco::FastMutex Statement::m_mutex;\r
std::map<sqlite3_stmt *, long> Statement::m_statementcount;\r
\r
-Statement::Statement()\r
+Statement::Statement():m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)\r
{\r
- m_statement=NULL;\r
- m_parametercount=0;\r
- m_resultcolumncount=0;\r
- m_rowreturned=false;\r
+\r
}\r
\r
-Statement::Statement(sqlite3_stmt *statement)\r
+Statement::Statement(sqlite3_stmt *statement):m_statement(statement),m_rowreturned(false),m_lastinsertrowid(-1)\r
{\r
- m_statement=statement;\r
m_parametercount=sqlite3_bind_parameter_count(m_statement);\r
m_resultcolumncount=sqlite3_column_count(m_statement);\r
- m_rowreturned=false;\r
- \r
+\r
if(m_statement)\r
{\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]++;\r
}\r
}\r
\r
-Statement::Statement(const Statement &rhs)\r
+Statement::Statement(const Statement &rhs):m_statement(0),m_parametercount(0),m_resultcolumncount(0),m_rowreturned(false),m_lastinsertrowid(-1)\r
{\r
- m_statement=NULL;\r
- m_parametercount=0;\r
- m_resultcolumncount=0;\r
- m_rowreturned=false;\r
*this=rhs;\r
}\r
\r
Statement::~Statement()\r
{\r
- \r
Finalize();\r
- \r
- /*\r
- std::vector<char *>::iterator i;\r
- for(i=textptrs.begin(); i!=textptrs.end(); i++)\r
- {\r
- if((*i))\r
- {\r
- delete [] (*i);\r
- }\r
- }\r
- */\r
-\r
}\r
\r
const bool Statement::Bind(const int column)\r
{\r
if(Valid() && column>=0 && column<m_parametercount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_bind_null(m_statement,column+1)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_parametercount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_bind_int(m_statement,column+1,value)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_parametercount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_bind_double(m_statement,column+1,value)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_parametercount)\r
{\r
- //char *text=new char[value.size()+1];\r
- //strncpy(text,value.c_str(),value.size());\r
- //text[value.size()]=NULL;\r
- //textptrs.push_back(text);\r
- \r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
- //m_boundtext.push_back(std::vector<char>(value.begin(),value.end()));\r
- //if(sqlite3_bind_text(m_statement,column+1,text,value.size(),NULL)==SQLITE_OK)\r
- //if(sqlite3_bind_text(m_statement,column+1,&(m_boundtext[m_boundtext.size()-1][0]),(m_boundtext[m_boundtext.size()-1]).size(),NULL)==SQLITE_OK) \r
if(sqlite3_bind_text(m_statement,column+1,value.c_str(),value.size(),SQLITE_TRANSIENT)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_parametercount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_bind_blob(m_statement,column+1,data,length,SQLITE_TRANSIENT)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(m_statement)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]--;\r
if(m_statementcount[m_statement]<=0)\r
{\r
m_parametercount=rhs.m_parametercount;\r
m_resultcolumncount=rhs.m_resultcolumncount;\r
m_rowreturned=rhs.m_rowreturned;\r
+ m_lastinsertrowid=rhs.m_lastinsertrowid;\r
\r
if(m_statement)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
+ Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
m_statementcount[m_statement]++;\r
}\r
}\r
{\r
if(Valid())\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_reset(m_statement)==SQLITE_OK)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_resultcolumncount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
- data=(void *)sqlite3_column_blob(m_statement,column);\r
- length=sqlite3_column_bytes(m_statement,column);\r
+ int bloblength=sqlite3_column_bytes(m_statement,column);\r
+ if(bloblength>length)\r
+ {\r
+ bloblength=length;\r
+ }\r
+ if(bloblength<length)\r
+ {\r
+ length=bloblength;\r
+ }\r
+ const void *blobptr=sqlite3_column_blob(m_statement,column);\r
+ if(blobptr)\r
+ {\r
+ std::copy((unsigned char *)blobptr,(unsigned char *)blobptr+bloblength,(unsigned char *)data);\r
+ }\r
+ else\r
+ {\r
+ length=0;\r
+ }\r
return true;\r
}\r
else\r
{\r
if(Valid() && column>=0 && column<m_resultcolumncount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
result=sqlite3_column_double(m_statement,column);\r
return true;\r
}\r
{\r
if(Valid() && column>=0 && column<m_resultcolumncount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
result=sqlite3_column_int(m_statement,column);\r
return true;\r
}\r
{\r
if(Valid() && column>=0 && column<m_resultcolumncount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
if(sqlite3_column_type(m_statement,column)==SQLITE_NULL)\r
{\r
return true;\r
{\r
if(Valid() && column>=0 && column<m_resultcolumncount)\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
const unsigned char *cresult=sqlite3_column_text(m_statement,column);\r
if(cresult)\r
{\r
m_rowreturned=false;\r
if(Valid())\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
int result=sqlite3_step(m_statement);\r
+#ifdef QUERY_LOG\r
+ size_t temp=reinterpret_cast<size_t>(m_statement);\r
+ std::string tempstr("");\r
+ StringFunctions::Convert(temp,tempstr);\r
+ Poco::Logger::get("querylog").information("Step : "+tempstr);\r
+#endif\r
if(result==SQLITE_OK || result==SQLITE_ROW || result==SQLITE_DONE)\r
{\r
if(result==SQLITE_ROW)\r
}\r
if(saveinsertrowid)\r
{\r
- m_lastinsertrowid=sqlite3_last_insert_rowid(DB::Instance()->GetDB());\r
+ m_lastinsertrowid=sqlite3_last_insert_rowid(sqlite3_db_handle(m_statement));\r
}\r
return true;\r
}\r
\r
const bool Statement::Valid()\r
{\r
- //ZThread::Guard<ZThread::Mutex> g(DB::instance()->m_mutex);\r
- PThread::Guard g(DB::Instance()->m_mutex);\r
return m_statement ? true : false ;\r
}\r
\r