243 lines
6.7 KiB
C++
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;
|
|
};
|
|
|