Skip to content

Commit e5815c0

Browse files
Fix for ODBC-87. 64 bit driver crashes accessing Excel 64bit 2010
1 parent 488ff12 commit e5815c0

File tree

10 files changed

+43
-43
lines changed

10 files changed

+43
-43
lines changed

IscDbc/Connection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ class ResultSet
670670

671671
virtual void setPosRowInSet(int posRow) = 0;
672672
virtual int getPosRowInSet() = 0;
673-
virtual int* getSqlDataOffsetPtr() = 0;
673+
virtual size_t* getSqlDataOffsetPtr() = 0;
674674
virtual bool readStaticCursor() = 0;
675675
virtual bool nextFetch() = 0;
676676
virtual bool setCurrentRowInBufferStaticCursor(int nRow) = 0;

IscDbc/IscResultSet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ int IscResultSet::getPosRowInSet()
504504
return activePosRowInSet;
505505
}
506506

507-
int* IscResultSet::getSqlDataOffsetPtr()
507+
size_t* IscResultSet::getSqlDataOffsetPtr()
508508
{
509509
return &sqldataOffsetPtr;
510510
}

IscDbc/IscResultSet.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class IscResultSet : public ResultSet, public IscStatementMetaData
172172
virtual Statement *getStatement();
173173
virtual void setPosRowInSet(int posRow);
174174
virtual int getPosRowInSet();
175-
virtual int *getSqlDataOffsetPtr();
175+
virtual size_t *getSqlDataOffsetPtr();
176176
virtual bool readStaticCursor();
177177
virtual bool readFromSystemCatalog();
178178
virtual bool nextFetch();
@@ -197,7 +197,7 @@ class IscResultSet : public ResultSet, public IscStatementMetaData
197197
LinkedList blobs;
198198
LinkedList clobs;
199199
int activePosRowInSet;
200-
int sqldataOffsetPtr;
200+
size_t sqldataOffsetPtr;
201201
enStatysActivePositionRow statysPositionRow;
202202
};
203203

