DataQuery.h

00001 /*
00002  * This source file is part of libRocket, the HTML/CSS Interface Middleware
00003  *
00004  * For the latest information, see http://www.librocket.com
00005  *
00006  * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
00007  *
00008  * Permission is hereby granted, free of charge, to any person obtaining a copy
00009  * of this software and associated documentation files (the "Software"), to deal
00010  * in the Software without restriction, including without limitation the rights
00011  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012  * copies of the Software, and to permit persons to whom the Software is
00013  * furnished to do so, subject to the following conditions:
00014  *
00015  * The above copyright notice and this permission notice shall be included in
00016  * all copies or substantial portions of the Software.
00017  * 
00018  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024  * THE SOFTWARE.
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