From 1af031f19c6f398f9e87425d47ee72d5010088ba Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Sep 2017 21:02:55 +0300 Subject: [PATCH] The update of data sources was added if they contain changed variables --- limereport/lrdatasourcemanager.cpp | 45 ++++++++++++++++++++++++++++ limereport/lrdatasourcemanager.h | 10 +++++-- limereport/lrscriptenginemanager.cpp | 22 ++++++++++++++ limereport/lrscriptenginemanager.h | 2 ++ limereport/lrvariablesholder.cpp | 3 ++ limereport/lrvariablesholder.h | 3 ++ 6 files changed, 82 insertions(+), 3 deletions(-) diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 09cf5c6..55ba747 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -229,6 +229,17 @@ DataSourceManager::DataSourceManager(QObject *parent) : setSystemVariable(QLatin1String("#IS_LAST_PAGEFOOTER"),false,FirstPass); setSystemVariable(QLatin1String("#IS_FIRST_PAGEFOOTER"),false,FirstPass); m_datasourcesModel.setDataSourceManager(this); + + connect(&m_reportVariables, SIGNAL(variableHasBeenAdded(QString)), + this, SLOT(slotVariableHasBeenAdded(QString)) ); + connect(&m_reportVariables, SIGNAL(variableHasBeenChanged(QString)), + this, SLOT(slotVariableHasBeenChanged(QString))); + connect(&m_userVariables, SIGNAL(variableHasBeenAdded(QString)), + this, SLOT(slotVariableHasBeenAdded(QString)) ); + connect(&m_userVariables, SIGNAL(variableHasBeenChanged(QString)), + this, SLOT(slotVariableHasBeenChanged(QString))); + + } QString DataSourceManager::defaultDatabasePath() const @@ -1188,6 +1199,7 @@ void DataSourceManager::changeVariable(const QString& name,const QVariant& value if (m_reportVariables.containsVariable(name)){ m_reportVariables.changeVariable(name,value); } + } void DataSourceManager::setSystemVariable(const QString &name, const QVariant &value, RenderPass pass) @@ -1236,6 +1248,30 @@ void DataSourceManager::slotQueryTextChanged(const QString &queryName, const QSt } } +void DataSourceManager::invalidateQueriesContainsVariable(const QString& variableName) +{ + foreach (const QString& datasourceName, dataSourceNames()){ + QueryHolder* holder = dynamic_cast(m_datasources.value(datasourceName)); + if (holder){ + QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); + if (holder->queryText().contains(rx)) + holder->invalidate(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + } + } +} + +void DataSourceManager::slotVariableHasBeenAdded(const QString& variableName) +{ + //qDebug()<< "variable has been added"<< variableName; + invalidateQueriesContainsVariable(variableName); +} + +void DataSourceManager::slotVariableHasBeenChanged(const QString& variableName) +{ + //qDebug()<< "variable has been changed"<< variableName; + invalidateQueriesContainsVariable(variableName); +} + void DataSourceManager::clear(ClearMethod method) { DataSourcesMap::iterator dit; @@ -1386,6 +1422,15 @@ QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const return QVariant(); } +void DataSourceManager::reopenDatasource(const QString& datasourceName) +{ + QueryHolder* qh = dynamic_cast(dataSourceHolder(datasourceName)); + if (qh){ + qh->invalidate(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + invalidateChildren(datasourceName); + } +} + QVariant DataSourceManager::variable(const QString &variableName) { if (m_userVariables.containsVariable(variableName)) diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 5483b55..285a258 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -160,14 +160,15 @@ public: QStringList dataSourceNames(const QString& connectionName); QStringList connectionNames(); QStringList fieldNames(const QString& datasourceName); - bool containsField(const QString& fieldName); - QVariant fieldData(const QString& fieldName); - QVariant fieldDataByKey( + bool containsField(const QString& fieldName); + QVariant fieldData(const QString& fieldName); + QVariant fieldDataByKey( const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue ); + void reopenDatasource(const QString& datasourceName); QString extractDataSource(const QString& fieldName); QString extractFieldName(const QString& fieldName); @@ -231,9 +232,12 @@ protected: void setLastError(const QString& value); void invalidateLinkedDatasources(QString datasourceName); bool checkConnection(QSqlDatabase db); + void invalidateQueriesContainsVariable(const QString& variableName); private slots: void slotConnectionRenamed(const QString& oldName,const QString& newName); void slotQueryTextChanged(const QString& queryName, const QString& queryText); + void slotVariableHasBeenAdded(const QString& variableName); + void slotVariableHasBeenChanged(const QString& variableName); private: explicit DataSourceManager(QObject *parent = 0); bool initAndOpenDB(QSqlDatabase &db, ConnectionDesc &connectionDesc); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 0780951..6ad79c6 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -813,6 +813,21 @@ bool ScriptEngineManager::createClearTableOfContensFunction() return addFunction(fd); } +bool ScriptEngineManager::createReopenDatasourceFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("reopenDatasource"); + fd.setDescription("reopenDatasource(\""+tr("datasourceName")+"\")"); + fd.setScriptWrapper(QString("function reopenDatasource(datasourceName){" + "return %1.reopenDatasource(datasourceName);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + ScriptEngineManager::ScriptEngineManager() :m_model(0), m_dataManager(0) { @@ -850,6 +865,7 @@ ScriptEngineManager::ScriptEngineManager() #endif createAddTableOfContensItemFunction(); createClearTableOfContensFunction(); + createReopenDatasourceFunction(); m_model = new ScriptEngineModel(this); } @@ -1516,6 +1532,12 @@ QVariant ScriptFunctionsManager::getFieldByKeyField(const QString& datasourceNam return dm->fieldDataByKey(datasourceName, valueFieldName, keyFieldName, keyValue); } +void ScriptFunctionsManager::reopenDatasource(const QString& datasourceName) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->reopenDatasource(datasourceName); +} + void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) { scriptEngineManager()->addTableOfContensItem(uniqKey, content, indent); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 162a21e..3edd6dc 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -319,6 +319,7 @@ public: Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue); + Q_INVOKABLE void reopenDatasource(const QString& datasourceName); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContens(); @@ -390,6 +391,7 @@ private: bool createGetFieldByKeyFunction(); bool createAddTableOfContensItemFunction(); bool createClearTableOfContensFunction(); + bool createReopenDatasourceFunction(); private: ScriptEngineManager(); ScriptEngineType* m_scriptEngine; diff --git a/limereport/lrvariablesholder.cpp b/limereport/lrvariablesholder.cpp index dd46b4e..9cdf630 100644 --- a/limereport/lrvariablesholder.cpp +++ b/limereport/lrvariablesholder.cpp @@ -61,6 +61,7 @@ void VariablesHolder::addVariable(const QString& name, const QVariant& value, Va m_varNames.insert(name,varValue); if (type==VarDesc::Report) m_userVariables.append(varValue); + emit variableHasBeenAdded(name); } else { throw ReportError(tr("variable with name ")+name+tr(" already exists!")); } @@ -86,6 +87,7 @@ void VariablesHolder::deleteVariable(const QString &name) m_userVariables.removeOne(m_varNames.value(name)); delete m_varNames.value(name); m_varNames.remove(name); + emit variableHasBennDeleted(name); } } @@ -93,6 +95,7 @@ void VariablesHolder::changeVariable(const QString &name, const QVariant &value) { if(m_varNames.contains(name)) { m_varNames.value(name)->setValue(value); + emit variableHasBeenChanged(name); } else throw ReportError(tr("variable with name ")+name+tr(" does not exists!")); } diff --git a/limereport/lrvariablesholder.h b/limereport/lrvariablesholder.h index ede1ac6..e375ea8 100644 --- a/limereport/lrvariablesholder.h +++ b/limereport/lrvariablesholder.h @@ -92,6 +92,9 @@ public: int userVariablesCount(); VarDesc* userVariableAt(int index); signals: + void variableHasBeenAdded(const QString& variableName); + void variableHasBeenChanged(const QString& variableName); + void variableHasBennDeleted(const QString& variableName); private: QMap m_varNames; QList m_userVariables;