~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.cc

  • Committer: Olaf van der Spek
  • Date: 2011-02-28 14:09:50 UTC
  • mfrom: (2207 bootstrap)
  • mto: (2209.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 2210.
  • Revision ID: olafvdspek@gmail.com-20110228140950-2nu0hyzhuww3wssx
Merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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