Drizzled Public API Documentation

result_set.cc
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 #include "config.h"
33 
34 #include <drizzled/sql/exception.h>
35 #include <drizzled/sql/result_set.h>
36 
37 #include <iostream>
38 
39 namespace drizzled {
40 namespace sql {
41 
42 static Exception exception_unknown_column("Unknown Column", "S0022", ER_BAD_FIELD_ERROR);
43 static Exception exception_no_more_results("No additional rows founds", "S0022", ER_BAD_FIELD_ERROR);
44 
45 ResultSet::~ResultSet()
46 {
47 }
48 
49 const std::string ResultSet::getString(size_t column_number) const
50 {
51  if (not isMore(column_number))
52  return "";
53 
54  return (*_current_row)[column_number].value();
55 }
56 
57 bool ResultSet::isNull(size_t column_number) const
58 {
59  return (*_current_row)[column_number].isNull();
60 }
61 
62 void ResultSet::pushException(const Exception &arg) const
63 {
64  if (_exceptions.empty())
65  {
66  _exceptions.push(arg);
67  return;
68  }
69 
70  _exceptions.front().setNextException(arg);
71 }
72 
73 bool ResultSet::isMore() const
74 {
75  if (_current_row == _results.end())
76  {
77  pushException(exception_no_more_results);
78  return false;
79  }
80 
81  return true;
82 }
83 
84 bool ResultSet::isMore(size_t column_number) const
85 {
86  if (column_number >= _meta_data.getColumnCount())
87  {
88  pushException(exception_unknown_column);
89 
90  return false;
91  }
92 
93  return isMore();
94 }
95 
96 bool ResultSet::error() const
97 {
98  return not _exceptions.empty();
99 }
100 
101 sql::Exception ResultSet::getException() const
102 {
103  return _exceptions.empty() ? sql::Exception() : _exceptions.front();
104 }
105 
106 const ResultSetMetaData &ResultSet::getMetaData() const
107 {
108  return _meta_data;
109 }
110 
111 void ResultSet::createRow()
112 {
113  assert(_meta_data.getColumnCount());
114  _results.resize(_results.size() +1);
115  _results.back().resize(_meta_data.getColumnCount());
116 }
117 
118 void ResultSet::setColumn(size_t column_number, const std::string &arg)
119 {
120  assert(column_number < _meta_data.getColumnCount());
121  assert(_results.back().at(column_number).isNull() == false); // ie the default value
122  assert(_results.back().at(column_number).value().empty() == true); // ie no value has been set yet
123  _results.back().at(column_number).set_value(arg);
124 }
125 
126 void ResultSet::setColumnNull(size_t column_number)
127 {
128  assert(column_number < _meta_data.getColumnCount());
129  assert(_results.back().at(column_number).isNull() == false); // ie the default value
130  assert(_results.back().at(column_number).value().empty() == true); // ie no value has been set yet
131  _results.back().at(column_number).set_null();
132 }
133 
134 bool ResultSet::next() const
135 {
136  if (not _has_next_been_called)
137  {
138  _current_row= _results.begin();
139  _has_next_been_called= true;
140  }
141  else
142  {
143  _current_row++;
144  }
145 
146  if (_current_row == _results.end())
147  return false;
148 
149  return true;
150 }
151 
152 std::ostream& operator<<(std::ostream& output, const ResultSet &result_set)
153 {
154  while (result_set.next())
155  {
156  for (size_t x= 0; x < result_set.getMetaData().getColumnCount(); x++)
157  {
158  if (result_set.isNull(x))
159  {
160  output << "<null>" << '\t';
161  }
162  else
163  {
164  output << result_set.getString(x) << '\t';
165  }
166  }
167  output << std::endl;
168  }
169 
170  return output;
171 }
172 
173 } // namespace sql
174 } // namespace drizzled