greenplumn CParseHandlerManager 源码

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

greenplumn CParseHandlerManager 代码

文件路径:/src/backend/gporca/libnaucrates/src/parser/CParseHandlerManager.cpp

//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2010 Greenplum, Inc.
//
//	@filename:
//		CParseHandlerManager.cpp
//
//	@doc:
//		Implementation of the controller for parse handlers.
//---------------------------------------------------------------------------

#include "naucrates/dxl/parser/CParseHandlerManager.h"

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

using namespace gpdxl;

#define GPDXL_PARSE_CFA_FREQUENCY 50

XERCES_CPP_NAMESPACE_USE

//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::CParseHandlerManager
//
//	@doc:
//		Constructor
//
//---------------------------------------------------------------------------
CParseHandlerManager::CParseHandlerManager(
	CDXLMemoryManager *dxl_memory_manager, SAX2XMLReader *sax_2_xml_reader)
	: m_dxl_memory_manager(dxl_memory_manager),
	  m_xml_reader(sax_2_xml_reader),
	  m_curr_parse_handler(nullptr),
	  m_iteration_since_last_abortcheck(0)
{
	m_parse_handler_stack = GPOS_NEW(dxl_memory_manager->Pmp())
		ParseHandlerStack(dxl_memory_manager->Pmp());
}

//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::~CParseHandlerManager
//
//	@doc:
//		Destructor
//
//---------------------------------------------------------------------------
CParseHandlerManager::~CParseHandlerManager()
{
	GPOS_DELETE(m_parse_handler_stack);
}


//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::ActivateParseHandler
//
//	@doc:
//		Activates the given parse handler and saves the current one on the stack
//
//---------------------------------------------------------------------------
void
CParseHandlerManager::ActivateParseHandler(
	CParseHandlerBase *parse_handler_base)
{
	CheckForAborts();

	if (m_curr_parse_handler)
	{
		// push current handler on stack
		m_parse_handler_stack->Push(m_curr_parse_handler);
	}

	GPOS_ASSERT(nullptr != parse_handler_base);

	m_curr_parse_handler = parse_handler_base;
	m_xml_reader->setContentHandler(parse_handler_base);
	m_xml_reader->setErrorHandler(parse_handler_base);
}

//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::ReplaceHandler
//
//	@doc:
//		Activates the given parse handler and throws out the current one
//
//---------------------------------------------------------------------------
void
CParseHandlerManager::ReplaceHandler(CParseHandlerBase *parse_handler_base,
									 CParseHandlerBase *parse_handler_root)
{
	CheckForAborts();

	GPOS_ASSERT(nullptr != m_curr_parse_handler);
	GPOS_ASSERT(nullptr != parse_handler_base);

	if (nullptr != parse_handler_root)
	{
		parse_handler_root->ReplaceParseHandler(m_curr_parse_handler,
												parse_handler_base);
	}

	m_curr_parse_handler = parse_handler_base;
	m_xml_reader->setContentHandler(parse_handler_base);
	m_xml_reader->setErrorHandler(parse_handler_base);
}


//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::DeactivateHandler
//
//	@doc:
//		Deactivates the current handler and activates the one on top of the
//		parser stack if one exists
//
//---------------------------------------------------------------------------
void
CParseHandlerManager::DeactivateHandler()
{
	CheckForAborts();

	GPOS_ASSERT(nullptr != m_curr_parse_handler);

	if (!m_parse_handler_stack->IsEmpty())
	{
		m_curr_parse_handler = m_parse_handler_stack->Pop();
	}
	else
	{
		m_curr_parse_handler = nullptr;
	}

	m_xml_reader->setContentHandler(m_curr_parse_handler);
	m_xml_reader->setErrorHandler(m_curr_parse_handler);
}

//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::GetCurrentParseHandler
//
//	@doc:
//		Returns the current handler
//
//---------------------------------------------------------------------------
const CParseHandlerBase *
CParseHandlerManager::GetCurrentParseHandler()
{
	return m_curr_parse_handler;
}

//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerManager::CheckForAborts
//
//	@doc:
//		Increment CFA counter and check for aborts if necessary according to the
//		specified CFA frequency
//
//---------------------------------------------------------------------------
void
CParseHandlerManager::CheckForAborts()
{
	m_iteration_since_last_abortcheck++;

	if (GPDXL_PARSE_CFA_FREQUENCY < m_iteration_since_last_abortcheck)
	{
		GPOS_CHECK_ABORT;
		m_iteration_since_last_abortcheck = 0;
	}
}

// EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CParseHandlerAgg 源码

greenplumn CParseHandlerAppend 源码

greenplumn CParseHandlerArray 源码

greenplumn CParseHandlerAssert 源码

greenplumn CParseHandlerBase 源码

greenplumn CParseHandlerBroadcastMotion 源码

greenplumn CParseHandlerCTEConfig 源码

greenplumn CParseHandlerCTEList 源码

greenplumn CParseHandlerColDescr 源码

greenplumn CParseHandlerColStats 源码

0  赞