1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#ifndef SQLRESULTSROW_H
#define SQLRESULTSROW_H
#include "coreSQLiteStudio_global.h"
#include <QVariant>
#include <QList>
#include <QHash>
#include <QSharedPointer>
/** @file */
/**
* @brief SQL query results row.
*
* Single row of data from SQL query results. It already has all columns stored in memory,
* so it doesn't matter if you read only one column, or all columns available in the row.
*
* You will never encounter object of exactly this class, as it has protected constructor
* and has no methods to populate internal data members. Instead of creating objects of this class,
* other class inherits it and handles populating internal data members, then this class
* is just an interface to read data from it.
*
* In other words, it's kind of an abstract class.
*/
class API_EXPORT SqlResultsRow
{
public:
/**
* @brief Releases resources.
*/
virtual ~SqlResultsRow();
/**
* @brief Gets value for given column.
* @param key Column name.
* @return Value from requested column. If column name is invalid, the invalid QVariant is returned.
*/
const QVariant value(const QString& key) const;
/**
* @brief Gets value for given column.
* @param idx 0-based index of column.
* @return Value from requested column. If index was invalid, the invalid QVariant is returned.
*/
const QVariant value(int idx) const;
/**
* @brief Gets table of column->value entries.
* @return Hash table with column names as keys and QVariants as their values.
*
* Note, that QHash doesn't guarantee order of entries. If you want to iterate through columns
* in order they were returned from the database, use valueList(), or iterate through SqlResults::getColumnNames()
* and use it to call value().
*/
const QHash<QString, QVariant>& valueMap() const;
/**
* @brief Gets list of values in this row.
* @return Ordered list of values in the row.
*
* Note, that this method returns values in order they were returned from database.
*/
const QList<QVariant>& valueList() const;
/**
* @brief Tests if the row contains given column name.
* @param key Column name. Case sensitive.
* @return true if column exists in the row, or false otherwise.
*/
bool contains(const QString& key) const;
/**
* @brief Tests if the row has column indexed with given number.
* @param idx 0-based index to test.
* @return true if index is in range of existing columns, or false if it's greater than "number of columns - 1", or if it's less than 0.
*/
bool contains(int idx) const;
protected:
SqlResultsRow();
/**
* @brief Columns and their values in the row.
*/
QHash<QString,QVariant> valuesMap;
/**
* @brief Ordered list of values in the row.
*
* Technical note:
* We keep list of values next to valuesMap, so we have it in the same order as column names when asked by valueList().
* This looks like having redundant data storage, but Qt container classes (such as QVariant)
* use smart pointers to keep their data internally, so here we actually keep only reference objects.
*/
QList<QVariant> values;
};
/**
* @brief Shared pointer to SQL query results row.
*/
typedef QSharedPointer<SqlResultsRow> SqlResultsRowPtr;
#endif // SQLRESULTSROW_H
|