/*
* 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 .
*/
#ifndef RECORDSET_H
#define RECORDSET_H
#include
#include
namespace dal
{
/**
* Data type for a row in a RecordSet.
*/
using Row = std::vector;
/**
* A RecordSet to store the result of a SQL query.
*
* Limitations:
* - the field values are stored and returned as string,
* - no information about the field data types are stored.
* - not thread-safe.
*/
class RecordSet
{
public:
RecordSet()
throw();
~RecordSet()
throw();
/**
* Remove all the records.
*/
void clear();
/**
* Check if the RecordSet is empty.
*
* @return true if empty.
*/
bool isEmpty() const;
/**
* Get the number of rows.
*
* @return the number of rows.
*/
unsigned rows() const;
/**
* Get the number of columns.
*
* @return the number of columns.
*/
unsigned cols() const;
/**
* Set the column headers.
*
* @param headers the column headers.
*
* @exception AlreadySetException if the column headers
* are already set.
*/
void setColumnHeaders(const Row &headers);
/**
* Add a new row.
*
* This method does not check the field data types, only the number
* of columns is checked.
*
* @param row the new row.
*
* @exception RsColumnHeadersNotSet if the row is being added before
* the column headers.
* @exception std::invalid_argument if the number of columns in the
* new row is not equal to the number of column headers.
*/
void add(const Row &row);
/**
* Operator()
* Get the value of a particular field of a particular row
* by field index.
*
* @param row the row index.
* @param col the field index.
*
* @return the field value.
*
* @exception std::out_of_range if row or col are out of range.
* @exception std::invalid_argument if the recordset is empty.
*/
const std::string&
operator()(const unsigned row,
const unsigned col) const;
/**
* Operator()
* Get the value of a particular field of a particular row
* by field name (slower than by field index).
*
* @param row the row index.
* @param name the field name.
*
* @return the field value.
*
* @exception std::out_of_range if the row index is out of range.
* @exception std::invalid_argument if the field name is not found or
* the recordset is empty.
*/
const std::string&
operator()(const unsigned row,
const std::string &name) const;
/**
* Operator<<
* Append the stringified RecordSet to the output stream.
*
* @param out the output stream.
* @param rhs the right hand side.
*
* @return the output stream for chaining.
*/
friend std::ostream&
operator<<(std::ostream& out, const RecordSet &rhs);
private:
/**
* Copy constructor.
*/
RecordSet(const RecordSet &rhs);
/**
* Assignment operator.
*/
RecordSet&
operator=(const RecordSet &rhs);
private:
Row mHeaders; /**< a list of field names */
using Rows = std::vector;
Rows mRows; /**< a list of records */
};
} // namespace dal
#endif // RECORDSET_H