/*
* The Mana World Server
* Copyright 2004 The Mana World Development Team
*
* This file is part of The Mana World.
*
* The Mana World is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or any later version.
*
* The Mana World is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with The Mana World; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id$
*/
#include "pqdataprovider.h"
#include "dalexcept.h"
namespace dal
{
/**
* Constructor
*/
PqDataProvider::PqDataProvider(void)
throw()
: mDb(0)
{
// NOOP
}
/**
* Destructor
*/
PqDataProvider::~PqDataProvider(void)
throw()
{
if (mIsConnected) {
disconnect();
}
}
/**
* Get the database backend name.
*/
DbBackends
PqDataProvider::getDbBackend(void) const
throw()
{
return DB_BKEND_POSTGRESQL;
}
/**
* Create a connection to the database.
*/
void
PqDataProvider::connect(const std::string& dbName,
const std::string& userName,
const std::string& password)
{
// Create string to pass to PQconnectdb
std::string connStr = "dbname = " + dbName + " "; // database name
if (userName != "")
connStr += "user = " + userName + " "; // username
if (password != "")
connStr += "password = " + password; // password
// Connect to database
mDb = PQconnectdb(connStr.c_str());
if (PQstatus(mDb) != CONNECTION_OK)
{
std::string error = PQerrorMessage(mDb);
PQfinish(mDb);
throw DbConnectionFailure(error);
}
// Save the Db Name.
mDbName = dbName;
mIsConnected = true;
}
/**
* Execute a SQL query.
*/
const RecordSet&
PqDataProvider::execSql(const std::string& sql,
const bool refresh)
{
if (!mIsConnected) {
throw std::runtime_error("not connected to database");
}
if (refresh || (sql != mSql)) {
mRecordSet.clear();
// execute the query
PGresult *res;
res = PQexec(mDb, sql.c_str());
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
PQclear(res);
throw DbSqlQueryExecFailure(PQerrorMessage(mDb));
}
// get field count
unsigned int nFields = PQnfields(res);
// fill column names
Row fieldNames;
for (unsigned int i = 0; i < nFields; i++) {
fieldNames.push_back(PQfname(res, i));
}
mRecordSet.setColumnHeaders(fieldNames);
// fill rows
for (unsigned int r = 0; r < PQntuples(res); r++) {
Row row;
for (unsigned int i = 0; i < nFields; i++) {
row.push_back(PQgetvalue(res, r, i));
}
mRecordSet.add(row);
}
// clear results
PQclear(res);
}
return mRecordSet;
}
/**
* Close connection to database.
*/
void
PqDataProvider::disconnect(void)
{
if (!mIsConnected) {
return;
}
// finish up with Postgre.
PQfinish(mDb);
mDb = 0;
mIsConnected = false;
}
} // namespace dal