IscDbc/Sqlda.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class CDataStaticCursor
168168
char * pt = listBlocks[n] + (var->sqldata - sqlvar[0].sqldata);
169169
for (int l = 0; nRow < countAllRows && l < countRowsInBlock[n]; ++l, pt += lenRow, ++nRow)
170170
{
171-
if ( pt && *(long*)pt )
171+
if ( pt && *(intptr_t*)pt )
172172
{
173173
free ( ((CAttrArray *)*(intptr_t*)pt)->arrBufData );
174174
delete (CAttrArray *)*(intptr_t*)pt;
@@ -211,7 +211,7 @@ class CDataStaticCursor
211211
{
212212
XSQLVAR * var = sqlvar + numColumnBlob[n];
213213
if ( *var->sqlind == -1 )
214-
*(long*)var->sqldata = (long)0;
214+
*(intptr_t*)var->sqldata = 0;
215215
else if ( (var->sqltype & ~1) == SQL_ARRAY )
216216
{
217217
CAttrArray * ptArr = new CAttrArray;

OdbcConvert.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ void OdbcConvert::setZeroColumn(DescRecord * to, long rowNumber)
9999
*indicatorTo = sizeof(long);
100100
}
101101

102-
void OdbcConvert::setBindOffsetPtrTo(SQLINTEGER *bindOffsetPtr, SQLINTEGER *bindOffsetPtrInd)
102+
void OdbcConvert::setBindOffsetPtrTo(SQLLEN *bindOffsetPtr, SQLLEN *bindOffsetPtrInd)
103103
{
104104
if( bindOffsetPtr )
105105
bindOffsetPtrTo = bindOffsetPtr;
@@ -112,7 +112,7 @@ void OdbcConvert::setBindOffsetPtrTo(SQLINTEGER *bindOffsetPtr, SQLINTEGER *bind
112112
bindOffsetPtrIndTo = &tempBindOffsetPtr;
113113
}
114114

115-
void OdbcConvert::setBindOffsetPtrFrom(SQLINTEGER *bindOffsetPtr, SQLINTEGER *bindOffsetPtrInd)
115+
void OdbcConvert::setBindOffsetPtrFrom(SQLLEN *bindOffsetPtr, SQLLEN *bindOffsetPtrInd)
116116
{
117117
if( bindOffsetPtr )
118118
bindOffsetPtrFrom = bindOffsetPtr;

OdbcConvert.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ class OdbcConvert
5454
{
5555
OdbcStatement *parentStmt;
5656
bool bIdentity;
57-
SQLINTEGER tempBindOffsetPtr;
58-
SQLINTEGER *bindOffsetPtrTo;
59-
SQLINTEGER *bindOffsetPtrIndTo;
60-
SQLINTEGER *bindOffsetPtrFrom;
61-
SQLINTEGER *bindOffsetPtrIndFrom;
57+
SQLLEN tempBindOffsetPtr;
58+
SQLLEN *bindOffsetPtrTo;
59+
SQLLEN *bindOffsetPtrIndTo;
60+
SQLLEN *bindOffsetPtrFrom;
61+
SQLLEN *bindOffsetPtrIndFrom;
6262

6363
public:
6464
bool statusReturnData;
@@ -78,8 +78,8 @@ class OdbcConvert
7878
OdbcConvert(OdbcStatement * parent);
7979

8080
void setZeroColumn(DescRecord * to, long rowNumber);
81-
void setBindOffsetPtrTo(SQLINTEGER *bindOffsetPtr, SQLINTEGER *bindOffsetPtrInd);
82-
void setBindOffsetPtrFrom(SQLINTEGER *bindOffsetPtr, SQLINTEGER *bindOffsetPtrInd);
81+
void setBindOffsetPtrTo(SQLLEN *bindOffsetPtr, SQLLEN *bindOffsetPtrInd);
82+
void setBindOffsetPtrFrom(SQLLEN *bindOffsetPtr, SQLLEN *bindOffsetPtrInd);
8383
ADRESS_FUNCTION getAdressFunction(DescRecord * from, DescRecord * to);
8484
inline SQLPOINTER getAdressBindDataFrom(char * pointer);
8585
inline SQLLEN *getAdressBindIndFrom(char * pointer);
@@ -88,7 +88,7 @@ class OdbcConvert
8888

8989
public:
9090
bool isIdentity(){ return bIdentity; }
91-
SQLINTEGER &getBindOffsetPtrTo() { return *bindOffsetPtrTo; }
91+
SQLLEN &getBindOffsetPtrTo() { return *bindOffsetPtrTo; }
9292
int notYetImplemented(DescRecord * from, DescRecord * to);
9393

9494
// Guid

OdbcDesc.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ OdbcDesc::OdbcDesc(OdbcDescType type, OdbcConnection *connect)
5757
headAllocType = SQL_DESC_ALLOC_AUTO;
5858
headArraySize = 1;
5959
headArrayStatusPtr = (SQLUSMALLINT*)NULL;
60-
headBindOffsetPtr = (SQLINTEGER*)NULL;
60+
headBindOffsetPtr = (SQLLEN*)NULL;
6161
headRowsProcessedPtr = (SQLULEN*)NULL;
6262
headCount = 0;
6363
headBindType = SQL_BIND_BY_COLUMN;
@@ -86,7 +86,7 @@ void OdbcDesc::setDefaultImplDesc (StatementMetaData * ptMetaDataOut, StatementM
8686
headAllocType = SQL_DESC_ALLOC_AUTO;
8787
headArraySize = 1;
8888
headArrayStatusPtr = (SQLUSMALLINT*)NULL;
89-
headBindOffsetPtr = (SQLINTEGER*)NULL;
89+
headBindOffsetPtr = (SQLLEN*)NULL;
9090
headRowsProcessedPtr = (SQLULEN*)NULL;
9191
headCount = 0;
9292

@@ -415,7 +415,7 @@ SQLRETURN OdbcDesc::sqlGetDescField(int recNumber, int fieldId, SQLPOINTER ptr,
415415
case odtApplicationParameter:
416416
case odtApplicationRow:
417417
if (ptr)
418-
*(SQLINTEGER **)ptr = headBindOffsetPtr,
418+
*(SQLLEN **)ptr = headBindOffsetPtr,
419419
size = sizeof (SQLINTEGER *);
420420
break;
421421
default:
@@ -905,7 +905,7 @@ SQLRETURN OdbcDesc::sqlSetDescField(int recNumber, int fieldId, SQLPOINTER value
905905
case odtApplication:
906906
case odtApplicationParameter:
907907
case odtApplicationRow:
908-
headBindOffsetPtr = (SQLINTEGER*)value;
908+
headBindOffsetPtr = (SQLLEN*)value;
909909
break;
910910
default:
911911
return sqlReturn (SQL_ERROR, "HY091", "Invalid descriptor field identifier");

OdbcDesc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class OdbcDesc : public OdbcObject
122122
SQLSMALLINT headAllocType;
123123
SQLUINTEGER headArraySize;
124124
SQLUSMALLINT *headArrayStatusPtr;
125-
SQLINTEGER *headBindOffsetPtr;
125+
SQLLEN *headBindOffsetPtr;
126126
SQLINTEGER headBindType;
127127
SQLSMALLINT headCount;
128128
SQLULEN *headRowsProcessedPtr;

OdbcStatement.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ void OdbcStatement::setResultSet(ResultSet * results, bool fromSystemCatalog)
538538
resultSet = results;
539539
isResultSetFromSystemCatalog = fromSystemCatalog;
540540
metaData = resultSet->getMetaData();
541-
sqldataOutOffsetPtr = (SQLINTEGER*) resultSet->getSqlDataOffsetPtr();
541+
sqldataOutOffsetPtr = (SQLLEN*) resultSet->getSqlDataOffsetPtr();
542542

543543
if ( !statement->isActive() )
544544
{
@@ -739,8 +739,8 @@ SQLRETURN OdbcStatement::fetchData()
739739
SQLUSMALLINT *statusPtr = implementationRowDescriptor->headArrayStatusPtr ? implementationRowDescriptor->headArrayStatusPtr
740740
: NULL;
741741
int nCountRow = applicationRowDescriptor->headArraySize;
742-
SQLINTEGER *&bindOffsetPtr = applicationRowDescriptor->headBindOffsetPtr;
743-
SQLINTEGER *bindOffsetPtrSave = bindOffsetPtr;
742+
SQLLEN *&bindOffsetPtr = applicationRowDescriptor->headBindOffsetPtr;
743+
SQLLEN *bindOffsetPtrSave = bindOffsetPtr;
744744

745745
try
746746
{
@@ -749,7 +749,7 @@ SQLRETURN OdbcStatement::fetchData()
749749
if ( !eof )
750750
{
751751
int rowBindType = applicationRowDescriptor->headBindType;
752-
SQLINTEGER bindOffsetPtrTmp = bindOffsetPtr ? *bindOffsetPtr : 0;
752+
SQLLEN bindOffsetPtrTmp = bindOffsetPtr ? *bindOffsetPtr : 0;
753753
bindOffsetPtr = &bindOffsetPtrTmp;
754754

755755
if ( schemaFetchData )
@@ -771,8 +771,8 @@ SQLRETURN OdbcStatement::fetchData()
771771
}
772772
else // if ( schemaExtendedFetchData )
773773
{
774-
SQLINTEGER bindOffsetPtrData = 0;
775-
SQLINTEGER bindOffsetPtrInd = 0;
774+
SQLLEN bindOffsetPtrData = 0;
775+
SQLLEN bindOffsetPtrInd = 0;
776776
convert->setBindOffsetPtrTo(&bindOffsetPtrData, &bindOffsetPtrInd);
777777
while ( nRow < nCountRow && (resultSet->*fetchNext)() )
778778
{
@@ -875,7 +875,7 @@ char *strDebOrientFetch[]=
875875

876876
SQLRETURN OdbcStatement::sqlFetchScrollCursorStatic(int orientation, int offset)
877877
{
878-
SQLINTEGER *&bindOffsetPtr = applicationRowDescriptor->headBindOffsetPtr;
878+
SQLLEN *&bindOffsetPtr = applicationRowDescriptor->headBindOffsetPtr;
879879
int rowsetSize = applicationRowDescriptor->headArraySize;
880880
bool bFetchAbsolute;
881881
SQLULEN rowCount;
@@ -1074,10 +1074,10 @@ SQLRETURN OdbcStatement::sqlFetchScrollCursorStatic(int orientation, int offset)
10741074
}
10751075
else // if ( !eof )
10761076
{
1077-
SQLINTEGER *bindOffsetPtrSave = bindOffsetPtr;
1077+
SQLLEN *bindOffsetPtrSave = bindOffsetPtr;
10781078
SQLUSMALLINT *statusPtr = implementationRowDescriptor->headArrayStatusPtr ? implementationRowDescriptor->headArrayStatusPtr
10791079
: NULL;
1080-
SQLINTEGER bindOffsetPtrTmp = bindOffsetPtr ? *bindOffsetPtr : 0;
1080+
SQLLEN bindOffsetPtrTmp = bindOffsetPtr ? *bindOffsetPtr : 0;
10811081
int rowBindType = applicationRowDescriptor->headBindType;
10821082

10831083
bindOffsetPtr = &bindOffsetPtrTmp;
@@ -1102,8 +1102,8 @@ SQLRETURN OdbcStatement::sqlFetchScrollCursorStatic(int orientation, int offset)
11021102
}
11031103
else
11041104
{
1105-
SQLINTEGER bindOffsetPtrData = 0;
1106-
SQLINTEGER bindOffsetPtrInd = 0;
1105+
SQLLEN bindOffsetPtrData = 0;
1106+
SQLLEN bindOffsetPtrInd = 0;
11071107
convert->setBindOffsetPtrTo(&bindOffsetPtrData, &bindOffsetPtrInd);
11081108
while ( nRow < rowsetSize && rowNumber < sqlDiagCursorRowCount )
11091109
{
@@ -2828,9 +2828,9 @@ SQLRETURN OdbcStatement::executeStatementParamArray()
28282828
: NULL;
28292829
int rowSize = applicationParamDescriptor->headBindType;
28302830
int nCountRow = applicationParamDescriptor->headArraySize;
2831-
SQLINTEGER *&headBindOffsetPtr = applicationParamDescriptor->headBindOffsetPtr;
2832-
SQLINTEGER *bindOffsetPtrSave = headBindOffsetPtr;
2833-
SQLINTEGER bindOffsetPtrTmp = headBindOffsetPtr ? *headBindOffsetPtr : 0;
2831+
SQLLEN *&headBindOffsetPtr = applicationParamDescriptor->headBindOffsetPtr;
2832+
SQLLEN *bindOffsetPtrSave = headBindOffsetPtr;
2833+
SQLLEN bindOffsetPtrTmp = headBindOffsetPtr ? *headBindOffsetPtr : 0;
28342834
bool arrayColumnWiseBinding = rowSize == SQL_PARAM_BIND_BY_COLUMN;
28352835

28362836
headBindOffsetPtr = &bindOffsetPtrTmp;
@@ -3008,7 +3008,7 @@ SQLRETURN OdbcStatement::sqlParamData(SQLPOINTER *ptr)
30083008
return sqlReturn (SQL_ERROR, "HY000", "General error :: OdbcStatement::sqlParamData");
30093009

30103010
DescRecord *binding = applicationParamDescriptor->getDescRecord ( parameterNeedData );
3011-
SQLINTEGER *bindOffsetPtr = applicationParamDescriptor->headBindOffsetPtr;
3011+
SQLLEN *bindOffsetPtr = applicationParamDescriptor->headBindOffsetPtr;
30123012

30133013
*(uintptr_t*)ptr = GETBOUNDADDRESS(binding);
30143014

@@ -3169,8 +3169,8 @@ inline
31693169
SQLRETURN OdbcStatement::returnDataFromExtendedFetch()
31703170
{
31713171
SQLRETURN retCode, ret = SQL_SUCCESS;
3172-
SQLINTEGER &bindOffsetPtrTo = convert->getBindOffsetPtrTo();
3173-
SQLINTEGER &currentRow = *applicationRowDescriptor->headBindOffsetPtr;
3172+
SQLLEN &bindOffsetPtrTo = convert->getBindOffsetPtrTo();
3173+
SQLLEN &currentRow = *applicationRowDescriptor->headBindOffsetPtr;
31743174
int count = listBindOut->GetCount();
31753175
convert->statusReturnData = true;
31763176

@@ -3223,7 +3223,7 @@ SQLRETURN OdbcStatement::sqlSetStmtAttr(int attribute, SQLPOINTER ptr, int lengt
32233223
break;
32243224

32253225
case SQL_ATTR_PARAM_BIND_OFFSET_PTR:// 17
3226-
applicationParamDescriptor->headBindOffsetPtr = (SQLINTEGER*)ptr;
3226+
applicationParamDescriptor->headBindOffsetPtr = (SQLLEN*)ptr;
32273227
TRACE02(SQL_ATTR_PARAM_BIND_OFFSET_PTR,(intptr_t) ptr);
32283228
break;
32293229

@@ -3259,7 +3259,7 @@ SQLRETURN OdbcStatement::sqlSetStmtAttr(int attribute, SQLPOINTER ptr, int lengt
32593259
break;
32603260

32613261
case SQL_ATTR_ROW_BIND_OFFSET_PTR: // 23
3262-
applicationRowDescriptor->headBindOffsetPtr = (SQLINTEGER*)ptr;
3262+
applicationRowDescriptor->headBindOffsetPtr = (SQLLEN*)ptr;
32633263
TRACE02(SQL_ATTR_ROW_BIND_OFFSET_PTR,(intptr_t) ptr);
32643264
break;
32653265

OdbcStatement.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,14 @@ class OdbcStatement : public OdbcObject
178178
bool schemaFetchData;
179179

180180
SQLLEN fetchRetData;
181-
SQLINTEGER *sqldataOutOffsetPtr;
181+
SQLLEN *sqldataOutOffsetPtr;
182182
SQLUINTEGER enableAutoIPD;
183183
SQLINTEGER useBookmarks;
184184
SQLINTEGER cursorSensitivity;
185185
SQLPOINTER fetchBookmarkPtr;
186186
SQLUINTEGER noscanSQL;
187-
SQLINTEGER bindOffsetColumnWiseBinding;
188-
SQLINTEGER bindOffsetIndColumnWiseBinding;
187+
SQLLEN bindOffsetColumnWiseBinding;
188+
SQLLEN bindOffsetIndColumnWiseBinding;
189189
int currency;
190190
int cursorType;
191191
int cursorScrollable;

0 commit comments

Comments
 (0)