greenplumn CDXLTableDescr 源码

  • 2022-08-18
  • 浏览 (331)

greenplumn CDXLTableDescr 代码

文件路径:/src/backend/gporca/libnaucrates/src/operators/CDXLTableDescr.cpp

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2010 Greenplum, Inc.
//
//	@filename:
//		CDXLTableDescr.cpp
//
//	@doc:
//		Implementation of DXL table descriptors
//---------------------------------------------------------------------------


#include "naucrates/dxl/operators/CDXLTableDescr.h"

#include "gpos/string/CWStringDynamic.h"

#include "naucrates/dxl/xml/CXMLSerializer.h"

using namespace gpos;
using namespace gpdxl;

#define GPDXL_DEFAULT_USERID 0
#define GPDXL_INVALID_LOCKMODE -1

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::CDXLTableDescr
//
//	@doc:
//		Ctor
//
//---------------------------------------------------------------------------
CDXLTableDescr::CDXLTableDescr(CMemoryPool *mp, IMDId *mdid, CMDName *mdname,
							   ULONG ulExecuteAsUser, int lockmode)
	: m_mdid(mdid),
	  m_mdname(mdname),
	  m_dxl_column_descr_array(nullptr),
	  m_execute_as_user_id(ulExecuteAsUser),
	  m_lockmode(lockmode)
{
	GPOS_ASSERT(nullptr != m_mdname);
	m_dxl_column_descr_array = GPOS_NEW(mp) CDXLColDescrArray(mp);
}


//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::~CDXLTableDescr
//
//	@doc:
//		Dtor
//
//---------------------------------------------------------------------------
CDXLTableDescr::~CDXLTableDescr()
{
	m_mdid->Release();
	GPOS_DELETE(m_mdname);
	CRefCount::SafeRelease(m_dxl_column_descr_array);
}


//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::MDId
//
//	@doc:
//		Return the metadata id for the table
//
//---------------------------------------------------------------------------
IMDId *
CDXLTableDescr::MDId() const
{
	return m_mdid;
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::MdName
//
//	@doc:
//		Return table name
//
//---------------------------------------------------------------------------
const CMDName *
CDXLTableDescr::MdName() const
{
	return m_mdname;
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::Arity
//
//	@doc:
//		Return number of columns in the table
//
//---------------------------------------------------------------------------
ULONG
CDXLTableDescr::Arity() const
{
	return (m_dxl_column_descr_array == nullptr)
			   ? 0
			   : m_dxl_column_descr_array->Size();
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::GetExecuteAsUserId
//
//	@doc:
//		Id of the user the table needs to be accessed with
//
//---------------------------------------------------------------------------
ULONG
CDXLTableDescr::GetExecuteAsUserId() const
{
	return m_execute_as_user_id;
}

INT
CDXLTableDescr::LockMode() const
{
	return m_lockmode;
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::SetColumnDescriptors
//
//	@doc:
//		Set the list of column descriptors
//
//---------------------------------------------------------------------------
void
CDXLTableDescr::SetColumnDescriptors(CDXLColDescrArray *dxl_column_descr_array)
{
	CRefCount::SafeRelease(m_dxl_column_descr_array);
	m_dxl_column_descr_array = dxl_column_descr_array;
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::AddColumnDescr
//
//	@doc:
//		Add a column to the list of column descriptors
//
//---------------------------------------------------------------------------
void
CDXLTableDescr::AddColumnDescr(CDXLColDescr *column_descr_dxl)
{
	GPOS_ASSERT(nullptr != m_dxl_column_descr_array);
	GPOS_ASSERT(nullptr != column_descr_dxl);
	m_dxl_column_descr_array->Append(column_descr_dxl);
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::GetColumnDescrAt
//
//	@doc:
//		Get the column descriptor at the specified position from the col descr list
//
//---------------------------------------------------------------------------
const CDXLColDescr *
CDXLTableDescr::GetColumnDescrAt(ULONG idx) const
{
	GPOS_ASSERT(idx < Arity());

	return (*m_dxl_column_descr_array)[idx];
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::SerializeMDId
//
//	@doc:
//		Serialize the metadata id in DXL format
//
//---------------------------------------------------------------------------
void
CDXLTableDescr::SerializeMDId(CXMLSerializer *xml_serializer) const
{
	m_mdid->Serialize(xml_serializer,
					  CDXLTokens::GetDXLTokenStr(EdxltokenMdid));
}

//---------------------------------------------------------------------------
//	@function:
//		CDXLTableDescr::SerializeToDXL
//
//	@doc:
//		Serialize table descriptor in DXL format
//
//---------------------------------------------------------------------------
void
CDXLTableDescr::SerializeToDXL(CXMLSerializer *xml_serializer) const
{
	xml_serializer->OpenElement(
		CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
		CDXLTokens::GetDXLTokenStr(EdxltokenTableDescr));

	SerializeMDId(xml_serializer);

	xml_serializer->AddAttribute(CDXLTokens::GetDXLTokenStr(EdxltokenTableName),
								 m_mdname->GetMDName());

	if (GPDXL_DEFAULT_USERID != m_execute_as_user_id)
	{
		xml_serializer->AddAttribute(
			CDXLTokens::GetDXLTokenStr(EdxltokenExecuteAsUser),
			m_execute_as_user_id);
	}

	if (GPDXL_INVALID_LOCKMODE != LockMode())
	{
		xml_serializer->AddAttribute(
			CDXLTokens::GetDXLTokenStr(EdxltokenLockMode), LockMode());
	}

	// serialize columns
	xml_serializer->OpenElement(
		CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
		CDXLTokens::GetDXLTokenStr(EdxltokenColumns));
	GPOS_ASSERT(nullptr != m_dxl_column_descr_array);

	const ULONG arity = Arity();
	for (ULONG ul = 0; ul < arity; ul++)
	{
		CDXLColDescr *pdxlcd = (*m_dxl_column_descr_array)[ul];
		pdxlcd->SerializeToDXL(xml_serializer);
	}

	xml_serializer->CloseElement(
		CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
		CDXLTokens::GetDXLTokenStr(EdxltokenColumns));

	xml_serializer->CloseElement(
		CDXLTokens::GetDXLTokenStr(EdxltokenNamespacePrefix),
		CDXLTokens::GetDXLTokenStr(EdxltokenTableDescr));
}

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CDXLColDescr 源码

greenplumn CDXLColRef 源码

greenplumn CDXLCtasStorageOptions 源码

greenplumn CDXLDatum 源码

greenplumn CDXLDatumBool 源码

greenplumn CDXLDatumGeneric 源码

greenplumn CDXLDatumInt2 源码

greenplumn CDXLDatumInt4 源码

greenplumn CDXLDatumInt8 源码

greenplumn CDXLDatumOid 源码

0  赞