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.
 
 
 
 
 
 

152 lines
4.5 KiB

//+---------------------------------------------------------------------------
//
// 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();
}