equal
deleted
inserted
replaced
60 QT_BEGIN_NAMESPACE |
60 QT_BEGIN_NAMESPACE |
61 |
61 |
62 // undefine this to prevent initial check of the ODBC driver |
62 // undefine this to prevent initial check of the ODBC driver |
63 #define ODBC_CHECK_DRIVER |
63 #define ODBC_CHECK_DRIVER |
64 |
64 |
65 #if defined(Q_ODBC_VERSION_2) |
|
66 //crude hack to get non-unicode capable driver managers to work |
|
67 # undef UNICODE |
|
68 # define SQLTCHAR SQLCHAR |
|
69 # define SQL_C_TCHAR SQL_C_CHAR |
|
70 #endif |
|
71 |
|
72 // newer platform SDKs use SQLLEN instead of SQLINTEGER |
65 // newer platform SDKs use SQLLEN instead of SQLINTEGER |
73 #if defined(WIN32) && (_MSC_VER < 1300) |
66 #if defined(WIN32) && (_MSC_VER < 1300) && !defined(__MINGW64_VERSION_MAJOR) |
74 # define QSQLLEN SQLINTEGER |
67 # define QSQLLEN SQLINTEGER |
75 # define QSQLULEN SQLUINTEGER |
68 # define QSQLULEN SQLUINTEGER |
76 #else |
69 #else |
77 # define QSQLLEN SQLLEN |
70 # define QSQLLEN SQLLEN |
78 # define QSQLULEN SQLULEN |
71 # define QSQLULEN SQLULEN |
341 break; |
334 break; |
342 case SQL_TIMESTAMP: |
335 case SQL_TIMESTAMP: |
343 case SQL_TYPE_TIMESTAMP: |
336 case SQL_TYPE_TIMESTAMP: |
344 type = QVariant::DateTime; |
337 type = QVariant::DateTime; |
345 break; |
338 break; |
346 #ifndef Q_ODBC_VERSION_2 |
|
347 case SQL_WCHAR: |
339 case SQL_WCHAR: |
348 case SQL_WVARCHAR: |
340 case SQL_WVARCHAR: |
349 case SQL_WLONGVARCHAR: |
341 case SQL_WLONGVARCHAR: |
350 type = QVariant::String; |
342 type = QVariant::String; |
351 break; |
343 break; |
352 #endif |
|
353 case SQL_CHAR: |
344 case SQL_CHAR: |
354 case SQL_VARCHAR: |
345 case SQL_VARCHAR: |
355 #if (ODBCVER >= 0x0350) |
346 #if (ODBCVER >= 0x0350) |
356 case SQL_GUID: |
347 case SQL_GUID: |
357 #endif |
348 #endif |
667 return f; |
658 return f; |
668 } |
659 } |
669 |
660 |
670 static int qGetODBCVersion(const QString &connOpts) |
661 static int qGetODBCVersion(const QString &connOpts) |
671 { |
662 { |
672 #ifndef Q_ODBC_VERSION_2 |
|
673 if (connOpts.contains(QLatin1String("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3"), Qt::CaseInsensitive)) |
663 if (connOpts.contains(QLatin1String("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC3"), Qt::CaseInsensitive)) |
674 return SQL_OV_ODBC3; |
664 return SQL_OV_ODBC3; |
675 #endif |
|
676 if (connOpts.contains(QLatin1String("SQL_ATTR_ODBC_VERSION=SQL_OV_ODBC2"), Qt::CaseInsensitive)) |
|
677 return SQL_OV_ODBC2; |
|
678 #ifdef _IODBCUNIX_H |
|
679 return SQL_OV_ODBC3; |
|
680 #else |
|
681 return SQL_OV_ODBC2; |
665 return SQL_OV_ODBC2; |
682 #endif |
|
683 } |
666 } |
684 |
667 |
685 QChar QODBCDriverPrivate::quoteChar() |
668 QChar QODBCDriverPrivate::quoteChar() |
686 { |
669 { |
687 if (!isQuoteInitialized) { |
670 if (!isQuoteInitialized) { |
778 } else { |
761 } else { |
779 qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; |
762 qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; |
780 continue; |
763 continue; |
781 } |
764 } |
782 r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACE, (SQLPOINTER) v, 0); |
765 r = SQLSetConnectAttr(hDbc, SQL_ATTR_TRACE, (SQLPOINTER) v, 0); |
783 #ifndef Q_ODBC_VERSION_2 |
|
784 } else if (opt.toUpper() == QLatin1String("SQL_ATTR_CONNECTION_POOLING")) { |
766 } else if (opt.toUpper() == QLatin1String("SQL_ATTR_CONNECTION_POOLING")) { |
785 if (val == QLatin1String("SQL_CP_OFF")) |
767 if (val == QLatin1String("SQL_CP_OFF")) |
786 v = SQL_CP_OFF; |
768 v = SQL_CP_OFF; |
787 else if (val.toUpper() == QLatin1String("SQL_CP_ONE_PER_DRIVER")) |
769 else if (val.toUpper() == QLatin1String("SQL_CP_ONE_PER_DRIVER")) |
788 v = SQL_CP_ONE_PER_DRIVER; |
770 v = SQL_CP_ONE_PER_DRIVER; |
805 else { |
787 else { |
806 qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; |
788 qWarning() << "QODBCDriver::open: Unknown option value '" << val << '\''; |
807 continue; |
789 continue; |
808 } |
790 } |
809 r = SQLSetConnectAttr(hDbc, SQL_ATTR_CP_MATCH, (SQLPOINTER)v, 0); |
791 r = SQLSetConnectAttr(hDbc, SQL_ATTR_CP_MATCH, (SQLPOINTER)v, 0); |
810 #endif |
|
811 } else if (opt.toUpper() == QLatin1String("SQL_ATTR_ODBC_VERSION")) { |
792 } else if (opt.toUpper() == QLatin1String("SQL_ATTR_ODBC_VERSION")) { |
812 // Already handled in QODBCDriver::open() |
793 // Already handled in QODBCDriver::open() |
813 continue; |
794 continue; |
814 } else { |
795 } else { |
815 qWarning() << "QODBCDriver::open: Unknown connection attribute '" << opt << '\''; |
796 qWarning() << "QODBCDriver::open: Unknown connection attribute '" << opt << '\''; |
1527 (void *) val.constData(), |
1508 (void *) val.constData(), |
1528 0, |
1509 0, |
1529 *ind == SQL_NULL_DATA ? ind : NULL); |
1510 *ind == SQL_NULL_DATA ? ind : NULL); |
1530 break; |
1511 break; |
1531 case QVariant::String: |
1512 case QVariant::String: |
1532 #ifndef Q_ODBC_VERSION_2 |
|
1533 if (d->unicode) { |
1513 if (d->unicode) { |
1534 QString str = val.toString(); |
1514 QString str = val.toString(); |
1535 if (*ind != SQL_NULL_DATA) |
1515 if (*ind != SQL_NULL_DATA) |
1536 *ind = str.length() * sizeof(SQLTCHAR); |
1516 *ind = str.length() * sizeof(SQLTCHAR); |
1537 int strSize = str.length() * sizeof(SQLTCHAR); |
1517 int strSize = str.length() * sizeof(SQLTCHAR); |
1565 ind); |
1545 ind); |
1566 tmpStorage.append(strba); |
1546 tmpStorage.append(strba); |
1567 break; |
1547 break; |
1568 } |
1548 } |
1569 else |
1549 else |
1570 #endif |
|
1571 { |
1550 { |
1572 QByteArray str = val.toString().toUtf8(); |
1551 QByteArray str = val.toString().toUtf8(); |
1573 if (*ind != SQL_NULL_DATA) |
1552 if (*ind != SQL_NULL_DATA) |
1574 *ind = str.length(); |
1553 *ind = str.length(); |
1575 int strSize = str.length(); |
1554 int strSize = str.length(); |
1971 |
1950 |
1972 // checks whether the server can return char, varchar and longvarchar |
1951 // checks whether the server can return char, varchar and longvarchar |
1973 // as two byte unicode characters |
1952 // as two byte unicode characters |
1974 void QODBCDriverPrivate::checkUnicode() |
1953 void QODBCDriverPrivate::checkUnicode() |
1975 { |
1954 { |
1976 #if defined(Q_ODBC_VERSION_2) |
|
1977 unicode = false; |
|
1978 return; |
|
1979 #endif |
|
1980 |
|
1981 SQLRETURN r; |
1955 SQLRETURN r; |
1982 SQLUINTEGER fFunc; |
1956 SQLUINTEGER fFunc; |
1983 |
1957 |
1984 unicode = false; |
1958 unicode = false; |
1985 r = SQLGetInfo(hDbc, |
1959 r = SQLGetInfo(hDbc, |