Mercurial > code
annotate C++/Driver.h @ 181:08af4f99c104
Update drivers a bit
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 29 Oct 2013 21:32:05 +0100 |
parents | f0cca031bcce |
children | 4c746050969a |
rev | line source |
---|---|
171 | 1 /* |
2 * Driver.h -- 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 #ifndef _DRIVER_H_ | |
20 #define _DRIVER_H_ | |
21 | |
22 #include <iostream> | |
23 #include <map> | |
24 #include <memory> | |
25 #include <string> | |
26 | |
181 | 27 #include "Date.h" |
171 | 28 |
29 /** | |
30 * @enum ColumnType | |
31 * @brief The column type request | |
32 * | |
33 * Used for the drivers. | |
34 */ | |
35 enum class ColumnType { | |
177 | 36 Invalid, //! not found |
171 | 37 Boolean, //! bool or 0 / 1 |
38 Date, //! date see Common/Date.h | |
39 Double, //! double | |
40 Integer, //! 32 or 64 bit int | |
41 String, //! varchar to std::string | |
42 }; | |
43 | |
44 /** | |
45 * @class Query | |
46 * @brief Class for querying the database | |
177 | 47 * |
48 * That class is returned when a SQL query succeed. It can retrieve the | |
49 * number of rows, columns and retrieve the results independantly from the | |
50 * driver. | |
51 * | |
52 * @see Driver::query | |
171 | 53 */ |
54 class Query { | |
177 | 55 public: |
56 typedef std::shared_ptr<Query> Ptr; | |
57 | |
58 /** | |
59 * @class Error | |
60 * @brief Query exception on query error | |
61 */ | |
62 class Error : public std::exception | |
63 { | |
64 private: | |
65 std::string m_error; | |
66 | |
67 public: | |
68 Error(const std::string &error); | |
69 | |
70 virtual const char *what() const throw(); | |
71 }; | |
72 | |
171 | 73 private: |
177 | 74 |
171 | 75 /** |
76 * Check if the request is valid and throws an exception | |
77 * on error. | |
78 * | |
79 * @param row the row number | |
80 * @param column the column name | |
177 | 81 * @param type |
82 * @throw Error on error | |
171 | 83 */ |
177 | 84 void assertRequest(int row, const std::string &column, ColumnType type); |
171 | 85 |
86 protected: | |
87 /** | |
88 * Get a bool. | |
89 * | |
90 * @param row the row number | |
91 * @param column the column | |
92 * @return the value | |
93 */ | |
177 | 94 virtual bool getBoolean(int row, const std::string &column) = 0; |
171 | 95 |
96 /** | |
97 * Get a Date. | |
98 * | |
99 * @param row the row number | |
100 * @param column the column | |
101 * @return the value | |
102 */ | |
177 | 103 virtual Date getDate(int row, const std::string &column) = 0; |
171 | 104 |
105 /** | |
106 * Get a double. | |
107 * | |
108 * @param row the row number | |
109 * @param column the column | |
110 * @return the value | |
111 */ | |
177 | 112 virtual double getDouble(int row, const std::string &column) = 0; |
171 | 113 |
114 /** | |
115 * Get a integer. | |
116 * | |
117 * @param row the row number | |
118 * @param column the column | |
119 * @return the value | |
120 */ | |
177 | 121 virtual int getInt(int row, const std::string &column) = 0; |
171 | 122 |
123 /** | |
124 * Get a string. | |
125 * | |
126 * @param row the row number | |
127 * @param column the column | |
128 * @return the value | |
129 */ | |
177 | 130 virtual std::string getString(int row, const std::string &column) = 0; |
171 | 131 |
132 public: | |
133 /** | |
177 | 134 * Default destructor. |
171 | 135 */ |
177 | 136 virtual ~Query(); |
171 | 137 |
138 /** | |
177 | 139 * Get a variable from a row and column. |
171 | 140 * |
177 | 141 * Specialization available: |
142 * - bool | |
143 * - Date | |
144 * - double | |
145 * - int | |
146 * - std::string | |
147 * | |
148 * @param row the row number (starts from 0) | |
149 * @param column the the column name | |
150 * @return the value | |
171 | 151 */ |
177 | 152 template <class T> |
153 T get(int row, const std::string &column); | |
171 | 154 |
155 /** | |
177 | 156 * Returns the type of a named column. |
171 | 157 * |
177 | 158 * @param column the column name |
159 * @return the type | |
171 | 160 */ |
177 | 161 virtual ColumnType type(const std::string &column) const = 0; |
171 | 162 |
163 /** | |
164 * Tells how many rows has been fetched. | |
165 * | |
166 * @return the number of rows | |
167 */ | |
177 | 168 virtual int countRows() = 0; |
171 | 169 |
170 /** | |
171 * Tells how many number of columns are present for each | |
172 * row. | |
173 * | |
174 * @return the number of columns | |
175 */ | |
177 | 176 virtual int countColumns() = 0; |
171 | 177 |
178 /** | |
179 * Tells if the column is null or not. | |
180 * | |
181 * @param row the row number | |
182 * @param column the column | |
183 * @return an true if null | |
184 */ | |
185 virtual bool isNull(int row, const std::string &column) = 0; | |
186 | |
187 /** | |
188 * Dump all rows and columns. | |
189 */ | |
177 | 190 virtual void dump() = 0; |
171 | 191 }; |
192 | |
177 | 193 /** |
194 * @class Driver | |
195 * @brief A generic SQL driver | |
196 * | |
197 * This class is used to connect to a database and execute SQL queries. It | |
198 * does not include any DBMS code and just call virtual functions for | |
199 * a simpler integration of new DBMS drivers. | |
200 */ | |
201 class Driver : public std::enable_shared_from_this<Driver> { | |
171 | 202 protected: |
203 std::string m_error; | |
204 | |
177 | 205 /** |
206 * Default constructor. Should not be used. | |
207 * | |
208 * @see Driver::create | |
209 */ | |
210 Driver(); | |
211 | |
171 | 212 public: |
213 typedef std::map<std::string, std::string> Params; | |
177 | 214 typedef std::shared_ptr<Driver> Ptr; |
171 | 215 |
172
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
216 /** |
177 | 217 * Create a new Driver object, some queries need to do additional |
218 * internal requests so it's easier to use shared_ptr. | |
219 * | |
220 * @return a shared_ptr | |
172
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
221 */ |
177 | 222 template <class T> |
223 static Ptr create() | |
224 { | |
225 T *t = new T(); | |
226 | |
227 return std::shared_ptr<T>(t); | |
228 } | |
172
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
229 |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
230 /** |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
231 * Virtual destructor. |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
232 */ |
171 | 233 virtual ~Driver(); |
234 | |
235 /** | |
236 * Get the error. | |
237 * | |
238 * @return the error | |
239 */ | |
177 | 240 const std::string &getError() const; |
171 | 241 |
242 /** | |
243 * Create a synchronous connection, it waits and block until | |
244 * the connection is made up to a specified timeout max. | |
245 * | |
246 * @param params a list of parameters. | |
247 */ | |
248 virtual bool connect(const Params ¶ms) = 0; | |
249 | |
250 /** | |
251 * Execute a query. | |
252 * | |
253 * @param query the SQL command | |
254 * @return a result | |
255 * @throw Query::Exception on failure | |
256 */ | |
177 | 257 virtual Query::Ptr query(const std::string &command) = 0; |
171 | 258 |
259 /** | |
260 * Get the driver connection description. | |
261 * | |
262 * @return the description | |
263 */ | |
264 virtual std::string description() const = 0; | |
177 | 265 |
266 /** | |
267 * Get the driver version as a string. | |
268 * | |
269 * @return the version | |
270 */ | |
271 virtual std::string version() const = 0; | |
171 | 272 }; |
273 | |
274 #endif // !_DRIVER_H_ |