Changeset View
Changeset View
Standalone View
Standalone View
src/KDbConnection.h
Show First 20 Lines • Show All 81 Lines • ▼ Show 20 Line(s) | 52 | public: | |||
---|---|---|---|---|---|
82 | bool isDatabaseUsed() const; | 82 | bool isDatabaseUsed() const; | ||
83 | 83 | | |||
84 | /*! @return generic options for a single connection. | 84 | /*! @return generic options for a single connection. | ||
85 | The options are accessible using key/value pairs. This enables extensibility | 85 | The options are accessible using key/value pairs. This enables extensibility | ||
86 | depending on driver's type and version. */ | 86 | depending on driver's type and version. */ | ||
87 | KDbConnectionOptions *options(); | 87 | KDbConnectionOptions *options(); | ||
88 | 88 | | |||
89 | /*! Reimplemented, also clears sql string. | 89 | /*! Reimplemented, also clears sql string. | ||
90 | @sa recentSQLString() */ | 90 | @sa recentSqlString() */ | ||
91 | void clearResult(); | 91 | void clearResult(); | ||
92 | 92 | | |||
93 | /*! @brief Disconnects from driver with given parameters. | 93 | /*! @brief Disconnects from driver with given parameters. | ||
94 | 94 | | |||
95 | The database (if used) is closed, and any active transactions | 95 | The database (if used) is closed, and any active transactions | ||
96 | (if supported) are rolled back, so commit these before disconnecting, | 96 | (if supported) are rolled back, so commit these before disconnecting, | ||
97 | if you'd like to save your changes. */ | 97 | if you'd like to save your changes. */ | ||
98 | bool disconnect(); | 98 | bool disconnect(); | ||
▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Line(s) | |||||
315 | transactions can be already inactive after calling this method. | 315 | transactions can be already inactive after calling this method. | ||
316 | Use KDbTransaction::active() to check that. Inactive transaction | 316 | Use KDbTransaction::active() to check that. Inactive transaction | ||
317 | handle is useless and can be safely dropped. | 317 | handle is useless and can be safely dropped. | ||
318 | */ | 318 | */ | ||
319 | QList<KDbTransaction> transactions(); | 319 | QList<KDbTransaction> transactions(); | ||
320 | 320 | | |||
321 | /*! @return true if "auto commit" option is on. | 321 | /*! @return true if "auto commit" option is on. | ||
322 | 322 | | |||
323 | When auto commit is on (the default on for any new KDbConnection object), | 323 | When auto commit is on (the default on for any new KDbConnection object), every SQL statement | ||
324 | every sql functional statement (statement that changes | 324 | that manipulates data in the database implicitly starts a new transaction. This transaction is | ||
325 | data in the database implicitly starts a new transaction. | 325 | automatically committed after successful statement execution or rolled back on error. | ||
326 | This transaction is automatically committed | | |||
327 | after successful statement execution or rolled back on error. | | |||
328 | 326 | | |||
329 | For drivers that do not support transactions (see KDbDriver::features()) | 327 | For drivers that do not support transactions (see KDbDriver::features()) | ||
330 | this method shouldn't be called because it does nothing ans always returns false. | 328 | this method shouldn't be called because it does nothing ans always returns false. | ||
331 | 329 | | |||
332 | No internal KDb object should changes this option, although auto commit's | 330 | No internal KDb object should changes this option, although auto commit's | ||
333 | behavior depends on database engine's specifics. Engines that support only single | 331 | behavior depends on database engine's specifics. Engines that support only single | ||
334 | transaction per connection (see KDbDriver::SingleTransactions), | 332 | transaction per connection (see KDbDriver::SingleTransactions), | ||
335 | use this single connection for autocommiting, so if there is already transaction | 333 | use this single connection for autocommiting, so if there is already transaction | ||
336 | started by the KDb user program (with beginTransaction()), this transaction | 334 | started by the KDb user program (with beginTransaction()), this transaction | ||
337 | is committed before any sql functional statement execution. In this situation | 335 | is committed before any statement that manipulates data. In this situation | ||
338 | default transaction is also affected (see defaultTransaction()). | 336 | default transaction is also affected (see defaultTransaction()). | ||
339 | 337 | | |||
340 | Only for drivers that support nested transactions (KDbDriver::NestedTransactions), | 338 | Only for drivers that support nested transactions (KDbDriver::NestedTransactions), | ||
341 | autocommiting works independently from previously started transaction, | 339 | autocommiting works independently from previously started transaction, | ||
342 | 340 | | |||
343 | For other drivers set this option off if you need use transaction | 341 | For other drivers set this option off if you need use transaction | ||
344 | for grouping more statements together. | 342 | for grouping more statements together. | ||
345 | 343 | | |||
▲ Show 20 Lines • Show All 214 Lines • ▼ Show 20 Line(s) | |||||
560 | Does not fetch any records. On error returns @c cancelled. | 558 | Does not fetch any records. On error returns @c cancelled. | ||
561 | Note: real executed query is: "SELECT 1 FROM (@a sql) LIMIT 1" | 559 | Note: real executed query is: "SELECT 1 FROM (@a sql) LIMIT 1" | ||
562 | if @a addLimitTo1 is true (the default). */ | 560 | if @a addLimitTo1 is true (the default). */ | ||
563 | tristate resultExists(const KDbEscapedString& sql, bool addLimitTo1 = true); | 561 | tristate resultExists(const KDbEscapedString& sql, bool addLimitTo1 = true); | ||
564 | 562 | | |||
565 | /*! @return true if there is at least one record in @a table. */ | 563 | /*! @return true if there is at least one record in @a table. */ | ||
566 | tristate isEmpty(KDbTableSchema* table); | 564 | tristate isEmpty(KDbTableSchema* table); | ||
567 | 565 | | |||
568 | virtual KDbEscapedString recentSQLString() const; | 566 | virtual KDbEscapedString recentSqlString() const; | ||
569 | 567 | | |||
570 | //PROTOTYPE: | 568 | //PROTOTYPE: | ||
571 | #define A , const QVariant& | 569 | #define A , const QVariant& | ||
572 | #define H_INS_REC(args) bool insertRecord(KDbTableSchema* tableSchema args, KDbSqlResult** result = 0) | 570 | #define H_INS_REC(args) QSharedPointer<KDbSqlResult> insertRecord(KDbTableSchema* tableSchema args) | ||
573 | #define H_INS_REC_ALL \ | 571 | #define H_INS_REC_ALL \ | ||
574 | H_INS_REC(A); \ | 572 | H_INS_REC(A); \ | ||
575 | H_INS_REC(A A); \ | 573 | H_INS_REC(A A); \ | ||
576 | H_INS_REC(A A A); \ | 574 | H_INS_REC(A A A); \ | ||
577 | H_INS_REC(A A A A); \ | 575 | H_INS_REC(A A A A); \ | ||
578 | H_INS_REC(A A A A A); \ | 576 | H_INS_REC(A A A A A); \ | ||
579 | H_INS_REC(A A A A A A); \ | 577 | H_INS_REC(A A A A A A); \ | ||
580 | H_INS_REC(A A A A A A A); \ | 578 | H_INS_REC(A A A A A A A); \ | ||
581 | H_INS_REC(A A A A A A A A) | 579 | H_INS_REC(A A A A A A A A) | ||
582 | H_INS_REC_ALL; | 580 | H_INS_REC_ALL; | ||
583 | 581 | | |||
584 | #undef H_INS_REC | 582 | #undef H_INS_REC | ||
585 | #define H_INS_REC(args) bool insertRecord(KDbFieldList* fields args, KDbSqlResult** result = 0) | 583 | #define H_INS_REC(args) QSharedPointer<KDbSqlResult> insertRecord(KDbFieldList* fields args) | ||
586 | 584 | | |||
587 | H_INS_REC_ALL; | 585 | H_INS_REC_ALL; | ||
588 | #undef H_INS_REC_ALL | 586 | #undef H_INS_REC_ALL | ||
589 | #undef H_INS_REC | 587 | #undef H_INS_REC | ||
590 | #undef A | 588 | #undef A | ||
591 | 589 | | |||
592 | bool insertRecord(KDbTableSchema* tableSchema, const QList<QVariant>& values, KDbSqlResult** result = nullptr); | 590 | QSharedPointer<KDbSqlResult> insertRecord(KDbTableSchema *tableSchema, | ||
591 | const QList<QVariant> &values); | ||||
593 | 592 | | |||
594 | bool insertRecord(KDbFieldList* fields, const QList<QVariant>& values, KDbSqlResult** result = nullptr); | 593 | QSharedPointer<KDbSqlResult> insertRecord(KDbFieldList *fields, const QList<QVariant> &values); | ||
595 | 594 | | |||
596 | /*! Creates table defined by @a tableSchema. | 595 | /*! Creates table defined by @a tableSchema. | ||
597 | Schema information is also added into kexi system tables, for later reuse. | 596 | Schema information is also added into kexi system tables, for later reuse. | ||
598 | @return true on success - @a tableSchema object is then | 597 | @return true on success - @a tableSchema object is then | ||
599 | inserted to KDbConnection structures - it is owned by KDbConnection object now, | 598 | inserted to KDbConnection structures - it is owned by KDbConnection object now, | ||
600 | so you shouldn't destroy the tableSchema object by hand | 599 | so you shouldn't destroy the tableSchema object by hand | ||
601 | (or declare it as local-scope variable). | 600 | (or declare it as local-scope variable). | ||
602 | 601 | | |||
▲ Show 20 Lines • Show All 132 Lines • ▼ Show 20 Line(s) | 653 | //! @todo (js): update any structure (e.g. query) that depend on this table! | |||
735 | tasks that require any used database. In such a case don't forget | 734 | tasks that require any used database. In such a case don't forget | ||
736 | to closeDatabase() if returned @a name is not empty. | 735 | to closeDatabase() if returned @a name is not empty. | ||
737 | 736 | | |||
738 | Note: This method has nothing to do with creating or using temporary databases | 737 | Note: This method has nothing to do with creating or using temporary databases | ||
739 | in such meaning that these database are not persistent | 738 | in such meaning that these database are not persistent | ||
740 | */ | 739 | */ | ||
741 | bool useTemporaryDatabaseIfNeeded(QString* name); | 740 | bool useTemporaryDatabaseIfNeeded(QString* name); | ||
742 | 741 | | |||
743 | /*! Executes a new native (raw, backend-specific) SQL query for statement @a sql. | 742 | /** | ||
744 | * Only use this method in cases if a non-portable raw query is required. | 743 | * Prepares execution of a new native (raw, backend-specific) SQL query. | ||
745 | * Access to results can be obtained using the returned KDbSqlResult object. | 744 | * | ||
746 | * @c nullptr is returned on failure. Use result() to obtain detailed status information. | 745 | * The query is described by a raw statement @a sql which should be is valid and properly | ||
747 | * The KDbConnection object is owner of the returned object. Before closing, the | 746 | * escaped. Access to results can be obtained using | ||
748 | * connection object deletes all its owned KDbSqlResult objects. It is also possible | 747 | * the returned KDbSqlResult object. The object is guarded with a shared pointer to facilitate | ||
749 | * and recommended that caller deletes the KDbSqlResult object as soon as the result | 748 | * transfer of ownership and memory management. A null pointer is returned if preparation of | ||
750 | * is not needed. | 749 | * the query fails. Use KDbConnection::result() immediately after calling prepareSql() to | ||
751 | * If the query is not supposed to return records (e.g. is a functional query) | 750 | * obtain detailed result information about the preparation. | ||
752 | * or the caller is not interested in the records, the returned object can be just deleted. | 751 | * | ||
753 | * In this case executeVoidSQL() can be a better choice. | 752 | * The returned object should be deleted before the database connection is closed. | ||
754 | * Using QScopedPointer<KDbSqlResult> construct may simplify memory management of the | 753 | * Connection object does not deletes the KDbSqlResult objects. It is also possible and | ||
755 | * returned object. | 754 | * recommended that caller deletes the KDbSqlResult object as soon as the result is not needed. | ||
756 | */ | 755 | * | ||
757 | KDbSqlResult* executeSQL(const KDbEscapedString& sql) Q_REQUIRED_RESULT; | 756 | * The returned object can be ignored if the query is not supposed to return records (e.g. | ||
758 | 757 | * manipulates data through INSERT, UPDATE, DELETE, ...) or the caller is not interested in the | |||
759 | /*! Executes a new native (raw, backend-specific) SQL query for statement @a sql. | 758 | * records. Thanks to the use of the shared pointer the object will be immediately deleted and | ||
760 | * This method is equivalent of executeSQL() useful for cases when the query is not | 759 | * execution will be finalized prior to that. However to execute queries that return no | ||
761 | * supposed to return records (e.g. is a functional query) or if the caller is not | 760 | * results, executeSql() is a better choice because of performance and easier reporting to | ||
762 | * interested in the records. | 761 | * results. | ||
762 | * | ||||
763 | * @note Only use this method if a non-portable raw query is required. | ||||
764 | * In other cases use prepareQuery() or executeQuery() and the KDbCursor object. | ||||
765 | */ | ||||
766 | QSharedPointer<KDbSqlResult> prepareSql(const KDbEscapedString& sql) Q_REQUIRED_RESULT; | ||||
767 | | ||||
768 | /** | ||||
769 | * Executes a new native (raw, backend-specific) SQL query | ||||
770 | * | ||||
771 | * The query is described by a raw statement @a sql which should be is valid and properly | ||||
772 | * escaped. This method is a convenience version of prepareSql() that immediately starts and | ||||
773 | * finalizes execution of a raw query in one step and provides a result. Use it for queries | ||||
774 | * that do not return records, i.e. for queries that manipulate data (INSERT, UPDATE, DELETE, | ||||
775 | * ...) or if the caller is not interested in the returned records. | ||||
776 | * | ||||
777 | * @note Only use this method if a non-portable raw query is required. | ||||
778 | * In other cases use prepareQuery() or executeQuery() and the KDbCursor object. | ||||
763 | */ | 779 | */ | ||
764 | bool executeVoidSQL(const KDbEscapedString& sql); | 780 | bool executeSql(const KDbEscapedString& sql); | ||
765 | 781 | | |||
766 | /*! Stores object (id, name, caption, description) | 782 | /*! Stores object (id, name, caption, description) | ||
767 | described by @a object on the backend. It is expected that entry on the | 783 | described by @a object on the backend. It is expected that entry on the | ||
768 | backend already exists, so it's updated. Changes to identifier attribute are not allowed. | 784 | backend already exists, so it's updated. Changes to identifier attribute are not allowed. | ||
769 | @return true on success. */ | 785 | @return true on success. */ | ||
770 | bool storeObjectData(KDbObject* object); | 786 | bool storeObjectData(KDbObject* object); | ||
771 | 787 | | |||
772 | /*! Stores new entry for object (id, name, caption, description) | 788 | /*! Stores new entry for object (id, name, caption, description) | ||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Line(s) | 860 | protected: | |||
869 | virtual bool drv_getServerVersion(KDbServerVersionInfo* version) = 0; | 885 | virtual bool drv_getServerVersion(KDbServerVersionInfo* version) = 0; | ||
870 | 886 | | |||
871 | /*! LOW LEVEL METHOD. For implementation: returns true if table | 887 | /*! LOW LEVEL METHOD. For implementation: returns true if table | ||
872 | with name @a tableName exists in the database. | 888 | with name @a tableName exists in the database. | ||
873 | @return @c false if it does not exist or @c cancelled if error occurred. | 889 | @return @c false if it does not exist or @c cancelled if error occurred. | ||
874 | The lookup is case insensitive. */ | 890 | The lookup is case insensitive. */ | ||
875 | virtual tristate drv_containsTable(const QString &tableName) = 0; | 891 | virtual tristate drv_containsTable(const QString &tableName) = 0; | ||
876 | 892 | | |||
877 | /*! Creates table using @a tableSchema information. | 893 | /** | ||
878 | @return true on success. Default implementation | 894 | * Creates table using @a tableSchema information. | ||
879 | builds a statement using createTableStatement() and calls drv_executeSQL() | 895 | * | ||
880 | Note for driver developers: reimplement this only if you want do to | 896 | * @return true on success. | ||
881 | this in other way. */ | 897 | * | ||
898 | * Default implementation builds a statement using createTableStatement() and calls | ||||
899 | * executeSql(). Note for driver developers: reimplement this only to perform creation in other | ||||
900 | * way. | ||||
901 | */ | ||||
882 | virtual bool drv_createTable(const KDbTableSchema& tableSchema); | 902 | virtual bool drv_createTable(const KDbTableSchema& tableSchema); | ||
883 | 903 | | |||
884 | /*! Alters table's described @a tableSchema name to @a newName. | 904 | /*! Alters table's described @a tableSchema name to @a newName. | ||
885 | This is the default implementation, using "ALTER TABLE <oldname> RENAME TO <newname>", | 905 | This is the default implementation, using "ALTER TABLE <oldname> RENAME TO <newname>", | ||
886 | what's supported by SQLite >= 3.2, PostgreSQL, MySQL. | 906 | what's supported by SQLite >= 3.2, PostgreSQL, MySQL. | ||
887 | Backends lacking ALTER TABLE, for example SQLite2, reimplement this with by an inefficient | 907 | Backends lacking ALTER TABLE, for example SQLite2, reimplement this with by an inefficient | ||
888 | data copying to a new table. In any case, renaming is performed at the backend. | 908 | data copying to a new table. In any case, renaming is performed at the backend. | ||
889 | It's good idea to keep the operation within a transaction. | 909 | It's good idea to keep the operation within a transaction. | ||
Show All 23 Lines | 931 | /*! Setups data for object that owns @a object (e.g. table, query) | |||
913 | corresponding to given object. */ | 933 | corresponding to given object. */ | ||
914 | bool setupObjectData(const KDbRecordData& data, KDbObject* object); | 934 | bool setupObjectData(const KDbRecordData& data, KDbObject* object); | ||
915 | 935 | | |||
916 | /*! @return a new field table schema for a table retrieved from @a data. | 936 | /*! @return a new field table schema for a table retrieved from @a data. | ||
917 | Ownership of the returned object is passed to the caller. | 937 | Ownership of the returned object is passed to the caller. | ||
918 | Used internally by tableSchema(). */ | 938 | Used internally by tableSchema(). */ | ||
919 | KDbField* setupField(const KDbRecordData& data) Q_REQUIRED_RESULT; | 939 | KDbField* setupField(const KDbRecordData& data) Q_REQUIRED_RESULT; | ||
920 | 940 | | |||
921 | /*! Executes query for a raw SQL statement @a sql with possibility of returning records. | 941 | /** | ||
922 | 942 | * Prepares query for a raw SQL statement @a sql with possibility of returning records. | |||
923 | It is useful mostly for functional (SELECT) queries. While INSERT queries do not | 943 | * | ||
924 | return records, the KDbSqlResult object offers KDbSqlResult::lastInsertRecordId(). | 944 | * It is useful mostly for SELECT queries. While INSERT queries do not return records, the | ||
925 | The @sql should be is valid and properly escaped. Only use this method if you really | 945 | * KDbSqlResult object offers KDbSqlResult::lastInsertRecordId(). The @sql should be is valid | ||
926 | need. For low-level access to the results (without cursors). The result may be not | 946 | * and properly escaped. Only use this method if you really need. For low-level access to the | ||
927 | stored (not buffered) yet. Use KDbSqlResult::fetchRecord() to fetch each record. | 947 | * results (without cursors). The result may be not stored (not buffered) yet. Use | ||
928 | @return @c nullptr if there is no proper result. Ownership of the returned object is | 948 | * KDbSqlResult::fetchRecord() to fetch each record. @return Null pointer if there is no proper | ||
929 | passed to the caller. | 949 | * result or error. Ownership of the returned object is passed to the caller. | ||
930 | @see executeSQL */ | 950 | * | ||
931 | virtual KDbSqlResult* drv_executeSQL(const KDbEscapedString& sql) Q_REQUIRED_RESULT = 0; | 951 | * @see prepareSql | ||
932 | 952 | */ | |||
933 | /*! Executes query for a raw SQL statement @a sql without returning resulting records. | 953 | virtual KDbSqlResult* drv_prepareSql(const KDbEscapedString &sql) Q_REQUIRED_RESULT = 0; | ||
piggz: why not returning a qsharedpointer here? | |||||
I used to do that initially but since this is not a user API, for performance I decided to return raw pointer here. Ownership is returned here to the caller so it's a clear situation. staniek: I used to do that initially but since this is not a user API, for performance I decided to… | |||||
934 | 954 | | |||
935 | It is useful mostly for INSERT queries but it is possible to execute SELECT queries | 955 | /** | ||
936 | when returned records can be ignored. The @sql should be is valid and properly escaped. | 956 | * Executes query for a raw SQL statement @a sql without returning resulting records. | ||
937 | Only use this method if you really need. | 957 | * | ||
938 | @see executeVoidSQL */ | 958 | * It is useful mostly for INSERT queries but it is possible to execute SELECT queries when | ||
939 | virtual bool drv_executeVoidSQL(const KDbEscapedString& sql) = 0; | 959 | * returned records can be ignored. The @sql should be is valid and properly escaped. | ||
940 | 960 | * | |||
941 | /*! Uses result of execution of raw SQL query using drv_executeSQL(). | 961 | * @note Only use this method if you really need. | ||
942 | For low-level access to the results (without cursors). | 962 | * @see executeSql | ||
943 | The result may be not stored (not buffered) yet. | 963 | */ | ||
944 | Use KDbSqlResult::fetchRecord() to fetch each record. | 964 | virtual bool drv_executeSql(const KDbEscapedString& sql) = 0; | ||
945 | @return @c nullptr if there is no proper result. | | |||
946 | Ownership of the returned object is passed to the caller. */ | | |||
947 | //virtual KDbSqlResult* drv_getSqlResult() Q_REQUIRED_RESULT = 0; | | |||
948 | 965 | | |||
949 | /*! For reimplementation: loads list of databases' names available for this connection | 966 | /*! For reimplementation: loads list of databases' names available for this connection | ||
950 | and adds these names to @a list. If your server is not able to offer such a list, | 967 | and adds these names to @a list. If your server is not able to offer such a list, | ||
951 | consider reimplementing drv_databaseExists() instead. | 968 | consider reimplementing drv_databaseExists() instead. | ||
952 | The method should return true only if there was no error on getting database names | 969 | The method should return true only if there was no error on getting database names | ||
953 | list from the server. | 970 | list from the server. | ||
954 | Default implementation puts empty list into @a list and returns true. | 971 | Default implementation puts empty list into @a list and returns true. | ||
955 | @see databaseNames */ | 972 | @see databaseNames */ | ||
▲ Show 20 Lines • Show All 228 Lines • ▼ Show 20 Line(s) | |||||
1184 | void removeMe(KDbTableSchema *ts); | 1201 | void removeMe(KDbTableSchema *ts); | ||
1185 | 1202 | | |||
1186 | /*! @internal | 1203 | /*! @internal | ||
1187 | @return true if the cursor @a cursor contains column @a column, | 1204 | @return true if the cursor @a cursor contains column @a column, | ||
1188 | else, sets appropriate error with a message and returns false. */ | 1205 | else, sets appropriate error with a message and returns false. */ | ||
1189 | bool checkIfColumnExists(KDbCursor *cursor, int column); | 1206 | bool checkIfColumnExists(KDbCursor *cursor, int column); | ||
1190 | 1207 | | |||
1191 | /*! @internal used by insertRecord() methods. */ | 1208 | /*! @internal used by insertRecord() methods. */ | ||
1192 | bool insertRecordInternal(const QString &tableSchemaName, KDbFieldList* fields, | 1209 | QSharedPointer<KDbSqlResult> insertRecordInternal(const QString &tableSchemaName, | ||
1193 | const KDbEscapedString &sql, KDbSqlResult** result); | 1210 | KDbFieldList *fields, | ||
1211 | const KDbEscapedString &sql); | ||||
1194 | 1212 | | |||
1195 | /*! @internal used by querySingleRecord() methods. | 1213 | /*! @internal used by querySingleRecord() methods. | ||
1196 | Note: "LIMIT 1" is appended to @a sql statement if @a addLimitTo1 is true (the default). */ | 1214 | Note: "LIMIT 1" is appended to @a sql statement if @a addLimitTo1 is true (the default). */ | ||
1197 | tristate querySingleRecordInternal(KDbRecordData* data, const KDbEscapedString* sql, | 1215 | tristate querySingleRecordInternal(KDbRecordData* data, const KDbEscapedString* sql, | ||
1198 | KDbQuerySchema* query, const QList<QVariant>* params, | 1216 | KDbQuerySchema* query, const QList<QVariant>* params, | ||
1199 | bool addLimitTo1 = true); | 1217 | bool addLimitTo1 = true); | ||
1200 | 1218 | | |||
1201 | /*! @internal used by querySingleString() methods. | 1219 | /*! @internal used by querySingleString() methods. | ||
▲ Show 20 Lines • Show All 85 Lines • Show Last 20 Lines |
why not returning a qsharedpointer here?