Mercurial > code
annotate C++/DriverPostgres.cpp @ 217:1aceace80f61
Driver: remove useless line
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 05 May 2014 22:36:57 +0200 |
parents | bb0a7d1a3f86 |
children | 82510454e772 |
rev | line source |
---|---|
171 | 1 /* |
2 * DriverPostgres.cpp -- PostgreSQL driver | |
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 | |
216
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
19 #include <cerrno> |
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
20 #include <cstring> |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
21 #include <iostream> |
216
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
22 #include <stdexcept> |
171 | 23 #include <sstream> |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
24 #include <vector> |
171 | 25 |
216
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
26 #include <libpq-fe.h> |
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
27 |
172
a61cddaf7547
Rename Driver postgres
David Demelier <markand@malikania.fr>
parents:
171
diff
changeset
|
28 #include "DriverPostgres.h" |
171 | 29 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
30 namespace { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
31 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
32 using PostgresResult = std::shared_ptr<PGresult>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
33 using PostgresConn = std::shared_ptr<PGconn>; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
34 |
177 | 35 } |
171 | 36 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
37 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
38 * @class QueryPostgres |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
39 * @brief Query implementation for PostgreSQL. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
40 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
41 class QueryPostgresImpl : public DriverQuery::Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
42 private: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
43 PostgresConn m_connection; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
44 PostgresResult m_result; |
177 | 45 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
46 public: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
47 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
48 * Constructor used by DriverPostgres |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
49 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
50 * @param result the result |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
51 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
52 QueryPostgresImpl(PostgresConn conn, PostgresResult result); |
177 | 53 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
54 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
55 * @copydoc Query::getBoolean |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
56 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
57 virtual bool getBoolean(int row, const std::string &column); |
171 | 58 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
59 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
60 * @copydoc Query::getDate |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
61 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
62 virtual time_t getDate(int row, const std::string &column); |
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 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
65 * @copydoc Query::getDouble |
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 virtual double getDouble(int row, const std::string &column); |
177 | 68 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
69 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
70 * @copydoc Query::getInt |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
71 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
72 virtual int getInt(int row, const std::string &column); |
177 | 73 |
214
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 * @copydoc Query::getString |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
76 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
77 virtual std::string getString(int row, const std::string &column); |
171 | 78 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
79 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
80 * @copydoc Query::type |
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 DriverColumn type(const std::string &column) const; |
177 | 83 |
214
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 * @copydoc Query::countRows |
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 virtual int countRows(); |
177 | 88 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
89 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
90 * @copydoc Query::countColumns |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
91 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
92 virtual int countColumns(); |
177 | 93 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
94 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
95 * @copydoc Query::isNull |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
96 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
97 virtual bool isNull(int row, const std::string &column); |
171 | 98 |
214
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 * @copydoc Query::dump |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
101 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
102 virtual void dump(); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
103 }; |
171 | 104 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
105 QueryPostgresImpl::QueryPostgresImpl(PostgresConn conn, PostgresResult result) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
106 : m_connection(conn) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
107 , m_result(result) |
171 | 108 { |
109 } | |
110 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
111 DriverColumn QueryPostgresImpl::type(const std::string &column) const |
177 | 112 { |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
113 DriverColumn type; |
177 | 114 int pqType, index; |
115 | |
116 index = PQfnumber(m_result.get(), column.c_str()); | |
117 pqType = PQftype(m_result.get(), index); | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
118 switch (pqType) { |
177 | 119 case 16: |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
120 type = DriverColumn::Boolean; |
177 | 121 break; |
122 case 1082: | |
123 case 1083: | |
124 case 1114: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
125 case 1184: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
126 type = DriverColumn::Date; |
177 | 127 break; |
128 case 1700: | |
129 case 700: | |
130 case 701: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
131 type = DriverColumn::Double; |
177 | 132 break; |
133 case 20: | |
134 case 21: | |
135 case 23: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
136 type = DriverColumn::Integer; |
177 | 137 break; |
138 case 25: | |
139 case 1042: | |
140 case 1043: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
141 type = DriverColumn::String; |
177 | 142 break; |
143 default: | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
144 type = DriverColumn::Invalid; |
177 | 145 } |
146 | |
147 return type; | |
148 } | |
149 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
150 int QueryPostgresImpl::countRows() |
171 | 151 { |
152 return PQntuples(m_result.get()); | |
153 } | |
154 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
155 int QueryPostgresImpl::countColumns() |
171 | 156 { |
157 return PQnfields(m_result.get()); | |
158 } | |
159 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
160 bool QueryPostgresImpl::isNull(int row, const std::string &column) |
171 | 161 { |
162 int idx = PQfnumber(m_result.get(), column.c_str()); | |
163 | |
164 return PQgetisnull(m_result.get(), row, idx) == 1; | |
165 } | |
166 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
167 void QueryPostgresImpl::dump(void) |
171 | 168 { |
169 std::cout << "Dumping PostgreSQL result, "; | |
170 std::cout << countRows() << " rows, "; | |
171 std::cout << countColumns() << " columns" << std::endl; | |
172 | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
173 for (int r = 0; r < countRows(); ++r) { |
171 | 174 std::cout << "Dumping row " << r << std::endl; |
175 std::cout << "==============================" << std::endl; | |
176 | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
177 for (int c = 0; c < countColumns(); ++c) { |
171 | 178 std::cout << "\t" << PQfname(m_result.get(), c); |
179 std::cout << " = " << PQgetvalue(m_result.get(), r, c) << std::endl; | |
180 } | |
181 } | |
182 } | |
183 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
184 bool QueryPostgresImpl::getBoolean(int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
185 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
186 int idx = PQfnumber(m_result.get(), column.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
187 std::string code = PQgetvalue(m_result.get(), row, idx); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
188 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
189 return code[0] == 't'; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
190 } |
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 time_t QueryPostgresImpl::getDate(int row, const std::string &column) |
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 int idx = PQfnumber(m_result.get(), column.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
195 time_t timestamp = std::time(nullptr); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
196 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
197 try { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
198 std::ostringstream oss; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
199 std::string value, req; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
200 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
201 value = PQgetvalue(m_result.get(), row, idx); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
202 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
203 /* |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
204 * Convert the date using the SQL function so that user does |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
205 * not require any explicit conversion itself. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
206 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
207 printf("%s\n", value.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
208 oss << "Select EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '"; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
209 oss << value; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
210 oss << "') AS RESULT"; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
211 req = oss.str(); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
212 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
213 auto info = PQexec(m_connection.get(), oss.str().c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
214 auto status = PQresultStatus(info); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
215 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
216 if (info != nullptr && (status == PGRES_COMMAND_OK || |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
217 status == PGRES_TUPLES_OK)) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
218 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
219 timestamp = atoi(PQgetvalue(info, 0, 0)); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
220 PQclear(info); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
221 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
222 } catch (...) { } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
223 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
224 return timestamp; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
225 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
226 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
227 double QueryPostgresImpl::getDouble(int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
228 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
229 int idx = PQfnumber(m_result.get(), column.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
230 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
231 return std::stod(PQgetvalue(m_result.get(), row, idx)); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
232 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
233 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
234 int QueryPostgresImpl::getInt(int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
235 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
236 int idx = PQfnumber(m_result.get(), column.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
237 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
238 return std::stoi(PQgetvalue(m_result.get(), row, idx)); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
239 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
240 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
241 std::string QueryPostgresImpl::getString(int row, const std::string &column) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
242 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
243 int idx = PQfnumber(m_result.get(), column.c_str()); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
244 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
245 return std::string(PQgetvalue(m_result.get(), row, idx)); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
246 } |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
247 |
171 | 248 /* -------------------------------------------------------- |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
249 * Request PostgreSQL Impl |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
250 * -------------------------------------------------------- */ |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
251 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
252 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
253 * @class RequestPostgres |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
254 * @brief Request implementation for PostgreSQL. |
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 class RequestPostgres : public DriverRequest::Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
257 private: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
258 std::shared_ptr<PGconn> m_connection; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
259 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
260 protected: |
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 * @copydoc Request::bindBoolean |
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 virtual std::string bindBoolean(bool value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
265 |
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 * @copydoc Request::bindDate |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
268 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
269 virtual std::string bindDate(time_t value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
270 |
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 * @copydoc Request::bindDouble |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
273 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
274 virtual std::string bindDouble(double value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
275 |
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 * @copydoc Request::bindInteger |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
278 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
279 virtual std::string bindInteger(int value); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
280 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
281 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
282 * @copydoc Request::bindString |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
283 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
284 virtual std::string bindString(std::string value); |
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 public: |
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 * Construct a request for PostgreSQL. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
289 * |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
290 * @param conn the connection |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
291 * @param command the command |
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 RequestPostgres(PostgresConn &conn); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
294 }; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
295 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
296 RequestPostgres::RequestPostgres(PostgresConn &conn) |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
297 { |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
298 m_connection = conn; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
299 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
300 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
301 std::string RequestPostgres::bindBoolean(bool value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
302 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
303 return (value) ? "'t'" : "'f'"; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
304 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
305 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
306 std::string RequestPostgres::bindDate(time_t value) |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
307 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
308 std::ostringstream oss; |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
309 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
310 oss << "to_timestamp(" << value << ")"; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
311 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
312 return oss.str(); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
313 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
314 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
315 std::string RequestPostgres::bindDouble(double value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
316 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
317 return std::to_string(value); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
318 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
319 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
320 std::string RequestPostgres::bindInteger(int value) |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
321 { |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
322 return std::to_string(value); |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
323 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
324 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
325 std::string RequestPostgres::bindString(std::string value) |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
326 { |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
327 std::string result; |
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
328 char *tmp; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
329 |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
330 tmp = PQescapeLiteral(m_connection.get(), value.c_str(), value.length()); |
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
331 if (tmp == nullptr) |
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
332 return ""; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
333 |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
334 result = std::string(tmp); |
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
335 PQfreemem(tmp); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
336 |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
337 return result; |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
338 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
339 |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
340 /* -------------------------------------------------------- |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
341 * Driver PostgreSQL impl |
171 | 342 * -------------------------------------------------------- */ |
343 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
344 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
345 * @class DriverPostgres |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
346 * @brief Driver implementation for PostgreSQL. |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
347 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
348 class DriverPostgresImpl : public Driver::Impl { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
349 private: |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
350 PostgresConn m_connection; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
351 |
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 * Convert the Params from the config |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
354 * to the PostgreSQL string. |
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 settings the table |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
357 * @return a string to be used |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
358 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
359 std::string convert(Driver::Params &settings); |
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 public: |
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 * @copydoc Driver::connect |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
364 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
365 virtual void connect(const Driver::Params ¶ms); |
171 | 366 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
367 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
368 * @copydoc Driver::prepare |
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 virtual DriverRequest prepare(const std::string &command); |
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 /** |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
373 * @copydoc Driver::query |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
374 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
375 virtual DriverQuery query(const std::string &command); |
171 | 376 |
214
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 * @copydoc Driver::description |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
379 */ |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
380 virtual std::string description() const; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
381 |
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 * @copydoc Driver::version |
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 virtual std::string version() const; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
386 }; |
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 std::string DriverPostgresImpl::convert(Driver::Params ¶ms) |
171 | 389 { |
390 std::ostringstream oss; | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
391 std::vector<std::string> required { "host", "port", "user", "database", "password" }; |
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 for (auto s : required) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
394 if (params.count(s) <= 0) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
395 throw std::runtime_error("missing parameter " + s); |
171 | 396 |
397 oss << "host = " << params["host"] << " "; | |
398 oss << "port = " << params["port"] << " "; | |
399 oss << "user = " << params["user"] << " "; | |
400 oss << "dbname = " << params["database"] << " "; | |
401 oss << "password = " << params["password"]; | |
402 | |
403 return oss.str(); | |
404 } | |
405 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
406 void DriverPostgresImpl::connect(const Driver::Params ¶ms) |
171 | 407 { |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
408 auto copy = params; |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
409 auto conn = PQconnectdb(convert(copy).c_str()); |
171 | 410 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
411 if (conn == nullptr) |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
412 throw std::runtime_error(std::strerror(ENOMEM)); |
171 | 413 |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
414 if (PQstatus(conn) == CONNECTION_BAD) { |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
415 auto error = PQerrorMessage(conn); |
171 | 416 PQfinish(conn); |
417 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
418 throw std::runtime_error(error); |
171 | 419 } |
420 | |
216
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
421 m_connection = std::shared_ptr<PGconn>(conn, PQfinish); |
171 | 422 } |
423 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
424 DriverRequest DriverPostgresImpl::prepare(const std::string &command) |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
425 { |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
426 return DriverRequest(std::make_shared<RequestPostgres>(m_connection), command); |
184
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
427 } |
4c746050969a
Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents:
177
diff
changeset
|
428 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
429 DriverQuery DriverPostgresImpl::query(const std::string &cmd) |
171 | 430 { |
431 PGresult *info; | |
432 | |
433 // If NULL, the libpq said no memory | |
434 info = PQexec(m_connection.get(), cmd.c_str()); | |
435 if (info == nullptr) | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
436 throw std::runtime_error(strerror(ENOMEM)); |
171 | 437 |
438 // If an error occured | |
439 int errorCode = PQresultStatus(info); | |
189
cc1e5fe1ee2c
Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents:
184
diff
changeset
|
440 if (errorCode != PGRES_COMMAND_OK && errorCode != PGRES_TUPLES_OK) { |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
441 auto error = PQresultErrorMessage(info); |
171 | 442 PQclear(info); |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
443 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
444 throw std::runtime_error(error); |
171 | 445 } |
446 | |
216
bb0a7d1a3f86
Driver: fix compilation on GCC
David Demelier <markand@malikania.fr>
parents:
214
diff
changeset
|
447 auto result = std::shared_ptr<PGresult>(info, PQclear); |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
448 auto impl = std::make_shared<QueryPostgresImpl>(m_connection, result); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
449 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
450 return DriverQuery(impl); |
171 | 451 } |
452 | |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
453 std::string DriverPostgresImpl::description() const |
171 | 454 { |
455 std::ostringstream oss; | |
456 | |
457 oss << "Connected on PostgreSQL database: " << std::endl; | |
458 oss << " host: " << PQhost(m_connection.get()) << std::endl; | |
459 oss << " port: " << PQport(m_connection.get()) << std::endl; | |
460 oss << " user: " << PQuser(m_connection.get()) << std::endl; | |
461 oss << " database: " << PQdb(m_connection.get()) << std::endl; | |
462 | |
463 return oss.str(); | |
464 } | |
177 | 465 |
214
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
466 std::string DriverPostgresImpl::version() const |
177 | 467 { |
468 std::ostringstream oss; | |
469 | |
190
d263f85f43a4
Update escape string for PostgreSQL strings
David Demelier <markand@malikania.fr>
parents:
189
diff
changeset
|
470 oss << "PostgreSQL driver (version " << PQlibVersion() << ")"; |
177 | 471 |
472 return oss.str(); | |
473 } | |
214
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 /* -------------------------------------------------------- |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
476 * Driver PostgreSQL |
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 |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
479 DriverPostgres::DriverPostgres() |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
480 { |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
481 m_impl = std::make_shared<DriverPostgresImpl>(); |
6c49e5e3ecc8
Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents:
190
diff
changeset
|
482 } |