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

SqliteResultSet.cpp

Go to the documentation of this file.
00001 #include "../include/SqliteResultSet.h"
00002 #include "../include/SqlitePreparedStatement.h"
00003 #include "../include/SqliteDatabaseLayer.h"
00004 #include "../include/SqliteResultSetMetaData.h"
00005 #include "../include/DatabaseLayerException.h"
00006 #include "../include/DatabaseErrorCodes.h"
00007 
00008 // ctor
00009 SqliteResultSet::SqliteResultSet()
00010  : DatabaseResultSet()
00011 {
00012   m_pStatement = NULL;
00013   m_pSqliteStatement = NULL;
00014   m_bManageStatement = false;
00015 }
00016 
00017 SqliteResultSet::SqliteResultSet(SqlitePreparedStatement* pStatement, bool bManageStatement /*= false*/)
00018  : DatabaseResultSet()
00019 {
00020   m_pStatement = pStatement;
00021   m_pSqliteStatement = m_pStatement->GetLastStatement();
00022   m_bManageStatement = bManageStatement;
00023 
00024   // Populate field lookup map
00025   int nFieldCount = sqlite3_column_count(m_pSqliteStatement);
00026   for (int i=0; i<nFieldCount; i++)
00027   {
00028     wxString strField = ConvertFromUnicodeStream(sqlite3_column_name(m_pSqliteStatement, i));
00029     m_FieldLookupMap[strField] = i;
00030   }
00031 }
00032 
00033 // dtor
00034 SqliteResultSet::~SqliteResultSet()
00035 {
00036   Close();
00037 }
00038 
00039 
00040 void SqliteResultSet::Close()
00041 {
00042   CloseMetaData();
00043 
00044   if (m_bManageStatement)
00045   {
00046     if (m_pStatement != NULL)
00047     {
00048       m_pStatement->Close();
00049       wxDELETE(m_pStatement);
00050     }
00051   }
00052 }
00053 
00054 
00055 bool SqliteResultSet::Next()
00056 {
00057   if (m_pSqliteStatement == NULL)
00058     m_pSqliteStatement = m_pStatement->GetLastStatement();
00059   int nReturn = sqlite3_step(m_pSqliteStatement);
00060  
00061   if (nReturn != SQLITE_ROW)
00062     sqlite3_reset(m_pSqliteStatement);
00063 
00064   if ((nReturn != SQLITE_ROW) && (nReturn != SQLITE_DONE))
00065   {
00066     wxLogError(_("Error with RunQueryWithResults\n"));
00067     SetErrorCode(SqliteDatabaseLayer::TranslateErrorCode(nReturn));
00068 #if SQLITE_VERSION_NUMBER>=3002002
00069     // sqlite3_db_handle wasn't added to the SQLite3 API until version 3.2.2
00070     SetErrorMessage(ConvertFromUnicodeStream(sqlite3_errmsg(sqlite3_db_handle(m_pSqliteStatement))));
00071 #else
00072     SetErrorMessage(_("Unknown error advancing result set"));
00073 #endif
00074     ThrowDatabaseException();
00075     return false;
00076   }
00077   
00078   return (nReturn == SQLITE_ROW);
00079 }
00080 
00081 
00082 // get field
00083 int SqliteResultSet::GetResultInt(int nField)
00084 {
00085   int nValue = -1;
00086   if (m_pSqliteStatement == NULL)
00087     m_pSqliteStatement = m_pStatement->GetLastStatement();
00088   nValue = sqlite3_column_int(m_pSqliteStatement, nField-1);
00089 
00090   return nValue;
00091 }
00092 
00093 wxString SqliteResultSet::GetResultString(int nField)
00094 {
00095   wxString strValue = _("");
00096   if (m_pSqliteStatement == NULL)
00097     m_pSqliteStatement = m_pStatement->GetLastStatement();
00098   strValue = ConvertFromUnicodeStream((const char*)(sqlite3_column_text(m_pSqliteStatement, nField-1)));
00099 
00100   return strValue;
00101 }
00102 
00103 long SqliteResultSet::GetResultLong(int nField)
00104 {
00105   long nValue = -1;
00106   if (m_pSqliteStatement == NULL)
00107     m_pSqliteStatement = m_pStatement->GetLastStatement();
00108   nValue = sqlite3_column_int(m_pSqliteStatement, nField-1);
00109 
00110   return nValue;
00111 }
00112 
00113 bool SqliteResultSet::GetResultBool(int nField)
00114 {
00115   int nValue = 0;
00116   if (m_pSqliteStatement == NULL)
00117     m_pSqliteStatement = m_pStatement->GetLastStatement();
00118   nValue = sqlite3_column_int(m_pSqliteStatement, nField-1);
00119 
00120   return (nValue != 0);
00121 }
00122 
00123 wxDateTime SqliteResultSet::GetResultDate(int nField)
00124 {
00125   // Don't use nField-1 here since GetResultString will take care of that
00126   wxString strDate = GetResultString(nField);
00127   wxDateTime date;
00128   // First check for the 2-digit year format
00129   if (date.ParseFormat(strDate, _("%m/%d/%y %H:%M:%S")) != NULL)
00130   {
00131     return date;
00132   }
00133   else if (date.ParseDateTime(strDate) != NULL)
00134   {
00135     return date;
00136   }
00137   else
00138   {
00139     return wxInvalidDateTime;
00140   }
00141 }
00142 
00143 double SqliteResultSet::GetResultDouble(int nField)
00144 {
00145   double dblValue = -1;
00146   if (m_pSqliteStatement == NULL)
00147     m_pSqliteStatement = m_pStatement->GetLastStatement();
00148   dblValue = sqlite3_column_double(m_pSqliteStatement, nField-1);
00149 
00150   return dblValue;
00151 }
00152 
00153 void* SqliteResultSet::GetResultBlob(int nField, wxMemoryBuffer& Buffer)
00154 {
00155   int nLength = 0;
00156   if (m_pSqliteStatement == NULL)
00157     m_pSqliteStatement = m_pStatement->GetLastStatement();
00158   nLength = sqlite3_column_bytes(m_pSqliteStatement, nField-1);
00159   if (nLength < 1)
00160     return NULL;
00161   const void* pBlob = sqlite3_column_blob(m_pSqliteStatement, nField-1);
00162   void* pBuffer = Buffer.GetWriteBuf(nLength);
00163   memcpy(pBuffer, pBlob, nLength);
00164   
00165   return Buffer.GetData();
00166 }
00167 
00168 bool SqliteResultSet::IsFieldNull(int nField)
00169 {
00170   if (m_pSqliteStatement == NULL)
00171     m_pSqliteStatement = m_pStatement->GetLastStatement();
00172   return (NULL == sqlite3_column_text(m_pSqliteStatement, nField-1));
00173 }
00174 
00175 int SqliteResultSet::LookupField(const wxString& strField)
00176 {
00177   StringToIntMap::iterator SearchIterator = m_FieldLookupMap.find(strField);
00178   if (SearchIterator == m_FieldLookupMap.end())
00179   {
00180     wxString msg(_("Field '") + strField + _("' not found in the resultset"));
00181 #ifndef DONT_USE_DATABASE_LAYER_EXCEPTIONS
00182     DatabaseLayerException error(DATABASE_LAYER_FIELD_NOT_IN_RESULTSET, msg);
00183     throw error;
00184 #else
00185     wxLogError(msg);
00186 #endif
00187     return -1;
00188   }
00189   else
00190   {
00191     return ((*SearchIterator).second + 1);  // Add +1 to make the result set 1-based rather than 0-based
00192   }
00193 }
00194 
00195 ResultSetMetaData* SqliteResultSet::GetMetaData()
00196 {
00197   ResultSetMetaData* pMetaData = new SqliteResultSetMetaData(m_pSqliteStatement);
00198   LogMetaDataForCleanup(pMetaData);
00199   return pMetaData;
00200 }
00201 

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