src/sql/drivers/odbc/qsql_odbc.cpp
changeset 30 5dc02b23752f
parent 19 fcece45ef507
child 33 3e2da88830cd
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    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,