Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// Copyright (C) 1996-1997, Microsoft Corporation.
//
// File: strsort.cxx
//
// Contents: Builds a sort node from a string
//
// History: 96/Jan/3 DwightKr Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: GetStringDbSortNode - public
//
// Synopsis: Builds a CDbSortNode from the string passed
//
// Arguments: [wcsSort] - the string containing the sort specification
// [pList] - the property list describing the sort DBTYPES
//
// Notes: CPListException is used instead of CParserException so the
// error class will be IDQError, not RESError in idq.dll.
//
// History: 96/Jan/03 DwightKr Created.
//
//----------------------------------------------------------------------------
CDbSortNode * GetStringDbSortNode( const WCHAR * wcsSort, IColumnMapper * pList, LCID locale) { Win4Assert( 0 != wcsSort );
unsigned cSortCol = 0; CDbSortNode * pDbSortNode = new CDbSortNode(); if ( 0 == pDbSortNode ) { THROW( CException(STATUS_INSUFFICIENT_RESOURCES) ); }
XPtr<CDbSortNode> xDbSortNode(pDbSortNode);
CQueryScanner scanner( wcsSort, FALSE, locale );
for ( XPtrST<WCHAR> wcsColumnName( scanner.AcqColumn() ); wcsColumnName.GetPointer() != 0; wcsColumnName.Set( scanner.AcqColumn() ) ) { scanner.AcceptColumn(); // Remove the column name
//
// Parse for the [a] or [d] parameters.
//
unsigned order = QUERY_SORTASCEND; // Assume ascending sort order
if ( scanner.LookAhead() == W_OPEN_TOKEN ) { scanner.Accept(); // Remove the '['
WCHAR wchOrder = scanner.GetCommandChar();
if ( wchOrder == L'a' ) { order = QUERY_SORTASCEND; } else if ( wchOrder == L'd' ) { order = QUERY_SORTDESCEND; } else { // Report an error
THROW( CPListException(QPARSE_E_INVALID_SORT_ORDER, 0) ); }
WCHAR wchNext = scanner.GetCommandChar(); if (wchNext != 0 && !iswspace(wchNext)) // some alphabetic character followed the '[a' or '[d'.
THROW( CPListException(QPARSE_E_INVALID_SORT_ORDER, 0) );
scanner.AcceptCommand(); // Remove the command character
if ( scanner.LookAhead() != W_CLOSE_TOKEN ) { // Report an error
THROW( CPListException(QPARSE_E_EXPECTING_BRACE, 0) ); }
scanner.Accept(); // Remove the ']' character
}
//
// Build a CDbSortKey with the parameters obtained.
//
CDbColId *pDbColId = 0; DBID *pdbid = 0; if ( FAILED(pList->GetPropInfoFromName( wcsColumnName.GetPointer(), &pdbid, 0, 0 )) ) { //
// Column name not found.
//
THROW( CPListException(QPARSE_E_NO_SUCH_SORT_PROPERTY, 0) ); } pDbColId = (CDbColId *)pdbid;
CDbSortKey sortKey( *pDbColId, order, locale);
//
// Add the new sort key to the tree of sort nodes.
//
if ( !pDbSortNode->AddSortColumn(sortKey) ) { // Report a failure.
THROW( CException(STATUS_INSUFFICIENT_RESOURCES) ); }
delete wcsColumnName.Acquire();
//
// Skip over commas seperating sort columns
//
if ( scanner.LookAhead() == COMMA_TOKEN ) { scanner.Accept(); // Remove the ','
} else if (scanner.LookAhead() != EOS_TOKEN) { THROW( CPListException(QPARSE_E_EXPECTING_COMMA, 0) ); }
cSortCol++; }
if (scanner.LookAhead() != EOS_TOKEN) { if (cSortCol > 0) { THROW( CPListException(QPARSE_E_NO_SUCH_SORT_PROPERTY, 0) ); } else { THROW( CPListException(QPARSE_E_EXPECTING_EOS, 0) ); } }
return xDbSortNode.Acquire(); }
|