Mercurial > code
annotate C++/modules/Driver/Driver.h @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/Driver.h@1aceace80f61 |
children |
rev | line source |
---|---|
171 | 1 /* |
2 * Driver.h -- generic SQL driver access | |
3 * | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> |
171 | 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 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
22 #include <ctime> |
171 | 23 #include <memory> |
24 #include <string> | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
25 #include <unordered_map> |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
26 #include <type_traits> |
171 | 27 |
28 /** | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
29 * @enum DriverColumn |
171 | 30 * @brief The column type request |
31 * | |
32 * Used for the drivers. | |
33 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
34 enum class DriverColumn { |
177 | 35 Invalid, //! not found |
171 | 36 Boolean, //! bool or 0 / 1 |
37 Date, //! date see Common/Date.h | |
38 Double, //! double | |
39 Integer, //! 32 or 64 bit int | |
40 String, //! varchar to std::string | |
41 }; | |
42 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
43 template <typename T> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
44 struct DriverTypeInfo : std::false_type { }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
45 |
171 | 46 /** |
47 * @class Query | |
48 * @brief Class for querying the database | |
177 | 49 * |
50 * That class is returned when a SQL query succeed. It can retrieve the | |
51 * number of rows, columns and retrieve the results independantly from the | |
52 * driver. | |
53 * | |
54 * @see Driver::query | |
171 | 55 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
56 class DriverQuery { |
177 | 57 public: |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
58 friend struct DriverTypeInfo<bool>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
59 friend struct DriverTypeInfo<time_t>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
60 friend struct DriverTypeInfo<double>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
61 friend struct DriverTypeInfo<int>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
62 friend struct DriverTypeInfo<std::string>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
63 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
64 class Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
65 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
66 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
67 * Get a bool. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
68 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
69 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
70 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
71 * @return the value |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
72 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
73 virtual bool getBoolean(int row, const std::string &column) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
74 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
75 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
76 * Get a Date. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
77 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
78 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
79 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
80 * @return the value |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
81 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
82 virtual time_t getDate(int row, const std::string &column) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
83 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
84 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
85 * Get a double. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
86 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
87 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
88 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
89 * @return the value |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
90 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
91 virtual double getDouble(int row, const std::string &column) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
92 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
93 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
94 * Get a integer. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
95 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
96 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
97 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
98 * @return the value |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
99 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
100 virtual int getInt(int row, const std::string &column) = 0; |
177 | 101 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
102 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
103 * Get a string. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
104 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
105 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
106 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
107 * @return the value |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
108 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
109 virtual std::string getString(int row, const std::string &column) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
110 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
111 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
112 * Returns the type of a named column. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
113 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
114 * @param column the column name |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
115 * @return the type |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
116 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
117 virtual DriverColumn type(const std::string &column) const = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
118 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
119 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
120 * Tells how many rows has been fetched. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
121 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
122 * @return the number of rows |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
123 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
124 virtual int countRows() = 0; |
177 | 125 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
126 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
127 * Tells how many number of columns are present for each |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
128 * row. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
129 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
130 * @return the number of columns |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
131 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
132 virtual int countColumns() = 0; |
177 | 133 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
134 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
135 * Tells if the column is null or not. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
136 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
137 * @param row the row number |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
138 * @param column the column |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
139 * @return an true if null |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
140 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
141 virtual bool isNull(int row, const std::string &column) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
142 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
143 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
144 * Dump all rows and columns. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
145 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
146 virtual void dump() = 0; |
177 | 147 }; |
148 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
149 using Ptr = std::shared_ptr<Impl>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
150 |
171 | 151 private: |
152 /** | |
153 * Check if the request is valid and throws an exception | |
154 * on error. | |
155 * | |
156 * @param row the row number | |
157 * @param column the column name | |
177 | 158 * @param type |
159 * @throw Error on error | |
171 | 160 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
161 void assertRequest(int row, const std::string &column, DriverColumn type); |
171 | 162 |
163 protected: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
164 Ptr m_impl; |
171 | 165 |
166 public: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
167 DriverQuery(Ptr impl); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
168 |
171 | 169 /** |
177 | 170 * Default destructor. |
171 | 171 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
172 virtual ~DriverQuery(); |
171 | 173 |
174 /** | |
177 | 175 * Get a variable from a row and column. |
171 | 176 * |
177 | 177 * Specialization available: |
178 * - bool | |
179 * - Date | |
180 * - double | |
181 * - int | |
182 * - std::string | |
183 * | |
184 * @param row the row number (starts from 0) | |
185 * @param column the the column name | |
186 * @return the value | |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
187 * @throw Query::Error on error |
171 | 188 */ |
177 | 189 template <class T> |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
190 T get(int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
191 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
192 static_assert(DriverTypeInfo<T>::value, "unsupported type"); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
193 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
194 assertRequest(row, column, DriverTypeInfo<T>::type); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
195 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
196 return DriverTypeInfo<T>::get(*this, row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
197 } |
171 | 198 |
199 /** | |
177 | 200 * Returns the type of a named column. |
171 | 201 * |
177 | 202 * @param column the column name |
203 * @return the type | |
171 | 204 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
205 DriverColumn type(const std::string &column) const; |
171 | 206 |
207 /** | |
208 * Tells how many rows has been fetched. | |
209 * | |
210 * @return the number of rows | |
211 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
212 int countRows(); |
171 | 213 |
214 /** | |
215 * Tells how many number of columns are present for each | |
216 * row. | |
217 * | |
218 * @return the number of columns | |
219 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
220 int countColumns(); |
171 | 221 |
222 /** | |
223 * Tells if the column is null or not. | |
224 * | |
225 * @param row the row number | |
226 * @param column the column | |
227 * @return an true if null | |
228 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
229 bool isNull(int row, const std::string &column); |
171 | 230 |
231 /** | |
232 * Dump all rows and columns. | |
233 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
234 void dump(); |
171 | 235 }; |
236 | |
177 | 237 /** |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
238 * @class Request |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
239 * @brief A secure helper for creating requests |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
240 * |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
241 * This helps creating class with SQL injection security and such. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
242 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
243 class DriverRequest { |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
244 public: |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
245 friend struct DriverTypeInfo<bool>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
246 friend struct DriverTypeInfo<time_t>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
247 friend struct DriverTypeInfo<double>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
248 friend struct DriverTypeInfo<int>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
249 friend struct DriverTypeInfo<std::string>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
250 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
251 class Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
252 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
253 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
254 * Bind a boolean. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
255 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
256 * @param value the boolean |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
257 * @return the string to use |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
258 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
259 virtual std::string bindBoolean(bool value) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
260 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
261 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
262 * Bind a date. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
263 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
264 * @param value the date |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
265 * @return the string to use |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
266 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
267 virtual std::string bindDate(time_t value) = 0; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
268 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
269 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
270 * Bind a double. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
271 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
272 * @param value the double |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
273 * @return the string to use |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
274 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
275 virtual std::string bindDouble(double value) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
276 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
277 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
278 * Bind an integer. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
279 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
280 * @param value the integer |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
281 * @return the string to use |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
282 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
283 virtual std::string bindInteger(int value) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
284 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
285 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
286 * Bind a string. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
287 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
288 * @param value the string |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
289 * @return the string to use |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
290 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
291 virtual std::string bindString(std::string value) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
292 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
293 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
294 using Ptr = std::shared_ptr<Impl>; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
295 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
296 private: |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
297 size_t m_pos; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
298 int m_params; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
299 std::string m_command; |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
300 Ptr m_impl; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
301 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
302 void assertCorrect(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
303 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
304 void setValue(const std::string &value); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
305 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
306 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
307 DriverRequest(Ptr impl, const std::string &command); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
308 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
309 /** |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
310 * Default destructor. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
311 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
312 virtual ~DriverRequest(); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
313 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
314 /** |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
315 * Bind a value. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
316 * |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
317 * @param value the value |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
318 */ |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
319 template <typename T> |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
320 void bind(T value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
321 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
322 static_assert(DriverTypeInfo<T>::value, "unsupported type"); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
323 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
324 setValue(DriverTypeInfo<T>::bind(value)); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
325 } |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
326 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
327 /** |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
328 * Convert the request to string. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
329 * |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
330 * @return the request as a string |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
331 */ |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
332 operator std::string(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
333 }; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
334 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
335 /** |
177 | 336 * @class Driver |
337 * @brief A generic SQL driver | |
338 * | |
339 * This class is used to connect to a database and execute SQL queries. It | |
340 * does not include any DBMS code and just call virtual functions for | |
341 * a simpler integration of new DBMS drivers. | |
342 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
343 class Driver { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
344 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
345 class Impl; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
346 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
347 using Params = std::unordered_map<std::string, std::string>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
348 using Ptr = std::shared_ptr<Impl>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
349 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
350 class Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
351 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
352 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
353 * Create a synchronous connection, it waits and block until |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
354 * the connection is made up to a specified timeout max. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
355 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
356 * @param params a list of parameters. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
357 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
358 virtual void connect(const Params ¶ms) = 0; |
171 | 359 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
360 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
361 * Prepare a request with the specified SQL command. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
362 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
363 * @param command the SQL command to parse and bind |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
364 * @return a request to use with query |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
365 * @see query |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
366 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
367 virtual DriverRequest prepare(const std::string &command) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
368 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
369 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
370 * Execute a query. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
371 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
372 * @param query the SQL command |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
373 * @return a result |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
374 * @throw Query::Error on failure |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
375 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
376 virtual DriverQuery query(const std::string &command) = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
377 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
378 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
379 * Get the driver connection description. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
380 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
381 * @return the description |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
382 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
383 virtual std::string description() const = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
384 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
385 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
386 * Get the driver version as a string. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
387 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
388 * @return the version |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
389 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
390 virtual std::string version() const = 0; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
391 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
392 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
393 protected: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
394 Ptr m_impl; |
177 | 395 |
171 | 396 public: |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
397 Driver() = default; |
172
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
398 |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
399 /** |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
400 * Virtual destructor. |
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
401 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
402 virtual ~Driver() = default; |
171 | 403 |
404 /** | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
405 * Wrapper for std::string variant. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
406 * |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
407 * @param request the request to use |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
408 * @return a result |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
409 * @throw Query::Error on failure |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
410 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
411 DriverQuery query(DriverRequest request); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
412 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
413 /** |
171 | 414 * Create a synchronous connection, it waits and block until |
415 * the connection is made up to a specified timeout max. | |
416 * | |
417 * @param params a list of parameters. | |
418 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
419 void connect(const Params ¶ms); |
171 | 420 |
421 /** | |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
422 * Prepare a request with the specified SQL command. |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
423 * |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
424 * @param command the SQL command to parse and bind |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
425 * @return a request to use with query |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
426 * @see query |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
427 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
428 DriverRequest prepare(const std::string &command); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
429 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
181
diff
changeset
|
430 /** |
171 | 431 * Execute a query. |
432 * | |
433 * @param query the SQL command | |
434 * @return a result | |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
435 * @throw Query::Error on failure |
171 | 436 */ |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
437 DriverQuery query(const std::string &command); |
171 | 438 |
439 /** | |
440 * Get the driver connection description. | |
441 * | |
442 * @return the description | |
443 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
444 std::string description() const; |
177 | 445 |
446 /** | |
447 * Get the driver version as a string. | |
448 * | |
449 * @return the version | |
450 */ | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
451 std::string version() const; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
452 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
453 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
454 template <> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
455 struct DriverTypeInfo<bool> : std::true_type { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
456 static const DriverColumn type = DriverColumn::Boolean; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
457 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
458 static bool get(DriverQuery &query, int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
459 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
460 return query.m_impl->getBoolean(row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
461 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
462 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
463 static void bind(DriverRequest &request, bool value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
464 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
465 request.m_impl->bindBoolean(value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
466 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
467 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
468 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
469 template <> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
470 struct DriverTypeInfo<time_t> : std::true_type { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
471 static const DriverColumn type = DriverColumn::Date; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
472 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
473 static time_t get(DriverQuery &query, int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
474 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
475 return query.m_impl->getDate(row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
476 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
477 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
478 static void bind(DriverRequest &request, time_t value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
479 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
480 request.m_impl->bindDate(value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
481 } |
171 | 482 }; |
483 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
484 template <> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
485 struct DriverTypeInfo<double> : std::true_type { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
486 static const DriverColumn type = DriverColumn::Double; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
487 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
488 static double get(DriverQuery &query, int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
489 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
490 return query.m_impl->getDouble(row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
491 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
492 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
493 static void bind(DriverRequest &request, double value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
494 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
495 request.m_impl->bindDouble(value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
496 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
497 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
498 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
499 template <> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
500 struct DriverTypeInfo<int> : std::true_type { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
501 static const DriverColumn type = DriverColumn::Integer; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
502 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
503 static int get(DriverQuery &query, int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
504 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
505 return query.m_impl->getInt(row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
506 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
507 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
508 static void bind(DriverRequest &request, int value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
509 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
510 request.m_impl->bindInteger(value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
511 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
512 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
513 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
514 template <> |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
515 struct DriverTypeInfo<std::string> : std::true_type { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
516 static const DriverColumn type = DriverColumn::String; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
517 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
518 static std::string get(DriverQuery &query, int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
519 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
520 return query.m_impl->getString(row, column); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
521 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
522 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
523 static void bind(DriverRequest &request, const std::string &value) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
524 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
525 request.m_impl->bindString(value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
526 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
527 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
528 |
171 | 529 #endif // !_DRIVER_H_ |