00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "pqdataprovider.h"
00022 #include "dalexcept.h"
00023
00024 namespace dal
00025 {
00026
00027
00031 PqDataProvider::PqDataProvider(void)
00032 throw()
00033 : mDb(0)
00034 {
00035
00036 }
00037
00038
00042 PqDataProvider::~PqDataProvider(void)
00043 throw()
00044 {
00045 if (mIsConnected) {
00046 disconnect();
00047 }
00048 }
00049
00050
00054 DbBackends
00055 PqDataProvider::getDbBackend(void) const
00056 throw()
00057 {
00058 return DB_BKEND_POSTGRESQL;
00059 }
00060
00061
00065 void
00066 PqDataProvider::connect(const std::string& dbName,
00067 const std::string& userName,
00068 const std::string& password)
00069 {
00070
00071 std::string connStr = "dbname = " + dbName + " ";
00072 if (userName != "")
00073 connStr += "user = " + userName + " ";
00074 if (password != "")
00075 connStr += "password = " + password;
00076
00077
00078 mDb = PQconnectdb(connStr.c_str());
00079
00080 if (PQstatus(mDb) != CONNECTION_OK)
00081 {
00082 std::string error = PQerrorMessage(mDb);
00083 PQfinish(mDb);
00084 throw DbConnectionFailure(error);
00085 }
00086
00087
00088 mDbName = dbName;
00089
00090 mIsConnected = true;
00091 }
00092
00093
00097 const RecordSet&
00098 PqDataProvider::execSql(const std::string& sql,
00099 const bool refresh)
00100 {
00101 if (!mIsConnected) {
00102 throw std::runtime_error("not connected to database");
00103 }
00104
00105 if (refresh || (sql != mSql)) {
00106 mRecordSet.clear();
00107
00108
00109 PGresult *res;
00110
00111 res = PQexec(mDb, sql.c_str());
00112 if (PQresultStatus(res) != PGRES_COMMAND_OK) {
00113 PQclear(res);
00114 throw DbSqlQueryExecFailure(PQerrorMessage(mDb));
00115 }
00116
00117
00118 unsigned int nFields = PQnfields(res);
00119
00120
00121 Row fieldNames;
00122 for (unsigned int i = 0; i < nFields; i++) {
00123 fieldNames.push_back(PQfname(res, i));
00124 }
00125 mRecordSet.setColumnHeaders(fieldNames);
00126
00127
00128 for (unsigned int r = 0; r < PQntuples(res); r++) {
00129 Row row;
00130
00131 for (unsigned int i = 0; i < nFields; i++) {
00132 row.push_back(PQgetvalue(res, r, i));
00133 }
00134
00135 mRecordSet.add(row);
00136 }
00137
00138
00139 PQclear(res);
00140 }
00141 return mRecordSet;
00142 }
00143
00144
00148 void
00149 PqDataProvider::disconnect(void)
00150 {
00151 if (!mIsConnected) {
00152 return;
00153 }
00154
00155
00156 PQfinish(mDb);
00157
00158 mDb = 0;
00159 mIsConnected = false;
00160 }
00161
00162
00163 }