//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: Pickle.cxx // // Contents: Pickling/Unpickling routines for restrictions. // // History: 22-Dec-92 KyleP Created // //-------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include #include #include #include #include //+------------------------------------------------------------------------- // // Function: DoPickle // // Synopsis: Pickles a query into a stream // // Arguments: [sver] -- version of the server we are targeting // [ss] -- Stream into which query is pickled // [cb] -- Size of pickled query // [pcol] -- Columns in table // [prst] -- Restriction // [pso] -- Sort order // [pcateg] -- Categorization specification // [ulFlags] -- Flags // [pidmap] -- Pid Mapper // // History: 18-Apr-95 dlee From duplicate code in Pickle & PickledSize // //-------------------------------------------------------------------------- void DoPickle( int sver, PSerStream &ss, ULONG cb, CColumnSet const * pcol, CRestriction const * prst, CSortSet const * pso, CCategorizationSet const *pcateg, CRowsetProperties const *pProps, CPidMapper const * pidmap ) { // must be 8-byte aligned ss.PutULong( cb ); // Size if ( 0 == pcol ) ss.PutByte( PickleColNone ); else { ss.PutByte( PickleColSet ); pcol->Marshall( ss ); } if ( 0 == prst ) ss.PutByte( FALSE ); else { if ( !prst->IsValid() ) { vqDebugOut(( DEB_ERROR, "Marshalling invalid restriction!\n" )); THROW( CException( QUERY_E_INVALIDRESTRICTION ) ); } ss.PutByte( TRUE ); prst->Marshall( ss ); } if ( 0 == pso ) ss.PutByte( FALSE ); else { ss.PutByte( TRUE ); pso->Marshall( ss ); } if ( 0 == pcateg ) ss.PutByte( FALSE ); else { ss.PutByte( TRUE ); pcateg->Marshall( ss ); } pProps->Marshall(ss); Win4Assert( 0 != pidmap ); pidmap->Marshall( ss ); } //DoPickle //+------------------------------------------------------------------------- // // Function: PickledSize, public // // Synopsis: Computes size of buffer required to pickle query. // // Arguments: [sver] -- version of the server we are targeting // [pcol] -- Columns in table // [prst] -- Restriction // [pso] -- Sort order // [pcateg] -- Categorization specification // [ulFlags] -- Flags // [pidmap] -- Pid Mapper // // Returns: Size (in bytes) of buffer needed to serialize query. // // History: 22-Dec-92 KyleP Added header // //-------------------------------------------------------------------------- ULONG PickledSize( int sver, CColumnSet const * pcol, CRestriction const * prst, CSortSet const * pso, CCategorizationSet const *pcateg, CRowsetProperties const *pProps, CPidMapper const * pidmap ) { CSizeSerStream ss; DoPickle( sver, ss, 0, pcol, prst, pso, pcateg, pProps, pidmap ); vqDebugOut(( DEB_ITRACE, "Marshalled size = %d bytes\n", ss.Size() )); return ss.Size(); } //PickledSize //+------------------------------------------------------------------------- // // Function: Pickle, public // // Synopsis: Pickles query // // Arguments: [sver] -- version of the server we are targeting // [pcol] -- Columns in table // [prst] -- Restriction // [pso] -- Sort order // [pcateg] -- Categorization specification // [ulFlags] -- Flags // [pidmap] -- Pid Mapper // [pb] -- Buffer to serialize query into // [cb] -- Size (in bytes) of pb. // // History: 22-Dec-92 KyleP Added header // //-------------------------------------------------------------------------- void Pickle( int sver, CColumnSet const * pcol, CRestriction const * prst, CSortSet const * pso, CCategorizationSet const *pcateg, CRowsetProperties const *pProps, CPidMapper const * pidmap, BYTE * pb, ULONG cb ) { CMemSerStream ss( pb, cb ); DoPickle( sver, ss, cb, pcol, prst, pso, pcateg, pProps, pidmap ); } //Pickle //+------------------------------------------------------------------------- // // Function: UnPickle, public // // Synopsis: Deserializes pickled query into buffer. // // Arguments: [cver] -- version of the client that pickled the query // [col] -- Columns in table here on exit // [rst] -- Restriction here on exit // [sort] -- Sort order here on exit // [categ] -- Categorization specification here on exit // [RstProp] -- Rowset properties initialized here on exit // [pidmap] -- Pidmap here on exit // [pbInput] -- Buffer containing pickled query // [cbInput] -- Size (in bytes) of pbInput. // // History: 22-Dec-92 KyleP Added header // //-------------------------------------------------------------------------- void UnPickle( int cver, XColumnSet & col, XRestriction & rst, XSortSet & sort, XCategorizationSet & categ, CRowsetProperties & RstProps, XPidMapper & pidmap, BYTE * pbInput, ULONG cbInput ) { CMemDeSerStream ss( pbInput, cbInput ); ULONG cbPickleBuf = 0; cbPickleBuf = ss.GetULong(); // length of buffer if (cbPickleBuf > cbInput) { vqDebugOut(( DEB_ERROR, "cbPickleBuf %d, cbInput %d\n", cbPickleBuf, cbInput )); Win4Assert(cbPickleBuf <= cbInput); THROW(CException(STATUS_INVALID_PARAMETER_MIX)); } BYTE bColType = ss.GetByte(); switch (bColType) { case PickleColSet: col.Set( new CColumnSet(ss) ); break; default: Win4Assert(bColType <= PickleColSet); case PickleColNone: break; } BOOL fNonZero = ss.GetByte(); if ( fNonZero ) { rst.Set( CRestriction::UnMarshall(ss) ); // would have thrown on out of memory, so rst must be valid Win4Assert( !rst.IsNull() ); Win4Assert( rst->IsValid() ); } fNonZero = ss.GetByte(); if ( fNonZero ) sort.Set( new CSortSet(ss) ); fNonZero = ss.GetByte(); if ( fNonZero ) categ.Set( new CCategorizationSet(ss) ); RstProps.Unmarshall(ss); pidmap.Set( new CPidMapper(ss) ); } //UnPickle void CRowsetProperties::Marshall( PSerStream & ss ) const { ss.PutULong( _uBooleanOptions ); ss.PutULong( _ulMaxOpenRows ); ss.PutULong( _ulMemoryUsage ); ss.PutULong( _cMaxResults ); ss.PutULong( _cCmdTimeout ); } //Marshall void CRowsetProperties::Unmarshall( PDeSerStream & ss ) { _uBooleanOptions = ss.GetULong(); _ulMaxOpenRows = ss.GetULong(); _ulMemoryUsage = ss.GetULong(); _cMaxResults = ss.GetULong(); _cCmdTimeout = ss.GetULong(); } //Unmarshall