diff options
author | Johannes Oikarinen <johannes.oikarinen@qt.io> | 2022-10-21 14:35:42 +0300 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2022-12-22 19:26:51 +0100 |
commit | cf2651ae80a34b388a6bbb41b5e62c7b352e8a80 (patch) | |
tree | 68270e208f6c1aacd70484b1929ddc4400e1256c /src/plugins/sqldrivers | |
parent | ebd94489a3eaf4c1b3f194df59dc7d53970b59ae (diff) |
Support connecting Oracle DB as system user
Adding support to different authentication modes to Oracle DB.
Adjust the connection string parsing a little bit as a drive-by.
Change-Id: I24ed70ed5085f22ba58eff70caa685579d31c96f
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Diffstat (limited to 'src/plugins/sqldrivers')
-rw-r--r-- | src/plugins/sqldrivers/oci/qsql_oci.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/plugins/sqldrivers/oci/qsql_oci.cpp b/src/plugins/sqldrivers/oci/qsql_oci.cpp index 39cd0ec68e..b8202a64cc 100644 --- a/src/plugins/sqldrivers/oci/qsql_oci.cpp +++ b/src/plugins/sqldrivers/oci/qsql_oci.cpp @@ -196,6 +196,7 @@ public: OCISession *authp = nullptr; OCITrans *trans = nullptr; OCIError *err = nullptr; + ub4 authMode = OCI_DEFAULT; bool transaction = false; int serverVersion = -1; int prefetchRows = -1; @@ -2193,17 +2194,16 @@ bool QOCIDriver::hasFeature(DriverFeature f) const static void qParseOpts(const QString &options, QOCIDriverPrivate *d) { - const QStringList opts(options.split(u';', Qt::SkipEmptyParts)); - for (int i = 0; i < opts.count(); ++i) { - const QString tmp(opts.at(i)); + const QVector<QStringView> opts(QStringView(options).split(u';', Qt::SkipEmptyParts)); + for (const auto tmp : opts) { qsizetype idx; if ((idx = tmp.indexOf(u'=')) == -1) { qWarning("QOCIDriver::parseArgs: Invalid parameter: '%s'", tmp.toLocal8Bit().constData()); continue; } - const QString opt = tmp.left(idx); - const QString val = tmp.mid(idx + 1).simplified(); + const QStringView opt = tmp.left(idx); + const QStringView val = tmp.mid(idx + 1).trimmed(); bool ok; if (opt == "OCI_ATTR_PREFETCH_ROWS"_L1) { d->prefetchRows = val.toInt(&ok); @@ -2213,9 +2213,18 @@ static void qParseOpts(const QString &options, QOCIDriverPrivate *d) d->prefetchMem = val.toInt(&ok); if (!ok) d->prefetchMem = -1; + } else if (opt == "OCI_AUTH_MODE"_L1) { + if (val == "OCI_SYSDBA"_L1) { + d->authMode = OCI_SYSDBA; + } else if (val == "OCI_SYSOPER"_L1) { + d->authMode = OCI_SYSOPER; + } else if (val != "OCI_DEFAULT"_L1) { + qWarning("QOCIDriver::parseArgs: Unsupported value for OCI_AUTH_MODE: '%s'", + val.toLocal8Bit().constData()); + } } else { - qWarning ("QOCIDriver::parseArgs: Invalid parameter: '%s'", - opt.toLocal8Bit().constData()); + qWarning("QOCIDriver::parseArgs: Invalid parameter: '%s'", + opt.toLocal8Bit().constData()); } } } @@ -2279,9 +2288,9 @@ bool QOCIDriver::open(const QString & db, if (r == OCI_SUCCESS) { if (user.isEmpty() && password.isEmpty()) - r = OCISessionBegin(d->svc, d->err, d->authp, OCI_CRED_EXT, OCI_DEFAULT); + r = OCISessionBegin(d->svc, d->err, d->authp, OCI_CRED_EXT, d->authMode); else - r = OCISessionBegin(d->svc, d->err, d->authp, OCI_CRED_RDBMS, OCI_DEFAULT); + r = OCISessionBegin(d->svc, d->err, d->authp, OCI_CRED_RDBMS, d->authMode); } if (r == OCI_SUCCESS || r == OCI_SUCCESS_WITH_INFO) r = OCIAttrSet(d->svc, OCI_HTYPE_SVCCTX, d->authp, 0, OCI_ATTR_SESSION, d->err); |