Skip to content

Commit aa9fe9e

Browse files
authored
Merge pull request #3118 from arnaud-morvan/processing_gdal_postgis_credentials
[processing] support postgis service parameter and credentials input
2 parents bbbc9d0 + 8ddae27 commit aa9fe9e

File tree

6 files changed

+147
-125
lines changed

6 files changed

+147
-125
lines changed

python/plugins/processing/algs/gdal/ogr2ogrtabletopostgislist.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
3737
from processing.algs.gdal.GdalUtils import GdalUtils
3838

39+
from processing.tools.postgis import uri_from_name, GeoDB
3940
from processing.tools.system import isWindows
4041
from processing.tools.vector import ogrConnectionString, ogrLayerName
4142

@@ -64,6 +65,10 @@ class Ogr2OgrTableToPostGisList(GdalAlgorithm):
6465
PRECISION = 'PRECISION'
6566
OPTIONS = 'OPTIONS'
6667

68+
def __init__(self):
69+
GdalAlgorithm.__init__(self)
70+
self.processing = False
71+
6772
def dbConnectionNames(self):
6873
settings = QSettings()
6974
settings.beginGroup('/PostgreSQL/connections/')
@@ -112,15 +117,18 @@ def defineCharacteristics(self):
112117
self.addParameter(ParameterString(self.OPTIONS,
113118
self.tr('Additional creation options'), '', optional=True))
114119

120+
def processAlgorithm(self, progress):
121+
self.processing = True
122+
GdalAlgorithm.processAlgorithm(self, progress)
123+
self.processing = False
124+
115125
def getConsoleCommands(self):
116126
connection = self.DB_CONNECTIONS[self.getParameterValue(self.DATABASE)]
117-
settings = QSettings()
118-
mySettings = '/PostgreSQL/connections/' + connection
119-
dbname = settings.value(mySettings + '/database')
120-
user = settings.value(mySettings + '/username')
121-
host = settings.value(mySettings + '/host')
122-
port = settings.value(mySettings + '/port')
123-
password = settings.value(mySettings + '/password')
127+
uri = uri_from_name(connection)
128+
if self.processing:
129+
# to get credentials input when needed
130+
uri = GeoDB(uri=uri).uri
131+
124132
inLayer = self.getParameterValue(self.INPUT_LAYER)
125133
ogrLayer = ogrConnectionString(inLayer)[1:-1]
126134
shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING)
@@ -150,19 +158,11 @@ def getConsoleCommands(self):
150158
arguments.append('"' + shapeEncoding + '"')
151159
arguments.append('-f')
152160
arguments.append('PostgreSQL')
153-
arguments.append('PG:"host=')
154-
arguments.append(host)
155-
arguments.append('port=')
156-
arguments.append(port)
157-
if len(dbname) > 0:
158-
arguments.append('dbname=' + dbname)
159-
if len(password) > 0:
160-
arguments.append('password=' + password)
161-
if len(schema) > 0:
162-
arguments.append('active_schema=' + schema)
163-
else:
164-
arguments.append('active_schema=public')
165-
arguments.append('user=' + user + '"')
161+
arguments.append('PG:"')
162+
for token in uri.connectionInfo(self.processing).split(' '):
163+
arguments.append(token)
164+
arguments.append('active_schema={}'.format(schema or 'public'))
165+
arguments.append('"')
166166
arguments.append(ogrLayer)
167167
arguments.append('-nlt NONE')
168168
arguments.append(ogrLayerName(inLayer))

python/plugins/processing/algs/gdal/ogr2ogrtopostgislist.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
4040
from processing.algs.gdal.GdalUtils import GdalUtils
4141

42+
from processing.tools.postgis import uri_from_name, GeoDB
4243
from processing.tools.system import isWindows
4344
from processing.tools.vector import ogrConnectionString, ogrLayerName
4445

@@ -81,6 +82,10 @@ class Ogr2OgrToPostGisList(GdalAlgorithm):
8182
PROMOTETOMULTI = 'PROMOTETOMULTI'
8283
OPTIONS = 'OPTIONS'
8384

