version 0.3.29
[fms.git] / src / db / sqlite3statement.cpp
index 60762f0..7ef5e27 100644 (file)
@@ -1,5 +1,13 @@
 #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
@@ -82,8 +68,6 @@ const bool Statement::Bind(const int column, const int value)
 {\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
@@ -103,8 +87,6 @@ const bool Statement::Bind(const int column, const double value)
 {\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
@@ -124,16 +106,6 @@ const bool Statement::Bind(const int column, const std::string &value)
 {\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
@@ -153,8 +125,6 @@ const bool Statement::Bind(const int column, const void *data, const int length)
 {\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
@@ -174,8 +144,7 @@ void Statement::Finalize()
 {\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
@@ -196,11 +165,11 @@ Statement &Statement::operator=(const Statement &rhs)
                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
@@ -211,8 +180,6 @@ const bool Statement::Reset()
 {\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
@@ -232,10 +199,24 @@ const bool Statement::ResultBlob(const int column, void *data, int &length)
 {\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
@@ -248,8 +229,6 @@ const bool Statement::ResultDouble(const int column, double &result)
 {\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
@@ -263,8 +242,6 @@ const bool Statement::ResultInt(const int column, int &result)
 {\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
@@ -278,8 +255,6 @@ const bool Statement::ResultNull(const int column)
 {\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
@@ -299,8 +274,6 @@ const bool Statement::ResultText(const int column, std::string &result)
 {\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
@@ -323,9 +296,13 @@ const bool Statement::Step(const bool saveinsertrowid)
        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
@@ -334,7 +311,7 @@ const bool Statement::Step(const bool saveinsertrowid)
                        }\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
@@ -351,8 +328,6 @@ const bool Statement::Step(const bool saveinsertrowid)
 \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