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 <cassert>
38 #include <queue>
39 
40 namespace drizzled {
41 namespace sql {
42 
44 {
45  // First version of API stores everything as strings
46  class Column {
47  public:
48  Column() :
49  _is_null(false)
50  { }
51 
52  inline const std::string &value() const
53  {
54  return _value;
55  }
56 
57  inline bool isNull() const
58  {
59  return _is_null;
60  }
61 
62  inline void set_value(const std::string &ref)
63  {
64  _value= ref;
65  }
66 
67  inline void set_null()
68  {
69  assert(_value.empty());
70  _is_null= true;
71  }
72 
73  private:
74  std::string _value;
75  bool _is_null;
76  };
77 
78  typedef std::vector< Column > Row;
79  typedef std::vector< Row > Result;
80 
81 public:
82  static ResultSet *make(size_t field_count)
83  {
84  return new ResultSet(field_count);
85  }
86 
87  bool next() const;
88 
89  const std::string getString(size_t column_number) const ;
90  bool isNull(size_t column_number) const;
91  const ResultSetMetaData &getMetaData() const;
92 
93  // Our functions to use instead of exceptions
94  bool error() const;
95  sql::Exception getException() const;
96 
97  ResultSet(size_t fields) :
98  _has_next_been_called(false),
99  _current_row(_results.end()),
100  _meta_data(fields)
101  {
102  }
103 
104  void setColumnCount(size_t fields)
105  {
106  _meta_data.setColumnCount(fields);
107  }
108 
109  ~ResultSet();
110 
111  void createRow();
112  void setColumn(size_t column_number, const std::string &arg);
113  void setColumnNull(size_t column_number);
114  void pushException(const Exception &arg) const;
115 
116 private: // Member methods
117  bool isMore() const;
118  bool isMore(size_t column_number) const;
119 
120 private: // Member variables
121  mutable bool _has_next_been_called;
122  Result _results;
123  mutable Result::const_iterator _current_row;
124  ResultSetMetaData _meta_data;
125 
126  // Because an error could come up during a fetch on const, we need to have
127  // this be mutable.
128  mutable std::queue<Exception> _exceptions;
129 };
130 
131 std::ostream& operator<<(std::ostream& output, const ResultSet &result_set);
132 
133 } // namespace sql
134 } // namespace drizzled
135