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