Mercurial > code
annotate C++/Driver.cpp @ 184:4c746050969a
Add support for request (PostgreSQL done)
Task: #199
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 11 Nov 2013 18:05:47 +0100 |
parents | f0cca031bcce |
children | cc1e5fe1ee2c |
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? | |
48 if (row < 0 || row >= countRows()) | |
49 { | |
50 oss << "Invalid row index " << row; | |
51 oss << ", expected [0.." << countRows() << "]"; | |
52 | |
53 throw Error(oss.str()); | |
54 } | |
55 | |
56 // Not found or bad column? | |
57 if (type(column) != wanted) | |
58 { | |
59 oss << "Invalid or not found column `" << column << "'"; | |
60 | |
61 throw Error(oss.str()); | |
62 } | |
171 | 63 } |
64 | |
65 Query::~Query() | |
66 { | |
67 } | |
68 | |
177 | 69 template <> |
70 bool Query::get(int row, const std::string &column) | |
171 | 71 { |
177 | 72 assertRequest(row, column, ColumnType::Boolean); |
171 | 73 |
177 | 74 return getBoolean(row, column); |
171 | 75 } |
76 | |
177 | 77 template <> |
78 Date Query::get(int row, const std::string &column) | |
171 | 79 { |
177 | 80 assertRequest(row, column, ColumnType::Date); |
171 | 81 |
177 | 82 return getDate(row, column); |
171 | 83 } |
84 | |
177 | 85 template <> |
86 double Query::get(int row, const std::string &column) | |
171 | 87 { |
177 | 88 assertRequest(row, column, ColumnType::Double); |
171 | 89 |
177 | 90 return getDouble(row, column); |
171 | 91 } |
92 | |
177 | 93 template <> |
94 int Query::get(int row, const std::string &column) | |
171 | 95 { |
177 | 96 assertRequest(row, column, ColumnType::Integer); |
171 | 97 |
177 | 98 return getInt(row, column); |
171 | 99 } |
100 | |
177 | 101 template <> |
102 std::string Query::get(int row, const std::string &column) | |
171 | 103 { |
177 | 104 assertRequest(row, column, ColumnType::String); |
171 | 105 |
177 | 106 return getString(row, column); |
171 | 107 } |
108 | |
109 /* -------------------------------------------------------- | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
110 * Request class |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
111 * -------------------------------------------------------- */ |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
112 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
113 Request::Request(const std::string &command) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
114 : m_pos(0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
115 , m_params(0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
116 , m_command(command) |
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 int i = -1; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
119 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
120 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
|
121 ++ m_params; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
122 } |
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 Request::~Request() |
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 } |
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 void Request::assertCorrect() |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
129 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
130 if (m_params <= 0) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
131 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
|
132 } |
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 void Request::setValue(const std::string &value) |
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 assertCorrect(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
137 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
138 m_pos = m_command.find('#', m_pos); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
139 m_command.replace(m_pos, 1, value); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
140 m_pos += value.length(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
141 m_params --; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
142 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
143 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
144 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
145 void Request::bind(bool 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 setValue(bindBoolean(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
148 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
149 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
150 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
151 void Request::bind(Date 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 setValue(bindDate(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
154 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
155 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
156 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
157 void Request::bind(double 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 setValue(bindDouble(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
160 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
161 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
162 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
163 void Request::bind(int 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 setValue(bindInt(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
166 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
167 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
168 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
169 void Request::bind(std::string 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 setValue(bindString(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
172 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
173 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
174 template <> |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
175 void Request::bind(const char *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 setValue(bindString(value)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
178 } |
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 Request::operator std::string() |
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 return m_command; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
183 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
184 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
185 /* -------------------------------------------------------- |
171 | 186 * Driver class |
187 * -------------------------------------------------------- */ | |
188 | |
189 Driver::Driver() | |
190 { | |
191 } | |
192 | |
193 Driver::~Driver() | |
194 { | |
195 } | |
196 | |
197 const std::string &Driver::getError() const | |
198 { | |
199 return m_error; | |
200 } | |
184
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 Query::Ptr Driver::query(Request::Ptr request) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
203 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
204 return query(static_cast<std::string>(*request)); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
205 } |