Mercurial > code
annotate C++/Driver.cpp @ 211:04aa866535fb
Merge
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 22 Mar 2014 22:02:24 +0100 |
parents | cc1e5fe1ee2c |
children | 6c49e5e3ecc8 |
rev | line source |
---|---|
171 | 1 /* |
2 * Driver.cpp -- generic SQL driver access | |
3 * | |
4 * Copyright (c) 2013, David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <map> | |
20 #include <string> | |
21 #include <sstream> | |
22 | |
23 #include "Driver.h" | |
24 | |
25 /* --------------------------------------------------------- | |
177 | 26 * Query::Error class |
27 * --------------------------------------------------------- */ | |
28 | |
29 Query::Error::Error(const std::string &error) | |
30 : m_error(error) | |
31 { | |
32 } | |
33 | |
34 const char *Query::Error::Error::what() const throw() | |
35 { | |
36 return m_error.c_str(); | |
37 } | |
38 | |
39 /* --------------------------------------------------------- | |
171 | 40 * Query class |
41 * ---------------------------------------------------------*/ | |
42 | |
177 | 43 void Query::assertRequest(int row, const std::string &column, ColumnType wanted) |
171 | 44 { |
177 | 45 std::ostringstream oss; |
46 | |
47 // Out of bounds? | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
48 if (row < 0 || row >= countRows()) { |
177 | 49 oss << "Invalid row index " << row; |
50 oss << ", expected [0.." << countRows() << "]"; | |
51 | |
52 throw Error(oss.str()); | |
53 } | |
54 | |
55 // Not found or bad column? | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
56 if (type(column) != wanted) { |
177 | 57 oss << "Invalid or not found column `" << column << "'"; |
58 | |
59 throw Error(oss.str()); | |
60 } | |
171 | 61 } |
62 | |
63 Query::~Query() | |
64 { | |
65 } | |
66 | |
177 | 67 template <> |
68 bool Query::get(int row, const std::string &column) | |
171 | 69 { |
177 | 70 assertRequest(row, column, ColumnType::Boolean); |
171 | 71 |
177 | 72 return getBoolean(row, column); |
171 | 73 } |
74 | |
177 | 75 template <> |
76 Date Query::get(int row, const std::string &column) | |
171 | 77 { |
177 | 78 assertRequest(row, column, ColumnType::Date); |
171 | 79 |
177 | 80 return getDate(row, column); |
171 | 81 } |
82 | |
177 | 83 template <> |
84 double Query::get(int row, const std::string &column) | |
171 | 85 { |
177 | 86 assertRequest(row, column, ColumnType::Double); |
171 | 87 |
177 | 88 return getDouble(row, column); |
171 | 89 } |
90 | |
177 | 91 template <> |
92 int Query::get(int row, const std::string &column) | |
171 | 93 { |
177 | 94 assertRequest(row, column, ColumnType::Integer); |
171 | 95 |
177 | 96 return getInt(row, column); |
171 | 97 } |
98 | |
177 | 99 template <> |
100 std::string Query::get(int row, const std::string &column) | |
171 | 101 { |
177 | 102 assertRequest(row, column, ColumnType::String); |
171 | 103 |
177 | 104 return getString(row, column); |
171 | 105 } |
106 | |
107 /* -------------------------------------------------------- | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
108 * Request class |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
109 * -------------------------------------------------------- */ |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
110 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
111 Request::Request(const std::string &command) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
112 : m_pos(0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
113 , m_params(0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
114 , m_command(command) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
115 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
116 int i = -1; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
117 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
118 while ((i = command.find('#', i + 1)) != std::string::npos) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
119 ++ m_params; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
120 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
121 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
122 Request::~Request() |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
123 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
124 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
125 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
126 void Request::assertCorrect() |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
127 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
128 if (m_params <= 0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
129 throw std::runtime_error("no more arguments to set"); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
130 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
131 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
132 void Request::setValue(const std::string &value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
133 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
134 assertCorrect(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
135 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
136 m_pos = m_command.find('#', m_pos); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
137 m_command.replace(m_pos, 1, value); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
138 m_pos += value.length(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
139 m_params --; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
140 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
141 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
142 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
143 void Request::bind(bool value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
144 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
145 setValue(bindBoolean(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
146 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
147 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
148 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
149 void Request::bind(Date value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
150 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
151 setValue(bindDate(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
152 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
153 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
154 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
155 void Request::bind(double value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
156 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
157 setValue(bindDouble(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
158 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
159 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
160 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
161 void Request::bind(int value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
162 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
163 setValue(bindInt(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
164 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
165 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
166 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
167 void Request::bind(std::string value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
168 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
169 setValue(bindString(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
170 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
171 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
172 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
173 void Request::bind(const char *value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
174 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
175 setValue(bindString(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
176 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
177 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
178 Request::operator std::string() |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
179 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
180 return m_command; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
181 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
182 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
183 /* -------------------------------------------------------- |
171 | 184 * Driver class |
185 * -------------------------------------------------------- */ | |
186 | |
187 Driver::Driver() | |
188 { | |
189 } | |
190 | |
191 Driver::~Driver() | |
192 { | |
193 } | |
194 | |
195 const std::string &Driver::getError() const | |
196 { | |
197 return m_error; | |
198 } | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
199 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
200 Query::Ptr Driver::query(Request::Ptr request) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
201 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
202 return query(static_cast<std::string>(*request)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
203 } |