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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * DriverPostgres.cpp -- PostgreSQL driver
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <sstream>
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
24 #include <vector>
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
35 }
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
112 {
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
113 DriverColumn type;
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
114 int pqType, index;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
115
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
116 index = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
121 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
122 case 1082:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
123 case 1083:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
127 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
128 case 1700:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
129 case 700:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
132 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
133 case 20:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
134 case 21:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
137 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
138 case 25:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
139 case 1042:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
142 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
143 default:
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
144 type = DriverColumn::Invalid;
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
145 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
146
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
147 return type;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
148 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
149
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
150 int QueryPostgresImpl::countRows()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 return PQntuples(m_result.get());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
155 int QueryPostgresImpl::countColumns()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 return PQnfields(m_result.get());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 int idx = PQfnumber(m_result.get(), column.c_str());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 return PQgetisnull(m_result.get(), row, idx) == 1;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
214
6c49e5e3ecc8 Driver: now data is shared internally
David Demelier <markand@malikania.fr>
parents: 190
diff changeset
167 void QueryPostgresImpl::dump(void)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 std::cout << "Dumping PostgreSQL result, ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 std::cout << countRows() << " rows, ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 std::cout << countColumns() << " columns" << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 std::cout << "Dumping row " << r << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 std::cout << "==============================" << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 std::cout << "\t" << PQfname(m_result.get(), c);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 std::cout << " = " << PQgetvalue(m_result.get(), r, c) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 * -------------------------------------------------------- */
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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 &params);
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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 &params)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
396
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 oss << "host = " << params["host"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 oss << "port = " << params["port"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 oss << "user = " << params["user"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 oss << "dbname = " << params["database"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 oss << "password = " << params["password"];
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
402
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 return oss.str();
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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 &params)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 PQfinish(conn);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 PGresult *info;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
432
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 // If NULL, the libpq said no memory
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
434 info = PQexec(m_connection.get(), cmd.c_str());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
437
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 // If an error occured
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
451 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 std::ostringstream oss;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
456
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 oss << "Connected on PostgreSQL database: " << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 oss << " host: " << PQhost(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 oss << " port: " << PQport(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 oss << " user: " << PQuser(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 oss << " database: " << PQdb(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
462
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 return oss.str();
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 }
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
467 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
468 std::ostringstream oss;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
471
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
472 return oss.str();
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
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 }