8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-31 10:43:02 +01:00
firebird-mirror/src/jrd/RecordBuffer.cpp
dimitr 6ae3e2cbaf 1) Fixed CORE-4383: Index and BLOBs garbage collection doesn't work for update_in_place().
2) Applied the same approach to temporary GC records.
3) Refactored the Record class to avoid reallocations, to improve encapsulation and to simplify the code.
4) Slightly refactored UndoItem to isolate its logic from the Record class.
5) Reduced the in-memory size of the undo log.
6) Slightly better alternative to the legacy NULL reporting for outer joins.
7) Minor fixes and adjustments in BufferedStream.
2015-02-19 14:15:00 +00:00

74 lines
1.8 KiB
C++

/*
* The contents of this file are subject to the Initial
* Developer's Public License Version 1.0 (the "License");
* you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
* http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
*
* Software distributed under the License is distributed AS IS,
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
* See the License for the specific language governing rights
* and limitations under the License.
*
* The Original Code was created by Dmitry Yemanov
* for the Firebird Open Source RDBMS project.
*
* Copyright (c) 2006 Dmitry Yemanov <dimitr@users.sf.net>
* and all contributors signed below.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#include "firebird.h"
#include "../common/gdsassert.h"
#include "../jrd/jrd.h"
#include "../jrd/req.h"
#include "../jrd/RecordBuffer.h"
const char* const SCRATCH = "fb_recbuf_";
using namespace Jrd;
RecordBuffer::RecordBuffer(MemoryPool& pool, const Format* format)
: count(0)
{
space = FB_NEW(pool) TempSpace(pool, SCRATCH);
record = FB_NEW(pool) Record(pool, format);
}
RecordBuffer::~RecordBuffer()
{
delete record;
delete space;
}
offset_t RecordBuffer::store(const Record* new_record)
{
const ULONG length = record->getLength();
fb_assert(new_record->getLength() == length);
space->write(count * length, new_record->getData(), length);
return count++;
}
bool RecordBuffer::fetch(offset_t position, Record* to_record)
{
const ULONG length = record->getLength();
fb_assert(to_record->getLength() == length);
if (position >= count)
return false;
space->read(position * length, to_record->getData(), length);
return true;
}
const Format* RecordBuffer::getFormat() const
{
return record->getFormat();
}