~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.cc

  • Committer: Brian Aker
  • Date: 2011-02-02 22:48:57 UTC
  • mto: (2116.1.12 slave-copy)
  • mto: This revision was merged to the branch mainline in revision 2202.
  • Revision ID: brian@tangent.org-20110202224857-gj3jstch9ad0lk4w
Example for David.

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