~drizzle-trunk/drizzle/development

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