85+
def __init__(self):
86+
GdalAlgorithm.__init__(self)
87+
self.processing = False
88+
8489
def dbConnectionNames(self):
8590
settings = QSettings()
8691
settings.beginGroup('/PostgreSQL/connections/')
@@ -156,15 +161,18 @@ def defineCharacteristics(self):
156161
self.addParameter(ParameterString(self.OPTIONS,
157162
self.tr('Additional creation options'), '', optional=True))
158163

164+
def processAlgorithm(self, progress):
165+
self.processing = True
166+
GdalAlgorithm.processAlgorithm(self, progress)
167+
self.processing = False
168+
159169
def getConsoleCommands(self):
160170
connection = self.DB_CONNECTIONS[self.getParameterValue(self.DATABASE)]
161-
settings = QSettings()
162-
mySettings = '/PostgreSQL/connections/' + connection
163-
dbname = settings.value(mySettings + '/database')
164-
user = settings.value(mySettings + '/username')
165-
host = settings.value(mySettings + '/host')
166-
port = settings.value(mySettings + '/port')
167-
password = settings.value(mySettings + '/password')
171+
uri = uri_from_name(connection)
172+
if self.processing:
173+
# to get credentials input when needed
174+
uri = GeoDB(uri=uri).uri
175+
168176
inLayer = self.getParameterValue(self.INPUT_LAYER)
169177
ogrLayer = ogrConnectionString(inLayer)[1:-1]
170178
shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING)
@@ -208,17 +216,11 @@ def getConsoleCommands(self):
208216
arguments.append('"' + shapeEncoding + '"')
209217
arguments.append('-f')
210218
arguments.append('PostgreSQL')
211-
arguments.append('PG:"host=' + host)
212-
arguments.append('port=' + port)
213-
if len(dbname) > 0:
214-
arguments.append('dbname=' + dbname)
215-
if len(password) > 0:
216-
arguments.append('password=' + password)
217-
if len(schema) > 0:
218-
arguments.append('active_schema=' + schema)
219-
else:
220-
arguments.append('active_schema=public')
221-
arguments.append('user=' + user + '"')
219+
arguments.append('PG:"')
220+
for token in uri.connectionInfo(self.processing).split(' '):
221+
arguments.append(token)
222+
arguments.append('active_schema={}'.format(schema or 'public'))
223+
arguments.append('"')
222224
arguments.append(dimstring)
223225
arguments.append(ogrLayer)
224226
arguments.append(ogrLayerName(inLayer))

python/plugins/processing/algs/qgis/ImportIntoPostGIS.py

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ def defineCharacteristics(self):
8686

8787
def processAlgorithm(self, progress):
8888
connection = self.DB_CONNECTIONS[self.getParameterValue(self.DATABASE)]
89+
db = postgis.GeoDB.from_name(connection)
90+
8991
schema = self.getParameterValue(self.SCHEMA)
9092
overwrite = self.getParameterValue(self.OVERWRITE)
9193
createIndex = self.getParameterValue(self.CREATEINDEX)
@@ -94,17 +96,6 @@ def processAlgorithm(self, progress):
9496
forceSinglePart = self.getParameterValue(self.FORCE_SINGLEPART)
9597
primaryKeyField = self.getParameterValue(self.PRIMARY_KEY)
9698
encoding = self.getParameterValue(self.ENCODING)
97-
settings = QSettings()
98-
mySettings = '/PostgreSQL/connections/' + connection
99-
try:
100-
database = settings.value(mySettings + '/database')
101-
username = settings.value(mySettings + '/username')
102-
host = settings.value(mySettings + '/host')
103-
port = settings.value(mySettings + '/port', type=int)
104-
password = settings.value(mySettings + '/password')
105-
except Exception as e:
106-
raise GeoAlgorithmExecutionException(
107-
self.tr('Wrong database connection name: %s' % connection))
10899

