From: David M. <ig...@us...> - 2006-01-27 07:54:49
|
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; |