1 /***************************************************************************
2                          qgsalgorithmexecutepostgisquery.cpp
3                          ---------------------
4     begin                : May 2020
5     copyright            : (C) 2020 by Alexander Bruy
6     email                : alexander dot bruy at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "qgsalgorithmexecutepostgisquery.h"
19 #include "qgsproviderregistry.h"
20 #include "qgsprovidermetadata.h"
21 #include "qgsabstractdatabaseproviderconnection.h"
22 
23 ///@cond PRIVATE
24 
name() const25 QString QgsExecutePostgisQueryAlgorithm::name() const
26 {
27   return QStringLiteral( "postgisexecutesql" );
28 }
29 
displayName() const30 QString QgsExecutePostgisQueryAlgorithm::displayName() const
31 {
32   return QObject::tr( "PostgreSQL execute SQL" );
33 }
34 
tags() const35 QStringList QgsExecutePostgisQueryAlgorithm::tags() const
36 {
37   return QObject::tr( "database,sql,postgresql,postgis,execute" ).split( ',' );
38 }
39 
group() const40 QString QgsExecutePostgisQueryAlgorithm::group() const
41 {
42   return QObject::tr( "Database" );
43 }
44 
groupId() const45 QString QgsExecutePostgisQueryAlgorithm::groupId() const
46 {
47   return QStringLiteral( "database" );
48 }
49 
shortHelpString() const50 QString QgsExecutePostgisQueryAlgorithm::shortHelpString() const
51 {
52   return QObject::tr( "Executes a SQL command on a PostgreSQL database." );
53 }
54 
createInstance() const55 QgsExecutePostgisQueryAlgorithm *QgsExecutePostgisQueryAlgorithm::createInstance() const
56 {
57   return new QgsExecutePostgisQueryAlgorithm();
58 }
59 
initAlgorithm(const QVariantMap &)60 void QgsExecutePostgisQueryAlgorithm::initAlgorithm( const QVariantMap & )
61 {
62   addParameter( new QgsProcessingParameterProviderConnection( QStringLiteral( "DATABASE" ), QObject::tr( "Database (connection name)" ), QStringLiteral( "postgres" ) ) );
63   addParameter( new QgsProcessingParameterString( QStringLiteral( "SQL" ), QObject::tr( "SQL query" ), QVariant(), true ) );
64 }
65 
processAlgorithm(const QVariantMap & parameters,QgsProcessingContext & context,QgsProcessingFeedback * feedback)66 QVariantMap QgsExecutePostgisQueryAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
67 {
68   Q_UNUSED( feedback );
69 
70   QString connName = parameterAsConnectionName( parameters, QStringLiteral( "DATABASE" ), context );
71 
72   std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn;
73   try
74   {
75     QgsProviderMetadata *md = QgsProviderRegistry::instance()->providerMetadata( QStringLiteral( "postgres" ) );
76     conn.reset( static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( connName ) ) );
77   }
78   catch ( QgsProviderConnectionException & )
79   {
80     throw QgsProcessingException( QObject::tr( "Could not retrieve connection details for %1" ).arg( connName ) );
81   }
82 
83   QString sql = parameterAsString( parameters, QStringLiteral( "SQL" ), context ).replace( '\n', ' ' );
84   try
85   {
86     conn->executeSql( sql );
87   }
88   catch ( QgsProviderConnectionException &ex )
89   {
90     throw QgsProcessingException( QObject::tr( "Error executing SQL:\n%1" ).arg( ex.what() ) );
91   }
92 
93   return QVariantMap();
94 }
95 
96 ///@endcond
97