00001 #include "../include/MysqlPreparedStatementWrapper.h"
00002 #include "../include/MysqlPreparedStatementResultSet.h"
00003 #include "../include/MysqlDatabaseLayer.h"
00004 #include "../include/DatabaseErrorCodes.h"
00005
00006 #include "errmsg.h"
00007
00008 MysqlPreparedStatementWrapper::MysqlPreparedStatementWrapper(MYSQL_STMT* pStatement)
00009 : DatabaseErrorReporter()
00010 {
00011 m_pStatement = pStatement;
00012 }
00013
00014 MysqlPreparedStatementWrapper::~MysqlPreparedStatementWrapper()
00015 {
00016 Close();
00017 }
00018
00019 void MysqlPreparedStatementWrapper::Close()
00020 {
00021 if (m_pStatement != NULL)
00022 {
00023 mysql_stmt_close(m_pStatement);
00024 m_pStatement = NULL;
00025 }
00026 }
00027
00028
00029 void MysqlPreparedStatementWrapper::SetParam(int nPosition, int nValue)
00030 {
00031 m_Parameters.SetParam(nPosition, nValue);
00032 }
00033
00034 void MysqlPreparedStatementWrapper::SetParam(int nPosition, double dblValue)
00035 {
00036 m_Parameters.SetParam(nPosition, dblValue);
00037 }
00038
00039 void MysqlPreparedStatementWrapper::SetParam(int nPosition, const wxString& strValue)
00040 {
00041 m_Parameters.SetParam(nPosition, strValue);
00042 }
00043
00044 void MysqlPreparedStatementWrapper::SetParam(int nPosition)
00045 {
00046 m_Parameters.SetParam(nPosition);
00047 }
00048
00049 void MysqlPreparedStatementWrapper::SetParam(int nPosition, const void* pData, long nDataLength)
00050 {
00051 m_Parameters.SetParam(nPosition, pData, nDataLength);
00052 }
00053
00054 void MysqlPreparedStatementWrapper::SetParam(int nPosition, const wxDateTime& dateValue)
00055 {
00056 m_Parameters.SetParam(nPosition, dateValue);
00057 }
00058
00059 void MysqlPreparedStatementWrapper::SetParam(int nPosition, bool bValue)
00060 {
00061 m_Parameters.SetParam(nPosition, bValue);
00062 }
00063
00064 int MysqlPreparedStatementWrapper::GetParameterCount()
00065 {
00066 return mysql_stmt_param_count(m_pStatement);
00067 }
00068
00069 void MysqlPreparedStatementWrapper::RunQuery()
00070 {
00071 MYSQL_BIND* pBoundParameters = m_Parameters.GetMysqlParameterBindings();
00072
00073 int nBindReturn = mysql_stmt_bind_param(m_pStatement, pBoundParameters);
00074 if (nBindReturn != 0)
00075 {
00076 SetErrorCode(MysqlDatabaseLayer::TranslateErrorCode(mysql_stmt_errno(m_pStatement)));
00077 SetErrorMessage(ConvertFromUnicodeStream(mysql_stmt_error(m_pStatement)));
00078 ThrowDatabaseException();
00079 }
00080 else
00081 {
00082 int nReturn = mysql_stmt_execute(m_pStatement);
00083 if (nReturn != 0)
00084 {
00085 SetErrorCode(MysqlDatabaseLayer::TranslateErrorCode(mysql_stmt_errno(m_pStatement)));
00086 SetErrorMessage(ConvertFromUnicodeStream(mysql_stmt_error(m_pStatement)));
00087 ThrowDatabaseException();
00088 }
00089 }
00090 delete []pBoundParameters;
00091 }
00092
00093 DatabaseResultSet* MysqlPreparedStatementWrapper::RunQueryWithResults()
00094 {
00095 MysqlPreparedStatementResultSet* pResultSet = NULL;
00096 MYSQL_BIND* pBoundParameters = m_Parameters.GetMysqlParameterBindings();
00097
00098 if (mysql_stmt_bind_param(m_pStatement, pBoundParameters))
00099 {
00100 SetErrorCode(MysqlDatabaseLayer::TranslateErrorCode(mysql_stmt_errno(m_pStatement)));
00101 SetErrorMessage(ConvertFromUnicodeStream(mysql_stmt_error(m_pStatement)));
00102 ThrowDatabaseException();
00103 }
00104 else
00105 {
00106 if (mysql_stmt_execute(m_pStatement) != 0)
00107 {
00108 SetErrorCode(MysqlDatabaseLayer::TranslateErrorCode(mysql_stmt_errno(m_pStatement)));
00109 SetErrorMessage(ConvertFromUnicodeStream(mysql_stmt_error(m_pStatement)));
00110 ThrowDatabaseException();
00111 }
00112 else
00113 {
00114 pResultSet = new MysqlPreparedStatementResultSet(m_pStatement);
00115 if (pResultSet)
00116 pResultSet->SetEncoding(GetEncoding());
00117 }
00118 }
00119 delete []pBoundParameters;
00120
00121 return pResultSet;
00122 }
00123