00001 #include "../include/OracleDatabaseLayer.h"
00002 #include "../include/OracleResultSet.h"
00003 #include "../include/OraclePreparedStatement.h"
00004 #include "../include/DatabaseErrorCodes.h"
00005
00006
00007 OracleDatabaseLayer::OracleDatabaseLayer()
00008 {
00009 m_bAutoCommit = true;
00010 m_strPort = _("1521");
00011 m_pEnvironment = oracle::occi::Environment::createEnvironment();
00012 }
00013
00014 OracleDatabaseLayer::OracleDatabaseLayer(const wxString& strUser, const wxString& strPassword, bool bOpenDatabase )
00015 {
00016 m_bAutoCommit = true;
00017 m_strPort = _("1521");
00018 m_strUser = strUser;
00019 m_strPassword = strPassword;
00020 m_pEnvironment = oracle::occi::Environment::createEnvironment();
00021 if (bOpenDatabase)
00022 Open();
00023 }
00024
00025 OracleDatabaseLayer::OracleDatabaseLayer(const wxString& strUser, const wxString& strPassword, const wxString& strDatabase)
00026 {
00027 m_bAutoCommit = true;
00028 m_strPort = _("1521");
00029 m_pEnvironment = oracle::occi::Environment::createEnvironment();
00030 Open(strDatabase, strUser, strPassword);
00031 }
00032
00033 OracleDatabaseLayer::OracleDatabaseLayer(oracle::occi::Environment* pEnvironment, oracle::occi::Connection* pDatabase)
00034 {
00035 m_bAutoCommit = true;
00036 m_strPort = _("1521");
00037 m_pEnvironment = pEnvironment;
00038 m_pDatabase = pDatabase;
00039 }
00040
00041
00042
00043 OracleDatabaseLayer::~OracleDatabaseLayer()
00044 {
00045 Close();
00046 }
00047
00048
00049
00050 bool OracleDatabaseLayer::Open()
00051 {
00052 try
00053 {
00054 wxString tnsString = _("");
00055 if (m_strServer != wxEmptyString)
00056 {
00057 tnsString += _("Host=") + m_strServer;
00058 }
00059 if (m_strPort != wxEmptyString)
00060 {
00061
00062 if (tnsString.length() > 0)
00063 tnsString += _(";");
00064 tnsString += _("Port=") + m_strPort;
00065 }
00066 if (m_strDatabase != wxEmptyString)
00067 {
00068
00069 if (tnsString.length() > 0)
00070 tnsString += _(";");
00071 tnsString += _("Service Name=") + m_strDatabase;
00072 }
00073
00074 wxCharBuffer tnsStringBuffer = ConvertToUnicodeStream(tnsString);
00075 std::string strTnsString(tnsStringBuffer);
00076
00077 if (m_pEnvironment == NULL)
00078 m_pEnvironment = oracle::occi::Environment::createEnvironment();
00079
00080 wxCharBuffer userCharBuffer = ConvertToUnicodeStream(m_strUser);
00081 std::string strUser = (const char*)userCharBuffer;
00082 wxCharBuffer passwordCharBuffer = ConvertToUnicodeStream(m_strPassword);
00083 std::string strPassword = (const char*)passwordCharBuffer;
00084 m_pDatabase = m_pEnvironment->createConnection(strUser, strPassword, strTnsString);
00085
00086 if (m_pDatabase == NULL)
00087 {
00088
00089 if (GetErrorCode() == DATABASE_LAYER_OK)
00090 {
00091 SetErrorCode(DATABASE_LAYER_ERROR);
00092 SetErrorMessage(_("Error creating database connection"));
00093 }
00094 ThrowDatabaseException();
00095 return false;
00096 }
00097 }
00098 catch (oracle::occi::SQLException& e)
00099 {
00100 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00101 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00102 ThrowDatabaseException();
00103 return false;
00104 }
00105 return true;
00106 }
00107
00108 bool OracleDatabaseLayer::Open(const wxString& strDatabase)
00109 {
00110 m_strDatabase = strDatabase;
00111 return Open();
00112 }
00113
00114 bool OracleDatabaseLayer::Open(const wxString& strServer, const wxString& strDatabase)
00115 {
00116 m_strServer = strServer;
00117 return Open(strDatabase);
00118 }
00119
00120 bool OracleDatabaseLayer::Open(const wxString& strDatabase, const wxString& strUser, const wxString& strPassword)
00121 {
00122 m_strUser = strUser;
00123 m_strPassword = strPassword;
00124 return Open(strDatabase);
00125 }
00126
00127 bool OracleDatabaseLayer::Open(const wxString& strServer, const wxString& strDatabase, const wxString& strUser, const wxString& strPassword)
00128 {
00129 m_strServer = strServer;
00130 return Open(strDatabase, strUser, strPassword);
00131 }
00132
00133
00134
00135 bool OracleDatabaseLayer::Close()
00136 {
00137 try
00138 {
00139 if (m_pEnvironment)
00140 {
00141 if (m_pDatabase)
00142 m_pEnvironment->terminateConnection(m_pDatabase);
00143
00144 oracle::occi::Environment::terminateEnvironment(m_pEnvironment);
00145 }
00146 }
00147 catch (oracle::occi::SQLException& e)
00148 {
00149 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00150 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00151 ThrowDatabaseException();
00152 return false;
00153 }
00154 return true;
00155 }
00156
00157
00158
00159 void OracleDatabaseLayer::BeginTransaction()
00160 {
00161 try
00162 {
00163 m_bAutoCommit = false;
00164 }
00165 catch (oracle::occi::SQLException& e)
00166 {
00167 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00168 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00169 ThrowDatabaseException();
00170 }
00171 }
00172
00173 void OracleDatabaseLayer::Commit()
00174 {
00175 try
00176 {
00177 m_pDatabase->commit();
00178 m_bAutoCommit = true;
00179 }
00180 catch (oracle::occi::SQLException& e)
00181 {
00182 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00183 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00184 ThrowDatabaseException();
00185 }
00186 }
00187
00188 void OracleDatabaseLayer::RollBack()
00189 {
00190 try
00191 {
00192 m_pDatabase->rollback();
00193 m_bAutoCommit = true;
00194 }
00195 catch (oracle::occi::SQLException& e)
00196 {
00197 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00198 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00199 ThrowDatabaseException();
00200 }
00201 }
00202
00203
00204
00205 bool OracleDatabaseLayer::RunQuery(const wxString& strQuery, bool bParseQuery)
00206 {
00207 try
00208 {
00209 wxArrayString QueryArray;
00210 if (bParseQuery)
00211 QueryArray = ParseQueries(strQuery);
00212 else
00213 QueryArray.push_back(strQuery);
00214
00215 wxArrayString::iterator start = QueryArray.begin();
00216 wxArrayString::iterator stop = QueryArray.end();
00217
00218 while (start != stop)
00219 {
00220 wxCharBuffer sqlBuffer = ConvertToUnicodeStream((*start));
00221 std::string strSQL(sqlBuffer);
00222 oracle::occi::Statement* pOracleStatement = m_pDatabase->createStatement(strSQL);
00223 if (pOracleStatement)
00224 {
00225 pOracleStatement->setAutoCommit(m_bAutoCommit);
00226 pOracleStatement->execute();
00227 m_pDatabase->terminateStatement(pOracleStatement);
00228 }
00229 start++;
00230 }
00231 }
00232 catch (oracle::occi::SQLException& e)
00233 {
00234 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00235 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00236 ThrowDatabaseException();
00237 return false;
00238 }
00239 return true;
00240 }
00241
00242 DatabaseResultSet* OracleDatabaseLayer::RunQueryWithResults(const wxString& strQuery)
00243 {
00244 OracleResultSet* pResultSet = NULL;
00245 try
00246 {
00247 wxArrayString QueryArray = ParseQueries(strQuery);
00248
00249 if (QueryArray.size() > 0)
00250 {
00251 for (unsigned int i=0; i<(QueryArray.size()-1); i++)
00252 {
00253 wxCharBuffer sqlBuffer = ConvertToUnicodeStream(QueryArray[i]);
00254 std::string strSQL(sqlBuffer);
00255 oracle::occi::Statement* pOracleStatement = m_pDatabase->createStatement(strSQL);
00256 if (pOracleStatement)
00257 {
00258 pOracleStatement->setAutoCommit(m_bAutoCommit);
00259 pOracleStatement->execute();
00260 m_pDatabase->terminateStatement(pOracleStatement);
00261 }
00262 }
00263
00264
00265 wxCharBuffer sqlBuffer = ConvertToUnicodeStream(QueryArray[QueryArray.size()-1]);
00266 std::string strSQL(sqlBuffer);
00267 oracle::occi::Statement* pOracleStatement = m_pDatabase->createStatement(strSQL);
00268 if (pOracleStatement)
00269 {
00270 pOracleStatement->setAutoCommit(m_bAutoCommit);
00271 oracle::occi::ResultSet* pOracleResultSet = pOracleStatement->executeQuery();
00272 pResultSet = new OracleResultSet(pOracleResultSet, true);
00273 }
00274 }
00275 }
00276 catch (oracle::occi::SQLException& e)
00277 {
00278 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00279 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00280 ThrowDatabaseException();
00281 return NULL;
00282 }
00283 return pResultSet;
00284 }
00285
00286
00287
00288 PreparedStatement* OracleDatabaseLayer::PrepareStatement(const wxString& strQuery)
00289 {
00290 OraclePreparedStatement* pStatement = NULL;
00291 try
00292 {
00293 wxArrayString QueryArray = ParseQueries(strQuery);
00294
00295 wxArrayString::iterator start = QueryArray.begin();
00296 wxArrayString::iterator stop = QueryArray.end();
00297
00298 while (start != stop)
00299 {
00300 wxCharBuffer sqlBuffer = ConvertToUnicodeStream((*start));
00301 std::string strSQL(sqlBuffer);
00302 oracle::occi::Statement* pOracleStatement = m_pDatabase->createStatement(strSQL);
00303 if (pOracleStatement)
00304 {
00305 pOracleStatement->setAutoCommit(m_bAutoCommit);
00306 pStatement->AddStatement(pOracleStatement);
00307 }
00308 start++;
00309 }
00310 }
00311 catch (oracle::occi::SQLException& e)
00312 {
00313 SetErrorCode(OracleDatabaseLayer::TranslateErrorCode(e.getErrorCode()));
00314 SetErrorMessage(ConvertFromUnicodeStream(e.getMessage().c_str()));
00315 wxDELETE(pStatement);
00316 ThrowDatabaseException();
00317 return NULL;
00318 }
00319
00320 return pStatement;
00321 }
00322
00323 int OracleDatabaseLayer::TranslateErrorCode(int nCode)
00324 {
00325
00326
00327 int nReturn = nCode;
00328 return nReturn;
00329 }