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
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 )
00018 : DatabaseResultSet()
00019 {
00020 m_pStatement = pStatement;
00021 m_pSqliteStatement = m_pStatement->GetLastStatement();
00022 m_bManageStatement = bManageStatement;
00023
00024
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
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
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
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
00126 wxString strDate = GetResultString(nField);
00127 wxDateTime date;
00128
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);
00192 }
00193 }
00194
00195 ResultSetMetaData* SqliteResultSet::GetMetaData()
00196 {
00197 ResultSetMetaData* pMetaData = new SqliteResultSetMetaData(m_pSqliteStatement);
00198 LogMetaDataForCleanup(pMetaData);
00199 return pMetaData;
00200 }
00201