Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsdatasourceuri.h - Structure to contain the component parts
3 : : of a data source URI
4 : : -------------------
5 : : begin : Dec 5, 2004
6 : : copyright : (C) 2004 by Gary E.Sherman
7 : : email : sherman at mrcc.com
8 : : ***************************************************************************/
9 : :
10 : : /***************************************************************************
11 : : * *
12 : : * This program is free software; you can redistribute it and/or modify *
13 : : * it under the terms of the GNU General Public License as published by *
14 : : * the Free Software Foundation; either version 2 of the License, or *
15 : : * (at your option) any later version. *
16 : : * *
17 : : ***************************************************************************/
18 : :
19 : : #include "qgsdatasourceuri.h"
20 : : #include "qgsauthmanager.h"
21 : : #include "qgslogger.h"
22 : : #include "qgswkbtypes.h"
23 : : #include "qgsapplication.h"
24 : :
25 : : #include <QStringList>
26 : : #include <QRegExp>
27 : : #include <QUrl>
28 : : #include <QUrlQuery>
29 : :
30 : 0 : QgsDataSourceUri::QgsDataSourceUri()
31 : : {
32 : : // do nothing
33 : 0 : }
34 : :
35 : 78 : QgsDataSourceUri::QgsDataSourceUri( const QString &u )
36 : : {
37 : 78 : QString uri = u;
38 : 78 : int i = 0;
39 : 156 : while ( i < uri.length() )
40 : : {
41 : 78 : skipBlanks( uri, i );
42 : :
43 : 78 : if ( uri[i] == '=' )
44 : : {
45 : 0 : QgsDebugMsg( QStringLiteral( "parameter name expected before =" ) );
46 : 0 : i++;
47 : 0 : continue;
48 : : }
49 : :
50 : 78 : int start = i;
51 : :
52 : 3553 : while ( i < uri.length() && uri[i] != '=' && !uri[i].isSpace() )
53 : 3475 : i++;
54 : :
55 : 78 : QString pname = uri.mid( start, i - start );
56 : :
57 : 78 : skipBlanks( uri, i );
58 : :
59 : 78 : if ( i == uri.length() || uri[i] != '=' )
60 : : {
61 : : // no "=", so likely not a parameter name
62 : 64 : continue;
63 : : }
64 : :
65 : 14 : i++;
66 : :
67 : 14 : if ( pname == QLatin1String( "sql" ) )
68 : : {
69 : : // rest of line is a sql where clause
70 : 0 : skipBlanks( uri, i );
71 : 0 : mSql = uri.mid( i );
72 : 0 : break;
73 : : }
74 : : else
75 : : {
76 : 14 : QString pval = getValue( uri, i );
77 : :
78 : 14 : if ( pname == QLatin1String( "table" ) )
79 : : {
80 : 0 : if ( i < uri.length() && uri[i] == '.' )
81 : : {
82 : 0 : i++;
83 : :
84 : 0 : mSchema = pval;
85 : 0 : mTable = getValue( uri, i );
86 : 0 : }
87 : : else
88 : : {
89 : 0 : mTable = pval;
90 : : }
91 : :
92 : 0 : if ( i < uri.length() && uri[i] == '(' )
93 : : {
94 : 0 : i++;
95 : :
96 : 0 : start = i;
97 : 0 : while ( i < uri.length() && uri[i] != ')' )
98 : : {
99 : 0 : if ( uri[i] == '\\' )
100 : 0 : i++;
101 : 0 : i++;
102 : : }
103 : :
104 : 0 : if ( i == uri.length() )
105 : : {
106 : 0 : QgsDebugMsg( QStringLiteral( "closing parenthesis missing" ) );
107 : 0 : }
108 : :
109 : 0 : mGeometryColumn = uri.mid( start, i - start );
110 : 0 : mGeometryColumn.replace( QLatin1String( "\\)" ), QLatin1String( ")" ) );
111 : 0 : mGeometryColumn.replace( QLatin1String( "\\\\" ), QLatin1String( "\\" ) );
112 : :
113 : 0 : i++;
114 : 0 : }
115 : : else
116 : : {
117 : 0 : mGeometryColumn = QString();
118 : : }
119 : 0 : }
120 : 14 : else if ( pname == QLatin1String( "schema" ) )
121 : : {
122 : 0 : mSchema = pval;
123 : 0 : }
124 : 14 : else if ( pname == QLatin1String( "key" ) )
125 : : {
126 : 0 : mKeyColumn = pval;
127 : 0 : }
128 : 14 : else if ( pname == QLatin1String( "estimatedmetadata" ) )
129 : : {
130 : 0 : mUseEstimatedMetadata = pval == QLatin1String( "true" );
131 : 0 : }
132 : 14 : else if ( pname == QLatin1String( "srid" ) )
133 : : {
134 : 0 : mSrid = pval;
135 : 0 : }
136 : 14 : else if ( pname == QLatin1String( "type" ) )
137 : : {
138 : 0 : mWkbType = QgsWkbTypes::parseType( pval );
139 : 0 : }
140 : 14 : else if ( pname == QLatin1String( "selectatid" ) )
141 : : {
142 : 0 : mSelectAtIdDisabled = pval == QLatin1String( "false" );
143 : 0 : }
144 : 14 : else if ( pname == QLatin1String( "service" ) )
145 : : {
146 : 0 : mService = pval;
147 : 0 : }
148 : 14 : else if ( pname == QLatin1String( "authcfg" ) )
149 : : {
150 : 0 : mAuthConfigId = pval;
151 : 0 : }
152 : 14 : else if ( pname == QLatin1String( "user" ) || pname == QLatin1String( "username" ) ) // Also accepts new WFS provider naming
153 : : {
154 : 0 : mUsername = pval;
155 : 0 : }
156 : 14 : else if ( pname == QLatin1String( "password" ) )
157 : : {
158 : 0 : mPassword = pval;
159 : 0 : }
160 : 14 : else if ( pname == QLatin1String( "connect_timeout" ) )
161 : : {
162 : 0 : QgsDebugMsgLevel( QStringLiteral( "connection timeout ignored" ), 3 );
163 : 0 : }
164 : 14 : else if ( pname == QLatin1String( "dbname" ) )
165 : : {
166 : 0 : mDatabase = pval;
167 : 0 : }
168 : 14 : else if ( pname == QLatin1String( "host" ) )
169 : : {
170 : 0 : mHost = pval;
171 : 0 : }
172 : 14 : else if ( pname == QLatin1String( "hostaddr" ) )
173 : : {
174 : 0 : QgsDebugMsg( QStringLiteral( "database host ip address ignored" ) );
175 : 0 : }
176 : 14 : else if ( pname == QLatin1String( "port" ) )
177 : : {
178 : 0 : mPort = pval;
179 : 0 : }
180 : 14 : else if ( pname == QLatin1String( "driver" ) )
181 : : {
182 : 0 : mDriver = pval;
183 : 0 : }
184 : 14 : else if ( pname == QLatin1String( "tty" ) )
185 : : {
186 : 0 : QgsDebugMsg( QStringLiteral( "backend debug tty ignored" ) );
187 : 0 : }
188 : 14 : else if ( pname == QLatin1String( "options" ) )
189 : : {
190 : 0 : QgsDebugMsg( QStringLiteral( "backend debug options ignored" ) );
191 : 0 : }
192 : 14 : else if ( pname == QLatin1String( "sslmode" ) )
193 : : {
194 : 0 : mSSLmode = decodeSslMode( pval );
195 : 0 : }
196 : 14 : else if ( pname == QLatin1String( "requiressl" ) )
197 : : {
198 : 0 : if ( pval == QLatin1String( "0" ) )
199 : 0 : mSSLmode = SslDisable;
200 : : else
201 : 0 : mSSLmode = SslPrefer;
202 : 0 : }
203 : 14 : else if ( pname == QLatin1String( "krbsrvname" ) )
204 : : {
205 : 0 : QgsDebugMsg( QStringLiteral( "kerberos server name ignored" ) );
206 : 0 : }
207 : 14 : else if ( pname == QLatin1String( "gsslib" ) )
208 : : {
209 : 0 : QgsDebugMsg( QStringLiteral( "gsslib ignored" ) );
210 : 0 : }
211 : : else
212 : : {
213 : 14 : QgsDebugMsgLevel( "parameter \"" + pname + "\":\"" + pval + "\" added", 4 );
214 : 14 : setParam( pname, pval );
215 : : }
216 : 14 : }
217 : 78 : }
218 : 78 : }
219 : :
220 : 93 : QString QgsDataSourceUri::removePassword( const QString &aUri )
221 : : {
222 : 93 : QRegExp regexp;
223 : 93 : regexp.setMinimal( true );
224 : 93 : QString safeName( aUri );
225 : 93 : if ( aUri.contains( QLatin1String( " password=" ) ) )
226 : : {
227 : 0 : regexp.setPattern( QStringLiteral( " password=.* " ) );
228 : 0 : safeName.replace( regexp, QStringLiteral( " " ) );
229 : 0 : }
230 : 93 : else if ( aUri.contains( QLatin1String( ",password=" ) ) )
231 : : {
232 : 0 : regexp.setPattern( QStringLiteral( ",password=.*," ) );
233 : 0 : safeName.replace( regexp, QStringLiteral( "," ) );
234 : 0 : }
235 : 93 : else if ( aUri.contains( QLatin1String( "IDB:" ) ) )
236 : : {
237 : 0 : regexp.setPattern( QStringLiteral( " pass=.* " ) );
238 : 0 : safeName.replace( regexp, QStringLiteral( " " ) );
239 : 0 : }
240 : 186 : else if ( ( aUri.contains( QLatin1String( "OCI:" ) ) )
241 : 93 : || ( aUri.contains( QLatin1String( "ODBC:" ) ) ) )
242 : : {
243 : 0 : regexp.setPattern( QStringLiteral( "/.*@" ) );
244 : 0 : safeName.replace( regexp, QStringLiteral( "/@" ) );
245 : 0 : }
246 : 93 : else if ( aUri.contains( QLatin1String( "SDE:" ) ) )
247 : : {
248 : 0 : QStringList strlist = aUri.split( ',' );
249 : 0 : safeName = strlist[0] + ',' + strlist[1] + ',' + strlist[2] + ',' + strlist[3];
250 : 0 : }
251 : 93 : return safeName;
252 : 93 : }
253 : :
254 : 0 : QString QgsDataSourceUri::authConfigId() const
255 : : {
256 : 0 : return mAuthConfigId;
257 : : }
258 : :
259 : 0 : QString QgsDataSourceUri::username() const
260 : : {
261 : 0 : return mUsername;
262 : : }
263 : :
264 : 0 : void QgsDataSourceUri::setUsername( const QString &username )
265 : : {
266 : 0 : mUsername = username;
267 : 0 : }
268 : :
269 : 0 : QString QgsDataSourceUri::service() const
270 : : {
271 : 0 : return mService;
272 : : }
273 : :
274 : 0 : QString QgsDataSourceUri::host() const
275 : : {
276 : 0 : return mHost;
277 : : }
278 : :
279 : 0 : QString QgsDataSourceUri::database() const
280 : : {
281 : 0 : return mDatabase;
282 : : }
283 : :
284 : 0 : QString QgsDataSourceUri::password() const
285 : : {
286 : 0 : return mPassword;
287 : : }
288 : :
289 : 0 : void QgsDataSourceUri::setPassword( const QString &password )
290 : : {
291 : 0 : mPassword = password;
292 : 0 : }
293 : :
294 : 0 : QString QgsDataSourceUri::port() const
295 : : {
296 : 0 : return mPort;
297 : : }
298 : :
299 : 0 : QString QgsDataSourceUri::driver() const
300 : : {
301 : 0 : return mDriver;
302 : : }
303 : :
304 : 0 : QgsDataSourceUri::SslMode QgsDataSourceUri::sslMode() const
305 : : {
306 : 0 : return mSSLmode;
307 : : }
308 : :
309 : 0 : QString QgsDataSourceUri::schema() const
310 : : {
311 : 0 : return mSchema;
312 : : }
313 : :
314 : 0 : QString QgsDataSourceUri::table() const
315 : : {
316 : 0 : return mTable;
317 : : }
318 : :
319 : 0 : QString QgsDataSourceUri::sql() const
320 : : {
321 : 0 : return mSql;
322 : : }
323 : :
324 : 0 : QString QgsDataSourceUri::geometryColumn() const
325 : : {
326 : 0 : return mGeometryColumn;
327 : : }
328 : :
329 : 0 : QString QgsDataSourceUri::keyColumn() const
330 : : {
331 : 0 : return mKeyColumn;
332 : : }
333 : :
334 : :
335 : 0 : void QgsDataSourceUri::setDriver( const QString &driver )
336 : : {
337 : 0 : mDriver = driver;
338 : 0 : }
339 : :
340 : :
341 : 0 : void QgsDataSourceUri::setKeyColumn( const QString &column )
342 : : {
343 : 0 : mKeyColumn = column;
344 : 0 : }
345 : :
346 : :
347 : 0 : void QgsDataSourceUri::setUseEstimatedMetadata( bool flag )
348 : : {
349 : 0 : mUseEstimatedMetadata = flag;
350 : 0 : }
351 : :
352 : 0 : bool QgsDataSourceUri::useEstimatedMetadata() const
353 : : {
354 : 0 : return mUseEstimatedMetadata;
355 : : }
356 : :
357 : 0 : void QgsDataSourceUri::disableSelectAtId( bool flag )
358 : : {
359 : 0 : mSelectAtIdDisabled = flag;
360 : 0 : }
361 : 78 :
362 : 0 : bool QgsDataSourceUri::selectAtIdDisabled() const
363 : : {
364 : 0 : return mSelectAtIdDisabled;
365 : 78 : }
366 : :
367 : 78 : void QgsDataSourceUri::setSql( const QString &sql )
368 : : {
369 : 78 : mSql = sql;
370 : 0 : }
371 : :
372 : 0 : void QgsDataSourceUri::clearSchema()
373 : : {
374 : 0 : mSchema.clear();
375 : 0 : }
376 : :
377 : 0 : void QgsDataSourceUri::setSchema( const QString &schema )
378 : : {
379 : 0 : mSchema = schema;
380 : 0 : }
381 : :
382 : 0 : QString QgsDataSourceUri::escape( const QString &val, QChar delim = '\'' ) const
383 : : {
384 : 0 : QString escaped = val;
385 : :
386 : 0 : escaped.replace( '\\', QLatin1String( "\\\\" ) );
387 : 0 : escaped.replace( delim, QStringLiteral( "\\%1" ).arg( delim ) );
388 : :
389 : 0 : return escaped;
390 : 0 : }
391 : :
392 : 0 : void QgsDataSourceUri::setGeometryColumn( const QString &geometryColumn )
393 : : {
394 : 0 : mGeometryColumn = geometryColumn;
395 : 0 : }
396 : :
397 : 0 : void QgsDataSourceUri::setTable( const QString &table )
398 : : {
399 : 0 : mTable = table;
400 : 0 : }
401 : :
402 : 184 : void QgsDataSourceUri::skipBlanks( const QString &uri, int &i )
403 : : {
404 : : // skip space before value
405 : 184 : while ( i < uri.length() && uri[i].isSpace() )
406 : 0 : i++;
407 : 184 : }
408 : :
409 : 14 : QString QgsDataSourceUri::getValue( const QString &uri, int &i )
410 : : {
411 : 14 : skipBlanks( uri, i );
412 : :
413 : : // Get the parameter value
414 : 14 : QString pval;
415 : 14 : if ( i < uri.length() && ( uri[i] == '\'' || uri[i] == '"' ) )
416 : : {
417 : 0 : QChar delim = uri[i];
418 : :
419 : 0 : i++;
420 : :
421 : : // value is quoted
422 : 0 : for ( ;; )
423 : : {
424 : 0 : if ( i == uri.length() )
425 : : {
426 : 0 : QgsDebugMsg( QStringLiteral( "unterminated quoted string in connection info string" ) );
427 : 0 : return pval;
428 : : }
429 : :
430 : 0 : if ( uri[i] == '\\' )
431 : : {
432 : 0 : i++;
433 : 0 : if ( i == uri.length() )
434 : 0 : continue;
435 : 0 : if ( uri[i] != delim && uri[i] != '\\' )
436 : 0 : i--;
437 : 0 : }
438 : 0 : else if ( uri[i] == delim )
439 : : {
440 : 0 : i++;
441 : 0 : break;
442 : : }
443 : :
444 : 0 : pval += uri[i++];
445 : : }
446 : 0 : }
447 : : else
448 : : {
449 : : // value is not quoted
450 : 560 : while ( i < uri.length() )
451 : : {
452 : 546 : if ( uri[i].isSpace() )
453 : : {
454 : : // end of value
455 : 0 : break;
456 : : }
457 : :
458 : 546 : if ( uri[i] == '\\' )
459 : : {
460 : 0 : i++;
461 : 0 : if ( i == uri.length() )
462 : 0 : break;
463 : 0 : if ( uri[i] != '\\' && uri[i] != '\'' )
464 : 0 : i--;
465 : 0 : }
466 : :
467 : 546 : pval += uri[i++];
468 : : }
469 : : }
470 : :
471 : 14 : skipBlanks( uri, i );
472 : :
473 : 14 : return pval;
474 : 14 : }
475 : :
476 : 0 : QString QgsDataSourceUri::connectionInfo( bool expandAuthConfig ) const
477 : : {
478 : 0 : QStringList connectionItems;
479 : :
480 : 0 : if ( !mDatabase.isEmpty() )
481 : : {
482 : 0 : connectionItems << "dbname='" + escape( mDatabase ) + '\'';
483 : 0 : }
484 : :
485 : 0 : if ( !mService.isEmpty() )
486 : : {
487 : 0 : connectionItems << "service='" + escape( mService ) + '\'';
488 : 0 : }
489 : 0 : else if ( !mHost.isEmpty() )
490 : : {
491 : 0 : connectionItems << "host=" + mHost;
492 : 0 : }
493 : :
494 : 0 : if ( mService.isEmpty() )
495 : : {
496 : 0 : if ( !mPort.isEmpty() )
497 : 0 : connectionItems << "port=" + mPort;
498 : 0 : }
499 : :
500 : 0 : if ( !mDriver.isEmpty() )
501 : : {
502 : 0 : connectionItems << "driver='" + escape( mDriver ) + '\'';
503 : 0 : }
504 : :
505 : 0 : if ( !mUsername.isEmpty() )
506 : : {
507 : 0 : connectionItems << "user='" + escape( mUsername ) + '\'';
508 : :
509 : 0 : if ( !mPassword.isEmpty() )
510 : : {
511 : 0 : connectionItems << "password='" + escape( mPassword ) + '\'';
512 : 0 : }
513 : 0 : }
514 : :
515 : 0 : if ( mSSLmode != SslPrefer ) // no need to output the default
516 : : {
517 : 0 : connectionItems << QStringLiteral( "sslmode=" ) + encodeSslMode( mSSLmode );
518 : 0 : }
519 : :
520 : 0 : if ( !mAuthConfigId.isEmpty() )
521 : : {
522 : 0 : if ( expandAuthConfig )
523 : : {
524 : 0 : if ( !QgsApplication::authManager()->updateDataSourceUriItems( connectionItems, mAuthConfigId ) )
525 : : {
526 : 0 : QgsDebugMsg( QStringLiteral( "Data source URI FAILED to update via loading configuration ID '%1'" ).arg( mAuthConfigId ) );
527 : 0 : }
528 : 0 : }
529 : : else
530 : : {
531 : 0 : connectionItems << "authcfg=" + mAuthConfigId;
532 : : }
533 : 0 : }
534 : :
535 : 0 : return connectionItems.join( QLatin1Char( ' ' ) );
536 : 0 : }
537 : :
538 : 0 : QString QgsDataSourceUri::uri( bool expandAuthConfig ) const
539 : : {
540 : 0 : QString uri = connectionInfo( expandAuthConfig );
541 : :
542 : 0 : if ( !mKeyColumn.isEmpty() )
543 : : {
544 : 0 : uri += QStringLiteral( " key='%1'" ).arg( escape( mKeyColumn ) );
545 : 0 : }
546 : :
547 : 0 : if ( mUseEstimatedMetadata )
548 : : {
549 : 0 : uri += QLatin1String( " estimatedmetadata=true" );
550 : 0 : }
551 : :
552 : 0 : if ( !mSrid.isEmpty() )
553 : : {
554 : 0 : uri += QStringLiteral( " srid=%1" ).arg( mSrid );
555 : 0 : }
556 : :
557 : 0 : if ( mWkbType != QgsWkbTypes::Unknown && mWkbType != QgsWkbTypes::NoGeometry )
558 : : {
559 : 0 : uri += QLatin1String( " type=" );
560 : 0 : uri += QgsWkbTypes::displayString( mWkbType );
561 : 0 : }
562 : :
563 : 0 : if ( mSelectAtIdDisabled )
564 : : {
565 : 0 : uri += QLatin1String( " selectatid=false" );
566 : 0 : }
567 : :
568 : 0 : for ( auto it = mParams.constBegin(); it != mParams.constEnd(); ++it )
569 : : {
570 : 0 : if ( it.key().contains( '=' ) || it.key().contains( ' ' ) )
571 : : {
572 : 0 : QgsDebugMsg( QStringLiteral( "invalid uri parameter %1 skipped" ).arg( it.key() ) );
573 : 0 : continue;
574 : : }
575 : :
576 : 0 : uri += ' ' + it.key() + "='" + escape( it.value() ) + '\'';
577 : 0 : }
578 : :
579 : 0 : QString columnName( mGeometryColumn );
580 : 0 : columnName.replace( '\\', QLatin1String( "\\\\" ) );
581 : 0 : columnName.replace( ')', QLatin1String( "\\)" ) );
582 : :
583 : 0 : if ( !mTable.isEmpty() )
584 : : {
585 : 0 : uri += QStringLiteral( " table=%1%2" )
586 : 0 : .arg( quotedTablename(),
587 : 0 : mGeometryColumn.isEmpty() ? QString() : QStringLiteral( " (%1)" ).arg( columnName ) );
588 : 0 : }
589 : 0 : else if ( !mSchema.isEmpty() )
590 : : {
591 : 0 : uri += QStringLiteral( " schema='%1'" ).arg( escape( mSchema ) );
592 : 0 : }
593 : :
594 : 0 : if ( !mSql.isEmpty() )
595 : : {
596 : 0 : uri += QStringLiteral( " sql=" ) + mSql;
597 : 0 : }
598 : :
599 : 0 : return uri;
600 : 0 : }
601 : :
602 : : // from qurl.h
603 : 0 : QByteArray toLatin1_helper( const QString &string )
604 : : {
605 : 0 : if ( string.isEmpty() )
606 : 0 : return string.isNull() ? QByteArray() : QByteArray( "" );
607 : 0 : return string.toLatin1();
608 : 0 : }
609 : :
610 : 0 : QByteArray QgsDataSourceUri::encodedUri() const
611 : : {
612 : 0 : QUrlQuery url;
613 : 0 : for ( auto it = mParams.constBegin(); it != mParams.constEnd(); ++it )
614 : : {
615 : 0 : url.addQueryItem( it.key(), it.value() );
616 : 0 : }
617 : :
618 : 0 : if ( !mUsername.isEmpty() )
619 : 0 : url.addQueryItem( QStringLiteral( "username" ), mUsername );
620 : :
621 : 0 : if ( !mPassword.isEmpty() )
622 : 0 : url.addQueryItem( QStringLiteral( "password" ), mPassword );
623 : :
624 : 0 : if ( !mAuthConfigId.isEmpty() )
625 : 0 : url.addQueryItem( QStringLiteral( "authcfg" ), mAuthConfigId );
626 : :
627 : 0 : return toLatin1_helper( url.toString( QUrl::FullyEncoded ) );
628 : 0 : }
629 : :
630 : 0 : void QgsDataSourceUri::setEncodedUri( const QByteArray &uri )
631 : : {
632 : 0 : mParams.clear();
633 : 0 : mUsername.clear();
634 : 0 : mPassword.clear();
635 : 0 : mAuthConfigId.clear();
636 : :
637 : 0 : QUrl url;
638 : 0 : url.setQuery( QString::fromLatin1( uri ) );
639 : 0 : const QUrlQuery query( url );
640 : :
641 : 0 : const auto constQueryItems = query.queryItems( QUrl::ComponentFormattingOption::FullyDecoded );
642 : 0 : for ( const QPair<QString, QString> &item : constQueryItems )
643 : : {
644 : 0 : if ( item.first == QLatin1String( "username" ) )
645 : 0 : mUsername = item.second;
646 : 0 : else if ( item.first == QLatin1String( "password" ) )
647 : 0 : mPassword = item.second;
648 : 0 : else if ( item.first == QLatin1String( "authcfg" ) )
649 : 0 : mAuthConfigId = item.second;
650 : : else
651 : 0 : mParams.insert( item.first, item.second );
652 : : }
653 : 0 : }
654 : :
655 : 0 : void QgsDataSourceUri::setEncodedUri( const QString &uri )
656 : : {
657 : 0 : setEncodedUri( uri.toLatin1() );
658 : 0 : }
659 : :
660 : 0 : QString QgsDataSourceUri::quotedTablename() const
661 : : {
662 : 0 : if ( !mSchema.isEmpty() )
663 : 0 : return QStringLiteral( "\"%1\".\"%2\"" )
664 : 0 : .arg( escape( mSchema, '"' ),
665 : 0 : escape( mTable, '"' ) );
666 : : else
667 : 0 : return QStringLiteral( "\"%1\"" )
668 : 0 : .arg( escape( mTable, '"' ) );
669 : 0 : }
670 : :
671 : 0 : void QgsDataSourceUri::setConnection( const QString &host,
672 : : const QString &port,
673 : : const QString &database,
674 : : const QString &username,
675 : : const QString &password,
676 : : SslMode sslmode,
677 : : const QString &authConfigId )
678 : : {
679 : 0 : mHost = host;
680 : 0 : mDatabase = database;
681 : 0 : mPort = port;
682 : 0 : mUsername = username;
683 : 0 : mPassword = password;
684 : 0 : mSSLmode = sslmode;
685 : 0 : mAuthConfigId = authConfigId;
686 : 0 : }
687 : :
688 : 0 : void QgsDataSourceUri::setConnection( const QString &service,
689 : : const QString &database,
690 : : const QString &username,
691 : : const QString &password,
692 : : SslMode sslmode,
693 : : const QString &authConfigId )
694 : : {
695 : 0 : mService = service;
696 : 0 : mDatabase = database;
697 : 0 : mUsername = username;
698 : 0 : mPassword = password;
699 : 0 : mSSLmode = sslmode;
700 : 0 : mAuthConfigId = authConfigId;
701 : 0 : }
702 : :
703 : 0 : void QgsDataSourceUri::setDataSource( const QString &schema,
704 : : const QString &table,
705 : : const QString &geometryColumn,
706 : : const QString &sql,
707 : : const QString &keyColumn )
708 : : {
709 : 0 : mSchema = schema;
710 : 0 : mTable = table;
711 : 0 : mGeometryColumn = geometryColumn;
712 : 0 : mSql = sql;
713 : 0 : mKeyColumn = keyColumn;
714 : 0 : }
715 : :
716 : 0 : void QgsDataSourceUri::setAuthConfigId( const QString &authcfg )
717 : : {
718 : 0 : mAuthConfigId = authcfg;
719 : 0 : }
720 : :
721 : 0 : void QgsDataSourceUri::setDatabase( const QString &database )
722 : : {
723 : 0 : mDatabase = database;
724 : 0 : }
725 : :
726 : 0 : QgsWkbTypes::Type QgsDataSourceUri::wkbType() const
727 : : {
728 : 0 : return mWkbType;
729 : : }
730 : :
731 : 0 : void QgsDataSourceUri::setWkbType( QgsWkbTypes::Type wkbType )
732 : : {
733 : 0 : mWkbType = wkbType;
734 : 0 : }
735 : :
736 : 0 : QString QgsDataSourceUri::srid() const
737 : : {
738 : 0 : return mSrid;
739 : : }
740 : :
741 : 0 : void QgsDataSourceUri::setSrid( const QString &srid )
742 : : {
743 : 0 : mSrid = srid;
744 : 0 : }
745 : :
746 : 0 : QgsDataSourceUri::SslMode QgsDataSourceUri::decodeSslMode( const QString &sslMode )
747 : : {
748 : 0 : if ( sslMode == QLatin1String( "prefer" ) )
749 : 0 : return SslPrefer;
750 : 0 : else if ( sslMode == QLatin1String( "disable" ) )
751 : 0 : return SslDisable;
752 : 0 : else if ( sslMode == QLatin1String( "allow" ) )
753 : 0 : return SslAllow;
754 : 0 : else if ( sslMode == QLatin1String( "require" ) )
755 : 0 : return SslRequire;
756 : 0 : else if ( sslMode == QLatin1String( "verify-ca" ) )
757 : 0 : return SslVerifyCa;
758 : 0 : else if ( sslMode == QLatin1String( "verify-full" ) )
759 : 0 : return SslVerifyFull;
760 : : else
761 : 0 : return SslPrefer; // default
762 : 0 : }
763 : :
764 : 0 : QString QgsDataSourceUri::encodeSslMode( QgsDataSourceUri::SslMode sslMode )
765 : : {
766 : 0 : switch ( sslMode )
767 : : {
768 : 0 : case SslPrefer: return QStringLiteral( "prefer" );
769 : 0 : case SslDisable: return QStringLiteral( "disable" );
770 : 0 : case SslAllow: return QStringLiteral( "allow" );
771 : 0 : case SslRequire: return QStringLiteral( "require" );
772 : 0 : case SslVerifyCa: return QStringLiteral( "verify-ca" );
773 : 0 : case SslVerifyFull: return QStringLiteral( "verify-full" );
774 : : }
775 : 0 : return QString();
776 : 0 : }
777 : :
778 : 14 : void QgsDataSourceUri::setParam( const QString &key, const QString &value )
779 : : {
780 : : // maintain old API
781 : 14 : if ( key == QLatin1String( "username" ) )
782 : 0 : mUsername = value;
783 : 14 : else if ( key == QLatin1String( "password" ) )
784 : 0 : mPassword = value;
785 : 14 : else if ( key == QLatin1String( "authcfg" ) )
786 : 0 : mAuthConfigId = value;
787 : : else
788 : : {
789 : : // may be multiple
790 : 14 : mParams.insert( key, value );
791 : : }
792 : 14 : }
793 : :
794 : 0 : void QgsDataSourceUri::setParam( const QString &key, const QStringList &value )
795 : : {
796 : 0 : for ( const QString &val : value )
797 : : {
798 : 0 : setParam( key, val );
799 : : }
800 : 0 : }
801 : :
802 : 0 : int QgsDataSourceUri::removeParam( const QString &key )
803 : : {
804 : 0 : if ( key == QLatin1String( "username" ) && !mUsername.isEmpty() )
805 : : {
806 : 0 : mUsername.clear();
807 : 0 : return 1;
808 : : }
809 : 0 : else if ( key == QLatin1String( "password" ) && !mPassword.isEmpty() )
810 : : {
811 : 0 : mPassword.clear();
812 : 0 : return 1;
813 : : }
814 : 0 : else if ( key == QLatin1String( "authcfg" ) && !mAuthConfigId.isEmpty() )
815 : : {
816 : 0 : mAuthConfigId.clear();
817 : 0 : return 1;
818 : : }
819 : :
820 : 0 : return mParams.remove( key );
821 : 0 : }
822 : :
823 : 0 : QString QgsDataSourceUri::param( const QString &key ) const
824 : : {
825 : : // maintain old api
826 : 0 : if ( key == QLatin1String( "username" ) && !mUsername.isEmpty() )
827 : 0 : return mUsername;
828 : 0 : else if ( key == QLatin1String( "password" ) && !mPassword.isEmpty() )
829 : 0 : return mPassword;
830 : 0 : else if ( key == QLatin1String( "authcfg" ) && !mAuthConfigId.isEmpty() )
831 : 0 : return mAuthConfigId;
832 : :
833 : 0 : return mParams.value( key );
834 : 0 : }
835 : :
836 : 0 : QStringList QgsDataSourceUri::params( const QString &key ) const
837 : : {
838 : : // maintain old api
839 : 0 : if ( key == QLatin1String( "username" ) && !mUsername.isEmpty() )
840 : 0 : return QStringList() << mUsername;
841 : 0 : else if ( key == QLatin1String( "password" ) && !mPassword.isEmpty() )
842 : 0 : return QStringList() << mPassword;
843 : 0 : else if ( key == QLatin1String( "authcfg" ) && !mAuthConfigId.isEmpty() )
844 : 0 : return QStringList() << mAuthConfigId;
845 : :
846 : 0 : return mParams.values( key );
847 : 0 : }
848 : :
849 : 0 : bool QgsDataSourceUri::hasParam( const QString &key ) const
850 : : {
851 : : // maintain old api
852 : 0 : if ( key == QLatin1String( "username" ) && !mUsername.isEmpty() )
853 : 0 : return true;
854 : 0 : else if ( key == QLatin1String( "password" ) && !mPassword.isEmpty() )
855 : 0 : return true;
856 : 0 : else if ( key == QLatin1String( "authcfg" ) && !mAuthConfigId.isEmpty() )
857 : 0 : return true;
858 : :
859 : 0 : return mParams.contains( key );
860 : 0 : }
|