~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.cc

  • Committer: Monty Taylor
  • Date: 2011-02-13 17:26:39 UTC
  • mfrom: (2157.2.2 give-in-to-pkg-config)
  • mto: This revision was merged to the branch mainline in revision 2166.
  • Revision ID: mordred@inaugust.com-20110213172639-nhy7i72sfhoq13ms
Merged in pkg-config fixes.

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