18#include <QtSql/private/qsqlresult_p.h>
19#include <QtSql/private/qsqldriver_p.h>
20#include <QtCore/private/qlocale_tools_p.h>
34#define QNUMERICOID 1700
37#define QABSTIMEOID 702
38#define QRELTIMEOID 703
41#define QTIMETZOID 1266
42#define QTIMESTAMPOID 1114
43#define QTIMESTAMPTZOID 1184
51#define QVARBITOID 1562
76#if !defined PG_VERSION_NUM || PG_VERSION_NUM-0 < 90200
98 bool fetch(
int i)
override;
104 bool isNull(
int field)
override;
111 bool exec()
override;
150 QStringLiteral(
"SELECT pg_class.relname, pg_namespace.nspname FROM pg_class "
151 "LEFT JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid) "
152 "WHERE (pg_class.relkind = '") +
type +
154 "AND (pg_class.relname !~ '^pg_') "
155 "AND (pg_namespace.nspname != 'information_schema')");
158 QString schema =
t.value(1).toString();
159 if (schema.
isEmpty() || schema ==
"public"_L1)
160 tl.append(
t.value(0).toString());
162 tl.append(
t.value(0).toString().prepend(u
'.').prepend(schema));
195#if defined PG_VERSION_NUM && PG_VERSION_NUM-0 >= 90200
210 qWarning(
"QPSQLDriver::getResult: Query results lost - "
211 "probably discarded on executing another SQL query.");
274 const char *
s = PQerrorMessage(
p->connection);
292 if (
stmtId != drv_d_func()->currentStmtId) {
294 "Query results lost - probably discarded on executing "
299 int status = PQresultStatus(
result);
301 case PGRES_TUPLES_OK:
313 case PGRES_COMMAND_OK:
336 type = QMetaType::Bool;
339 type = QMetaType::LongLong;
347 type = QMetaType::Int;
352 type = QMetaType::Double;
357 type = QMetaType::QDate;
361 type = QMetaType::QTime;
365 type = QMetaType::QDateTime;
368 type = QMetaType::QByteArray;
371 type = QMetaType::QString;
383 if (PQresultStatus(
result) != PGRES_COMMAND_OK) {
404 if (
d->preparedQueriesEnabled && !
d->preparedStmtId.isNull())
405 d->deallocatePreparedStmt();
420 while (!
d->nextResultSets.empty()) {
421 PQclear(
d->nextResultSets.front());
422 d->nextResultSets.pop();
426 d->drv_d_func()->finishQuery(
d->stmtId);
431 d->canFetchMoreRows =
false;
449 while (
ok &&
i >
at())
454 if (
i >=
d->currentSize)
472 if (
d->result && PQntuples(
d->result) > 0) {
502 return fetch(
d->currentSize - 1);
511 const int currentRow =
at();
518 if (!
d->canFetchMoreRows)
521 d->result =
d->drv_d_func()->getResult(
d->stmtId);
525 d->canFetchMoreRows =
false;
528 int status = PQresultStatus(
d->result);
534 setAt(currentRow + 1);
536 case PGRES_TUPLES_OK:
539 d->canFetchMoreRows =
false;
544 d->canFetchMoreRows =
false;
549 if (currentRow + 1 >=
d->currentSize)
551 setAt(currentRow + 1);
564 if (
d->canFetchMoreRows) {
568 d->result =
d->drv_d_func()->getResult(
d->stmtId);
570 d->canFetchMoreRows =
false;
572 if (
d->result && PQresultStatus(
d->result) == PGRES_FATAL_ERROR)
573 return d->processResults();
578 d->result =
d->drv_d_func()->getResult(
d->stmtId);
579 return d->processResults();
585 if (!
d->nextResultSets.empty()) {
586 d->result =
d->nextResultSets.front();
587 d->nextResultSets.pop();
589 return d->processResults();
595 if (
i >= PQnfields(
d->result)) {
596 qWarning(
"QPSQLResult::data: column %d out of range",
i);
600 int ptype = PQftype(
d->result,
i);
602 if (PQgetisnull(
d->result, currentRow,
i))
604 const char *
val = PQgetvalue(
d->result, currentRow,
i);
606 case QMetaType::Bool:
608 case QMetaType::QString:
610 case QMetaType::LongLong:
617 case QMetaType::Double: {
644 case QMetaType::QDate:
645#if QT_CONFIG(datestring)
650 case QMetaType::QTime:
651#if QT_CONFIG(datestring)
656 case QMetaType::QDateTime:
657#if QT_CONFIG(datestring)
663 case QMetaType::QByteArray: {
665 unsigned char *
data = PQunescapeBytea(
reinterpret_cast<const unsigned char *
>(
val), &
len);
671 qWarning(
"QPSQLResult::data: unknown data type");
680 return PQgetisnull(
d->result, currentRow, field);
692 d->stmtId =
d->drv_d_func()->sendQuery(
query);
702 d->result =
d->drv_d_func()->getResult(
d->stmtId);
705 while (
PGresult *nextResultSet =
d->drv_d_func()->getResult(
d->stmtId))
706 d->nextResultSets.push(nextResultSet);
708 return d->processResults();
714 return d->currentSize;
720 const char *tuples = PQcmdTuples(
d->result);
733 Oid
id = PQoidValue(
d->result);
734 if (
id != InvalidOid)
747 int count = PQnfields(
d->result);
751 const int tableOid = PQftable(
d->result,
i);
757 auto &tableName =
d->drv_d_func()->oidToTable[tableOid];
758 if (tableName.isEmpty()) {
761 .
arg(tableOid)) && qry.
next()) {
765 f.setTableName(tableName);
769 int ptype = PQftype(
d->result,
i);
772 int len = PQfsize(
d->result,
i);
821 f.setMetaType(
val.metaType());
843 if (!
d->preparedQueriesEnabled)
848 if (!
d->preparedStmtId.isEmpty())
849 d->deallocatePreparedStmt();
856 if (PQresultStatus(
result) != PGRES_COMMAND_OK) {
860 d->preparedStmtId.clear();
865 d->preparedStmtId = stmtId;
872 if (!
d->preparedQueriesEnabled)
884 d->stmtId =
d->drv_d_func()->sendQuery(stmt);
894 d->result =
d->drv_d_func()->getResult(
d->stmtId);
897 while (
PGresult *nextResultSet =
d->drv_d_func()->getResult(
d->stmtId))
898 d->nextResultSets.push(nextResultSet);
900 return d->processResults();
908 int status = PQresultStatus(
result);
910 return status == PGRES_COMMAND_OK;
916 int status = PQresultStatus(
result);
917 if (status != PGRES_COMMAND_OK)
929 int status = PQresultStatus(
result);
930 if (status != PGRES_COMMAND_OK)
945 int status = PQresultStatus(
result);
946 if (status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK)
1026 if (
match.hasMatch()) {
1031 int vMaj =
match.capturedView(1).toInt();
1036 if (
match.capturedView(2).isEmpty())
1038 vMin =
match.capturedView(2).toInt();
1050 int status = PQresultStatus(
result);
1051 if (status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK) {
1058#if defined(PG_MAJORVERSION)
1060#elif defined(PG_VERSION)
1067 serverVersion = clientVersion;
1069 qWarning(
"The server version of this PostgreSQL is unknown, falling back to the client version.");
1077 qWarning(
"This version of PostgreSQL is not supported and may not work.");
1080 return serverVersion;
1092 d->connection = conn;
1094 d->pro =
d->getPSQLVersion();
1095 d->detectBackslashEscape();
1105 PQfinish(
d->connection);
1182 d->connection = PQconnectdb(std::move(connectString).
toLocal8Bit().constData());
1183 if (PQstatus(
d->connection) == CONNECTION_BAD) {
1186 PQfinish(
d->connection);
1187 d->connection =
nullptr;
1191 d->pro =
d->getPSQLVersion();
1192 d->detectBackslashEscape();
1193 if (!
d->setEncodingUtf8()) {
1196 PQfinish(
d->connection);
1197 d->connection =
nullptr;
1201 d->setByteaOutput();
1220 PQfinish(
d->connection);
1221 d->connection =
nullptr;
1235 qWarning(
"QPSQLDriver::beginTransaction: Database not open");
1239 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK) {
1253 qWarning(
"QPSQLDriver::commitTransaction: Database not open");
1258 bool transaction_failed =
false;
1265 transaction_failed =
qstrcmp(PQcmdStatus(
res),
"ROLLBACK") == 0;
1268 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK || transaction_failed) {
1282 qWarning(
"QPSQLDriver::rollbackTransaction: Database not open");
1286 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK) {
1303 t.setForwardOnly(
true);
1311 "AND (relname LIKE 'pg_%') "));
1313 tl.append(
t.value(0).toString());
1325 tablename = tablename.
mid(
dot + 1);
1343 "FROM pg_attribute, pg_class "
1344 "WHERE %1 pg_class.oid IN "
1345 "(SELECT indexrelid FROM pg_index WHERE indisprimary = true AND indrelid IN "
1346 "(SELECT oid FROM pg_class WHERE relname = '%2')) "
1347 "AND pg_attribute.attrelid = pg_class.oid "
1348 "AND pg_attribute.attisdropped = false "
1349 "ORDER BY pg_attribute.attnum");
1354 "pg_namespace WHERE pg_namespace.nspname = '%1') AND").
arg(schema));
1356 i.exec(stmt.
arg(tbl));
1357 while (
i.isActive() &&
i.next()) {
1360 idx.
setName(
i.value(2).toString());
1379 :
QStringLiteral(
"pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid)");
1383 "pg_namespace WHERE pg_namespace.nspname = '%1')").arg(schema);
1385 QStringLiteral(
"SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
1386 "pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
1388 "FROM pg_class, pg_attribute "
1389 "LEFT JOIN pg_attrdef ON (pg_attrdef.adrelid = "
1390 "pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum) "
1392 "AND pg_class.relname = '%3' "
1393 "AND pg_attribute.attnum > 0 "
1394 "AND pg_attribute.attrelid = pg_class.oid "
1395 "AND pg_attribute.attisdropped = false "
1396 "ORDER BY pg_attribute.attnum").arg(adsrc, nspname, tbl);
1400 while (
query.next()) {
1409 if (!defVal.
isEmpty() && defVal.
at(0) == u
'\'') {
1412 defVal = defVal.
mid(1,
end - 1);
1415 f.setRequired(
query.value(2).toBool());
1418 f.setDefaultValue(defVal);
1419 f.setSqlType(
query.value(1).toInt());
1426template <
class FloatType>
1444 case QMetaType::QDateTime:
1445#if QT_CONFIG(datestring)
1460 case QMetaType::QTime:
1461#if QT_CONFIG(datestring)
1463 r = u
'\'' + field.
value().
toTime().toString(u
"hh:mm:ss.zzz") + u
'\'';
1470 case QMetaType::QString:
1472 if (
d->hasBackslashEscape)
1473 r.replace(u
'\\',
"\\\\"_L1);
1475 case QMetaType::Bool:
1481 case QMetaType::QByteArray: {
1484#if defined PG_VERSION_NUM && PG_VERSION_NUM-0 >= 80200
1495 case QMetaType::Float:
1500 case QMetaType::Double:
1505 case QMetaType::QUuid:
1530 return PQstatus(
d->connection) == CONNECTION_OK;
1543 qWarning(
"QPSQLDriver::subscribeToNotificationImplementation: database not open.");
1547 const bool alreadyContained =
d->seid.contains(
name);
1548 int socket = PQsocket(
d->connection);
1554 if (!alreadyContained)
1558 if (PQresultStatus(
result) != PGRES_COMMAND_OK) {
1559 if (!alreadyContained)
1560 d->seid.removeLast();
1572 qWarning(
"QPSQLDriver::subscribeToNotificationImplementation: PQsocket didn't return a valid socket to listen on");
1583 qWarning(
"QPSQLDriver::unsubscribeFromNotificationImplementation: database not open.");
1587 if (!
d->seid.contains(
name)) {
1588 qWarning(
"QPSQLDriver::unsubscribeFromNotificationImplementation: not subscribed to '%ls'.",
1595 if (PQresultStatus(
result) != PGRES_COMMAND_OK) {
1602 d->seid.removeAll(
name);
1604 if (
d->seid.isEmpty()) {
1619void QPSQLDriver::_q_handleNotification()
1622 d->pendingNotifyCheck =
false;
1623 PQconsumeInput(
d->connection);
1625 PGnotify *notify =
nullptr;
1626 while ((notify = PQnotifies(
d->connection)) !=
nullptr) {
1628 if (
d->seid.contains(
name)) {
1630#if defined PG_VERSION_NUM && PG_VERSION_NUM-0 >= 70400
1638 qWarning(
"QPSQLDriver: received notification for '%ls' which isn't subscribed to.",
qulonglong toULongLong(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an {unsigned long long} using base base, which is ten by default.
qlonglong toLongLong(bool *ok=nullptr, int base=10) const
Returns the byte array converted to a {long long} using base base, which is ten by default.
qsizetype size() const noexcept
Returns the number of bytes in this byte array.
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
QDateTime toUTC() const
Returns a copy of this datetime converted to UTC.
bool isValid() const
Returns true if this datetime represents a definite moment, otherwise false.
bool isEmpty() const noexcept
static QLocale c()
Returns a QLocale object initialized to the "C" locale.
QString toString(qlonglong i) const
Returns a localized string representation of i.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
void appendTables(QStringList &tl, QSqlQuery &t, QChar type)
void discardResults() const
PGresult * getResult(StatementId stmtId) const
void detectBackslashEscape()
PGresult * exec(const char *stmt)
void finishQuery(StatementId stmtId)
QPSQLDriver::Protocol getPSQLVersion()
StatementId generateStatementId()
StatementId sendQuery(const QString &stmt)
bool setSingleRowMode() const
void checkPendingNotifications() const
QPSQLDriver::Protocol pro
StatementId currentStmtId
QHash< int, QString > oidToTable
QVariant handle() const override
Returns the low-level database handle wrapped in a QVariant or an invalid variant if there is no hand...
bool beginTransaction() override
This function is called to begin a transaction.
QSqlIndex primaryIndex(const QString &tablename) const override
Returns the primary index for table tableName.
QSqlResult * createResult() const override
Creates an empty SQL result on the database.
QPSQLDriver(QObject *parent=nullptr)
bool commitTransaction() override
This function is called to commit a transaction.
bool unsubscribeFromNotification(const QString &name) override
This function is called to unsubscribe from event notifications from the database.
QStringList tables(QSql::TableType) const override
Returns a list of the names of the tables in the database.
bool hasFeature(DriverFeature f) const override
Returns true if the driver supports feature feature; otherwise returns false.
bool rollbackTransaction() override
This function is called to rollback a transaction.
bool isOpen() const override
Returns true if the database connection is open; otherwise returns false.
QStringList subscribedToNotifications() const override
Returns a list of the names of the event notifications that are currently subscribed to.
bool open(const QString &db, const QString &user, const QString &password, const QString &host, int port, const QString &connOpts) override
Derived classes must reimplement this pure virtual function to open a database connection on database...
QString escapeIdentifier(const QString &identifier, IdentifierType type) const override
Returns the identifier escaped according to the database rules.
Protocol protocol() const
bool subscribeToNotification(const QString &name) override
This function is called to subscribe to event notifications from the database.
QSqlRecord record(const QString &tablename) const override
Returns a QSqlRecord populated with the names of the fields in table tableName.
void close() override
Derived classes must reimplement this pure virtual function in order to close the database connection...
QString formatValue(const QSqlField &field, bool trimStrings) const override
Returns a string representation of the field value for the database.
QString fieldSerial(qsizetype i) const override
void deallocatePreparedStmt()
bool preparedQueriesEnabled
std::queue< PGresult * > nextResultSets
bool reset(const QString &query) override
Sets the result to use the SQL statement query for subsequent data retrieval.
int size() override
Returns the size of the SELECT result, or -1 if it cannot be determined or if the query is not a SELE...
QVariant lastInsertId() const override
Returns the object ID of the most recent inserted row if the database supports it.
bool nextResult() override
bool isNull(int field) override
Returns true if the field at position index in the current row is null; otherwise returns false.
QPSQLResult(const QPSQLDriver *db)
bool fetch(int i) override
Positions the result to an arbitrary (zero-based) row index.
bool fetchLast() override
Positions the result to the last record (last row) in the result.
QSqlRecord record() const override
Returns the current record if the query is active; otherwise returns an empty QSqlRecord.
bool fetchNext() override
Positions the result to the next available record (row) in the result.
QVariant data(int i) override
Returns the data for field index in the current row as a QVariant.
bool prepare(const QString &query) override
Prepares the given query for execution; the query will normally use placeholders so that it can be ex...
QVariant handle() const override
Returns the low-level database handle for this result set wrapped in a QVariant or an invalid QVarian...
int numRowsAffected() override
Returns the number of rows affected by the last query executed, or -1 if it cannot be determined or i...
bool fetchFirst() override
Positions the result to the first record (row 0) in the result.
void virtual_hook(int id, void *data) override
bool exec() override
Executes the query, returning true if successful; otherwise returns false.
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
The QSqlDriver class is an abstract base class for accessing specific SQL databases.
virtual QString formatValue(const QSqlField &field, bool trimStrings=false) const
Returns a string representation of the field value for the database.
IdentifierType
This enum contains a list of SQL identifier types.
virtual QString stripDelimiters(const QString &identifier, IdentifierType type) const
Returns the identifier with the leading and trailing delimiters removed, identifier can either be a t...
DriverFeature
This enum contains a list of features a driver might support.
NotificationSource
This enum contains a list of SQL notification sources.
virtual void setLastError(const QSqlError &e)
This function is used to set the value of the last error, error, that occurred on the database.
void notification(const QString &name, QSqlDriver::NotificationSource source, const QVariant &payload)
virtual void setOpenError(bool e)
This function sets the open error state of the database to error.
virtual void setOpen(bool o)
This function sets the open state of the database to open.
The QSqlError class provides SQL database error information.
ErrorType
This enum type describes the context in which the error occurred, e.g., a connection error,...
The QSqlField class manipulates the fields in SQL database tables and views.
QMetaType metaType() const
Returns the field's type as stored in the database.
QVariant value() const
Returns the value of the field as a QVariant.
bool isNull() const
Returns true if the field's value is NULL; otherwise returns false.
The QSqlIndex class provides functions to manipulate and describe database indexes.
void setName(const QString &name)
Sets the name of the index to name.
void append(const QSqlField &field)
Appends the field field to the list of indexed fields.
The QSqlQuery class provides a means of executing and manipulating SQL statements.
bool next()
Retrieves the next record in the result, if available, and positions the query on the retrieved recor...
QVariant value(int i) const
Returns the value of field index in the current record.
bool exec(const QString &query)
Executes the SQL in query.
The QSqlRecord class encapsulates a database record.
static bool isVariantNull(const QVariant &variant)
QSqlResultPrivate(QSqlResult *q, const QSqlDriver *drv)
The QSqlResult class provides an abstract interface for accessing data from specific SQL databases.
bool isForwardOnly() const
Returns true if you can only scroll forward through the result set; otherwise returns false.
virtual void virtual_hook(int id, void *data)
int at() const
Returns the current (zero-based) row position of the result.
virtual bool prepare(const QString &query)
Prepares the given query for execution; the query will normally use placeholders so that it can be ex...
virtual bool exec()
Executes the query, returning true if successful; otherwise returns false.
bool isSelect() const
Returns true if the current result is from a SELECT statement; otherwise returns false.
virtual void setAt(int at)
This function is provided for derived classes to set the internal (zero-based) row position to index.
virtual void setActive(bool a)
This function is provided for derived classes to set the internal active state to active.
QVariantList & boundValues(QT6_DECL_NEW_OVERLOAD)
QSql::NumericalPrecisionPolicy numericalPrecisionPolicy() const
virtual void setLastError(const QSqlError &e)
This function is provided for derived classes to set the last error to error.
const QSqlDriver * driver() const
Returns the driver associated with the result.
virtual void setForwardOnly(bool forward)
Sets forward only mode to forward.
bool isActive() const
Returns true if the result has records to be retrieved; otherwise returns false.
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QString & replace(qsizetype i, qsizetype len, QChar after)
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
void clear()
Clears the contents of the string and makes it null.
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString arg(qlonglong a, int fieldwidth=0, int base=10, QChar fillChar=u' ') const
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
QString left(qsizetype n) const
Returns a substring that contains the n leftmost characters of the string.
static QString static QString qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QByteArray toUtf8() const &
QString & prepend(QChar c)
bool isValid() const
Returns true if the time is valid; otherwise returns false.
QDateTime toDateTime() const
Returns the variant as a QDateTime if the variant has userType() \l QMetaType::QDateTime,...
double toDouble(bool *ok=nullptr) const
Returns the variant as a double if the variant has userType() \l QMetaType::Double,...
QTime toTime() const
Returns the variant as a QTime if the variant has userType() \l QMetaType::QTime, \l QMetaType::QDate...
float toFloat(bool *ok=nullptr) const
Returns the variant as a float if the variant has userType() \l QMetaType::Double,...
QString toString() const
Returns the variant as a QString if the variant has a userType() including, but not limited to:
bool toBool() const
Returns the variant as a bool if the variant has userType() Bool.
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
QByteArray toByteArray() const
Returns the variant as a QByteArray if the variant has userType() \l QMetaType::QByteArray or \l QMet...
Combined button and popup list for selecting options.
#define Q_BASIC_ATOMIC_INITIALIZER(a)
size_t qstrlen(const char *str)
Q_CORE_EXPORT int qstricmp(const char *, const char *)
Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2)
DBusConnection * connection
bool qIsNaN(qfloat16 f) noexcept
bool qIsInf(qfloat16 f) noexcept
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qInf()
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qQNaN()
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLsizei GLsizei GLchar * source
GLdouble GLdouble GLdouble GLdouble q
GLenum GLint GLint * precision
static qreal dot(const QPointF &a, const QPointF &b)
static QSqlError qMakeError(const QString &err, QSqlError::ErrorType type, const QDB2DriverPrivate *p)
void PQfreemem(T *t, int=0)
static QSqlError qMakeError(const QString &err, QSqlError::ErrorType type, const QPSQLDriverPrivate *p, PGresult *result=nullptr)
void assignSpecialPsqlFloatValue(FloatType val, QString *target)
static QPSQLDriver::Protocol qFindPSQLVersion(const QString &versionString)
static QMetaType qDecodePSQLType(int t)
void qPQfreemem(void *buffer)
static QPSQLDriver::Protocol qMakePSQLVersion(int vMaj, int vMin)
static QString qCreateParamString(const QList< QVariant > &boundValues, const QSqlDriver *driver)
QString qMakePreparedStmtId()
static const StatementId InvalidStatementId
static void qSplitTableName(QString &tablename, QString &schema)
static const int PGRES_SINGLE_TUPLE
static QString qQuote(QString s)
struct pg_result PGresult
#define Q_DECLARE_SQLDRIVER_PRIVATE(Class)
#define qUtf16Printable(string)
static char * toLocal8Bit(char *out, QStringView in, QStringConverter::State *state)
#define QStringLiteral(str)
static bool match(const uchar *found, uint foundLen, const char *target, uint targetLen)
QFileInfo info(fileName)
[8]
myObject disconnect()
[26]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent