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
00029
00030
00031
00032 #pragma once
00033
00034 #include <drizzled/visibility.h>
00035 #include <drizzled/sql/exception.h>
00036 #include <drizzled/sql/result_set_meta_data.h>
00037 #include <cassert>
00038 #include <queue>
00039
00040 namespace drizzled {
00041 namespace sql {
00042
00043 class DRIZZLED_API ResultSet
00044 {
00045
00046 class Column {
00047 public:
00048 Column() :
00049 _is_null(false)
00050 { }
00051
00052 inline const std::string &value() const
00053 {
00054 return _value;
00055 }
00056
00057 inline bool isNull() const
00058 {
00059 return _is_null;
00060 }
00061
00062 inline void set_value(const std::string &ref)
00063 {
00064 _value= ref;
00065 }
00066
00067 inline void set_null()
00068 {
00069 assert(_value.empty());
00070 _is_null= true;
00071 }
00072
00073 private:
00074 std::string _value;
00075 bool _is_null;
00076 };
00077
00078 typedef std::vector< Column > Row;
00079 typedef std::vector< Row > Result;
00080
00081 public:
00082 static ResultSet *make(size_t field_count)
00083 {
00084 return new ResultSet(field_count);
00085 }
00086
00087 bool next() const;
00088
00089 const std::string getString(size_t column_number) const ;
00090 bool isNull(size_t column_number) const;
00091 const ResultSetMetaData &getMetaData() const;
00092
00093
00094 bool error() const;
00095 sql::Exception getException() const;
00096
00097 ResultSet(size_t fields) :
00098 _has_next_been_called(false),
00099 _current_row(_results.end()),
00100 _meta_data(fields)
00101 {
00102 }
00103
00104 void setColumnCount(size_t fields)
00105 {
00106 _meta_data.setColumnCount(fields);
00107 }
00108
00109 ~ResultSet();
00110
00111 void createRow();
00112 void setColumn(size_t column_number, const std::string &arg);
00113 void setColumnNull(size_t column_number);
00114 void pushException(const Exception &arg) const;
00115
00116 private:
00117 bool isMore() const;
00118 bool isMore(size_t column_number) const;
00119
00120 private:
00121 mutable bool _has_next_been_called;
00122 Result _results;
00123 mutable Result::const_iterator _current_row;
00124 ResultSetMetaData _meta_data;
00125
00126
00127
00128 mutable std::queue<Exception> _exceptions;
00129 };
00130
00131 std::ostream& operator<<(std::ostream& output, const ResultSet &result_set);
00132
00133 }
00134 }
00135