1 #ifndef DATABASETABLE_H
2 #define DATABASETABLE_H
4 #include "Kernel_global.h"
34 void setDatabase(
const QSqlDatabase& base);
35 QSqlDatabase database()
const;
40 bool addColumn(
const QString &name,
const IDomain &domain);
55 QString internalName()
const;
57 template<
class T>
bool insertColumn(
const QString& col,
const QVector<T>& values,
const IDomain& dom){
59 kernel()->
issues()->log(TR(ERR_INVALID_PROPERTY_IN_4).arg(
"domain",
"table",
"column",col));
62 if ( !_database.isValid()) {
63 kernel()->
issues()->log(name(),TR(
"Database is not initialized"));
67 QString vt = valueType2DataType(dom->valueType());
71 _columnDefinitionsByIndex = _columnDefinitionsByName[col];
75 stmt =
"Insert into %1 (%2) values('?')";
77 stmt =
"Insert into %1 (%2) values(?)";
78 return executeStatement(stmt,col,values);
84 template<
class T>
bool updateColumn(
const QString& col,
const QVector<T>& values){
85 if ( !_database.isValid()) {
86 kernel()->
issues()->log(name(),TR(
"Database is not initialized"));
89 IDomain dom = _columnDefinitionsByName[col].datadef().domain();
91 kernel()->
issues()->log(TR(ERR_INVALID_PROPERTY_IN_4).arg(
"domain",
"table",
"column",col));
94 IlwisTypes ty = dom->valueType();
95 QString query =
"Update %1 set %2=" ;
98 else if ( ty == itSTRING)
100 return executeStatement(query,col, values);
104 std::vector<QVariant> record(quint32 n)
const ;
107 void record(quint32 rec,
const std::vector<QVariant> &vars, quint32 offset=0);
110 std::vector<QVariant> column(
const QString& nme, quint32 start=0, quint32 stop=2e9)
const;
113 std::vector<QVariant> column(quint32 index, quint32 start=0, quint32 stop=2e9)
const;
116 void column(
const QString& nme,
const std::vector<QVariant>& vars, quint32 offset=0);
119 void column(quint32 index,
const std::vector<QVariant> &vars, quint32 offset);
122 QVariant cell(
const QString& col, quint32 rec,
bool asRaw=
true)
const;
125 QVariant cell(quint32, quint32 rec,
bool asRaw=
true)
const;
128 void setCell(
const QString& col, quint32 rec,
const QVariant& inputvar);
131 void setCell(quint32, quint32 rec,
const QVariant& var);
141 IlwisTypes ilwisType()
const;
144 std::vector<quint32> select(
const QString &conditions)
const;
151 QSqlDatabase _database;
154 QString valueType2DataType(IlwisTypes ty) {
155 QString vType=sUNDEF;
156 if ( (ty >= 1024 && ty <= itINT64) || ((ty & itDOMAINITEM) != 0)) {
158 }
else if ( ty >= 1024 &&ty <= itDOUBLE) {
160 }
else if ( ty == itSTRING) {
172 template<
class T>
bool executeStatement(
const QString& stmt,
const QString& col,
const QVector<T>& values) {
173 QSqlQuery db(_database);
174 QString query = stmt.arg(internalName(), col);
176 QVariantList varlist;
177 for(
int i=0 ; i<values.size(); ++i){
178 varlist << values[i];
180 db.addBindValue(varlist);
181 if (!db.execBatch()) {
182 kernel()->
issues()->logSql(db.lastError());
189 quint32 numberOfExistingRecords();
198 #endif // DATABASETABLE_H