109100
layerUri = self.getParameterValue(self.INPUT)
110101
layer = dataobjects.getObjectFromUri(layerUri)
@@ -115,13 +106,6 @@ def processAlgorithm(self, progress):
115106
table = table.replace(' ', '').lower()[0:62]
116107
providerName = 'postgres'
117108

118-
try:
119-
db = postgis.GeoDB(host=host, port=port, dbname=database,
120-
user=username, passwd=password)
121-
except postgis.DbError as e:
122-
raise GeoAlgorithmExecutionException(
123-
self.tr("Couldn't connect to database:\n%s") % unicode(e))
124-
125109
geomColumn = self.getParameterValue(self.GEOMETRY_COLUMN)
126110
if not geomColumn:
127111
geomColumn = 'the_geom'
@@ -141,8 +125,7 @@ def processAlgorithm(self, progress):
141125
if not layer.hasGeometryType():
142126
geomColumn = None
143127

144-
uri = QgsDataSourceURI()
145-
uri.setConnection(host, unicode(port), database, username, password)
128+
uri = db.uri
146129
if primaryKeyField:
147130
uri.setDataSource(schema, table, geomColumn, '', primaryKeyField)
148131
else:

python/plugins/processing/algs/qgis/PostGISExecuteSQL.py

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,7 @@ def defineCharacteristics(self):
4646

4747
def processAlgorithm(self, progress):
4848
connection = self.getParameterValue(self.DATABASE)
49-
settings = QSettings()
50-
mySettings = '/PostgreSQL/connections/' + connection
51-
try:
52-
database = settings.value(mySettings + '/database')
53-
username = settings.value(mySettings + '/username')
54-
host = settings.value(mySettings + '/host')
55-
port = settings.value(mySettings + '/port', type=int)
56-
password = settings.value(mySettings + '/password')
57-
except Exception as e:
58-
raise GeoAlgorithmExecutionException(
59-
self.tr('Wrong database connection name: %s' % connection))
60-
try:
61-
self.db = postgis.GeoDB(host=host, port=port,
62-
dbname=database, user=username, passwd=password)
63-
except postgis.DbError as e:
64-
raise GeoAlgorithmExecutionException(
65-
self.tr("Couldn't connect to database:\n%s") % unicode(e))
66-
49+
self.db = postgis.GeoDB.from_name(connection)
6750
sql = self.getParameterValue(self.SQL).replace('\n', ' ')
6851
try:
6952
self.db._exec_sql_and_commit(unicode(sql))

python/plugins/processing/gui/PostgisTableSelector.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -100,23 +100,10 @@ def __init__(self, connection):
100100
def populateSchemas(self):
101101
if self.childCount() != 0:
102102
return
103-
settings = QSettings()
104-
connSettings = '/PostgreSQL/connections/' + self.connection
105-
database = settings.value(connSettings + '/database')
106-
user = settings.value(connSettings + '/username')
107-
host = settings.value(connSettings + '/host')
108-
port = settings.value(connSettings + '/port')
109-
passwd = settings.value(connSettings + '/password')
110-
uri = QgsDataSourceURI()
111-
uri.setConnection(host, str(port), database, user, passwd)
112-
connInfo = uri.connectionInfo()
113-
(success, user, passwd) = QgsCredentials.instance().get(connInfo, None, None)
114-
if success:
115-
QgsCredentials.instance().put(connInfo, user, passwd)
116-
geodb = GeoDB(host, int(port), database, user, passwd)
117-
schemas = geodb.list_schemas()
118-
for oid, name, owner, perms in schemas:
119-
item = QTreeWidgetItem()
120-
item.setText(0, name)
121-
item.setIcon(0, self.schemaIcon)
122-
self.addChild(item)
103+
geodb = GeoDB.from_name(self.connection)
104+
schemas = geodb.list_schemas()
105+
for oid, name, owner, perms in schemas:
106+
item = QTreeWidgetItem()
107+
item.setText(0, name)
108+
item.setIcon(0, self.schemaIcon)
109+
self.addChild(item)

0 commit comments

Comments
 (0)