[Sqlrelay-discussion] fix for ODBC2 drivers
Brought to you by:
mused
From: Игорь Д. <la...@ma...> - 2021-04-16 10:10:02
|
SQL_DESC_LENGTH, SQL_DESC_TYPE, SQL_DESC_PRECISION,SQL_DESC_BASE_TABLE_NAME attributes only for ODBC 3.0 and higher https://docs.microsoft.com/ru-ru/sql/odbc/reference/syntax/sqlcolattribute-function?view=sql-server-ver15 --- a/odbc.cpp 2020-09-16 08:04:17.000000000 +0300 +++ b/odbc.cpp 2021-04-16 00:16:09.428262800 +0300 @@ -3126,27 +3126,45 @@ charstring::length(column[i].name); // column length - erg=SQLColAttribute(stmt,i+1,SQL_DESC_LENGTH, + if (!charstring::compare(odbcconn->odbcversion,"2")) { + erg=SQLColAttribute(stmt,i+1,SQL_COLUMN_LENGTH, NULL,0,NULL, &(column[i].length)); + } else { + erg=SQLColAttribute(stmt,i+1,SQL_DESC_LENGTH, + NULL,0,NULL, + &(column[i].length)); + } if (erg!=SQL_SUCCESS && erg!=SQL_SUCCESS_WITH_INFO) { return false; } // column type - erg=SQLColAttribute(stmt,i+1,SQL_DESC_TYPE, + if (!charstring::compare(odbcconn->odbcversion,"2")) { + erg=SQLColAttribute(stmt,i+1,SQL_COLUMN_TYPE, + NULL,0,NULL, + &(column[i].type)); + } else { + erg=SQLColAttribute(stmt,i+1,SQL_DESC_TYPE, NULL,0,NULL, &(column[i].type)); + } if (erg!=SQL_SUCCESS && erg!=SQL_SUCCESS_WITH_INFO) { return false; } // column precision - erg=SQLColAttribute(stmt,i+1,SQL_DESC_PRECISION, + if (!charstring::compare(odbcconn->odbcversion,"2")) { + erg=SQLColAttribute(stmt,i+1,SQL_COLUMN_PRECISION, + NULL,0,NULL, + &(column[i].precision)); + } else { + erg=SQLColAttribute(stmt,i+1,SQL_DESC_PRECISION, NULL,0,NULL, &(column[i].precision)); + } // Some drivers (Redshift) like to return -1 // for the precision of some (TEXT/NTEXT) // columns. This wreaks havoc on the client @@ -3161,9 +3179,15 @@ } // column scale - erg=SQLColAttribute(stmt,i+1,SQL_DESC_SCALE, + if (!charstring::compare(odbcconn->odbcversion,"2")) { + erg=SQLColAttribute(stmt,i+1,SQL_COLUMN_SCALE, NULL,0,NULL, &(column[i].scale)); + } else { + erg=SQLColAttribute(stmt,i+1,SQL_DESC_SCALE, + NULL,0,NULL, + &(column[i].scale)); + } if (erg!=SQL_SUCCESS && erg!=SQL_SUCCESS_WITH_INFO) { return false; @@ -3208,12 +3232,21 @@ } // table name - erg=SQLColAttribute(stmt,i+1, + if (!charstring::compare(odbcconn->odbcversion,"2")) { + erg=SQLColAttributes(stmt,i+1, + SQL_COLUMN_TABLE_NAME, + column[i].table,4096, + (SQLSMALLINT *) + &(column[i].tablelength), + NULL); + } else { + erg=SQLColAttribute(stmt,i+1, SQL_DESC_BASE_TABLE_NAME, column[i].table,4096, (SQLSMALLINT *) &(column[i].tablelength), NULL); + } if (erg!=SQL_SUCCESS && erg!=SQL_SUCCESS_WITH_INFO) { return false; -- Игорь Драч |