265 lines
7.4 KiB
C++
265 lines
7.4 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Copyright (C) 1994-1994, Microsoft Corporation.
|
||
|
//
|
||
|
// File: seqquery.hxx
|
||
|
//
|
||
|
// Contents: Declarations of classes which implement sequential IRowset
|
||
|
// and related OLE DB interfaces over file stores.
|
||
|
//
|
||
|
// Classes: CSeqQuery - container of table/query for a set of seq cursors
|
||
|
//
|
||
|
// History: 09 Jan 95 DwightKr Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <query.hxx>
|
||
|
#include <seqexec.hxx>
|
||
|
|
||
|
const ULONG hSequentialCursor = 0x1000;
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CSeqQuery
|
||
|
//
|
||
|
// Purpose: Encapsulates a sequential query execution context, and PID
|
||
|
// mapper for use by a row cursor.
|
||
|
//
|
||
|
// Interface: PQuery
|
||
|
//
|
||
|
// History: 09-Jan-95 DwightKr Created
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CSeqQuery : public PQuery
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//
|
||
|
// Local methods.
|
||
|
//
|
||
|
|
||
|
CSeqQuery( XQueryOptimizer & qopt,
|
||
|
XColumnSet & pcol,
|
||
|
ULONG *pCursor,
|
||
|
XInterface<CPidRemapper> & pidremap,
|
||
|
ICiCDocStore *pDocStore
|
||
|
);
|
||
|
|
||
|
virtual ~CSeqQuery() {}
|
||
|
|
||
|
ULONG AddRef(void);
|
||
|
|
||
|
ULONG Release(void);
|
||
|
|
||
|
void WorkIdToPath( WORKID wid, CFunnyPath & funnyPath );
|
||
|
|
||
|
BOOL CanDoWorkIdToPath() { return FALSE; }
|
||
|
|
||
|
//
|
||
|
// Method supporting load of deferred values.
|
||
|
//
|
||
|
|
||
|
BOOL FetchDeferredValue( WORKID wid,
|
||
|
CFullPropSpec const & ps,
|
||
|
PROPVARIANT & var );
|
||
|
|
||
|
//
|
||
|
// Methods supporting IRowset
|
||
|
//
|
||
|
void SetBindings(
|
||
|
ULONG hCursor,
|
||
|
ULONG cbRowLength,
|
||
|
CTableColumnSet& cols,
|
||
|
CPidMapper & pids
|
||
|
);
|
||
|
|
||
|
virtual SCODE GetRows(
|
||
|
ULONG hCursor,
|
||
|
const CRowSeekDescription& rSeekDesc,
|
||
|
CGetRowsParams& rFetchParams,
|
||
|
XPtr<CRowSeekDescription>& pSeekDescOut
|
||
|
);
|
||
|
|
||
|
virtual void RatioFinished(
|
||
|
ULONG hCursor,
|
||
|
DBCOUNTITEM & rulDenominator,
|
||
|
DBCOUNTITEM & rulNumerator,
|
||
|
DBCOUNTITEM & rcRows,
|
||
|
BOOL & rfNewRows
|
||
|
);
|
||
|
|
||
|
virtual void RestartPosition(
|
||
|
ULONG hCursor,
|
||
|
CI_TBL_CHAPT chapt
|
||
|
)
|
||
|
{
|
||
|
//Win4Assert( !"RestartPosition not supported for sequential cursors" );
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Methods supporting IRowsetLocate
|
||
|
//
|
||
|
virtual void Compare(
|
||
|
ULONG hCursor,
|
||
|
CI_TBL_CHAPT chapt,
|
||
|
CI_TBL_BMK bmkFirst,
|
||
|
CI_TBL_BMK bmkSecond,
|
||
|
DWORD & rdwComparison
|
||
|
)
|
||
|
{
|
||
|
Win4Assert( !"Compare not supported for sequential cursors" );
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Methods supporting IRowsetScroll
|
||
|
//
|
||
|
virtual void GetApproximatePosition(
|
||
|
ULONG hCursor,
|
||
|
CI_TBL_CHAPT chapt,
|
||
|
CI_TBL_BMK bmk,
|
||
|
DBCOUNTITEM * pulNumerator,
|
||
|
DBCOUNTITEM * pulDenominator
|
||
|
)
|
||
|
{
|
||
|
Win4Assert( !"GetApproximatePosition not supported for sequential cursors" );
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Support routines
|
||
|
//
|
||
|
unsigned FreeCursor( ULONG hCursor )
|
||
|
{
|
||
|
Win4Assert( hCursor != 0 );
|
||
|
_VerifyHandle( hCursor );
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
virtual SCODE GetNotifications(
|
||
|
CNotificationSync &rSync,
|
||
|
DBWATCHNOTIFY &changeType
|
||
|
)
|
||
|
{
|
||
|
Win4Assert( !"GetNotifications not supported for sequential cursors" );
|
||
|
return E_NOTIMPL;
|
||
|
}
|
||
|
|
||
|
virtual void SetWatchMode (
|
||
|
HWATCHREGION* phRegion,
|
||
|
ULONG mode)
|
||
|
{
|
||
|
Win4Assert( !"SetWatchMode not supported for sequential cursors" );
|
||
|
}
|
||
|
|
||
|
virtual void GetWatchInfo (
|
||
|
HWATCHREGION hRegion,
|
||
|
ULONG* pMode,
|
||
|
CI_TBL_CHAPT* pChapt,
|
||
|
CI_TBL_BMK* pBmk,
|
||
|
DBCOUNTITEM * pcRows)
|
||
|
{
|
||
|
Win4Assert( !"GetWatchInfo not supported for sequential cursors" );
|
||
|
}
|
||
|
|
||
|
virtual void ShrinkWatchRegion (
|
||
|
HWATCHREGION hRegion,
|
||
|
CI_TBL_CHAPT chapt,
|
||
|
CI_TBL_BMK bmk,
|
||
|
LONG cRows )
|
||
|
{
|
||
|
Win4Assert( !"ShrinkWatchRegion not supported for sequential cursors" );
|
||
|
}
|
||
|
|
||
|
virtual void Refresh ()
|
||
|
{
|
||
|
Win4Assert( !"Refresh not supported for sequential cursors" );
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Methods supporting IRowsetWatchAll
|
||
|
//
|
||
|
|
||
|
virtual void StartWatching(ULONG hCursor)
|
||
|
{
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
virtual void StopWatching (ULONG hCursor)
|
||
|
{
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Methods supporting IRowsetAsync
|
||
|
//
|
||
|
virtual void StopAsynch (ULONG hCursor)
|
||
|
{
|
||
|
THROW(CException( E_NOTIMPL ));
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Method supporting IRowsetQueryStatus
|
||
|
//
|
||
|
void GetQueryStatus(
|
||
|
ULONG hCursor,
|
||
|
DWORD & rdwStatus);
|
||
|
|
||
|
void GetQueryStatusEx(
|
||
|
ULONG hCursor,
|
||
|
DWORD & rdwStatus,
|
||
|
DWORD & rcFilteredDocuments,
|
||
|
DWORD & rcDocumentsToFilter,
|
||
|
DBCOUNTITEM & rdwRatioFinishedDenominator,
|
||
|
DBCOUNTITEM & rdwRatioFinishedNumerator,
|
||
|
CI_TBL_BMK bmk,
|
||
|
DBCOUNTITEM & riRowBmk,
|
||
|
DBCOUNTITEM & rcRowsTotal );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
ULONG _CreateRowCursor() { return hSequentialCursor; }
|
||
|
|
||
|
virtual void _VerifyHandle( ULONG hCursor ) const;
|
||
|
|
||
|
XInterface<CPidRemapper> _pidremap; // Must be before _QExec
|
||
|
|
||
|
XPtr<CQSeqExecute> _QExec; // The query execution context
|
||
|
|
||
|
CTableCursor _cursor; // Array of table cursors
|
||
|
|
||
|
LONG _ref; // reference count
|
||
|
|
||
|
XInterface<ICiManager> _xCiManager;
|
||
|
XInterface<ICiCDocNameToWorkidTranslator> _xNameToWidTranslator;
|
||
|
};
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CSeqQuery::_VerifyHandle, public
|
||
|
//
|
||
|
// Synopsis: Verifies the handle passed is a legal sequential cursor handle
|
||
|
//
|
||
|
// Effects: Throws E_FAIL if handle invalid.
|
||
|
//
|
||
|
// History: 19-Jan-95 DwightKr Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
inline void CSeqQuery::_VerifyHandle( ULONG hCursor ) const
|
||
|
{
|
||
|
if ( hSequentialCursor != hCursor )
|
||
|
THROW( CException(E_FAIL) );
|
||
|
}
|
||
|
|