greenplumn CFileWriter 源码

2022-08-18 浏览 (395)

greenplumn CFileWriter 代码

文件路径:/src/backend/gporca/libgpos/src/io/CFileWriter.cpp

/---------------------------------------------------------------------------
/	Greenplum Database
/	Copyright (C) 2010 Greenplum, Inc.
/
/	@filename:
/		CFileWriter.cpp
/
/	@doc:
/		Implementation of file handler for raw output
/---------------------------------------------------------------------------

#include "gpos/io/CFileWriter.h"

#include <fcntl.h>

#include "gpos/base.h"
#include "gpos/io/ioutils.h"
#include "gpos/task/IWorker.h"

using namespace gpos;


/---------------------------------------------------------------------------
/	@function:
/		CFileWriter::CFileWriter
/
/	@doc:
/		Ctor
/
/---------------------------------------------------------------------------
CFileWriter::CFileWriter() : CFileDescriptor()
{
}


/---------------------------------------------------------------------------
/	@function:
/		CFileWriter::Open
/
/	@doc:
/		Open file for writing
/
/---------------------------------------------------------------------------
void
CFileWriter::Open(const CHAR *file_path, ULONG permission_bits)
{
	GPOS_ASSERT(nullptr != file_path);

	OpenFile(file_path, O_CREAT | O_WRONLY | O_RDONLY | O_TRUNC,
			 permission_bits);

	GPOS_ASSERT(0 == ioutils::FileSize(file_path));

	m_file_size = 0;
}


/---------------------------------------------------------------------------
/	@function:
/		CFileWriter::Close
/
/	@doc:
/		Close file after writing
/
/---------------------------------------------------------------------------
void
CFileWriter::Close()
{
	CloseFile();

	m_file_size = 0;
}


/---------------------------------------------------------------------------
/	@function:
/		CFileWriter::Write
/
/	@doc:
/		Write bytes to file
/
/---------------------------------------------------------------------------
void
CFileWriter::Write(const BYTE *read_buffer, const ULONG_PTR write_size)
{
	GPOS_ASSERT(CFileDescriptor::IsFileOpen() &&
				"Attempt to write to invalid file descriptor");
	GPOS_ASSERT(0 < write_size);
	GPOS_ASSERT(nullptr != read_buffer);

	ULONG_PTR bytes_left_to_write = write_size;

	while (0 < bytes_left_to_write)
	{
		INT_PTR current_byte;

		/ write to file
		current_byte = ioutils::Write(GetFileDescriptor(), read_buffer,
									  bytes_left_to_write);

		/ check for error
		if (-1 == current_byte)
		{
			/ in case an interrupt was received we retry
			if (EINTR == errno)
			{
				GPOS_CHECK_ABORT;

				continue;
			}

			GPOS_RAISE(CException::ExmaSystem, CException::ExmiIOError, errno);
		}

		GPOS_ASSERT(current_byte <= (INT_PTR) bytes_left_to_write);

		/ increase file size
		m_file_size += current_byte;
		read_buffer += current_byte;
		bytes_left_to_write -= current_byte;
	}
}

/ EOF

相关信息

greenplumn 源码目录

相关文章

greenplumn CFileDescriptor 源码

greenplumn CFileReader 源码

greenplumn COstream 源码

greenplumn COstreamBasic 源码

greenplumn COstreamStdString 源码

greenplumn COstreamString 源码

greenplumn ioutils 源码

^