windows-nt/Source/XPSP1/NT/inetsrv/query/apps/srch/srchq.hxx
2020-09-26 16:20:57 +08:00

243 lines
6.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: srchq.hxx
//
// Contents:
//
// History: 15 Aug 1996 DLee Created
//
//--------------------------------------------------------------------------
#pragma once
const ULONG cMaxRowCache = 100; // can't have more visible rows than this
const ULONG cwcMaxQuery = 200;
enum ESearchType { srchNormal, srchClass, srchFunction };
#define MAX_BOOKMARK_LENGTH 50 // should be big enough for 11 distributed rowsets
class CBookMark
{
public:
CBookMark () : cbBmk (0) {}
CBookMark (DBBOOKMARK bmkSpecial) : cbBmk (1)
{
abBmk[0] = (BYTE)bmkSpecial;
}
BOOL IsValid() const { return cbBmk != 0; }
void Invalidate () { cbBmk = 0; }
BOOL IsEqual ( CBookMark& bmk)
{
if (cbBmk != bmk.cbBmk)
return FALSE;
else
return memcmp ( abBmk, bmk.abBmk, cbBmk ) == 0;
}
void MakeFirst()
{
cbBmk = sizeof (BYTE);
abBmk[0] = (BYTE) DBBMK_FIRST;
}
BOOL IsFirst()
{
return cbBmk == sizeof(BYTE) && abBmk[0] == (BYTE) DBBMK_FIRST;
}
DBLENGTH cbBmk;
BYTE abBmk[MAX_BOOKMARK_LENGTH];
};
class CListView;
enum FetchResult
{
fetchOk,
fetchError,
fetchBoundary
};
inline BOOL isFetchOK( FetchResult r )
{ return ( fetchOk == r || fetchBoundary == r ); }
class CSearchQuery
{
friend class CWatchQuery;
public:
CSearchQuery( const XGrowable<WCHAR> & xCatList,
WCHAR * pwcQuery,
HWND hNotify,
int cRowsDisp,
LCID lcid,
ESearchType srchType,
IColumnMapper & columnMapper,
CColumnList & columnList,
CSortList & sort,
ULONG ulDialect,
ULONG ulLimit,
ULONG ulFirstRows );
~CSearchQuery();
void InitNotifications(HWND hwndList);
BOOL WindowResized (ULONG& cRows);
BOOL ListNotify (HWND hwnd, WPARAM action, long* pDist);
BOOL GetSelectedRowData( WCHAR *&rpwc, HROW &hrow );
void FreeSelectedRowData( HROW hrow );
BOOL GetRow( DWORD iRow, unsigned &cCols, PROPVARIANT **pProps )
{
if (iRow >= _cHRows)
return FALSE;
HROW hRow = _aHRows[iRow];
Win4Assert (hRow != 0);
SCODE sc = _xRowset->GetData( hRow, _hAccessor, pProps );
cCols = _columns.NumberOfColumns();
return SUCCEEDED( sc );
}
void ProcessNotification (HWND hwndList, DBWATCHNOTIFY changeType, IRowset* pRowset);
void ProcessNotificationComplete();
void UpdateProgress (BOOL& fMore);
DBCOUNTITEM RowCount() { return _cRowsTotal; }
DBCOUNTITEM RowCurrent () { return _iRowCurrent;}
BOOL MostlyDone() { return _fDone; }
ULONG PctDone () { return _pctDone; }
DWORD QueryStatus() { return _dwQueryStatus; }
DWORD LastError() { return _scLastError; }
void WriteResults();
BOOL Browse( enumViewFile eViewType );
void InvalidateCache ();
BOOL IsSelected (UINT iRow);
BOOL IsSelected () { return _bmkSelect.IsValid(); }
void CreateScript (DBCOUNTITEM* pcChanges, DBROWWATCHCHANGE** paScript);
inline double QueryTime()
{
if ( 0 == _dwEndTime )
return 0.0;
if ( _dwEndTime >= _dwStartTime )
return ( (double) ( _dwEndTime - _dwStartTime ) ) / 1000;
DWORD dw = ULONG_MAX - (DWORD) _dwStartTime + (DWORD) _dwEndTime;
return ( (double) dw ) / 1000.0;
}
private:
void Quiesce (BOOL fReally) { _fDone = fReally; }
void InsertRowAfter (int iRow, HROW hrow);
void DeleteRow (int iRow);
void UpdateRow (int iRow, HROW hrow);
void UpdateCount (long cTotal) { _cRowsTotal = cTotal; }
void ParseCatList( WCHAR * * aScopes, WCHAR * * aCatalogs,
WCHAR * * aMachines, DWORD * aDepths,
ULONG & cScopes );
SCODE InstantiateICommand( ICommand **ppQuery );
void Exec(WCHAR *pwcCmdLine);
long FindSelection();
BOOL SelectUp( long * piNew );
BOOL SelectDown( long * piNew );
BOOL Select ( long* piRow );
void ScrollLineUp (long* pdist);
void ScrollPageUp (long* pdist);
void ScrollLineDn (long* pdist);
void ScrollPageDn (long* pdist);
void ScrollTop (long* pdist);
void ScrollBottom (long* pdist);
void ScrollPos (long* pdist);
void SetupColumnMappingsAndAccessors();
BOOL InvokeBrowser(WCHAR *pwcPath);
BOOL FetchApprox (LONG iFirstRow,
LONG cToFetch, DBCOUNTITEM &rcFetched,
HROW *pHRows, HWATCHREGION hRegion);
FetchResult Fetch( CBookMark & bookMark, LONG iFirstRow,
LONG cToFetch, DBCOUNTITEM &rcFetched,
HROW *phRows, HWATCHREGION hRegion );
BOOL GetBookMark( HROW hRow, CBookMark & bookMark )
{
Win4Assert( 0 != _hBmkAccessor );
SCODE sc = _xRowset->GetData( hRow, _hBmkAccessor, &bookMark );
return ( SUCCEEDED( sc ) && ( DB_S_ERRORSOCCURRED != sc ) );
}
// Query
LCID _lcid;
ESearchType _srchType;
XGrowable<WCHAR, cwcMaxQuery> _xwcQuery;
DBCOMMANDTREE * _prstQuery;
//
// Columns, Rowsets and accessors
//
XInterface<IRowsetScroll> _xRowset;
XInterface<IRowsetQueryStatus> _xRowsetStatus;
XInterface<IDBAsynchStatus> _xDBAsynchStatus;
XInterface<IAccessor> _xIAccessor;
HACCESSOR _hAccessor;
HACCESSOR _hBmkAccessor;
HACCESSOR _hBrowseAccessor;
//
// HROWs
//
HROW _aHRows[cMaxRowCache];
ULONG _cHRows; // this many we have
ULONG _cRowsDisp; // this many can be displayed
HROW _aHRowsTmp[cMaxRowCache];
CBookMark _bmkSelect;
//
// Notifications
//
HWND _hwndNotify; // where to send notifications
HWND _hwndList;
XPtr<CWatchQuery> _xWatch;
HWATCHREGION _hRegion;
DBCOUNTITEM _cRowsTotal;
DBCOUNTITEM _iRowCurrent;
ULONG_PTR _dwStartTime;
ULONG_PTR _dwEndTime;
CBookMark _bmkTop;
BOOL _fDone;
ULONG _pctDone;
DWORD _dwQueryStatus;
SCODE _scLastError;
CColumnList &_columns;
IColumnMapper &_columnMapper;
XGrowable<WCHAR> _xCatList;
};