QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
qgsabstractdatabaseproviderconnection.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsabstractdatabaseproviderconnection.cpp - QgsAbstractDatabaseProviderConnection
3
4 ---------------------
5 begin : 2.8.2019
6 copyright : (C) 2019 by Alessandro Pasotti
7 email : elpaso at itopen dot it
8 ***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
17
18#include "qgsexception.h"
19#include "qgsfeedback.h"
21#include "qgssqlstatement.h"
22#include "qgsvectorlayer.h"
23#include "qgsweakrelation.h"
24
25#include <QObject>
26#include <QString>
27#include <QVariant>
28
29#include "moc_qgsabstractdatabaseproviderconnection.cpp"
30
31using namespace Qt::StringLiterals;
32
36
40
45
50
55
60
62{
63 throw QgsProviderConnectionException( QObject::tr( "Operation 'createVectorLayerExporterDestinationUri' is not supported" ) );
64}
65
66QString QgsAbstractDatabaseProviderConnection::tableUri( const QString &schema, const QString &name ) const
67{
68 Q_UNUSED( schema )
69 Q_UNUSED( name )
70 throw QgsProviderConnectionException( QObject::tr( "Operation 'tableUri' is not supported" ) );
71}
72
73
75void QgsAbstractDatabaseProviderConnection::checkCapability( QgsAbstractDatabaseProviderConnection::Capability capability ) const
76{
77 if ( !mCapabilities.testFlag( capability ) )
78 {
79 static QMetaEnum metaEnum = QMetaEnum::fromType<QgsAbstractDatabaseProviderConnection::Capability>();
80 const QString capName { metaEnum.valueToKey( capability ) };
81 throw QgsProviderConnectionException( QObject::tr( "Operation '%1' is not supported for this connection" ).arg( capName ) );
82 }
83}
84
85void QgsAbstractDatabaseProviderConnection::checkCapability( Qgis::DatabaseProviderConnectionCapability2 capability ) const
86{
87 if ( !mCapabilities2.testFlag( capability ) )
88 {
89 throw QgsProviderConnectionException( QObject::tr( "Operation '%1' is not supported for this connection" ).arg( qgsEnumValueToKey( capability ) ) );
90 }
91}
92
93QString QgsAbstractDatabaseProviderConnection::sanitizeSqlForQueryLayer( const QString &sql ) const
94{
95 QString sanitizedSql { sql.trimmed() };
96 while ( sanitizedSql.endsWith( ';' ) )
97 {
98 sanitizedSql.chop( 1 );
99 }
100 return sanitizedSql;
101}
102
104
109
110QMultiMap<Qgis::SqlKeywordCategory, QStringList> QgsAbstractDatabaseProviderConnection::sqlDictionary()
111{
112 return {
113 // Common constants
115 {
116 u"NULL"_s,
117 u"FALSE"_s,
118 u"TRUE"_s,
119 } },
120 // Common SQL reserved words
121 // From: GET https://en.wikipedia.org/wiki/SQL_reserved_words| grep 'style="background: #ececec; color: black; font-weight: bold;'| sed -e 's/.*>//'|sort
123 {
124 u"ABORT "_s,
125 u"ABORTSESSION"_s,
126 u"ABS"_s,
127 u"ABSOLUTE"_s,
128 u"ACCESS"_s,
129 u"ACCESSIBLE"_s,
130 u"ACCESS_LOCK"_s,
131 u"ACCOUNT"_s,
132 u"ACOS"_s,
133 u"ACOSH"_s,
134 u"ACTION"_s,
135 u"ADD"_s,
136 u"ADD_MONTHS"_s,
137 u"ADMIN"_s,
138 u"AFTER"_s,
139 u"AGGREGATE"_s,
140 u"ALIAS"_s,
141 u"ALL"_s,
142 u"ALLOCATE"_s,
143 u"ALLOW"_s,
144 u"ALTER"_s,
145 u"ALTERAND"_s,
146 u"AMP"_s,
147 u"ANALYSE"_s,
148 u"ANALYZE"_s,
149 u"AND"_s,
150 u"ANSIDATE"_s,
151 u"ANY"_s,
152 u"ARE"_s,
153 u"ARRAY"_s,
154 u"ARRAY_AGG"_s,
155 u"ARRAY_EXISTS"_s,
156 u"ARRAY_MAX_CARDINALITY"_s,
157 u"AS"_s,
158 u"ASC"_s,
159 u"ASENSITIVE"_s,
160 u"ASIN"_s,
161 u"ASINH"_s,
162 u"ASSERTION"_s,
163 u"ASSOCIATE"_s,
164 u"ASUTIME"_s,
165 u"ASYMMETRIC"_s,
166 u"AT"_s,
167 u"ATAN"_s,
168 u"ATAN2"_s,
169 u"ATANH"_s,
170 u"ATOMIC"_s,
171 u"AUDIT"_s,
172 u"AUTHORIZATION"_s,
173 u"AUX"_s,
174 u"AUXILIARY"_s,
175 u"AVE"_s,
176 u"AVERAGE"_s,
177 u"AVG"_s,
178 u"BACKUP"_s,
179 u"BEFORE"_s,
180 u"BEGIN"_s,
181 u"BEGIN_FRAME"_s,
182 u"BEGIN_PARTITION"_s,
183 u"BETWEEN"_s,
184 u"BIGINT"_s,
185 u"BINARY"_s,
186 u"BIT"_s,
187 u"BLOB"_s,
188 u"BOOLEAN"_s,
189 u"BOTH"_s,
190 u"BREADTH"_s,
191 u"BREAK"_s,
192 u"BROWSE"_s,
193 u"BT"_s,
194 u"BUFFERPOOL"_s,
195 u"BULK"_s,
196 u"BUT"_s,
197 u"BY"_s,
198 u"BYTE"_s,
199 u"BYTEINT"_s,
200 u"BYTES"_s,
201 u"CALL"_s,
202 u"CALLED"_s,
203 u"CAPTURE"_s,
204 u"CARDINALITY"_s,
205 u"CASCADE"_s,
206 u"CASCADED"_s,
207 u"CASE"_s,
208 u"CASE_N"_s,
209 u"CASESPECIFIC"_s,
210 u"CAST"_s,
211 u"CATALOG"_s,
212 u"CCSID"_s,
213 u"CD"_s,
214 u"CEIL"_s,
215 u"CEILING"_s,
216 u"CHANGE"_s,
217 u"CHAR"_s,
218 u"CHAR2HEXINT"_s,
219 u"CHARACTER"_s,
220 u"CHARACTER_LENGTH"_s,
221 u"CHARACTERS"_s,
222 u"CHAR_LENGTH"_s,
223 u"CHARS"_s,
224 u"CHECK"_s,
225 u"CHECKPOINT"_s,
226 u"CLASS"_s,
227 u"CLASSIFIER"_s,
228 u"CLOB"_s,
229 u"CLONE"_s,
230 u"CLOSE"_s,
231 u"CLUSTER"_s,
232 u"CLUSTERED"_s,
233 u"CM"_s,
234 u"COALESCE"_s,
235 u"COLLATE"_s,
236 u"COLLATION"_s,
237 u"COLLECT"_s,
238 u"COLLECTION"_s,
239 u"COLLID"_s,
240 u"COLUMN"_s,
241 u"COLUMN_VALUE"_s,
242 u"COMMENT"_s,
243 u"COMMIT"_s,
244 u"COMPLETION"_s,
245 u"COMPRESS"_s,
246 u"COMPUTE"_s,
247 u"CONCAT"_s,
248 u"CONCURRENTLY"_s,
249 u"CONDITION"_s,
250 u"CONNECT"_s,
251 u"CONNECTION"_s,
252 u"CONSTRAINT"_s,
253 u"CONSTRAINTS"_s,
254 u"CONSTRUCTOR"_s,
255 u"CONTAINS"_s,
256 u"CONTAINSTABLE"_s,
257 u"CONTENT"_s,
258 u"CONTINUE"_s,
259 u"CONVERT"_s,
260 u"CONVERT_TABLE_HEADER"_s,
261 u"COPY"_s,
262 u"CORR"_s,
263 u"CORRESPONDING"_s,
264 u"COS"_s,
265 u"COSH"_s,
266 u"COUNT"_s,
267 u"COVAR_POP"_s,
268 u"COVAR_SAMP"_s,
269 u"CREATE"_s,
270 u"CROSS"_s,
271 u"CS"_s,
272 u"CSUM"_s,
273 u"CT"_s,
274 u"CUBE"_s,
275 u"CUME_DIST"_s,
276 u"CURRENT"_s,
277 u"CURRENT_CATALOG"_s,
278 u"CURRENT_DATE"_s,
279 u"CURRENT_DEFAULT_TRANSFORM_GROUP"_s,
280 u"CURRENT_LC_CTYPE"_s,
281 u"CURRENT_PATH"_s,
282 u"CURRENT_ROLE"_s,
283 u"CURRENT_ROW"_s,
284 u"CURRENT_SCHEMA"_s,
285 u"CURRENT_SERVER"_s,
286 u"CURRENT_TIME"_s,
287 u"CURRENT_TIMESTAMP"_s,
288 u"CURRENT_TIMEZONE"_s,
289 u"CURRENT_TRANSFORM_GROUP_FOR_TYPE"_s,
290 u"CURRENT_USER"_s,
291 u"CURRVAL"_s,
292 u"CURSOR"_s,
293 u"CV"_s,
294 u"CYCLE"_s,
295 u"DATA"_s,
296 u"DATABASE"_s,
297 u"DATABASES"_s,
298 u"DATABLOCKSIZE"_s,
299 u"DATE"_s,
300 u"DATEFORM"_s,
301 u"DAY"_s,
302 u"DAY_HOUR"_s,
303 u"DAY_MICROSECOND"_s,
304 u"DAY_MINUTE"_s,
305 u"DAYS"_s,
306 u"DAY_SECOND"_s,
307 u"DBCC"_s,
308 u"DBINFO"_s,
309 u"DEALLOCATE"_s,
310 u"DEC"_s,
311 u"DECFLOAT"_s,
312 u"DECIMAL"_s,
313 u"DECLARE"_s,
314 u"DEFAULT"_s,
315 u"DEFERRABLE"_s,
316 u"DEFERRED"_s,
317 u"DEFINE"_s,
318 u"DEGREES"_s,
319 u"DEL"_s,
320 u"DELAYED"_s,
321 u"DELETE"_s,
322 u"DENSE_RANK"_s,
323 u"DENY"_s,
324 u"DEPTH"_s,
325 u"DEREF"_s,
326 u"DESC"_s,
327 u"DESCRIBE"_s,
328 u"DESCRIPTOR"_s,
329 u"DESTROY"_s,
330 u"DESTRUCTOR"_s,
331 u"DETERMINISTIC"_s,
332 u"DIAGNOSTIC"_s,
333 u"DIAGNOSTICS"_s,
334 u"DICTIONARY"_s,
335 u"DISABLE"_s,
336 u"DISABLED"_s,
337 u"DISALLOW"_s,
338 u"DISCONNECT"_s,
339 u"DISK"_s,
340 u"DISTINCT"_s,
341 u"DISTINCTROW"_s,
342 u"DISTRIBUTED"_s,
343 u"DIV"_s,
344 u"DO"_s,
345 u"DOCUMENT"_s,
346 u"DOMAIN"_s,
347 u"DOUBLE"_s,
348 u"DROP"_s,
349 u"DSSIZE"_s,
350 u"DUAL"_s,
351 u"DUMP"_s,
352 u"DYNAMIC"_s,
353 u"EACH"_s,
354 u"ECHO"_s,
355 u"EDITPROC"_s,
356 u"ELEMENT"_s,
357 u"ELSE"_s,
358 u"ELSEIF"_s,
359 u"EMPTY"_s,
360 u"ENABLED"_s,
361 u"ENCLOSED"_s,
362 u"ENCODING"_s,
363 u"ENCRYPTION"_s,
364 u"END"_s,
365 u"END-EXEC"_s,
366 u"END_FRAME"_s,
367 u"ENDING"_s,
368 u"END_PARTITION"_s,
369 u"EQ"_s,
370 u"EQUALS"_s,
371 u"ERASE"_s,
372 u"ERRLVL"_s,
373 u"ERROR"_s,
374 u"ERRORFILES"_s,
375 u"ERRORTABLES"_s,
376 u"ESCAPE"_s,
377 u"ESCAPED"_s,
378 u"ET"_s,
379 u"EVERY"_s,
380 u"EXCEPT"_s,
381 u"EXCEPTION"_s,
382 u"EXCLUSIVE"_s,
383 u"EXEC"_s,
384 u"EXECUTE"_s,
385 u"EXISTS"_s,
386 u"EXIT"_s,
387 u"EXP"_s,
388 u"EXPLAIN"_s,
389 u"EXTERNAL"_s,
390 u"EXTRACT"_s,
391 u"FALLBACK"_s,
392 u"FALSE"_s,
393 u"FASTEXPORT"_s,
394 u"FENCED"_s,
395 u"FETCH"_s,
396 u"FIELDPROC"_s,
397 u"FILE"_s,
398 u"FILLFACTOR"_s,
399 u"FILTER"_s,
400 u"FINAL"_s,
401 u"FIRST"_s,
402 u"FIRST_VALUE"_s,
403 u"FLOAT"_s,
404 u"FLOAT4"_s,
405 u"FLOAT8"_s,
406 u"FLOOR"_s,
407 u"FOR"_s,
408 u"FORCE"_s,
409 u"FOREIGN"_s,
410 u"FORMAT"_s,
411 u"FOUND"_s,
412 u"FRAME_ROW"_s,
413 u"FREE"_s,
414 u"FREESPACE"_s,
415 u"FREETEXT"_s,
416 u"FREETEXTTABLE"_s,
417 u"FREEZE"_s,
418 u"FROM"_s,
419 u"FULL"_s,
420 u"FULLTEXT"_s,
421 u"FUNCTION"_s,
422 u"FUSION"_s,
423 u"GE"_s,
424 u"GENERAL"_s,
425 u"GENERATED"_s,
426 u"GET"_s,
427 u"GIVE"_s,
428 u"GLOBAL"_s,
429 u"GO"_s,
430 u"GOTO"_s,
431 u"GRANT"_s,
432 u"GRAPHIC"_s,
433 u"GROUP"_s,
434 u"GROUPING"_s,
435 u"GROUPS"_s,
436 u"GT"_s,
437 u"HANDLER"_s,
438 u"HASH"_s,
439 u"HASHAMP"_s,
440 u"HASHBAKAMP"_s,
441 u"HASHBUCKET"_s,
442 u"HASHROW"_s,
443 u"HAVING"_s,
444 u"HELP"_s,
445 u"HIGH_PRIORITY"_s,
446 u"HOLD"_s,
447 u"HOLDLOCK"_s,
448 u"HOST"_s,
449 u"HOUR"_s,
450 u"HOUR_MICROSECOND"_s,
451 u"HOUR_MINUTE"_s,
452 u"HOURS"_s,
453 u"HOUR_SECOND"_s,
454 u"IDENTIFIED"_s,
455 u"IDENTITY"_s,
456 u"IDENTITYCOL"_s,
457 u"IDENTITY_INSERT"_s,
458 u"IF"_s,
459 u"IGNORE"_s,
460 u"ILIKE"_s,
461 u"IMMEDIATE"_s,
462 u"IN"_s,
463 u"INCLUSIVE"_s,
464 u"INCONSISTENT"_s,
465 u"INCREMENT"_s,
466 u"INDEX"_s,
467 u"INDICATOR"_s,
468 u"INFILE"_s,
469 u"INHERIT"_s,
470 u"INITIAL"_s,
471 u"INITIALIZE"_s,
472 u"INITIALLY"_s,
473 u"INITIATE"_s,
474 u"INNER"_s,
475 u"INOUT"_s,
476 u"INPUT"_s,
477 u"INS"_s,
478 u"INSENSITIVE"_s,
479 u"INSERT"_s,
480 u"INSTEAD"_s,
481 u"INT"_s,
482 u"INT1"_s,
483 u"INT2"_s,
484 u"INT3"_s,
485 u"INT4"_s,
486 u"INT8"_s,
487 u"INTEGER"_s,
488 u"INTEGERDATE"_s,
489 u"INTERSECT"_s,
490 u"INTERSECTION"_s,
491 u"INTERVAL"_s,
492 u"INTO"_s,
493 u"IO_AFTER_GTIDS"_s,
494 u"IO_BEFORE_GTIDS"_s,
495 u"IS"_s,
496 u"ISNULL"_s,
497 u"ISOBID"_s,
498 u"ISOLATION"_s,
499 u"ITERATE"_s,
500 u"JAR"_s,
501 u"JOIN"_s,
502 u"JOURNAL"_s,
503 u"JSON_ARRAY"_s,
504 u"JSON_ARRAYAGG"_s,
505 u"JSON_EXISTS"_s,
506 u"JSON_OBJECT"_s,
507 u"JSON_OBJECTAGG"_s,
508 u"JSON_QUERY"_s,
509 u"JSON_TABLE"_s,
510 u"JSON_TABLE_PRIMITIVE"_s,
511 u"JSON_VALUE"_s,
512 u"KEEP"_s,
513 u"KEY"_s,
514 u"KEYS"_s,
515 u"KILL"_s,
516 u"KURTOSIS"_s,
517 u"LABEL"_s,
518 u"LAG"_s,
519 u"LANGUAGE"_s,
520 u"LARGE"_s,
521 u"LAST"_s,
522 u"LAST_VALUE"_s,
523 u"LATERAL"_s,
524 u"LC_CTYPE"_s,
525 u"LE"_s,
526 u"LEAD"_s,
527 u"LEADING"_s,
528 u"LEAVE"_s,
529 u"LEFT"_s,
530 u"LESS"_s,
531 u"LEVEL"_s,
532 u"LIKE"_s,
533 u"LIKE_REGEX"_s,
534 u"LIMIT"_s,
535 u"LINEAR"_s,
536 u"LINENO"_s,
537 u"LINES"_s,
538 u"LISTAGG"_s,
539 u"LN"_s,
540 u"LOAD"_s,
541 u"LOADING"_s,
542 u"LOCAL"_s,
543 u"LOCALE"_s,
544 u"LOCALTIME"_s,
545 u"LOCALTIMESTAMP"_s,
546 u"LOCATOR"_s,
547 u"LOCATORS"_s,
548 u"LOCK"_s,
549 u"LOCKING"_s,
550 u"LOCKMAX"_s,
551 u"LOCKSIZE"_s,
552 u"LOG"_s,
553 u"LOG10"_s,
554 u"LOGGING"_s,
555 u"LOGON"_s,
556 u"LONG"_s,
557 u"LONGBLOB"_s,
558 u"LONGTEXT"_s,
559 u"LOOP"_s,
560 u"LOWER"_s,
561 u"LOW_PRIORITY"_s,
562 u"LT"_s,
563 u"MACRO"_s,
564 u"MAINTAINED"_s,
565 u"MAP"_s,
566 u"MASTER_BIND"_s,
567 u"MASTER_SSL_VERIFY_SERVER_CERT"_s,
568 u"MATCH"_s,
569 u"MATCHES"_s,
570 u"MATCH_NUMBER"_s,
571 u"MATCH_RECOGNIZE"_s,
572 u"MATERIALIZED"_s,
573 u"MAVG"_s,
574 u"MAX"_s,
575 u"MAXEXTENTS"_s,
576 u"MAXIMUM"_s,
577 u"MAXVALUE"_s,
578 u"MCHARACTERS"_s,
579 u"MDIFF"_s,
580 u"MEDIUMBLOB"_s,
581 u"MEDIUMINT"_s,
582 u"MEDIUMTEXT"_s,
583 u"MEMBER"_s,
584 u"MERGE"_s,
585 u"METHOD"_s,
586 u"MICROSECOND"_s,
587 u"MICROSECONDS"_s,
588 u"MIDDLEINT"_s,
589 u"MIN"_s,
590 u"MINDEX"_s,
591 u"MINIMUM"_s,
592 u"MINUS"_s,
593 u"MINUTE"_s,
594 u"MINUTE_MICROSECOND"_s,
595 u"MINUTES"_s,
596 u"MINUTE_SECOND"_s,
597 u"MLINREG"_s,
598 u"MLOAD"_s,
599 u"MLSLABEL"_s,
600 u"MOD"_s,
601 u"MODE"_s,
602 u"MODIFIES"_s,
603 u"MODIFY"_s,
604 u"MODULE"_s,
605 u"MONITOR"_s,
606 u"MONRESOURCE"_s,
607 u"MONSESSION"_s,
608 u"MONTH"_s,
609 u"MONTHS"_s,
610 u"MSUBSTR"_s,
611 u"MSUM"_s,
612 u"MULTISET"_s,
613 u"NAMED"_s,
614 u"NAMES"_s,
615 u"NATIONAL"_s,
616 u"NATURAL"_s,
617 u"NCHAR"_s,
618 u"NCLOB"_s,
619 u"NE"_s,
620 u"NESTED_TABLE_ID"_s,
621 u"NEW"_s,
622 u"NEW_TABLE"_s,
623 u"NEXT"_s,
624 u"NEXTVAL"_s,
625 u"NO"_s,
626 u"NOAUDIT"_s,
627 u"NOCHECK"_s,
628 u"NOCOMPRESS"_s,
629 u"NONCLUSTERED"_s,
630 u"NONE"_s,
631 u"NORMALIZE"_s,
632 u"NOT"_s,
633 u"NOTNULL"_s,
634 u"NOWAIT"_s,
635 u"NO_WRITE_TO_BINLOG"_s,
636 u"NTH_VALUE"_s,
637 u"NTILE"_s,
638 u"NULL"_s,
639 u"NULLIF"_s,
640 u"NULLIFZERO"_s,
641 u"NULLS"_s,
642 u"NUMBER"_s,
643 u"NUMERIC"_s,
644 u"NUMPARTS"_s,
645 u"OBID"_s,
646 u"OBJECT"_s,
647 u"OBJECTS"_s,
648 u"OCCURRENCES_REGEX"_s,
649 u"OCTET_LENGTH"_s,
650 u"OF"_s,
651 u"OFF"_s,
652 u"OFFLINE"_s,
653 u"OFFSET"_s,
654 u"OFFSETS"_s,
655 u"OLD"_s,
656 u"OLD_TABLE"_s,
657 u"OMIT"_s,
658 u"ON"_s,
659 u"ONE"_s,
660 u"ONLINE"_s,
661 u"ONLY"_s,
662 u"OPEN"_s,
663 u"OPENDATASOURCE"_s,
664 u"OPENQUERY"_s,
665 u"OPENROWSET"_s,
666 u"OPENXML"_s,
667 u"OPERATION"_s,
668 u"OPTIMIZATION"_s,
669 u"OPTIMIZE"_s,
670 u"OPTIMIZER_COSTS"_s,
671 u"OPTION"_s,
672 u"OPTIONALLY"_s,
673 u"OR"_s,
674 u"ORDER"_s,
675 u"ORDINALITY"_s,
676 u"ORGANIZATION"_s,
677 u"OUT"_s,
678 u"OUTER"_s,
679 u"OUTFILE"_s,
680 u"OUTPUT"_s,
681 u"OVER"_s,
682 u"OVERLAPS"_s,
683 u"OVERLAY"_s,
684 u"OVERRIDE"_s,
685 u"PACKAGE"_s,
686 u"PAD"_s,
687 u"PADDED"_s,
688 u"PARAMETER"_s,
689 u"PARAMETERS"_s,
690 u"PART"_s,
691 u"PARTIAL"_s,
692 u"PARTITION"_s,
693 u"PARTITIONED"_s,
694 u"PARTITIONING"_s,
695 u"PASSWORD"_s,
696 u"PATH"_s,
697 u"PATTERN"_s,
698 u"PCTFREE"_s,
699 u"PER"_s,
700 u"PERCENT"_s,
701 u"PERCENTILE_CONT"_s,
702 u"PERCENTILE_DISC"_s,
703 u"PERCENT_RANK"_s,
704 u"PERIOD"_s,
705 u"PERM"_s,
706 u"PERMANENT"_s,
707 u"PIECESIZE"_s,
708 u"PIVOT"_s,
709 u"PLACING"_s,
710 u"PLAN"_s,
711 u"PORTION"_s,
712 u"POSITION"_s,
713 u"POSITION_REGEX"_s,
714 u"POSTFIX"_s,
715 u"POWER"_s,
716 u"PRECEDES"_s,
717 u"PRECISION"_s,
718 u"PREFIX"_s,
719 u"PREORDER"_s,
720 u"PREPARE"_s,
721 u"PRESERVE"_s,
722 u"PREVVAL"_s,
723 u"PRIMARY"_s,
724 u"PRINT"_s,
725 u"PRIOR"_s,
726 u"PRIQTY"_s,
727 u"PRIVATE"_s,
728 u"PRIVILEGES"_s,
729 u"PROC"_s,
730 u"PROCEDURE"_s,
731 u"PROFILE"_s,
732 u"PROGRAM"_s,
733 u"PROPORTIONAL"_s,
734 u"PROTECTION"_s,
735 u"PSID"_s,
736 u"PTF"_s,
737 u"PUBLIC"_s,
738 u"PURGE"_s,
739 u"QUALIFIED"_s,
740 u"QUALIFY"_s,
741 u"QUANTILE"_s,
742 u"QUERY"_s,
743 u"QUERYNO"_s,
744 u"RADIANS"_s,
745 u"RAISERROR"_s,
746 u"RANDOM"_s,
747 u"RANGE"_s,
748 u"RANGE_N"_s,
749 u"RANK"_s,
750 u"RAW"_s,
751 u"READ"_s,
752 u"READS"_s,
753 u"READTEXT"_s,
754 u"READ_WRITE"_s,
755 u"REAL"_s,
756 u"RECONFIGURE"_s,
757 u"RECURSIVE"_s,
758 u"REF"_s,
759 u"REFERENCES"_s,
760 u"REFERENCING"_s,
761 u"REFRESH"_s,
762 u"REGEXP"_s,
763 u"REGR_AVGX"_s,
764 u"REGR_AVGY"_s,
765 u"REGR_COUNT"_s,
766 u"REGR_INTERCEPT"_s,
767 u"REGR_R2"_s,
768 u"REGR_SLOPE"_s,
769 u"REGR_SXX"_s,
770 u"REGR_SXY"_s,
771 u"REGR_SYY"_s,
772 u"RELATIVE"_s,
773 u"RELEASE"_s,
774 u"RENAME"_s,
775 u"REPEAT"_s,
776 u"REPLACE"_s,
777 u"REPLICATION"_s,
778 u"REPOVERRIDE"_s,
779 u"REQUEST"_s,
780 u"REQUIRE"_s,
781 u"RESIGNAL"_s,
782 u"RESOURCE"_s,
783 u"RESTART"_s,
784 u"RESTORE"_s,
785 u"RESTRICT"_s,
786 u"RESULT"_s,
787 u"RESULT_SET_LOCATOR"_s,
788 u"RESUME"_s,
789 u"RET"_s,
790 u"RETRIEVE"_s,
791 u"RETURN"_s,
792 u"RETURNING"_s,
793 u"RETURNS"_s,
794 u"REVALIDATE"_s,
795 u"REVERT"_s,
796 u"REVOKE"_s,
797 u"RIGHT"_s,
798 u"RIGHTS"_s,
799 u"RLIKE"_s,
800 u"ROLE"_s,
801 u"ROLLBACK"_s,
802 u"ROLLFORWARD"_s,
803 u"ROLLUP"_s,
804 u"ROUND_CEILING"_s,
805 u"ROUND_DOWN"_s,
806 u"ROUND_FLOOR"_s,
807 u"ROUND_HALF_DOWN"_s,
808 u"ROUND_HALF_EVEN"_s,
809 u"ROUND_HALF_UP"_s,
810 u"ROUND_UP"_s,
811 u"ROUTINE"_s,
812 u"ROW"_s,
813 u"ROWCOUNT"_s,
814 u"ROWGUIDCOL"_s,
815 u"ROWID"_s,
816 u"ROWNUM"_s,
817 u"ROW_NUMBER"_s,
818 u"ROWS"_s,
819 u"ROWSET"_s,
820 u"RULE"_s,
821 u"RUN"_s,
822 u"RUNNING"_s,
823 u"SAMPLE"_s,
824 u"SAMPLEID"_s,
825 u"SAVE"_s,
826 u"SAVEPOINT"_s,
827 u"SCHEMA"_s,
828 u"SCHEMAS"_s,
829 u"SCOPE"_s,
830 u"SCRATCHPAD"_s,
831 u"SCROLL"_s,
832 u"SEARCH"_s,
833 u"SECOND"_s,
834 u"SECOND_MICROSECOND"_s,
835 u"SECONDS"_s,
836 u"SECQTY"_s,
837 u"SECTION"_s,
838 u"SECURITY"_s,
839 u"SECURITYAUDIT"_s,
840 u"SEEK"_s,
841 u"SEL"_s,
842 u"SELECT"_s,
843 u"SEMANTICKEYPHRASETABLE"_s,
844 u"SEMANTICSIMILARITYDETAILSTABLE"_s,
845 u"SEMANTICSIMILARITYTABLE"_s,
846 u"SENSITIVE"_s,
847 u"SEPARATOR"_s,
848 u"SEQUENCE"_s,
849 u"SESSION"_s,
850 u"SESSION_USER"_s,
851 u"SET"_s,
852 u"SETRESRATE"_s,
853 u"SETS"_s,
854 u"SETSESSRATE"_s,
855 u"SETUSER"_s,
856 u"SHARE"_s,
857 u"SHOW"_s,
858 u"SHUTDOWN"_s,
859 u"SIGNAL"_s,
860 u"SIMILAR"_s,
861 u"SIMPLE"_s,
862 u"SIN"_s,
863 u"SINH"_s,
864 u"SIZE"_s,
865 u"SKEW"_s,
866 u"SKIP"_s,
867 u"SMALLINT"_s,
868 u"SOME"_s,
869 u"SOUNDEX"_s,
870 u"SOURCE"_s,
871 u"SPACE"_s,
872 u"SPATIAL"_s,
873 u"SPECIFIC"_s,
874 u"SPECIFICTYPE"_s,
875 u"SPOOL"_s,
876 u"SQL"_s,
877 u"SQL_BIG_RESULT"_s,
878 u"SQL_CALC_FOUND_ROWS"_s,
879 u"SQLEXCEPTION"_s,
880 u"SQL_SMALL_RESULT"_s,
881 u"SQLSTATE"_s,
882 u"SQLTEXT"_s,
883 u"SQLWARNING"_s,
884 u"SQRT"_s,
885 u"SS"_s,
886 u"SSL"_s,
887 u"STANDARD"_s,
888 u"START"_s,
889 u"STARTING"_s,
890 u"STARTUP"_s,
891 u"STATE"_s,
892 u"STATEMENT"_s,
893 u"STATIC"_s,
894 u"STATISTICS"_s,
895 u"STAY"_s,
896 u"STDDEV_POP"_s,
897 u"STDDEV_SAMP"_s,
898 u"STEPINFO"_s,
899 u"STOGROUP"_s,
900 u"STORED"_s,
901 u"STORES"_s,
902 u"STRAIGHT_JOIN"_s,
903 u"STRING_CS"_s,
904 u"STRUCTURE"_s,
905 u"STYLE"_s,
906 u"SUBMULTISET"_s,
907 u"SUBSCRIBER"_s,
908 u"SUBSET"_s,
909 u"SUBSTR"_s,
910 u"SUBSTRING"_s,
911 u"SUBSTRING_REGEX"_s,
912 u"SUCCEEDS"_s,
913 u"SUCCESSFUL"_s,
914 u"SUM"_s,
915 u"SUMMARY"_s,
916 u"SUSPEND"_s,
917 u"SYMMETRIC"_s,
918 u"SYNONYM"_s,
919 u"SYSDATE"_s,
920 u"SYSTEM"_s,
921 u"SYSTEM_TIME"_s,
922 u"SYSTEM_USER"_s,
923 u"SYSTIMESTAMP"_s,
924 u"TABLE"_s,
925 u"TABLESAMPLE"_s,
926 u"TABLESPACE"_s,
927 u"TAN"_s,
928 u"TANH"_s,
929 u"TBL_CS"_s,
930 u"TEMPORARY"_s,
931 u"TERMINATE"_s,
932 u"TERMINATED"_s,
933 u"TEXTSIZE"_s,
934 u"THAN"_s,
935 u"THEN"_s,
936 u"THRESHOLD"_s,
937 u"TIME"_s,
938 u"TIMESTAMP"_s,
939 u"TIMEZONE_HOUR"_s,
940 u"TIMEZONE_MINUTE"_s,
941 u"TINYBLOB"_s,
942 u"TINYINT"_s,
943 u"TINYTEXT"_s,
944 u"TITLE"_s,
945 u"TO"_s,
946 u"TOP"_s,
947 u"TRACE"_s,
948 u"TRAILING"_s,
949 u"TRAN"_s,
950 u"TRANSACTION"_s,
951 u"TRANSLATE"_s,
952 u"TRANSLATE_CHK"_s,
953 u"TRANSLATE_REGEX"_s,
954 u"TRANSLATION"_s,
955 u"TREAT"_s,
956 u"TRIGGER"_s,
957 u"TRIM"_s,
958 u"TRIM_ARRAY"_s,
959 u"TRUE"_s,
960 u"TRUNCATE"_s,
961 u"TRY_CONVERT"_s,
962 u"TSEQUAL"_s,
963 u"TYPE"_s,
964 u"UC"_s,
965 u"UESCAPE"_s,
966 u"UID"_s,
967 u"UNDEFINED"_s,
968 u"UNDER"_s,
969 u"UNDO"_s,
970 u"UNION"_s,
971 u"UNIQUE"_s,
972 u"UNKNOWN"_s,
973 u"UNLOCK"_s,
974 u"UNNEST"_s,
975 u"UNPIVOT"_s,
976 u"UNSIGNED"_s,
977 u"UNTIL"_s,
978 u"UPD"_s,
979 u"UPDATE"_s,
980 u"UPDATETEXT"_s,
981 u"UPPER"_s,
982 u"UPPERCASE"_s,
983 u"USAGE"_s,
984 u"USE"_s,
985 u"USER"_s,
986 u"USING"_s,
987 u"UTC_DATE"_s,
988 u"UTC_TIME"_s,
989 u"UTC_TIMESTAMP"_s,
990 u"VALIDATE"_s,
991 u"VALIDPROC"_s,
992 u"VALUE"_s,
993 u"VALUE_OF"_s,
994 u"VALUES"_s,
995 u"VARBINARY"_s,
996 u"VARBYTE"_s,
997 u"VARCHAR"_s,
998 u"VARCHAR2"_s,
999 u"VARCHARACTER"_s,
1000 u"VARGRAPHIC"_s,
1001 u"VARIABLE"_s,
1002 u"VARIADIC"_s,
1003 u"VARIANT"_s,
1004 u"VAR_POP"_s,
1005 u"VAR_SAMP"_s,
1006 u"VARYING"_s,
1007 u"VCAT"_s,
1008 u"VERBOSE"_s,
1009 u"VERSIONING"_s,
1010 u"VIEW"_s,
1011 u"VIRTUAL"_s,
1012 u"VOLATILE"_s,
1013 u"VOLUMES"_s,
1014 u"WAIT"_s,
1015 u"WAITFOR"_s,
1016 u"WHEN"_s,
1017 u"WHENEVER"_s,
1018 u"WHERE"_s,
1019 u"WHILE"_s,
1020 u"WIDTH_BUCKET"_s,
1021 u"WINDOW"_s,
1022 u"WITH"_s,
1023 u"WITHIN"_s,
1024 u"WITHIN_GROUP"_s,
1025 u"WITHOUT"_s,
1026 u"WLM"_s,
1027 u"WORK"_s,
1028 u"WRITE"_s,
1029 u"WRITETEXT"_s,
1030 u"XMLCAST"_s,
1031 u"XMLEXISTS"_s,
1032 u"XMLNAMESPACES"_s,
1033 u"XOR"_s,
1034 u"YEAR"_s,
1035 u"YEAR_MONTH"_s,
1036 u"YEARS"_s,
1037 u"ZEROFILL"_s,
1038 u"ZEROIFNULL"_s,
1039 u"ZONE"_s,
1040 } }
1041 };
1042}
1043
1048
1050{
1051 return u"pk"_s;
1052}
1053
1055{
1056 return u"geom"_s;
1057}
1058
1060{
1061 return {};
1062}
1063
1065{
1066 return {};
1067}
1068
1070{
1071 return {};
1072}
1073
1078
1080{
1081 return {};
1082}
1083
1088
1090 const QString &schema, const QString &name, const QgsFields &fields, Qgis::WkbType wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, const QMap<QString, QVariant> *options
1091) const
1092{
1093 Q_UNUSED( schema );
1094 Q_UNUSED( name );
1095 Q_UNUSED( fields );
1096 Q_UNUSED( srs );
1097 Q_UNUSED( overwrite );
1098 Q_UNUSED( options );
1099 Q_UNUSED( wkbType );
1100 throw QgsProviderConnectionException( QObject::tr( "Operation 'createVectorTable' is not supported" ) );
1101}
1102
1103void QgsAbstractDatabaseProviderConnection::renameVectorTable( const QString &, const QString &, const QString & ) const
1104{
1105 checkCapability( Capability::RenameVectorTable );
1106}
1107
1108
1114
1115void QgsAbstractDatabaseProviderConnection::renameRasterTable( const QString &, const QString &, const QString & ) const
1116{
1117 checkCapability( Capability::RenameRasterTable );
1118}
1119
1120void QgsAbstractDatabaseProviderConnection::dropVectorTable( const QString &, const QString & ) const
1121{
1122 checkCapability( Capability::DropVectorTable );
1123}
1124
1125bool QgsAbstractDatabaseProviderConnection::tableExists( const QString &schema, const QString &name ) const
1126{
1127 checkCapability( Capability::TableExists );
1128 const QList<QgsAbstractDatabaseProviderConnection::TableProperty> constTables { tables( schema ) };
1129 for ( const auto &t : constTables )
1130 {
1131 if ( t.tableName() == name )
1132 {
1133 return true;
1134 }
1135 }
1136 return false;
1137}
1138
1139
1141 const QgsMetadataSearchContext &searchContext, const QString &searchString, const QgsRectangle &geographicExtent, QgsFeedback *feedback
1142) const
1143{
1144 Q_UNUSED( feedback );
1145 Q_UNUSED( searchContext );
1146 Q_UNUSED( searchString );
1147 Q_UNUSED( geographicExtent );
1148 throw QgsNotSupportedException( QObject::tr( "Provider %1 has no %2 method" ).arg( providerKey(), u"searchLayerMetadata"_s ) );
1149}
1150
1151void QgsAbstractDatabaseProviderConnection::dropRasterTable( const QString &, const QString & ) const
1152{
1153 checkCapability( Capability::DropRasterTable );
1154}
1155
1157{
1158 checkCapability( Capability::CreateSchema );
1159}
1160
1161void QgsAbstractDatabaseProviderConnection::dropSchema( const QString &, bool ) const
1162{
1163 checkCapability( Capability::DropSchema );
1164}
1165
1166void QgsAbstractDatabaseProviderConnection::renameSchema( const QString &, const QString & ) const
1167{
1168 checkCapability( Capability::RenameSchema );
1169}
1170
1171QList<QList<QVariant>> QgsAbstractDatabaseProviderConnection::executeSql( const QString &sql, QgsFeedback *feedback ) const
1172{
1173 return execSql( sql, feedback ).rows();
1174}
1175
1176
1182
1183
1184void QgsAbstractDatabaseProviderConnection::vacuum( const QString &, const QString & ) const
1185{
1186 checkCapability( Capability::Vacuum );
1187}
1188
1193
1195{
1196 checkCapability( Capability::SqlLayers );
1197 return nullptr;
1198}
1199
1201{
1202 checkCapability( Capability::SqlLayers );
1203 return true;
1204}
1205
1206void QgsAbstractDatabaseProviderConnection::deleteSpatialIndex( const QString &, const QString &, const QString & ) const
1207{
1208 checkCapability( Capability::DeleteSpatialIndex );
1209}
1210
1211bool QgsAbstractDatabaseProviderConnection::spatialIndexExists( const QString &, const QString &, const QString & ) const
1212{
1213 checkCapability( Capability::SpatialIndexExists );
1214 return false;
1215}
1216
1217void QgsAbstractDatabaseProviderConnection::deleteField( const QString &fieldName, const QString &schema, const QString &tableName, bool ) const
1218{
1219 checkCapability( Capability::DeleteField );
1220
1221 QgsVectorLayer::LayerOptions options { false, false };
1222 options.skipCrsValidation = true;
1223 std::unique_ptr<QgsVectorLayer> vl { std::make_unique<QgsVectorLayer>( tableUri( schema, tableName ), u"temp_layer"_s, mProviderKey, options ) };
1224 if ( !vl->isValid() )
1225 {
1226 throw QgsProviderConnectionException( QObject::tr( "Could not create a vector layer for table '%1' in schema '%2'" ).arg( tableName, schema ) );
1227 }
1228 if ( vl->fields().lookupField( fieldName ) == -1 )
1229 {
1230 throw QgsProviderConnectionException( QObject::tr( "Could not find field '%1' in table '%2' in schema '%3'" ).arg( fieldName, tableName, schema ) );
1231 }
1232 if ( !vl->dataProvider()->deleteAttributes( { vl->fields().lookupField( fieldName ) } ) )
1233 {
1234 throw QgsProviderConnectionException( QObject::tr( "Unknown error deleting field '%1' in table '%2' in schema '%3'" ).arg( fieldName, tableName, schema ) );
1235 }
1236}
1237
1238void QgsAbstractDatabaseProviderConnection::addField( const QgsField &field, const QString &schema, const QString &tableName ) const
1239{
1240 checkCapability( Capability::AddField );
1241
1242 QgsVectorLayer::LayerOptions options { false, false };
1243 options.skipCrsValidation = true;
1244 auto vl = std::make_unique<QgsVectorLayer>( tableUri( schema, tableName ), u"temp_layer"_s, mProviderKey, options );
1245 if ( !vl->isValid() )
1246 {
1247 throw QgsProviderConnectionException( QObject::tr( "Could not create a vector layer for table '%1' in schema '%2'" ).arg( tableName, schema ) );
1248 }
1249 if ( vl->fields().lookupField( field.name() ) != -1 )
1250 {
1251 throw QgsProviderConnectionException( QObject::tr( "Field '%1' in table '%2' in schema '%3' already exists" ).arg( field.name(), tableName, schema ) );
1252 }
1253 if ( !vl->dataProvider()->addAttributes( { field } ) )
1254 {
1255 throw QgsProviderConnectionException( QObject::tr( "Unknown error adding field '%1' in table '%2' in schema '%3'" ).arg( field.name(), tableName, schema ) );
1256 }
1257}
1258
1259void QgsAbstractDatabaseProviderConnection::renameField( const QString &schema, const QString &tableName, const QString &name, const QString &newName ) const
1260{
1261 checkCapability( Capability::RenameField );
1262
1263 QgsVectorLayer::LayerOptions options { false, false };
1264 options.skipCrsValidation = true;
1265 auto vl = std::make_unique<QgsVectorLayer>( tableUri( schema, tableName ), u"temp_layer"_s, mProviderKey, options );
1266 if ( !vl->isValid() )
1267 {
1268 throw QgsProviderConnectionException( QObject::tr( "Could not create a vector layer for table '%1' in schema '%2'" ).arg( tableName, schema ) );
1269 }
1270 int existingIndex = vl->fields().lookupField( name );
1271 if ( existingIndex == -1 )
1272 {
1273 throw QgsProviderConnectionException( QObject::tr( "Field '%1' in table '%2' in does not exist" ).arg( name, tableName ) );
1274 }
1275 if ( vl->fields().lookupField( newName ) != -1 )
1276 {
1277 throw QgsProviderConnectionException( QObject::tr( "A field with name '%1' already exists in table '%2'" ).arg( newName, tableName ) );
1278 }
1279 if ( !vl->dataProvider()->renameAttributes( { { existingIndex, newName } } ) )
1280 {
1281 throw QgsProviderConnectionException( QObject::tr( "Unknown error renaming field '%1' in table '%2' to '%3'" ).arg( name, tableName, newName ) );
1282 }
1283}
1284
1285QList<QgsAbstractDatabaseProviderConnection::TableProperty> QgsAbstractDatabaseProviderConnection::tables( const QString &, const QgsAbstractDatabaseProviderConnection::TableFlags &, QgsFeedback * ) const
1286{
1287 checkCapability( Capability::Tables );
1288 return QList<QgsAbstractDatabaseProviderConnection::TableProperty>();
1289}
1290
1291
1293{
1294 checkCapability( Capability::Tables );
1295 const QList<QgsAbstractDatabaseProviderConnection::TableProperty> constTables { tables( schema, TableFlags(), feedback ) };
1296 for ( const auto &t : constTables )
1297 {
1298 if ( t.tableName() == name )
1299 {
1300 return t;
1301 }
1302 }
1303 throw QgsProviderConnectionException( QObject::tr( "Table '%1' was not found in schema '%2'" ).arg( name, schema ) );
1304}
1305
1306QList<QgsAbstractDatabaseProviderConnection::TableProperty> QgsAbstractDatabaseProviderConnection::tablesInt( const QString &schema, const int flags ) const
1307{
1308 return tables( schema, static_cast<QgsAbstractDatabaseProviderConnection::TableFlags>( flags ) );
1309}
1310
1311
1313{
1314 checkCapability( Capability::Schemas );
1315 return QStringList();
1316}
1317
1319{
1320 return mTableName;
1321}
1322
1324{
1325 mTableName = name;
1326}
1327
1329{
1330 // Do not add the type if it's already present
1332 for ( const auto &t : std::as_const( mGeometryColumnTypes ) )
1333 {
1334 if ( t == toAdd )
1335 {
1336 return;
1337 }
1338 }
1339 mGeometryColumnTypes.push_back( toAdd );
1340}
1341
1342QList<QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType> QgsAbstractDatabaseProviderConnection::TableProperty::geometryColumnTypes() const
1343{
1344 return mGeometryColumnTypes;
1345}
1346
1347
1348QgsFields QgsAbstractDatabaseProviderConnection::fields( const QString &schema, const QString &tableName, QgsFeedback * ) const
1349{
1350 QgsVectorLayer::LayerOptions options { false, true };
1351 options.skipCrsValidation = true;
1352 QgsVectorLayer vl { tableUri( schema, tableName ), u"temp_layer"_s, mProviderKey, options };
1353 if ( vl.isValid() )
1354 {
1355 // Note: this implementation works for providers that do not hide any "special" field (geometry or PKs)
1356 return vl.fields();
1357 }
1358 else
1359 {
1360 throw QgsProviderConnectionException( QObject::tr( "Error retrieving fields information for uri: %1" ).arg( vl.publicSource() ) );
1361 }
1362}
1363
1365{
1366 checkCapability( Capability::ListFieldDomains );
1367 return QStringList();
1368}
1369
1371{
1372 checkCapability( Capability::RetrieveFieldDomain );
1373 return nullptr;
1374}
1375
1376void QgsAbstractDatabaseProviderConnection::setFieldDomainName( const QString &, const QString &, const QString &, const QString & ) const
1377{
1378 checkCapability( Capability::SetFieldDomain );
1379}
1380
1382{
1383 checkCapability( Capability::AddFieldDomain );
1384}
1385
1390
1391void QgsAbstractDatabaseProviderConnection::deleteFieldDomain( const QString &, const QString & ) const
1392{
1394}
1395
1396void QgsAbstractDatabaseProviderConnection::setFieldAlias( const QString &, const QString &, const QString &, const QString & ) const
1397{
1399}
1400
1401void QgsAbstractDatabaseProviderConnection::setTableComment( const QString &, const QString &, const QString & ) const
1402{
1404}
1405
1406void QgsAbstractDatabaseProviderConnection::setFieldComment( const QString &, const QString &, const QString &, const QString & ) const
1407{
1409}
1410
1411QList< QgsWeakRelation > QgsAbstractDatabaseProviderConnection::relationships( const QString &, const QString & ) const
1412{
1413 checkCapability( Capability::RetrieveRelationships );
1414 return {};
1415}
1416
1421
1426
1431
1433{
1434 QString n = mTableName;
1435 if ( mGeometryColumnCount > 1 )
1436 n += '.' + mGeometryColumn;
1437 return n;
1438}
1439
1440void QgsAbstractDatabaseProviderConnection::moveTableToSchema( const QString &schema, const QString &tableName, const QString &targetSchema ) const
1441{
1442 Q_UNUSED( schema );
1443 Q_UNUSED( tableName );
1444 Q_UNUSED( targetSchema );
1445 checkCapability( Capability::MoveTableToSchema );
1446}
1447
1449{
1450 TableProperty property;
1451
1452 Q_ASSERT( index >= 0 && index < mGeometryColumnTypes.size() );
1453
1454 property.mGeometryColumnTypes << mGeometryColumnTypes[index];
1455 property.mSchema = mSchema;
1456 property.mTableName = mTableName;
1457 property.mGeometryColumn = mGeometryColumn;
1458 property.mPkColumns = mPkColumns;
1459 property.mGeometryColumnCount = mGeometryColumnCount;
1460 property.mFlags = mFlags;
1461 property.mComment = mComment;
1462 property.mInfo = mInfo;
1463 return property;
1464}
1465
1470
1472{
1473 int res = 0;
1474 for ( const TableProperty::GeometryColumnType &ct : std::as_const( mGeometryColumnTypes ) )
1475 {
1476 res = std::max( res, QgsWkbTypes::coordDimensions( ct.wkbType ) );
1477 }
1478 return res;
1479}
1480
1482{
1483 return mSchema == other.mSchema
1484 && mTableName == other.mTableName
1485 && mGeometryColumn == other.mGeometryColumn
1486 && mGeometryColumnCount == other.mGeometryColumnCount
1487 && mPkColumns == other.mPkColumns
1488 && mFlags == other.mFlags
1489 && mComment == other.mComment
1490 && mInfo == other.mInfo;
1491}
1492
1493
1494void QgsAbstractDatabaseProviderConnection::TableProperty::setGeometryColumnTypes( const QList<QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType> &columnTypes )
1495{
1496 mGeometryColumnTypes = columnTypes;
1497}
1498
1499
1501{
1502 return mGeometryColumnCount;
1503}
1504
1509
1511{
1512 return mInfo;
1513}
1514
1516{
1517 mInfo = info;
1518}
1519
1521{
1522 return mComment;
1523}
1524
1529
1534
1539
1540QList<QgsCoordinateReferenceSystem> QgsAbstractDatabaseProviderConnection::TableProperty::crsList() const
1541{
1542 QList<QgsCoordinateReferenceSystem> crss;
1543 for ( const auto &t : std::as_const( mGeometryColumnTypes ) )
1544 {
1545 crss.push_back( t.crs );
1546 }
1547 return crss;
1548}
1549
1551{
1552 return mPkColumns;
1553}
1554
1556{
1557 mPkColumns = pkColumns;
1558}
1559
1561{
1562 return mGeometryColumn;
1563}
1564
1569
1571{
1572 return mSchema;
1573}
1574
1576{
1577 mSchema = schema;
1578}
1579
1581
1583{
1584 return mColumns;
1585}
1586
1588{
1589 QList<QList<QVariant> > rows;
1590
1591 while ( mResultIterator && mResultIterator->hasNextRow() && ( !feedback || !feedback->isCanceled() ) )
1592 {
1593 const QVariantList row( mResultIterator->nextRow() );
1594 if ( row.isEmpty() )
1595 {
1596 break;
1597 }
1598 else
1599 {
1600 rows.push_back( row );
1601 }
1602 }
1603 return rows;
1604}
1605
1607{
1608 if ( !mResultIterator )
1609 {
1610 return QList<QVariant>();
1611 }
1612 return mResultIterator->nextRow();
1613}
1614
1615
1617{
1618 if ( !mResultIterator )
1619 {
1620 return 0;
1621 }
1622 return mResultIterator->fetchedRowCount();
1623}
1624
1626{
1627 if ( !mResultIterator )
1628 {
1629 return static_cast<long long>( Qgis::FeatureCountState::UnknownCount );
1630 }
1631 return mResultIterator->rowCount();
1632}
1633
1634bool QgsAbstractDatabaseProviderConnection::splitSimpleQuery( const QString &sql, QStringList &columns, QStringList &tables, QString &where )
1635{
1636 const QgsSQLStatement statement { sql };
1637 if ( statement.hasParserError() )
1638 {
1639 return false;
1640 }
1641
1642 const QgsSQLStatement::NodeSelect *nodeSelect = dynamic_cast<const QgsSQLStatement::NodeSelect *>( statement.rootNode() );
1643
1644 if ( !nodeSelect || !nodeSelect->joins().empty() || !nodeSelect->orderBy().empty() )
1645 {
1646 return false;
1647 }
1648
1649 const QList<QgsSQLStatement::NodeTableDef *> tablesList { nodeSelect->tables() };
1650
1651 if ( tablesList.empty() )
1652 {
1653 return false;
1654 }
1655
1656 for ( const QgsSQLStatement::NodeTableDef *tableDef : tablesList )
1657 {
1658 tables.append( tableDef->name() );
1659 }
1660
1661 const QList<QgsSQLStatement::NodeSelectedColumn *> columnsList { nodeSelect->columns() };
1662
1663 if ( columnsList.empty() )
1664 {
1665 return false;
1666 }
1667
1668 for ( const QgsSQLStatement::NodeSelectedColumn *colDef : columnsList )
1669 {
1670 columns.append( colDef->dump() );
1671 }
1672
1673 if ( nodeSelect->where() )
1674 {
1675 where = nodeSelect->where()->dump();
1676 }
1677
1678 return true;
1679}
1680
1681
1683{
1684 if ( !mResultIterator )
1685 {
1686 return false;
1687 }
1688 return mResultIterator->hasNextRow();
1689}
1690
1691void QgsAbstractDatabaseProviderConnection::QueryResult::appendColumn( const QString &columnName )
1692{
1693 mColumns.push_back( columnName );
1694}
1695
1696QgsAbstractDatabaseProviderConnection::QueryResult::QueryResult( std::shared_ptr<QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator> iterator )
1697 : mResultIterator( std::move( iterator ) )
1698{}
1699
1700double QgsAbstractDatabaseProviderConnection::QueryResult::queryExecutionTime() const
1701{
1702 return mQueryExecutionTime;
1703}
1704
1705void QgsAbstractDatabaseProviderConnection::QueryResult::setQueryExecutionTime( double queryExecutionTime )
1706{
1707 mQueryExecutionTime = queryExecutionTime;
1708}
1709
1710
1711QVariantList QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator::nextRow()
1712{
1713 QMutexLocker lock( &mMutex );
1714 const QVariantList row = nextRowPrivate();
1715 if ( !row.isEmpty() )
1716 {
1717 mFetchedRowCount++;
1718 }
1719 return row;
1720}
1721
1722bool QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator::hasNextRow() const
1723{
1724 QMutexLocker lock( &mMutex );
1725 return hasNextRowPrivate();
1726}
1727
1728long long QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator::fetchedRowCount()
1729{
1730 QMutexLocker lock( &mMutex );
1731 return mFetchedRowCount;
1732}
1733
1734long long QgsAbstractDatabaseProviderConnection::QueryResult::QueryResultIterator::rowCount()
1735{
1736 QMutexLocker lock( &mMutex );
1737 return rowCountPrivate();
1738}
1739
DatabaseProviderConnectionCapability2
The Capability enum represents the extended operations supported by the connection.
Definition qgis.h:5746
@ SetTableComment
Can set comments for tables via setTableComment().
Definition qgis.h:5749
@ DeleteFieldDomain
Can delete existing field domain.
Definition qgis.h:5751
@ SetFieldComment
Can set comments for fields via setFieldComment().
Definition qgis.h:5747
@ EditFieldDomain
Can edit existing field domain.
Definition qgis.h:5750
@ SetFieldAlias
Can set aliases for fields via setFieldAlias().
Definition qgis.h:5748
@ Keyword
SQL keyword.
Definition qgis.h:1135
@ Constant
SQL constant.
Definition qgis.h:1136
QFlags< RelationshipCapability > RelationshipCapabilities
Relationship capabilities.
Definition qgis.h:4587
QFlags< DatabaseProviderConnectionCapability2 > DatabaseProviderConnectionCapabilities2
Definition qgis.h:5754
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
QFlags< SqlLayerDefinitionCapability > SqlLayerDefinitionCapabilities
SQL layer definition capabilities.
Definition qgis.h:1125
virtual QString defaultGeometryColumnName() const
Returns the default name to use for a geometry column for the connection.
virtual void setFieldComment(const QString &fieldName, const QString &schema, const QString &tableName, const QString &comment) const
Sets the comment for the existing field with the specified name.
virtual QList< QgsWeakRelation > relationships(const QString &schema=QString(), const QString &tableName=QString()) const
Returns a list of relationships detected in the database.
virtual void createVectorTable(const QString &schema, const QString &name, const QgsFields &fields, Qgis::WkbType wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, const QMap< QString, QVariant > *options) const
Creates an empty table with name in the given schema (schema is ignored if not supported by the backe...
virtual QgsVectorLayer * createSqlVectorLayer(const SqlVectorLayerOptions &options) const
Creates and returns a (possibly invalid) vector layer based on a SQL statement and options.
virtual bool tableExists(const QString &schema, const QString &name) const
Checks whether a table name exists in the given schema.
QList< QgsAbstractDatabaseProviderConnection::TableProperty > tablesInt(const QString &schema=QString(), const int flags=0) const
Returns information on the tables in the given schema.
virtual void updateRelationship(const QgsWeakRelation &relationship) const
Updates an existing relationship in the database.
virtual void renameField(const QString &schema, const QString &tableName, const QString &name, const QString &newName) const
Renames an existing field.
virtual void deleteFieldDomain(const QString &name, const QString &schema) const
Deletes the field domain with the specified name from the provider.
virtual void dropSchema(const QString &name, bool force=false) const
Drops an entire schema with the specified name.
Qgis::SqlLayerDefinitionCapabilities mSqlLayerDefinitionCapabilities
virtual void addField(const QgsField &field, const QString &schema, const QString &tableName) const
Adds a field.
virtual QList< QgsAbstractDatabaseProviderConnection::TableProperty > tables(const QString &schema=QString(), const QgsAbstractDatabaseProviderConnection::TableFlags &flags=QgsAbstractDatabaseProviderConnection::TableFlags(), QgsFeedback *feedback=nullptr) const
Returns information on the tables in the given schema.
Qgis::DatabaseProviderConnectionCapabilities2 mCapabilities2
virtual void vacuum(const QString &schema, const QString &name) const
Vacuum the database table with given schema and name (schema is ignored if not supported by the backe...
virtual QList< Qgis::FieldDomainType > supportedFieldDomainTypes() const
Returns a list of field domain types which are supported by the provider.
virtual void renameVectorTable(const QString &schema, const QString &name, const QString &newName) const
Renames a vector or aspatial table with given schema (schema is ignored if not supported by the backe...
virtual void createSchema(const QString &name) const
Creates a new schema with the specified name.
virtual void deleteSpatialIndex(const QString &schema, const QString &name, const QString &geometryColumn) const
Deletes the existing spatial index for the database table with given schema, name and geometryColumn ...
virtual void dropRasterTable(const QString &schema, const QString &name) const
Drops a raster table with given schema (schema is ignored if not supported by the backend) and name.
Qgis::DatabaseProviderConnectionCapabilities2 capabilities2() const
Returns extended connection capabilities.
virtual QueryResult execSql(const QString &sql, QgsFeedback *feedback=nullptr) const
Executes raw sql and returns the (possibly empty) query results, optionally feedback can be provided.
virtual QgsProviderSqlQueryBuilder * queryBuilder() const
Returns a SQL query builder for the connection, which provides an interface for provider-specific cre...
virtual void setFieldDomainName(const QString &fieldName, const QString &schema, const QString &tableName, const QString &domainName) const
Sets the field domain name for the existing field with the specified name.
virtual void deleteField(const QString &fieldName, const QString &schema, const QString &tableName, bool force=false) const
Deletes the field with the specified name.
virtual QString tableUri(const QString &schema, const QString &name) const
Returns the URI string for the given table and schema.
QFlags< GeometryColumnCapability > GeometryColumnCapabilities
virtual void deleteRelationship(const QgsWeakRelation &relationship) const
Deletes an existing relationship in the database.
Capability
The Capability enum represents the operations supported by the connection.
@ RetrieveFieldDomain
Can retrieve field domain details from provider via fieldDomain().
@ CreateSpatialIndex
The connection can create spatial indices.
@ AddRelationship
Can add new relationships to the database via addRelationship().
@ SqlLayers
Can create vector layers from SQL SELECT queries.
@ DropVectorTable
Can DROP a vector (or aspatial) table/layer.
@ DeleteSpatialIndex
The connection can delete spatial indices for tables.
@ RetrieveRelationships
Can retrieve relationships from the database.
@ SetFieldDomain
Can set the domain for an existing field via setFieldDomainName().
@ AddFieldDomain
Can add new field domains to the database via addFieldDomain().
@ DeleteRelationship
Can delete existing relationships from the database via deleteRelationship().
@ RenameVectorTable
Can RENAME a vector (or aspatial) table/layer.
@ RenameField
Can rename existing fields via renameField().
@ MoveTableToSchema
Can move table to another schema via moveTableToAnotherSchema().
@ ExecuteSql
Can execute raw SQL queries (without returning results).
@ UpdateRelationship
Can update existing relationships in the database via updateRelationship().
@ SpatialIndexExists
The connection can determine if a spatial index exists.
@ ListFieldDomains
Can return a list of field domain names via fieldDomainNames().
@ Schemas
Can list schemas (if not set, the connection does not support schemas).
virtual void createSpatialIndex(const QString &schema, const QString &name, const QgsAbstractDatabaseProviderConnection::SpatialIndexOptions &options=QgsAbstractDatabaseProviderConnection::SpatialIndexOptions()) const
Creates a spatial index for the database table with given schema and name (schema is ignored if not s...
virtual QStringList relatedTableTypes() const
Returns a list of the related table types supported by the database format.
static bool splitSimpleQuery(const QString &sql, QStringList &columns, QStringList &tables, QString &where)
Splits a simple query in the form "SELECT column(s) FROM table(s) [WHERE ...]" into its components.
virtual GeometryColumnCapabilities geometryColumnCapabilities()
Returns connection geometry column capabilities (Z, M, SinglePart, Curves).
virtual Qgis::SqlLayerDefinitionCapabilities sqlLayerDefinitionCapabilities()
Returns SQL layer definition capabilities (Filters, GeometryColumn, PrimaryKeys).
virtual void renameRasterTable(const QString &schema, const QString &name, const QString &newName) const
Renames a raster table with given schema (schema is ignored if not supported by the backend) and name...
virtual void dropVectorTable(const QString &schema, const QString &name) const
Drops a vector (or aspatial) table with given schema (schema is ignored if not supported by the backe...
virtual QStringList fieldDomainNames() const
Returns a list of field domain names present on the provider.
virtual void setFieldAlias(const QString &fieldName, const QString &schema, const QString &tableName, const QString &alias) const
Sets the alias for the existing field with the specified name.
virtual void renameSchema(const QString &name, const QString &newName) const
Renames a schema with the specified name.
virtual void addFieldDomain(const QgsFieldDomain &domain, const QString &schema) const
Adds a new field domain to the database.
virtual QList< QList< QVariant > > executeSql(const QString &sql, QgsFeedback *feedback=nullptr) const
Executes raw sql and returns the (possibly empty) list of results in a multi-dimensional array,...
virtual bool spatialIndexExists(const QString &schema, const QString &name, const QString &geometryColumn) const
Determines whether a spatial index exists for the database table with given schema,...
virtual QgsAbstractDatabaseProviderConnection::TableProperty table(const QString &schema, const QString &table, QgsFeedback *feedback=nullptr) const
Returns information on a table in the given schema.
virtual QMultiMap< Qgis::SqlKeywordCategory, QStringList > sqlDictionary()
Returns a dictionary of SQL keywords supported by the provider.
virtual Qgis::RelationshipCapabilities supportedRelationshipCapabilities() const
Returns the relationship capabilities supported by the provider.
virtual SqlVectorLayerOptions sqlOptions(const QString &layerSource)
Returns the SQL layer options from a layerSource.
virtual QSet< QString > illegalFieldNames() const
Returns a list of field names which are considered illegal by the connection and should not be used w...
virtual QStringList schemas() const
Returns information about the existing schemas.
virtual QList< Qgis::RelationshipCardinality > supportedRelationshipCardinalities() const
Returns a list of relationship cardinalities which are supported by the provider.
virtual QString createVectorLayerExporterDestinationUri(const QgsAbstractDatabaseProviderConnection::VectorLayerExporterOptions &options, QVariantMap &providerOptions) const
Creates a URI for use with QgsVectorLayerExporter corresponding to given destination table options fo...
virtual void moveTableToSchema(const QString &sourceSchema, const QString &tableName, const QString &targetSchema) const
Move table to a different schema.
virtual QList< Qgis::RelationshipStrength > supportedRelationshipStrengths() const
Returns a list of relationship strengths which are supported by the provider.
virtual QList< QgsLayerMetadataProviderResult > searchLayerMetadata(const QgsMetadataSearchContext &searchContext, const QString &searchString=QString(), const QgsRectangle &geographicExtent=QgsRectangle(), QgsFeedback *feedback=nullptr) const
Search the stored layer metadata in the connection, optionally limiting the search to the metadata id...
virtual void addRelationship(const QgsWeakRelation &relationship) const
Adds a new field relationship to the database.
virtual void updateFieldDomain(QgsFieldDomain *domain, const QString &schema) const
Update an existing field domain in the database, the domain is identified by name.
virtual QgsFieldDomain * fieldDomain(const QString &name) const
Returns the field domain with the specified name from the provider.
QgsAbstractDatabaseProviderConnection(const QString &name)
Creates a new connection with name by reading its configuration from the settings.
virtual void setTableComment(const QString &schema, const QString &tableName, const QString &comment) const
Sets the comment for the existing table with the specified name.
virtual QString defaultPrimaryKeyColumnName() const
Returns the default name to use for a primary key column for the connection.
virtual bool validateSqlVectorLayer(const SqlVectorLayerOptions &options, QString &message) const
Validates the SQL query options to determine if it is possible to create a vector layer based on a SQ...
Capabilities capabilities() const
Returns connection capabilities.
virtual QgsFields fields(const QString &schema, const QString &table, QgsFeedback *feedback=nullptr) const
Returns the fields of a table and schema.
QVariantMap configuration() const
Returns the connection configuration parameters.
QgsAbstractProviderConnection(const QString &name)
Creates a new connection with name by reading its configuration from the settings.
QString uri() const
Returns the connection data source URI string representation.
Represents a coordinate reference system (CRS).
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:56
Base class for field domains.
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:56
QString name
Definition qgsfield.h:65
Container of fields for a vector layer.
Definition qgsfields.h:46
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
Custom exception class which is raised when an operation is not supported.
Custom exception class for provider connection related exceptions.
Provides an interface for provider-specific creation of SQL queries.
A rectangle specified with double values.
QList< QgsSQLStatement::NodeColumnSorted * > orderBy() const
Returns the list of order by columns.
QList< QgsSQLStatement::NodeSelectedColumn * > columns() const
Returns the list of columns.
QList< QgsSQLStatement::NodeJoin * > joins() const
Returns the list of joins.
QgsSQLStatement::Node * where() const
Returns the where clause.
QList< QgsSQLStatement::NodeTableDef * > tables() const
Returns the list of tables.
virtual QString dump() const =0
Abstract virtual dump method.
bool hasParserError() const
Returns true if an error occurred when parsing the input statement.
const QgsSQLStatement::Node * rootNode() const
Returns the root node of the statement.
Represents a vector layer which manages a vector based dataset.
Represent a QgsRelation with possibly unresolved layers or unmatched fields.
static Q_INVOKABLE int coordDimensions(Qgis::WkbType type)
Returns the coordinate dimension of the geometry type as an integer.
@ UnknownCount
Provider returned an unknown feature count.
Definition qgis.h:573
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
Definition qgis.h:7157
The QueryResult class represents the result of a query executed by execSql().
QList< QList< QVariant > > rows(QgsFeedback *feedback=nullptr)
Returns the result rows by calling the iterator internally and fetching all the rows,...
long long fetchedRowCount() const
Returns the number of fetched rows.
bool hasNextRow() const
Returns true if there are more rows to fetch.
QList< QVariant > nextRow() const
Returns the next result row or an empty row if there are no rows left.
long long rowCount() const
Returns the number of rows returned by a SELECT query or Qgis::FeatureCountState::UnknownCount if unk...
QStringList columns() const
Returns the column names.
The SpatialIndexOptions contains extra options relating to spatial index creation.
The SqlVectorLayerOptions stores all information required to create a SQL (query) layer.
The GeometryColumnType struct represents the combination of geometry type and CRS for the table geome...
The TableProperty class represents a database table or view.
void setTableName(const QString &name)
Sets the table name to name.
bool operator==(const QgsAbstractDatabaseProviderConnection::TableProperty &other) const
void setPrimaryKeyColumns(const QStringList &primaryKeyColumns)
Sets the primary key column names to primaryKeyColumns.
QString defaultName() const
Returns the default name for the table entry.
QList< QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType > geometryColumnTypes() const
Returns the list of geometry column types and CRSs.
void setGeometryColumn(const QString &geometryColumn)
Sets the geometry column name to geometryColumn.
TableProperty at(int index) const
Returns the table property corresponding to the geometry type at the given index.
int maxCoordinateDimensions() const
Returns the maximum coordinate dimensions of the geometries of a vector table.
int geometryColumnCount() const
Returns the number of geometry columns in the original table this entry refers to.
QList< QgsCoordinateReferenceSystem > crsList() const
Returns the list of CRSs supported by the geometry column.
QVariantMap info() const
Returns additional information about the table.
void setInfo(const QVariantMap &info)
Sets additional information about the table to info.
QStringList primaryKeyColumns() const
Returns the list of primary key column names.
void setGeometryColumnTypes(const QList< QgsAbstractDatabaseProviderConnection::TableProperty::GeometryColumnType > &geometryColumnTypes)
Sets the geometry column types to geometryColumnTypes.
QString schema() const
Returns the schema or an empty string for backends that do not support a schema.
void setGeometryColumnCount(int geometryColumnCount)
Sets the geometryColumnCount.
void addGeometryColumnType(Qgis::WkbType type, const QgsCoordinateReferenceSystem &crs)
Appends the geometry column type with the given srid to the geometry column types list.
Stores all information required to create a QgsVectorLayerExporter for the backend.
Setting options for loading vector layers.
bool skipCrsValidation
Controls whether the layer is allowed to have an invalid/unknown CRS.