DataQuery.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROCKETCONTROLSDATAQUERY_H
00029 #define ROCKETCONTROLSDATAQUERY_H
00030
00031 #include <Rocket/Controls/Header.h>
00032 #include <Rocket/Core/TypeConverter.h>
00033 #include <Rocket/Core/Log.h>
00034
00035 namespace Rocket {
00036 namespace Controls {
00037
00038 class DataSource;
00039
00048 class ROCKETCONTROLS_API DataQuery
00049 {
00050 public:
00051 DataQuery();
00052 DataQuery(DataSource* data_source, const Rocket::Core::String& table, const Rocket::Core::String& fields, int offset = 0, int limit = -1, const Rocket::Core::String& order = "");
00053 virtual ~DataQuery();
00054
00055 void ExecuteQuery(DataSource* data_source, const Rocket::Core::String& table, const Rocket::Core::String& fields, int offset = 0, int limit = -1, const Rocket::Core::String& order = "");
00056 bool NextRow();
00057
00058 bool IsFieldSet(const Rocket::Core::String& field) const;
00059
00060 template< typename T >
00061 T Get(const Rocket::Core::String& field_name, const T& default_value) const
00062 {
00063 FieldIndices::const_iterator itr = field_indices.find(field_name);
00064 if (itr == field_indices.end())
00065 {
00066 Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Field %s not found in query", field_name.CString());
00067 return default_value;
00068 }
00069
00070 T return_value = default_value;
00071
00072 GetInto((*itr).second, return_value);
00073
00074 return return_value;
00075 }
00076
00077 template< typename T >
00078 bool GetInto(const Rocket::Core::String& field_name, T& value) const
00079 {
00080 FieldIndices::const_iterator itr = field_indices.find(field_name);
00081 if (itr == field_indices.end())
00082 {
00083 Rocket::Core::Log::Message(Rocket::Core::Log::LT_ERROR, "Field %s not found in query", field_name.CString());
00084 return false;
00085 }
00086
00087 return GetInto((*itr).second, value);
00088 }
00089
00090 template< typename T >
00091 T Get(const size_t field_index, const T& default_value) const
00092 {
00093 T return_value = default_value;
00094
00095 GetInto(field_index, return_value);
00096
00097 return return_value;
00098 }
00099
00100 template< typename T >
00101 bool GetInto(const size_t field_index, T& value) const
00102 {
00103 if (field_index < rows[current_row].size())
00104 {
00105 return Rocket::Core::TypeConverter< Rocket::Core::String, T >::Convert(rows[current_row][field_index], value);
00106 }
00107
00108 return false;
00109 }
00110
00111 size_t GetNumFields()
00112 {
00113 return rows[current_row].size();
00114 }
00115
00116 private:
00117 Rocket::Core::StringList fields;
00118
00119 DataSource* data_source;
00120 Rocket::Core::String table;
00121 int current_row;
00122 int offset;
00123 int limit;
00124
00125 typedef std::vector< Rocket::Core::StringList > Rows;
00126 Rows rows;
00127 typedef std::map< Rocket::Core::String, size_t > FieldIndices;
00128 FieldIndices field_indices;
00129
00130 void LoadRow();
00131 };
00132
00133 }
00134 }
00135
00136 #endif // ROCKETCONTROLSDATAQUERY_H