~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.h

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