192 lines
5.2 KiB
C++
192 lines
5.2 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
||
|
//
|
||
|
// File: qcanon.hxx
|
||
|
//
|
||
|
// Contents: Structure definitions for canonical output of query results.
|
||
|
//
|
||
|
// Classes: CCiCanonicalOutput, CCiCanonicalQueryRows
|
||
|
//
|
||
|
// History: 6-13-96 srikants Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <sizeser.hxx>
|
||
|
#include <memser.hxx>
|
||
|
|
||
|
const ULONG CI_CANONICAL_VERSION = 1;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CCiCanonicalOutput
|
||
|
//
|
||
|
// Purpose: Base header definition for data sent in the canonical format
|
||
|
// from CI.
|
||
|
//
|
||
|
// History: 7-01-96 srikants Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CCiCanonicalOutput
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
enum EOutputType { eQueryRows = 1 };
|
||
|
CCiCanonicalOutput();
|
||
|
|
||
|
void InitVersion() { _ulVersion = CI_CANONICAL_VERSION; }
|
||
|
ULONG GetVersion() const { return _ulVersion; }
|
||
|
|
||
|
void SetOutputType( EOutputType type ) { _type = type; }
|
||
|
EOutputType GetOutputType() const { return _type; }
|
||
|
|
||
|
SCODE GetStatus() const { return _scStatus; }
|
||
|
void SetStatus( SCODE sc) { _scStatus = sc; }
|
||
|
|
||
|
ULONG GetTotalLen() const { return _cbTotal; }
|
||
|
void SetTotalLen( ULONG cbTotal )
|
||
|
{
|
||
|
Win4Assert( cbTotal >= sizeof(CCiCanonicalOutput) );
|
||
|
_cbTotal = cbTotal;
|
||
|
}
|
||
|
|
||
|
static void PutWString( PSerStream & stm, const WCHAR * pwszStr );
|
||
|
static WCHAR * GetWString( PDeSerStream & stm, BOOL & fSuccess );
|
||
|
static WCHAR * AllocAndCopyWString( const WCHAR * pSrc );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
ULONG _ulVersion; // Version Number Information
|
||
|
EOutputType _type; // Type of the data.
|
||
|
SCODE _scStatus; // status of transfer
|
||
|
ULONG _cbTotal; // Total bytes in the buffer
|
||
|
LONGLONG _llSig1; // To force an 8 byte alignment
|
||
|
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CCiCanonicalQueryRows
|
||
|
//
|
||
|
// Purpose: Format of the query results returned in the canonical
|
||
|
// format.
|
||
|
//
|
||
|
// History: 7-01-96 srikants Created
|
||
|
//
|
||
|
// Notes: The first value in the variable buffer is the "BookMark" of
|
||
|
// the first row in the result set.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CCiCanonicalQueryRows : public CCiCanonicalOutput
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
void Init();
|
||
|
|
||
|
static ULONG GetResultsBufferOffset()
|
||
|
{
|
||
|
return FIELD_OFFSET( CCiCanonicalQueryRows, _aRows );
|
||
|
}
|
||
|
|
||
|
BYTE * GetResultsBuffer() { return (BYTE *) _aRows; }
|
||
|
ULONG GetResultsBufMaxLen() const
|
||
|
{
|
||
|
Win4Assert( GetTotalLen() >= GetResultsBufferOffset() );
|
||
|
return GetTotalLen() - GetResultsBufferOffset();
|
||
|
}
|
||
|
|
||
|
ULONG GetColumnCount() const { return _nCols; }
|
||
|
void SetColumnCount( ULONG nCols ) { _nCols = nCols; }
|
||
|
|
||
|
void IncrementRowCount() { _cRowsReturned++; }
|
||
|
ULONG GetRowCount() const { return _cRowsReturned; }
|
||
|
void SetRowCount( ULONG nRows ) { _cRowsReturned = nRows; }
|
||
|
|
||
|
void SetMoreRowsAvailable() { _fMoreRows = TRUE; }
|
||
|
BOOL AreMoreRowsAvailable() const { return _fMoreRows; }
|
||
|
|
||
|
void UpdateTotalLen( ULONG cbResults )
|
||
|
{
|
||
|
SetTotalLen( GetResultsBufferOffset() + cbResults );
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
ULONG _nCols; // Number of columns per row
|
||
|
ULONG _cRowsReturned; // number of rows returned in buffer
|
||
|
BOOL _fMoreRows; // Set to TRUE if there are more rows
|
||
|
LONGLONG _aRows[1]; // To force an 8 byte alignment
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
class COutputColumn;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CQuadByteAlignedBuffer
|
||
|
//
|
||
|
// Purpose: A class that has a quad byte aligned buffer.
|
||
|
//
|
||
|
// History: 7-01-96 srikants Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CQuadByteAlignedBuffer : INHERIT_UNWIND
|
||
|
{
|
||
|
INLINE_UNWIND( CQuadByteAlignedBuffer );
|
||
|
|
||
|
public:
|
||
|
|
||
|
CQuadByteAlignedBuffer( ULONG cbBuffer = 0x10000 );
|
||
|
|
||
|
~CQuadByteAlignedBuffer()
|
||
|
{
|
||
|
delete [] _pbAlloc;
|
||
|
}
|
||
|
|
||
|
BYTE * GetBuffer() { return _pbAligned; }
|
||
|
ULONG GetSize() const { return _cbAligned; }
|
||
|
void ZeroFill();
|
||
|
|
||
|
private:
|
||
|
|
||
|
BYTE * _pbAlloc; // Pointer to the allocated buffer
|
||
|
ULONG _cbAlloc; // Actual bytes allocated
|
||
|
|
||
|
BYTE * _pbAligned; // Pointer to the aligned buffer
|
||
|
ULONG _cbAligned; // Number of bytes in the aligned buffer
|
||
|
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CWebCanonicalResultsIn
|
||
|
//
|
||
|
// Purpose: A helper class to interpret the data that is returned from
|
||
|
// CI.
|
||
|
//
|
||
|
// History: 6-16-96 srikants Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
class CWebCanonicalResultsIn
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CWebCanonicalResultsIn( CQuadByteAlignedBuffer & buffer );
|
||
|
|
||
|
private:
|
||
|
|
||
|
CQuadByteAlignedBuffer & _buffer;
|
||
|
|
||
|
};
|
||
|
|