Update of /cvsroot/myoledb/myoledb3
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17763
Modified Files:
rowset.cpp irowset.cpp rowchng.cpp
Log Message:
If there are no rows returned, don't allocate a rowset ref object
Fix other references, so nobody tries to use the NULL object
Index: irowset.cpp
===================================================================
RCS file: /cvsroot/myoledb/myoledb3/irowset.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- irowset.cpp 18 Jan 2006 09:14:37 -0000 1.3
+++ irowset.cpp 27 Jan 2006 07:54:41 -0000 1.4
@@ -290,6 +290,10 @@
if (cRows == 0)
return S_OK;
+ // If there are no rows, return DB_S_ENDOFROWSET
+ if (m_pObj->m_SlotRef == NULL)
+ return DB_S_ENDOFROWSET;
+
//Send notifications
if (bAllNotifications)
{
@@ -429,7 +433,7 @@
{
bRowFound = FALSE;
- // finding the same rows in the buffer
+ // finding the same rows in the buffer
for ( krow = 0; krow < m_pObj->m_pData->m_dwTotalRows; krow++ )
{
if (m_pObj->m_SlotRef[krow].Status == 0)
@@ -462,7 +466,7 @@
iSlot = m_pObj->GetFreeSlot();
assert (iSlot != 0xFFFFFFFF);
- prowbuff = m_pObj->GetRowBuff(m_pObj->m_SlotRef[iSlot].hRow);
+ prowbuff = m_pObj->GetRowBuff(m_pObj->m_SlotRef[iSlot].hRow);
hr = m_pObj->m_pData->GetRow(m_pObj->m_rgdwDataOffsets, (BYTE*)prowbuff);
if (hr != S_OK)
@@ -614,7 +618,7 @@
if ( rghRows[ihRow] == m_pObj->m_SlotRef[ i ].hRow )
break;
- if (i == m_pObj->m_pData->m_dwTotalRows)
+ if (i >= m_pObj->m_pData->m_dwTotalRows)
goto InvalidRow;
Index: rowchng.cpp
===================================================================
RCS file: /cvsroot/myoledb/myoledb3/rowchng.cpp,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- rowchng.cpp 20 Sep 2005 14:45:00 -0000 1.1.1.1
+++ rowchng.cpp 27 Jan 2006 07:54:41 -0000 1.2
@@ -406,7 +406,7 @@
m_pObj->m_cRows++;
m_pObj->m_ulRowRefCount++;
- PROWBUFF pRow = m_pObj->GetRowBuff(m_pObj->m_SlotRef[iSlot].hRow);
+ PROWBUFF pRow = m_pObj->GetRowBuff(m_pObj->m_SlotRef[iSlot].hRow);
//Fill out row with new data
hr = m_pObj->ApplyAccessor(hAccessor, (BYTE*)pRow, pData);
Index: rowset.cpp
===================================================================
RCS file: /cvsroot/myoledb/myoledb3/rowset.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- rowset.cpp 19 Jan 2006 09:05:31 -0000 1.4
+++ rowset.cpp 27 Jan 2006 07:54:41 -0000 1.5
@@ -193,9 +193,12 @@
m_pData = pData;
// allocate m_SlotRef object
- m_SlotRef = new SLOTREF[pData->m_dwTotalRows];
- if (m_SlotRef == NULL)
- return FALSE;
+ if (pData->m_dwTotalRows > 0)
+ {
+ m_SlotRef = new SLOTREF[pData->m_dwTotalRows];
+ if (m_SlotRef == NULL)
+ return FALSE;
+ }
// allocate utility object that manages our properties
if( m_pSession )
@@ -447,7 +450,8 @@
m_SlotRef[ i ].hRow = m_irowMin + i + 1;
m_SlotRef[ i ].NextSlot = i + 1;
}
- m_SlotRef[m_pData->m_dwTotalRows - 1].NextSlot = 0xFFFFFFFF;
+ if (m_SlotRef != NULL)
+ m_SlotRef[m_pData->m_dwTotalRows - 1].NextSlot = 0xFFFFFFFF;
m_FirstFreeSlot = 0;
return S_OK;
@@ -462,6 +466,8 @@
BOOL CRowset::IsSlotLimitReached()
{
TRACE( "CRowset::IsSlotLimitReached" );
+ if (m_SlotRef == NULL)
+ return TRUE;
return (m_FirstFreeSlot == 0xFFFFFFFF)? TRUE : FALSE;
}
@@ -476,7 +482,10 @@
TRACE( "CRowset::GetFreeSlot" );
ULONG iSlot;
- iSlot = m_FirstFreeSlot;
+ if (m_SlotRef == NULL)
+ return 0xFFFFFFFF;
+
+ iSlot = m_FirstFreeSlot;
if (iSlot != 0xFFFFFFFF)
{
m_FirstFreeSlot = m_SlotRef[iSlot].NextSlot;
@@ -500,7 +509,10 @@
// assert(m_SlotRef[ iSlot ].Status);
// assert(m_ulRowRefCount);
- m_SlotRef[ iSlot ].NextSlot = m_FirstFreeSlot;
+ if (m_SlotRef == NULL)
+ return;
+
+ m_SlotRef[ iSlot ].NextSlot = m_FirstFreeSlot;
m_FirstFreeSlot = iSlot;
// status: slot is free
m_SlotRef[iSlot].Status = 0;
|