~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.h

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