iLand
output.h
Go to the documentation of this file.
1/********************************************************************************************
2** iLand - an individual based forest landscape and disturbance model
3** http://iland-model.org
4** Copyright (C) 2009- Werner Rammer, Rupert Seidl
5**
6** This program is free software: you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation, either version 3 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program. If not, see <http://www.gnu.org/licenses/>.
18********************************************************************************************/
19
20#ifndef OUTPUT_H
21#define OUTPUT_H
22#include <QtCore/QString>
23#include <QtCore/QVariant>
24#include <QtSql/QSqlQuery>
25#include <QtCore/QVector>
26
27#include "global.h"
28
31
32class XmlHelper;
33class Output;
34class GlobalSettings;
36{
37public:
38 OutputColumn(const QString name, const QString description, const OutputDatatype datatype):
39 mName(name), mDescription(description), mDatatype(datatype) {}
40 static OutputColumn year() { return OutputColumn("year", "simulation year", OutInteger); }
41 static OutputColumn species() { return OutputColumn("species", "tree species", OutString); }
42 static OutputColumn ru() { return OutputColumn("ru", "index of ressource unit", OutInteger); }
43 static OutputColumn id() { return OutputColumn("rid", "id of ressource unit (-1: no ids set)", OutInteger); }
44 const QString &name() const { return mName; }
45 const QString &description() const { return mDescription; }
46 QString datatype() const { switch(mDatatype) { case OutInteger: return QString("integer"); case OutDouble: return QString("double"); default: return QString("string"); } }
47private:
48 QString mName;
49 QString mDescription;
50 OutputDatatype mDatatype;
51friend class Output;
52};
53
54class Output
55{
56public:
57 Output();
58 virtual ~Output();
59 virtual void setup();
60 void setMode(OutputMode mode) { mMode = mode; }
61
62 void open();
63 bool isOpen() const { return mOpen; }
64 void close();
65 bool isEnabled() const { return mEnabled; }
66 void setEnabled(const bool enabled) { mEnabled=enabled; if(enabled) open(); }
67 bool isRowEmpty() const { return mIndex==0; }
68
69 virtual void exec();
70
71 // properties
72 const QList<OutputColumn> getColumns() const { return mColumns; }
73
74 const QString name() const { return mName; }
75 const QString description() const { return mDescription; }
76 const QString tableName() const { return mTableName; }
77 QString wikiFormat() const;
78
79 // save data
80 Output & operator<< ( const double& value ) { add(value); return *this; }
81 Output & operator<< ( const int value ) { add(value); return *this; }
82 Output & operator<< ( const QString &value ) { add(value); return *this; }
83
84protected:
85 void setName(const QString &name, const QString tableName) { mName = name; mTableName=tableName; }
86 void setDescription(const QString &description) { mDescription=description; }
87
88 QList<OutputColumn> &columns() { return mColumns; }
89 int currentYear() const { return gl->currentYear(); }
90 const XmlHelper &settings() const { return gl->settings(); }
91 // add data
92 void writeRow();
94
95 inline void add(const double &value);
96 void add(const double &value1, const double &value2) { add(value1); add(value2); }
97 void add(const double &value1, const double &value2, const double &value3) { add(value1, value2); add(value3); }
98 void add(const double &value1, const double &value2, const double &value3, const double &value4) { add(value1, value2); add(value3, value4); }
99 void add(const double &value1, const double &value2, const double &value3, const double &value4, const double value5) { add(value1, value2); add(value3, value4, value5); }
100 inline void add(const int intValue);
101 inline void add(const QString &stringValue);
103 bool clearColumnsAfter(QString find_name);
105 void truncateTable();
106
107private:
108 static const GlobalSettings *gl;
109 void newRow();
110 void openDatabase();
111 void openFile();
112 inline void saveDatabase();
113 inline void saveFile();
114 OutputMode mMode;
115 bool mOpen;
116 bool mEnabled;
117 QString mName;
118 QString mTableName;
119 QString mDescription;
120 QList<OutputColumn> mColumns;
121 QVector<QVariant> mRow;
122 QSqlQuery mInserter;
123 QFile mOutputFile;
124 QTextStream mFileStream;
125 int mCount;
126 int mIndex;
127
128};
129
130
131void Output::add(const double &value)
132{
133 DBG_IF(mIndex>=mCount || mIndex<0,"Output::add(double)","output index out of range!");
134 mRow[mIndex++].setValue(value);
135}
136void Output::add(const QString &value)
137{
138 DBG_IF(mIndex>=mCount || mIndex<0,"Output::add(string)","output index out of range!");
139 mRow[mIndex++].setValue(value);
140}
141void Output::add(const int value)
142{
143 DBG_IF(mIndex>=mCount || mIndex<0,"Output::add(int)","output index out of range!");
144 mRow[mIndex++].setValue(value);
145}
146#endif // OUTPUT_H
General settings and globally available data.
Definition: globalsettings.h:18
int currentYear() const
Definition: globalsettings.h:61
const XmlHelper & settings() const
Definition: globalsettings.h:105
Definition: output.h:36
const QString & name() const
Definition: output.h:44
static OutputColumn species()
Definition: output.h:41
OutputColumn(const QString name, const QString description, const OutputDatatype datatype)
Definition: output.h:38
const QString & description() const
Definition: output.h:45
QString datatype() const
Definition: output.h:46
static OutputColumn year()
Definition: output.h:40
static OutputColumn id()
Definition: output.h:43
static OutputColumn ru()
Definition: output.h:42
The Output class abstracts output data (database, textbased, ...).
Definition: output.h:55
QList< OutputColumn > & columns()
Definition: output.h:88
void setMode(OutputMode mode)
Definition: output.h:60
void setDescription(const QString &description)
Definition: output.h:86
void open()
open output connection (create actual db connection, ...)
Definition: output.cpp:234
bool clearColumnsAfter(QString find_name)
delete all columns after the column 'find_name'. Return true if columns were removed.
Definition: output.cpp:208
const XmlHelper & settings() const
access XML settings (see class description)
Definition: output.h:90
Output()
ctor. Override in derived class to craete columns, etc.
Definition: output.cpp:97
void add(const double &value1, const double &value2, const double &value3, const double &value4)
Definition: output.h:98
void add(const double &value1, const double &value2, const double &value3, const double &value4, const double value5)
Definition: output.h:99
bool isOpen() const
returns true if output is open, i.e. has a open database connection
Definition: output.h:63
Output & operator<<(const double &value)
Definition: output.h:80
int currentYear() const
Definition: output.h:89
const QList< OutputColumn > getColumns() const
Definition: output.h:72
virtual ~Output()
Definition: output.cpp:92
bool isRowEmpty() const
returns true if the buffer of the current row is empty
Definition: output.h:67
void singleThreadedWriteRow()
writeRow() protected by a mutex (if there is a chance that two outputs write at the same time)
Definition: output.cpp:201
void add(const double &value1, const double &value2)
Definition: output.h:96
bool isEnabled() const
returns true if output is enabled, i.e. is "turned on"
Definition: output.h:65
const QString name() const
descriptive name of the ouptut
Definition: output.h:74
void truncateTable()
delete all data from the table
Definition: output.cpp:224
QString wikiFormat() const
return output description in a (tiki)-wiki format
Definition: output.cpp:302
const QString tableName() const
internal output name (no spaces allowed)
Definition: output.h:76
void close()
shut down the connection.
Definition: output.cpp:253
virtual void exec()
main function that executes the output
Definition: output.cpp:83
virtual void setup()
setup() is called during project setup and can be ovveridden for specific setup
Definition: output.cpp:88
void setEnabled(const bool enabled)
Definition: output.h:66
void add(const double &value1, const double &value2, const double &value3)
Definition: output.h:97
void writeRow()
saves the current row/line of data to database/file. Must be called for each row.
Definition: output.cpp:185
void add(const double &value)
Definition: output.h:131
void setName(const QString &name, const QString tableName)
Definition: output.h:85
const QString description() const
description of output
Definition: output.h:75
XmlHelper wraps a XML file and provides some convenient functions to retrieve values.
Definition: xmlhelper.h:26
#define DBG_IF(cond, where, what)
Definition: global.h:50
OutputMode
Definition: output.h:30
@ OutDatabase
Definition: output.h:30
@ OutText
Definition: output.h:30
@ OutFile
Definition: output.h:30
OutputDatatype
Definition: output.h:29
@ OutString
Definition: output.h:29
@ OutInteger
Definition: output.h:29
@ OutDouble
Definition: output.h:29