Windows2003-3790/inetsrv/query/distrib/rowcache.cxx

111 lines
2.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995.
//
// File: RowCache.cxx
//
// Contents: Forward-only cache
//
// Classes: CMiniRowCache
//
// History: 05-Jun-95 KyleP Created
// 14-JAN-97 KrishnaN Undefined CI_INETSRV and related changes
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "rowcache.hxx"
//+---------------------------------------------------------------------------
//
// Member: CMiniRowCache::CMiniRowCache, public
//
// Synopsis: Initialize
//
// Arguments: [Index] -- Identifier. Not used internally.
// [pRowset] -- Rowset used to fill cache.
// [cBindings] -- Size of [pBindings].
// [pBindings] -- Default binding.
// [cbMaxLen] -- Max length of data fetched via [pBindings]
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
CMiniRowCache::CMiniRowCache( int Index,
IRowset * pRowset,
unsigned cBindings,
DBBINDING * pBindings,
unsigned cbMaxLen )
: PMiniRowCache( Index, pRowset, cBindings, pBindings, cbMaxLen )
{
Next();
END_CONSTRUCTION( CMiniRowCache );
}
//+---------------------------------------------------------------------------
//
// Member: CMiniPositionableCache::Next, public
//
// Synopsis: Moves to next row
//
// Returns: Move status
//
// History: 05-Jun-95 KyleP Created.
//
//----------------------------------------------------------------------------
PMiniRowCache::ENext CMiniRowCache::Next( int iDir /* = 1 */ )
{
// Cna only go forward here
Win4Assert( iDir > 0 );
//
// If we had a row in cache, Just advance to it. Otherwise
// fetch more rows from table.
//
_ihrow++;
if ( _ihrow >= _chrow )
{
//
// Fetch more rows from table.
//
HROW * phrow = _ahrow.GetPointer();
SCODE sc = _pRowset->GetNextRows( 0, 0, _ahrow.Count() , &_chrow, &phrow );
vqDebugOut(( DEB_ITRACE, "Fetched %d from %d\n", _chrow, _Index ));
if ( FAILED(sc) )
{
vqDebugOut(( DEB_ERROR, "CMiniRowCache: Error 0x%x from GetNextRows\n", sc ));
_chrow = 0;
THROW( CException( sc ) );
}
else if ( 0 == _chrow && sc != DB_S_ENDOFROWSET )
{
return( CMiniRowCache::NotNow );
}
_ihrow = 0;
}
if( IsAtEnd() )
{
return CMiniRowCache::EndOfRows;
}
LoadData();
return CMiniRowCache::Ok;
}