greenplumn CFileWriter 源码
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
相关信息
相关文章
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