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 ¶meters, 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