~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql/result_set.h

  • Committer: Mark Atwood
  • Date: 2011-08-11 03:05:03 UTC
  • mfrom: (2385.1.12 refactor4)
  • Revision ID: me@mark.atwood.name-20110811030503-rp9xjihc5x3y0x4q
mergeĀ lp:~olafvdspek/drizzle/refactor4

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