/*
* The Mana Server
* Copyright (C) 2004-2010 The Mana World Development Team
*
* This file is part of The Mana Server.
*
* The Mana Server 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 Server 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 Server. If not, see .
*/
#include
#include
#include
#include "dal/recordset.h"
#include "dal/dalexcept.h"
namespace dal
{
RecordSet::RecordSet()
throw()
{
}
RecordSet::~RecordSet()
throw()
{
}
/**
* Remove all the Records.
*/
void RecordSet::clear()
{
mHeaders.clear();
mRows.clear();
}
/**
* Check if the RecordSet is empty.
*/
bool RecordSet::isEmpty() const
{
return mRows.empty();
}
/**
* Get the number of rows.
*
* @return the number of rows.
*/
unsigned RecordSet::rows() const
{
return mRows.size();
}
/**
* Get the number of columns.
*
* @return the number of columns.
*/
unsigned RecordSet::cols() const
{
return mHeaders.size();
}
/**
* Set the column headers.
*/
void RecordSet::setColumnHeaders(const Row &headers)
{
if (mHeaders.size() > 0) {
throw AlreadySetException();
}
mHeaders = headers;
}
/**
* Add a new row.
*/
void RecordSet::add(const Row &row)
{
const unsigned nCols = mHeaders.size();
if (nCols == 0) {
throw RsColumnHeadersNotSet();
}
if (row.size() != nCols) {
std::ostringstream msg;
msg << "row has " << row.size() << " columns; "
<< "expected: " << nCols << std::ends;
throw std::invalid_argument(msg.str());
}
mRows.push_back(row);
}
const std::string &RecordSet::operator()(const unsigned row,
const unsigned col) const
{
if ((row >= mRows.size()) || (col >= mHeaders.size())) {
std::ostringstream os;
os << "(" << row << ", " << col << ") is out of range; "
<< "max rows: " << mRows.size()
<< ", max cols: " << mHeaders.size() << std::ends;
throw std::out_of_range(os.str());
}
return mRows[row][col];
}
const std::string &RecordSet::operator()(const unsigned row,
const std::string& name) const
{
if (row >= mRows.size()) {
std::ostringstream os;
os << "row " << row << " is out of range; "
<< "max rows: " << mRows.size() << std::ends;
throw std::out_of_range(os.str());
}
auto it = std::find(mHeaders.begin(), mHeaders.end(), name);
if (it == mHeaders.end()) {
std::ostringstream os;
os << "field " << name << " does not exist." << std::ends;
throw std::invalid_argument(os.str());
}
// find the field index.
const unsigned nCols = mHeaders.size();
unsigned i;
for (i = 0; i < nCols; ++i) {
if (mHeaders[i] == name) {
break;
}
}
return mRows[row][i];
}
std::ostream &operator<<(std::ostream &out, const RecordSet &rhs)
{
// print the field names first.
if (rhs.mHeaders.size() > 0) {
out << "|";
for (const auto &header : rhs.mHeaders)
out << header << "|";
out << std::endl << std::endl;
}
// and then print every line.
for (const auto &row : rhs.mRows) {
out << "|";
for (const auto &element : row)
out << element << "|";
out << std::endl;
}
return out;
}
} // namespace dal