]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/store/db/pg_driver.cpp
61adda2648f73cbdf123f7eebc5ad3113d4d151f
[stg.git] / projects / stargazer / plugins / store / db / pg_driver.cpp
1 #include <sstream>
2
3 #include "pg_driver.h"
4
5 BASE_DB * CreateDriver()
6 {
7     return new PG_DRIVER();
8 }
9
10 void DestroyDriver(BASE_DB * drv)
11 {
12     delete drv;
13 }
14
15 PG_DRIVER::~PG_DRIVER()
16 {
17     if (conn != NULL)
18         PQfinish(conn);
19 }
20
21 bool PG_DRIVER::Connect()
22 {
23     std::stringstream params;
24     params << "host=" << host
25            << "dbname=" << database
26            << "user=" << user
27            << "password=" << password;
28     std::string str = params.str();
29     conn = PQconnectdb(str.c_str());
30     errorMsg = PQerrorMessage(conn);
31     return PQstatus(conn) != CONNECTION_OK;
32 }
33
34 bool PG_DRIVER::Disconnect()
35 {
36     if (PQstatus(conn) == CONNECTION_OK) {
37         PQfinish(conn);
38         errorMsg = PQerrorMessage(conn);
39         return PQstatus(conn) != CONNECTION_BAD;
40     }
41
42     return false;
43 }
44
45 bool PG_DRIVER::Query(const std::string & query)
46 {
47     cols.erase(cols.begin(), cols.end());
48     cols.reserve(columns);
49
50     PQclear(result);
51     result = PQexec(conn, query.c_str());
52     errorMsg = PQerrorMessage(conn);
53     tuples = PQntuples(result);
54     columns = PQnfields(result);
55     affected = atoi(PQcmdTuples(result));
56
57     if (tuples) {
58         for (int i = 0; i < columns; ++i)
59             cols.push_back(PQfname(result, i));
60     }
61
62     if (!result)
63         return true;
64
65     if (PQresultStatus(result) == PGRES_COMMAND_OK)
66         return false;
67
68     if (PQresultStatus(result) == PGRES_TUPLES_OK)
69         return false;
70
71     return true;
72 }
73
74 bool PG_DRIVER::Start()
75 {
76     return Query("BEGIN");
77 }
78
79 bool PG_DRIVER::Commit()
80 {
81     return Query("COMMIT");
82 }
83
84 bool PG_DRIVER::Rollback()
85 {
86     return Query("ROLLBACK");
87 }
88
89 BASE_DB::TUPLE PG_DRIVER::GetTuple(int n) const
90 {
91     BASE_DB::TUPLE tuple;
92
93     for (int i = 0; i < columns; ++i)
94         tuple[cols[i]] = PQgetvalue(result, n, i);
95
96     return tuple;
97 }
98
99 BASE_DB::TUPLES PG_DRIVER::GetResult() const
100 {
101     BASE_DB::TUPLES tpls;
102
103     for (int i = 0; i < tuples; ++i)
104         tpls.push_back(GetTuple(i));
105
106     return tpls;
107 }