annotate C++/DriverPostgres.cpp @ 189:cc1e5fe1ee2c

Update drivers to style and using instead of typedefs
author David Demelier <markand@malikania.fr>
date Tue, 26 Nov 2013 20:36:59 +0100
parents 4c746050969a
children d263f85f43a4
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 *
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, David Demelier <markand@malikania.fr>
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
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <sstream>
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
21 #include "DriverPostgres.h"
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 /* --------------------------------------------------------
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 * Query PostgreSQL (protected methods)
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 * -------------------------------------------------------- */
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
27 bool QueryPostgres::getBoolean(int row, const std::string &column)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 {
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
29 int idx = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
30 std::string code = PQgetvalue(m_result.get(), row, idx);
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
32 return code[0] == 't';
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
33 }
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
35 Date QueryPostgres::getDate(int row, const std::string &column)
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
36 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
37 int idx = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
38 long timestamp = static_cast<long>(time(0));
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
39
184
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
40 try {
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
41 std::ostringstream oss;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
42 std::string value, req;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
43
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
44 value = PQgetvalue(m_result.get(), row, idx);
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
45
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
46 /*
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
47 * Convert the date using the SQL function so that user does
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
48 * not require any explicit conversion itself.
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
49 */
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
50 oss << "Select EXTRACT(EPOCH FROM TIMESTAMP '";
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
51 oss << value;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
52 oss << "') AS RESULT";
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
53 req = oss.str();
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
54
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
55 Query::Ptr result = m_driver->query(req);
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
56 timestamp = result->get<double>(0, "RESULT");
184
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
57 } catch (...) { }
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
59 return Date(static_cast<time_t>(timestamp));
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
60 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
61
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
62 double QueryPostgres::getDouble(int row, const std::string &column)
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
63 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
64 int idx = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
65
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
66 return std::stod(PQgetvalue(m_result.get(), row, idx));
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
67 }
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
69 int QueryPostgres::getInt(int row, const std::string &column)
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
70 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
71 int idx = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
72
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
73 return std::stoi(PQgetvalue(m_result.get(), row, idx));
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
74 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
75
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
76 std::string QueryPostgres::getString(int row, const std::string &column)
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
77 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
78 int idx = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
79
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
80 return std::string(PQgetvalue(m_result.get(), row, idx));
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 /* --------------------------------------------------------
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 * Query PostgreSQL (public methods)
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * -------------------------------------------------------- */
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
87 QueryPostgres::QueryPostgres(Driver::Ptr driver, PostgresResult result)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 {
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
89 m_driver = driver;
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 m_result = std::move(result);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
93 QueryPostgres::~QueryPostgres()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
97 ColumnType QueryPostgres::type(const std::string &column) const
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
98 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
99 ColumnType type;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
100 int pqType, index;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
101
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
102 index = PQfnumber(m_result.get(), column.c_str());
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
103 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
104 switch (pqType) {
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
105 case 16:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
106 type = ColumnType::Boolean;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
107 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
108 case 1082:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
109 case 1083:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
110 case 1114:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
111 type = ColumnType::Date;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
112 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
113 case 1700:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
114 case 700:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
115 case 701:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
116 type = ColumnType::Double;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
117 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
118 case 20:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
119 case 21:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
120 case 23:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
121 type = ColumnType::Integer;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
122 break;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
123 case 25:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
124 case 1042:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
125 case 1043:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
126 type = ColumnType::String;
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 default:
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
129 type = ColumnType::Invalid;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
130 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
131
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
132 return type;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
133 }
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
134
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
135 int QueryPostgres::countRows()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 return PQntuples(m_result.get());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
140 int QueryPostgres::countColumns()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 return PQnfields(m_result.get());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
145 bool QueryPostgres::isNull(int row, const std::string &column)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 int idx = PQfnumber(m_result.get(), column.c_str());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 return PQgetisnull(m_result.get(), row, idx) == 1;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
151
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
152 void QueryPostgres::dump(void)
171
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 std::cout << "Dumping PostgreSQL result, ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 std::cout << countRows() << " rows, ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 std::cout << countColumns() << " columns" << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
189
cc1e5fe1ee2c Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents: 184
diff changeset
158 for (int r = 0; r < countRows(); ++r) {
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 std::cout << "Dumping row " << r << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 std::cout << "==============================" << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
161
189
cc1e5fe1ee2c Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents: 184
diff changeset
162 for (int c = 0; c < countColumns(); ++c) {
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 std::cout << "\t" << PQfname(m_result.get(), c);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 std::cout << " = " << PQgetvalue(m_result.get(), r, c) << std::endl;
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 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 }
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 /* --------------------------------------------------------
184
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
170 * Request PostgreSQL
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
171 * -------------------------------------------------------- */
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
172
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
173 RequestPostgres::RequestPostgres(const std::string &command)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
174 : Request(command)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
175 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
176 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
177
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
178 std::string RequestPostgres::bindBoolean(bool value)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
179 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
180 return (value) ? "'t'" : "'f'";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
181 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
182
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
183 std::string RequestPostgres::bindDate(Date value)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
184 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
185 std::ostringstream oss;
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
186
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
187 oss << "to_timestamp(";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
188 oss << value.getTimestamp();
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
189 oss << ")";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
190
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
191 return oss.str();
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
192 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
193
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
194 std::string RequestPostgres::bindDouble(double value)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
195 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
196 return std::to_string(value);
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
197 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
198
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
199 std::string RequestPostgres::bindInt(int value)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
200 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
201 return std::to_string(value);
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
202 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
203
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
204 std::string RequestPostgres::bindString(std::string value)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
205 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
206 std::ostringstream oss;
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
207
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
208 oss << "'";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
209 for (auto c : value) {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
210 if (c == '\'')
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
211 oss << "\\'";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
212 else
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
213 oss << c;
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
214 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
215
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
216 oss << "'";
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
217
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
218 return oss.str();
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
219 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
220
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
221 /* --------------------------------------------------------
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 * Driver PostgreSQL
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 * -------------------------------------------------------- */
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
225 DriverPostgres::DriverPostgres()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
229 DriverPostgres::~DriverPostgres()
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
233 std::string DriverPostgres::convert(Params &params)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 std::ostringstream oss;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
236
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 oss << "host = " << params["host"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 oss << "port = " << params["port"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 oss << "user = " << params["user"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 oss << "dbname = " << params["database"] << " ";
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 oss << "password = " << params["password"];
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 return oss.str();
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
246 bool DriverPostgres::connect(const Params &params)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 Params copy = params;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 PGconn *conn = PQconnectdb(convert(copy).c_str());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
189
cc1e5fe1ee2c Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents: 184
diff changeset
251 if (conn == nullptr) {
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 m_error = strerror(ENOMEM);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 return false;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
255
189
cc1e5fe1ee2c Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents: 184
diff changeset
256 if (PQstatus(conn) == CONNECTION_BAD) {
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 m_error = PQerrorMessage(conn);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 PQfinish(conn);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
259
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 return false;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 m_connection = PostgresConn(conn);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
264
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 return true;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
267
184
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
268 Request::Ptr DriverPostgres::prepare(const std::string &command)
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
269 {
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
270 return std::make_shared<RequestPostgres>(command);
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
271 }
4c746050969a Add support for request (PostgreSQL done)
David Demelier <markand@malikania.fr>
parents: 177
diff changeset
272
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
273 Query::Ptr DriverPostgres::query(const std::string &cmd)
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 PGresult *info;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
276
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 // If NULL, the libpq said no memory
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 info = PQexec(m_connection.get(), cmd.c_str());
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 if (info == nullptr)
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
280 throw Query::Error(strerror(ENOMEM));
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
281
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 // If an error occured
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 int errorCode = PQresultStatus(info);
189
cc1e5fe1ee2c Update drivers to style and using instead of typedefs
David Demelier <markand@malikania.fr>
parents: 184
diff changeset
284 if (errorCode != PGRES_COMMAND_OK && errorCode != PGRES_TUPLES_OK) {
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 std::string error = PQresultErrorMessage(info);
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 PQclear(info);
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
287 throw Query::Error(error);
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
289
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
290 return std::unique_ptr<Query>(new QueryPostgres(shared_from_this(),
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
291 QueryPostgres::PostgresResult(info)));
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 }
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
293
172
a61cddaf7547 Rename Driver postgres
David Demelier <markand@malikania.fr>
parents: 171
diff changeset
294 std::string DriverPostgres::description() const
171
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 {
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 std::ostringstream oss;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 oss << "Connected on PostgreSQL database: " << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 oss << " host: " << PQhost(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 oss << " port: " << PQport(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 oss << " user: " << PQuser(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 oss << " database: " << PQdb(m_connection.get()) << std::endl;
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 return oss.str();
e47c4e9e3f9d Add SQL drivers
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 }
177
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
306
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
307 std::string DriverPostgres::version() const
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
308 {
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
309 std::ostringstream oss;
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
310
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
311 // TODO: ADD VERSION
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
312
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
313 oss << "PostgreSQL driver";
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
314
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
315 return oss.str();
f0cca031bcce Improve Drivers
David Demelier <markand@malikania.fr>
parents: 172
diff changeset
316 }