windows-nt/Source/XPSP1/NT/net/ias/iasjet/setup/properties.cpp
2020-09-26 16:20:57 +08:00

382 lines
13 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright(C) 2000 Microsoft Corporation all rights reserved.
//
// Module: Properties.cpp
//
// Project: Windows 2000 IAS
//
// Description: Implementation of the CProperties class
//
// Author: tperraut
//
// Revision 02/24/2000 created
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Properties.h"
//////////////////////////////////////////////////////////////////////////
// class CProperties
//////////////////////////////////////////////////////////////////////////
//Constructor
//////////////
CProperties::CProperties(CSession& SessionParam)
:m_PropertiesCommandGet(SessionParam),
m_PropertiesCommandGetByName(SessionParam),
m_PropertiesCommandInsert(SessionParam),
m_PropertiesCommandDelete(SessionParam),
m_PropertiesCommandDeleteMultiple(SessionParam)
{
};
//////////////
// Destructor
//////////////
CProperties::~CProperties()
{
};
///////////////
// GetProperty
///////////////
HRESULT CProperties::GetProperty(
LONG Bag,
_bstr_t& Name,
LONG& Type,
_bstr_t& StrVal
)
{
return m_PropertiesCommandGet.GetProperty(
Bag,
Name,
Type,
StrVal
);
}
///////////////////
// GetNextProperty
///////////////////
HRESULT CProperties::GetNextProperty(
LONG Bag,
_bstr_t& Name,
LONG& Type,
_bstr_t& StrVal,
LONG Index
)
{
return m_PropertiesCommandGet.GetProperty(
Bag,
Name,
Type,
StrVal,
Index
);
}
/////////////////////
// GetPropertyByName
/////////////////////
HRESULT CProperties::GetPropertyByName(
LONG Bag,
const _bstr_t& Name,
LONG& Type,
_bstr_t& StrVal
)
{
return m_PropertiesCommandGetByName.GetPropertyByName(
Bag,
Name,
Type,
StrVal
);
}
//////////////////////////////////
// InsertProperty
// throw an exception if it fails
//////////////////////////////////
void CProperties::InsertProperty(
LONG Bag,
const _bstr_t& Name,
LONG Type,
const _bstr_t& StrVal
)
{
m_PropertiesCommandInsert.InsertProperty(
Bag,
Name,
Type,
StrVal
);
}
//////////////////////////////////
// DeleteProperty
// throw an exception if it fails
//////////////////////////////////
void CProperties::DeleteProperty(
LONG Bag,
const _bstr_t& Name
)
{
m_PropertiesCommandDelete.DeleteProperty(
Bag,
Name
);
}
//////////////////////////
// DeletePropertiesExcept
//////////////////////////
void CProperties::DeletePropertiesExcept(
LONG Bag,
const _bstr_t& Exception
)
{
m_PropertiesCommandDeleteMultiple.DeletePropertiesExcept(Bag, Exception);
}
///////////////////////////////////////////////////
// UpdateProperty
// throw an exception if it fails
// Improvement possible: create a SQL statement
// to update instead of doing a delete then insert
///////////////////////////////////////////////////
void CProperties::UpdateProperty(
LONG Bag,
const _bstr_t& Name,
LONG Type,
const _bstr_t& StrVal
)
{
try
{
m_PropertiesCommandDelete.DeleteProperty(
Bag,
Name
);
}
catch(...)
{
// ignore the failure. If delete fails but insert works, that's ok
}
m_PropertiesCommandInsert.InsertProperty(
Bag,
Name,
Type,
StrVal
);
}
//////////////////////////////////////////////////////////////////////////////
// class CPropertiesCommandGet
//////////////////////////////////////////////////////////////////////////////
CProperties::CPropertiesCommandGet::CPropertiesCommandGet(
CSession& CurrentSession
)
{
Init(CurrentSession);
};
///////////////
// GetProperty
///////////////
HRESULT CProperties::CPropertiesCommandGet::GetProperty(
LONG Bag,
_bstr_t& Name,
LONG& Type,
_bstr_t& StrVal
)
{
m_BagParam = Bag;
HRESULT hr = BaseExecute();
if ( SUCCEEDED(hr) )
{
Name = m_Name;
Type = m_Type;
StrVal = m_StrVal;
}
return hr;
}
//////////////////////////
// GetProperty overloaded
//////////////////////////
HRESULT CProperties::CPropertiesCommandGet::GetProperty(
LONG Bag,
_bstr_t& Name,
LONG& Type,
_bstr_t& StrVal,
LONG Index
)
{
m_BagParam = Bag;
HRESULT hr = BaseExecute(Index);
if ( SUCCEEDED(hr) )
{
Name = m_Name;
Type = m_Type;
StrVal = m_StrVal;
}
return hr;
}
//////////////////////////////////////////////////////////////////////////////
// class CPropertiesCommandGetByName
//////////////////////////////////////////////////////////////////////////////
CProperties::CPropertiesCommandGetByName::CPropertiesCommandGetByName(
CSession& CurrentSession
)
{
Init(CurrentSession);
};
//////////////////////
// GetPropertyByName
//////////////////////
HRESULT CProperties::CPropertiesCommandGetByName::GetPropertyByName(
LONG Bag,
const _bstr_t& Name,
LONG& Type,
_bstr_t& StrVal
)
{
m_BagParam = Bag;
if ( Name.length() )
{
lstrcpynW(m_NameParam, Name, NAME_SIZE);
}
HRESULT hr = BaseExecute();
if ( SUCCEEDED(hr) )
{
Type = m_Type;
StrVal = m_StrVal;
}
return hr;
};
//////////////////////////////////////////////////////////////////////////////
// class CPropertiesCommandInsert
//////////////////////////////////////////////////////////////////////////////
CProperties::CPropertiesCommandInsert::CPropertiesCommandInsert(
CSession& CurrentSession
)
{
Init(CurrentSession);
}
//////////////////
// InsertProperty
//////////////////
void CProperties::CPropertiesCommandInsert::InsertProperty(
LONG Bag,
const _bstr_t& Name,
LONG Type,
const _bstr_t& StrVal
)
{
ClearRecord();
m_BagParam = Bag;
if ( Name.length() )
{
lstrcpynW(m_NameParam, Name, NAME_SIZE);
}
m_TypeParam = Type;
if ( StrVal.length() )
{
lstrcpynW(m_StrValParam, StrVal, STRVAL_SIZE);
}
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE
| DBPROPVAL_UP_INSERT );
_com_util::CheckError(Open(&propset));
Close();
}
//////////////////////////////////////////////////////////////////////////////
// class CPropertiesCommandDelete
//////////////////////////////////////////////////////////////////////////////
CProperties::CPropertiesCommandDelete::CPropertiesCommandDelete(
CSession& CurrentSession
)
{
Init(CurrentSession);
}
//////////////////
// DeleteProperty
//////////////////
void CProperties::CPropertiesCommandDelete::DeleteProperty(
LONG Bag,
const _bstr_t& Name
)
{
m_BagParam = Bag;
lstrcpynW(m_NameParam, Name, NAME_SIZE);
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE
| DBPROPVAL_UP_DELETE );
_com_util::CheckError(Open(&propset));
Close();
}
//////////////////////////////////////////////////////////////////////////////
// class CPropertiesCommandDeleteMultiple
//////////////////////////////////////////////////////////////////////////////
CProperties::CPropertiesCommandDeleteMultiple::
CPropertiesCommandDeleteMultiple(CSession& CurrentSession)
{
Init(CurrentSession);
}
//////////////////
// DeleteProperty
//////////////////
void CProperties::CPropertiesCommandDeleteMultiple::DeletePropertiesExcept(
LONG Bag,
const _bstr_t& Exception
)
{
m_BagParam = Bag;
lstrcpynW(m_ExceptionParam, Exception, SIZE_EXCEPTION_MAX);
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE
| DBPROPVAL_UP_DELETE );
Open(&propset); // ignore the result
Close();
}