Source code of Windows XP (NT5)
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) Microsoft Corporation, 1996 - 2000.
//
// File: idq.hxx
//
// Contents: Parser for an IDQ file
//
// History: 96/Jan/3 DwightKr Created
//
//----------------------------------------------------------------------------
#pragma once
#if !defined( LONGSIG )
#define LONGSIG(c1, c2, c3, c4) \
(((ULONG) (BYTE) (c1)) | \ (((ULONG) (BYTE) (c2)) << 8) | \ (((ULONG) (BYTE) (c3)) << 16) | \ (((ULONG) (BYTE) (c4)) << 24)) #endif // LONGSIG
class CVariable; class CVariableSet; class COutputFormat;
//+---------------------------------------------------------------------------
//
// Function: ISAPI_IDQHash, inline
//
// Arguments: [wcsName] -- name to be hashed
//
// Returns: ULONG - hashed value for wcsName
//
//----------------------------------------------------------------------------
inline ULONG ISAPI_IDQHash( WCHAR const * wcsName ) { ULONG ulHash = 0; ULONG cwcName;
for ( cwcName=0; wcsName[cwcName] != 0; cwcName++ ) { ulHash <<= 1; ulHash += wcsName[cwcName]; }
ulHash += cwcName;
return ulHash; }
//+---------------------------------------------------------------------------
//
// Class: CIDQFile
//
// Purpose: Scans and parses an IDQ file.
//
// History: 96/Jan/23 DwightKr Created
//
//----------------------------------------------------------------------------
class CIDQFile { public: CIDQFile( WCHAR const * wcsFileName, UINT codePage, CSecurityIdentity const & securityIdentity ); ~CIDQFile();
void ParseFile();
WCHAR const * GetIDQFileName() const { return _wcsIDQFileName; } WCHAR const * GetRestriction() const { return _wcsRestriction; } WCHAR const * GetDialect() const { return _wcsDialect; } WCHAR const * GetScope() const { return _wcsScope; } WCHAR const * GetSort() const { return _wcsSort; } WCHAR const * GetCiFlags() const { return _wcsCiFlags; } WCHAR const * GetForceUseCI() const { return _wcsForceUseCi; } WCHAR const * GetDeferTrimming() const { return _wcsDeferTrimming; } WCHAR const * GetHTXFileName() const { return _wcsHTXFileName; } WCHAR const * GetCatalog() const { return _wcsCatalog; } WCHAR const * GetColumns() const { return _wcsColumns; } WCHAR const * GetLocale() const { return _wcsLocale; } WCHAR const * GetCanonicalOutput() const { return _wcsCanonicalOutput; } WCHAR const * GetDontTimeout() const { return _wcsDontTimeout; }
WCHAR const * GetMaxRecordsInResultSet() const { return _wcsMaxRecordsInResultSet; } WCHAR const * GetMaxRecordsPerPage() const { return _wcsMaxRecordsPerPage; }
WCHAR const * GetFirstRowsInResultSet() const { return _wcsFirstRowsInResultSet; }
IColumnMapper * GetColumnMapper() const { return _xList.GetPointer(); }
BOOL IsCachedDataValid();
inline BOOL CheckSecurity( CSecurityIdentity const & securityIdentity ) const;
void SetSecurityToken( CSecurityIdentity const & securityIdentity ) { _securityIdentity.SetSecurityToken( securityIdentity ); }
void GetVectorFormatting( COutputFormat & outputFormat );
CDbColumns * ParseColumns( WCHAR const * wcsColumns, CVariableSet & variableSet, CDynArray<WCHAR> & awcsColumns );
ULONG GetReplaceableParameterCount() const { return _cReplaceableParameters; }
void LokAddRef() { InterlockedIncrement(&_refCount); } void Release() { InterlockedDecrement(&_refCount); Win4Assert( _refCount >= 0 ); }
LONG LokGetRefCount() { return _refCount; }
ULONG ParseFlags( WCHAR const * wcsCiFlags ); BOOL ParseForceUseCI( WCHAR const * wcsForceUseCi ); BOOL ParseDeferTrimming( WCHAR const * wcsDeferTrimming );
BOOL IsCanonicalOutput() const; BOOL IsDontTimeout() const;
UINT GetCodePage() const { return _codePage; }
private:
void ParseOneLine( CQueryScanner & scan, unsigned iLine );
void GetStringValue( CQueryScanner & scan, unsigned iLine, WCHAR ** pwcsStringValue, BOOL fParseQuotes = TRUE );
WCHAR * _wcsRestriction; // The query restriction
WCHAR * _wcsDialect; // The tripolish version (1/2)
WCHAR * _wcsScope; // The query scope
WCHAR * _wcsColumns; // Output columns
WCHAR * _wcsLocale; // Locale specified in IDQ file
WCHAR * _wcsSort; // Sort order
WCHAR * _wcsHTXFileName; // The name of the template file
WCHAR * _wcsMaxRecordsInResultSet; // Max # recs to get from qry
WCHAR * _wcsMaxRecordsPerPage; // Number of records per page
WCHAR * _wcsFirstRowsInResultSet; WCHAR * _wcsCatalog; // Location of the catalog
WCHAR * _wcsCiFlags; // Flags
WCHAR * _wcsForceUseCi; // Force use of CI for all queries
WCHAR * _wcsDeferTrimming; // Defer result trimming
WCHAR * _wcsCanonicalOutput; // Canonical output
WCHAR * _wcsDontTimeout; // Don't timeout value
WCHAR * _wcsBoolVectorPrefix; // Prefix for vectors of bools
WCHAR * _wcsBoolVectorSeparator; // Separator for vectors of bools
WCHAR * _wcsBoolVectorSuffix; // Suffix for vectors or bools
WCHAR * _wcsCurrencyVectorPrefix; // Prefix for vectors of currency
WCHAR * _wcsCurrencyVectorSeparator;// Separator for vectors of currency
WCHAR * _wcsCurrencyVectorSuffix; // Suffix for vectors or currency
WCHAR * _wcsDateVectorPrefix; // Prefix for vectors of date
WCHAR * _wcsDateVectorSeparator; // Separator for vectors of date
WCHAR * _wcsDateVectorSuffix; // Suffix for vectors for date
WCHAR * _wcsNumberVectorPrefix; // Prefix for vectors of numbers
WCHAR * _wcsNumberVectorSeparator;// Separator for vectors of numbers
WCHAR * _wcsNumberVectorSuffix; // Suffix for vectors or numbers
WCHAR * _wcsStringVectorPrefix; // Prefix for vectors of strings
WCHAR * _wcsStringVectorSeparator;// Separator for vectors of string
WCHAR * _wcsStringVectorSuffix; // Suffix for vectors or strings
ULONG _cReplaceableParameters; // # of replaceable parameters
FILETIME _ftIDQLastWriteTime; // Last write time of IDQ file
LONG _refCount; // Refcount for this file
XInterface<CLocalGlobalPropertyList> _xList; // Parsed property list
WCHAR _wcsIDQFileName[MAX_PATH]; // The IDQ file name
UINT _codePage; // code page to parse file
CSecurityIdentity _securityIdentity; // Security ID used to open file
};
//+---------------------------------------------------------------------------
//
// Function: GetLastWriteTime
//
// Purpose: Gets the last change time of the file specified
//
// Arguments: [wcsFileName] - name of file to get last write time of
// [ft] - returns the last write time of the file
//
// History: 96/Jan/23 DwightKr Created
//
//----------------------------------------------------------------------------
SCODE GetLastWriteTime( WCHAR const * wcsFileName, FILETIME & ft );
//+---------------------------------------------------------------------------
//
// Class: CIDQFileList
//
// Purpose: List of parsed and cached IDQ files
//
// History: 96/Mar/27 DwightKr Created
//
//----------------------------------------------------------------------------
class CIDQFileList { public: CIDQFileList() : _ulSignature( LONGSIG( 'i', 'd', 'q', 'l' ) ) { END_CONSTRUCTION(CIDQFileList); }
~CIDQFileList();
CIDQFile * Find( WCHAR const * wcsFileName, UINT codePage, CSecurityIdentity const & securityIdentity );
void Release( CIDQFile & idqFile );
void DeleteZombies();
private:
ULONG _ulSignature; // Signature of start of privates
CMutexSem _mutex; // To serialize access to list
CDynArrayInPlace<CIDQFile *> _aIDQFile; // parsed IDQ files
};
//+---------------------------------------------------------------------------
//
// Method: CIDQFile::CheckSecurity
//
// Purpose: Compare user id with one used to load IDQ file
//
// Arguments: [securityIdentity] - Check against this
//
// Returns: TRUE if check passes
//
// History: 26-Oct-1996 KyleP Created
//
//----------------------------------------------------------------------------
inline BOOL CIDQFile::CheckSecurity( CSecurityIdentity const & securityIdentity ) const { return _securityIdentity.IsEqual( securityIdentity ); }
//+---------------------------------------------------------------------------
//
// Function: IsNetPath
//
// Purpose: Determines if a physical path is a UNC
//
// Arguments: [pwszPath] -- The path to check
//
// Returns: TRUE if the path is a UNC, FALSE otherwise
//
// History: 26-Aug-1997 dlee Coped from impersonation code
//
//----------------------------------------------------------------------------
inline BOOL IsNetPath( WCHAR const * pwszPath ) { return L'\\' == pwszPath[0] && L'\\' == pwszPath[1]; }
|