Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

OracleDatabaseLayer.cpp

Go to the documentation of this file.
00001 #include "../include/OracleDatabaseLayer.h"
00002 #include "../include/OracleResultSet.h"
00003 #include "../include/OraclePreparedStatement.h"
00004 #include "../include/DatabaseErrorCodes.h"
00005 
00006 // ctor()
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 /*=false*/)
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 // dtor()
00043 OracleDatabaseLayer::~OracleDatabaseLayer()
00044 {
00045   Close();
00046 }
00047 
00048 
00049 // open database
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       // Add the parameter separater (colon) if needed
00062       if (tnsString.length() > 0)
00063         tnsString += _(";");
00064       tnsString += _("Port=") + m_strPort;
00065     }
00066     if (m_strDatabase != wxEmptyString)
00067     {
00068       // Add the parameter separater (colon) if needed
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       // If the database didn't set an error indicator, then make sure that is gets set
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   // close database
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   // transaction support
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   // query database
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       // Deal with the last query separately
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 // PreparedStatement support
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   // Ultimately, this will probably be a map of SQLite database error code values to DatabaseLayer values
00326   // For now though, we'll just return error
00327   int nReturn = nCode;
00328   return nReturn;
00329 }

Generated on Sat May 13 17:31:34 2006 for databaselayer by  doxygen 1.4.1