ResultEntry DataStore::findResultForIdWithExportdData(int id) {
  const char *q = sqlite3_mprintf("select id, model_name, subject_name, notes, date, value, exported_data, exported_message, statistics from result where id = '%d'", id);
  sqlite3_stmt *stmt = query(q);

  int rc;
  while((rc = sqlite3_step(stmt)) != SQLITE_DONE) {
    switch(rc) {
      case SQLITE_ROW:
        int id = sqlite3_column_int(stmt, 0);
        std::string modelName(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 1)));
        std::string subjectName(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 2)));
        std::string notes(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 3)));
        std::string date(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 4)));
        double value = sqlite3_column_double(stmt, 5);
        std::string exportedData(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 6)));
        std::string exportedMessage(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 7)));
        std::string statistics(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 8)));

        ResultEntry entry = ResultEntry(id, modelName, subjectName, notes, date, value, exportedData, exportedMessage, statistics);

        sqlite3_free((void *) q);
        sqlite3_finalize(stmt);

        return entry;
    }
  }

  throw std::runtime_error("No result for given id");
}
std::vector<ResultEntry> DataStore::findResultsForModelName(std::string modelName) {
  std::vector<ResultEntry> entries;

  const char *q = sqlite3_mprintf("select id, model_name, subject_name, notes, date, value, statistics from result where model_name = '%q'", modelName.c_str());
  sqlite3_stmt *stmt = query(q);

  int rc;
  while((rc = sqlite3_step(stmt)) != SQLITE_DONE) {
    switch(rc) {
      case SQLITE_ROW:
        int id = sqlite3_column_int(stmt, 0);
        std::string modelName(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 1)));
        std::string subjectName(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 2)));
        std::string notes(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 3)));
        std::string date(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 4)));
        double value = sqlite3_column_double(stmt, 5);
        std::string statistics(reinterpret_cast<char const*>(sqlite3_column_text(stmt, 6)));

        entries.push_back(ResultEntry(id, modelName, subjectName, notes, date, value, "", "", statistics));
        break;
    }
  }

  sqlite3_free((void *) q);
  sqlite3_finalize(stmt);

  return entries;
}
void QgsVBSCatalogProvider::replyFinished()
{
  QNetworkReply* reply = qobject_cast<QNetworkReply*>( QObject::sender() );
  if ( reply->error() == QNetworkReply::NoError )
  {
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
    QJson::Parser parser;
    QVariantMap listData = parser.parse( reply->readAll() ).toMap();
#else
    QVariantMap listData = QJsonDocument::fromJson( reply->readAll() ).object().toVariantMap();
#endif
    QMap<QString, EntryMap> wmtsLayers;
    QMap<QString, EntryMap> wmsLayers;
    QMap<QString, EntryMap> amsLayers;
    foreach ( const QVariant& resultData, listData["results"].toList() )
    {
      QVariantMap resultMap = resultData.toMap();
      if ( resultMap["type"].toString() == "wmts" )
      {
        wmtsLayers[resultMap["serviceUrl"].toString()].insert( resultMap["layerName"].toString(), ResultEntry( resultMap["category"].toString(), resultMap["title"].toString(), resultMap["position"].toString(), resultMap["metadataUrl"].toString() ) );
      }
      else if ( resultMap["type"].toString() == "wms" )
      {
        wmsLayers[resultMap["serviceUrl"].toString()].insert( resultMap["layerName"].toString(), ResultEntry( resultMap["category"].toString(), resultMap["title"].toString(), resultMap["position"].toString(), resultMap["metadataUrl"].toString() ) );
      }
      else if ( resultMap["type"].toString() == "ams" )
      {
        amsLayers[resultMap["serviceUrl"].toString()].insert( resultMap["layerName"].toString(), ResultEntry( resultMap["category"].toString(), resultMap["title"].toString(), resultMap["position"].toString(), resultMap["metadataUrl"].toString() ) );
      }
    }

    foreach ( const QString& wmtsUrl, wmtsLayers.keys() )
    {
      readWMTSCapabilities( wmtsUrl, wmtsLayers[wmtsUrl] );
    }
    foreach ( const QString& wmsUrl, wmsLayers.keys() )
    {
      readWMSCapabilities( wmsUrl, wmsLayers[wmsUrl] );
    }
    foreach ( const QString& amsUrl, amsLayers.keys() )
    {
      readAMSCapabilities( amsUrl, amsLayers[amsUrl] );
    }
  }