Drizzled Public API Documentation

result_set.h
1 /* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2011, Brian Aker
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * * Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright notice,
13  * this list of conditions and the following disclaimer in the documentation
14  * and/or other materials provided with the distribution.
15  * * Neither the name of Patrick Galbraith nor the names of its contributors
16  * may be used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29  * THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #pragma once
33 
34 #include <drizzled/visibility.h>
35 #include <drizzled/sql/exception.h>
36 #include <drizzled/sql/result_set_meta_data.h>
37 #include <drizzled/field.h>
38 #include <cassert>
39 #include <queue>
40 
41 namespace drizzled {
42 namespace sql {
43 
45 {
46  // First version of API stores everything as strings
47  class Column {
48  public:
49  Column() :
50  _is_null(false)
51  { }
52 
53  inline const std::string &value() const
54  {
55  return _value;
56  }
57 
58  inline bool isNull() const
59  {
60  return _is_null;
61  }
62 
63  inline void set_value(const std::string &ref)
64  {
65  _value= ref;
66  }
67 
68  inline void set_null()
69  {
70  assert(_value.empty());
71  _is_null= true;
72  }
73 
74  private:
75  std::string _value;
76  bool _is_null;
77  };
78 
79  typedef std::vector< Column > Row;
80  typedef std::vector< Row > Result;
81 
82 public:
83  static ResultSet *make(size_t field_count)
84  {
85  return new ResultSet(field_count);
86  }
87 
88  bool next() const;
89 
90  const std::string getString(size_t column_number) const ;
91  bool isNull(size_t column_number) const;
92  const ResultSetMetaData &getMetaData() const;
93 
94  // Our functions to use instead of exceptions
95  bool error() const;
96  sql::Exception getException() const;
97 
98  ResultSet(size_t columns) :
99  _has_next_been_called(false),
100  _current_row(_results.end()),
101  _meta_data(columns)
102  {
103  }
104 
105  void setColumnCount(size_t columns)
106  {
107  _meta_data.setColumnCount(columns);
108  }
109 
110  void setColumnInfo(size_t column_number, const SendField& field)
111  {
112  _meta_data.setColumnInfo(column_number, field);
113  }
114 
134  SendField getColumnInfo(size_t column_number)
135  {
136  return _meta_data.getColumnInfo(column_number);
137  }
138 
139 ~ResultSet();
140 
141  void createRow();
142  void setColumn(size_t column_number, const std::string &arg);
143  void setColumnNull(size_t column_number);
144  void pushException(const Exception &arg) const;
145 
146 private: // Member methods
147  bool isMore() const;
148  bool isMore(size_t column_number) const;
149 
150 private: // Member variables
151  mutable bool _has_next_been_called;
152  Result _results;
153  mutable Result::const_iterator _current_row;
154  ResultSetMetaData _meta_data;
155 
156  // Because an error could come up during a fetch on const, we need to have
157  // this be mutable.
158  mutable std::queue<Exception> _exceptions;
159 };
160 
161 std::ostream& operator<<(std::ostream& output, const ResultSet &result_set);
162 
163 } // namespace sql
164 } // namespace drizzled
165 
TODO: Rename this file - func.h is stupid.
#define DRIZZLED_API
Definition: visibility.h:62
Visibility Control Macros.
SendField getColumnInfo(size_t column_number)
Get object that holds column meta data.
Definition: result_set.h:134