8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:40:38 +01:00

Small refactoring.

This commit is contained in:
dimitr 2013-03-17 17:35:53 +00:00
parent 7ef0a0aa14
commit 15e4367810
15 changed files with 58 additions and 62 deletions

View File

@ -6758,13 +6758,7 @@ const StmtNode* StoreNode::store(thread_db* tdbb, jrd_req* request, WhichTrigger
// bug with incorrect blob sharing during insertion in
// a stored procedure.
memset(record->rec_data, 0, rpb->rpb_length);
// Initialize all fields to missing
SSHORT n = (format->fmt_count + 7) >> 3;
if (n)
memset(record->rec_data, 0xFF, n);
record->nullify();
return statement;
}
@ -8580,7 +8574,7 @@ static void cleanupRpb(thread_db* tdbb, record_param* rpb)
UCHAR* const p = record->rec_data + (IPTR) desc->dsc_address;
if (TEST_NULL(record, n))
if (record->isNull(n))
{
USHORT length = desc->dsc_length;

View File

@ -503,7 +503,7 @@ DatabaseSnapshot::DatabaseSnapshot(thread_db* tdbb, MemoryPool& pool)
if (buffer)
{
record = buffer->getTempRecord();
clearRecord(record);
record->nullify();
}
else
{
@ -611,17 +611,6 @@ RecordBuffer* DatabaseSnapshot::allocBuffer(thread_db* tdbb, MemoryPool& pool, i
}
void DataDump::clearRecord(Record* record)
{
fb_assert(record);
// Initialize all fields to NULLs
memset(record->rec_data, 0, record->rec_length);
const size_t null_bytes = (record->rec_format->fmt_count + 7u) >> 3;
memset(record->rec_data, 0xFF, null_bytes);
}
void DataDump::putField(thread_db* tdbb, Record* record, const DumpField& field, int charset)
{
fb_assert(record);
@ -728,7 +717,7 @@ void DataDump::putField(thread_db* tdbb, Record* record, const DumpField& field,
}
}
CLEAR_NULL(record, field.id);
record->clearNull(field.id);
}

View File

@ -190,7 +190,6 @@ public:
ULONG sizeLimit;
};
void clearRecord(Record*);
void putField(thread_db*, Record*, const DumpField&, int);
private:

View File

@ -662,10 +662,10 @@ void ExtEngineManager::Trigger::execute(thread_db* tdbb, ExternalTrigger::Action
dsc source = format->fmt_desc[i * 2];
source.dsc_address += (IPTR) p;
MOV_move(tdbb, &source, &target);
CLEAR_NULL(record, fieldPos);
record->clearNull(fieldPos);
}
else
SET_NULL(record, fieldPos);
record->setNull(fieldPos);
}
}
}

View File

@ -227,7 +227,7 @@ void UserManagement::Display::list(Auth::IUser* u)
void UserManagement::list(Auth::IUser* u)
{
Record* record = buffer->getTempRecord();
clearRecord(record);
record->nullify();
int attachment_charset = ttype_none;

View File

@ -1056,12 +1056,12 @@ void blb::move(thread_db* tdbb, dsc* from_desc, dsc* to_desc, const ValueExprNod
if ((request->req_flags & req_null) || source->isEmpty())
{
SET_NULL(record, id);
record->setNull(id);
destination->clear();
return;
}
CLEAR_NULL(record, id);
record->clearNull(id);
jrd_tra* transaction = request->req_transaction;
transaction = transaction->getOuter();

View File

@ -375,7 +375,7 @@ bool EVL_field(jrd_rel* relation, Record* record, USHORT id, dsc* desc)
desc->dsc_address = record->rec_data + (IPTR) desc->dsc_address;
if (TEST_NULL(record, id))
if (record->isNull(id))
{
desc->dsc_flags |= DSC_null;
return false;

View File

@ -414,9 +414,9 @@ void EXE_assignment(thread_db* tdbb, const ValueExprNode* to, dsc* from_desc, bo
Record* record = request->req_rpb[toField->fieldStream].rpb_record;
if (null)
SET_NULL(record, toField->fieldId);
record->setNull(toField->fieldId);
else
CLEAR_NULL(record, toField->fieldId);
record->clearNull(toField->fieldId);
}
else if (toParam && toParam->argFlag)
{
@ -1072,7 +1072,7 @@ void EXE_execute_triggers(thread_db* tdbb,
Record* const old_rec = old_rpb ? old_rpb->rpb_record : NULL;
Record* const new_rec = new_rpb ? new_rpb->rpb_record : NULL;
Record* null_rec = NULL;
AutoPtr<Record> null_rec;
if (!old_rec && !new_rec)
{
@ -1086,11 +1086,8 @@ void EXE_execute_triggers(thread_db* tdbb,
null_rec = FB_NEW_RPT(record->rec_pool, record->rec_length) Record(record->rec_pool);
null_rec->rec_length = record->rec_length;
null_rec->rec_format = record->rec_format;
// zero the record buffer
memset(null_rec->rec_data, 0, record->rec_length);
// initialize all fields to missing
const SSHORT n = (record->rec_format->fmt_count + 7) >> 3;
memset(null_rec->rec_data, 0xFF, n);
null_rec->nullify();
}
const Firebird::TimeStamp timestamp =
@ -1171,14 +1168,12 @@ void EXE_execute_triggers(thread_db* tdbb,
}
}
delete null_rec;
if (vector != *triggers) {
MET_release_triggers(tdbb, &vector);
}
}
catch (const Firebird::Exception&)
{
delete null_rec;
if (vector != *triggers) {
MET_release_triggers(tdbb, &vector);
}

View File

@ -385,7 +385,7 @@ bool EXT_get(thread_db* /*tdbb*/, record_param* rpb, FB_UINT64& position)
{
const jrd_fld* field = *itr;
SET_NULL(record, i);
record->setNull(i);
if (!desc_ptr->dsc_length || !field)
continue;
@ -401,7 +401,7 @@ bool EXT_get(thread_db* /*tdbb*/, record_param* rpb, FB_UINT64& position)
continue;
}
CLEAR_NULL(record, i);
record->clearNull(i);
}
return true;
@ -489,7 +489,7 @@ void EXT_store(thread_db* tdbb, record_param* rpb)
for (USHORT i = 0; i < format->fmt_count; ++i, ++field_ptr, ++desc_ptr)
{
const jrd_fld* field = *field_ptr;
if (field && !field->fld_computation && desc_ptr->dsc_length && TEST_NULL(record, i))
if (field && !field->fld_computation && desc_ptr->dsc_length && record->isNull(i))
{
UCHAR* p = record->rec_data + (IPTR) desc_ptr->dsc_address;
LiteralNode* literal = ExprNode::as<LiteralNode>(field->fld_missing_value);

View File

@ -165,11 +165,11 @@ bool AggregatedStream::getRecord(thread_db* tdbb) const
desc = aggNode->winPass(tdbb, request, &window);
if (!desc)
SET_NULL(record, id);
record->setNull(id);
else
{
MOV_move(tdbb, desc, EVL_assign_to(tdbb, *target));
CLEAR_NULL(record, id);
record->clearNull(id);
}
}
}
@ -499,11 +499,11 @@ AggregatedStream::State AggregatedStream::evaluateGroup(thread_db* tdbb, Aggrega
desc = aggNode->execute(tdbb, request);
if (!desc || !desc->dsc_dtype)
SET_NULL(record, id);
record->setNull(id);
else
{
MOV_move(tdbb, desc, EVL_assign_to(tdbb, *target));
CLEAR_NULL(record, id);
record->clearNull(id);
}
}
}

View File

@ -172,7 +172,7 @@ bool BufferedStream::getRecord(thread_db* tdbb) const
record_param* const rpb = &request->req_rpb[map.map_stream];
CLEAR_NULL(buffer_record, i);
buffer_record->clearNull(i);
dsc to;
if (!EVL_field(NULL, buffer_record, (USHORT) i, &to))
@ -193,7 +193,7 @@ bool BufferedStream::getRecord(thread_db* tdbb) const
}
else
{
SET_NULL(buffer_record, i);
buffer_record->setNull(i);
}
}
break;
@ -237,7 +237,7 @@ bool BufferedStream::getRecord(thread_db* tdbb) const
if (!EVL_field(NULL, buffer_record, (USHORT) i, &from))
{
fb_assert(map.map_type == FieldMap::REGULAR_FIELD);
SET_NULL(record, map.map_id);
record->setNull(map.map_id);
continue;
}
@ -251,7 +251,7 @@ bool BufferedStream::getRecord(thread_db* tdbb) const
record->rec_format = record->rec_fmt_bk;
}
CLEAR_NULL(record, map.map_id);
record->clearNull(map.map_id);
dsc to;
if (!EVL_field(NULL, record, map.map_id, &to))

View File

@ -317,7 +317,7 @@ void ProcedureScan::assignParams(thread_db* tdbb,
if (indicator)
{
SET_NULL(record, to_id);
record->setNull(to_id);
const USHORT l = to_desc->dsc_length;
UCHAR* const p = record->rec_data + (IPTR) to_desc->dsc_address;
switch (to_desc->dsc_dtype)
@ -358,7 +358,7 @@ void ProcedureScan::assignParams(thread_db* tdbb,
}
else
{
CLEAR_NULL(record, to_id);
record->clearNull(to_id);
desc1 = *from_desc;
desc1.dsc_address = const_cast<UCHAR*>(msg) + (IPTR) desc1.dsc_address;
desc2 = *to_desc;

View File

@ -316,7 +316,7 @@ void SortedStream::mapData(thread_db* tdbb, jrd_req* request, UCHAR* data) const
for (const SortMap::Item* item = m_map->items.begin(); item < end_item; item++)
{
const UCHAR flag = *(data + item->flagOffset);
const bool flag = (*(data + item->flagOffset) == TRUE);
from = item->desc;
from.dsc_address = data + (IPTR) from.dsc_address;
@ -373,12 +373,12 @@ void SortedStream::mapData(thread_db* tdbb, jrd_req* request, UCHAR* data) const
if (flag)
{
SET_NULL(record, id);
record->setNull(id);
}
else
{
MOV_move(tdbb, &from, &to);
CLEAR_NULL(record, id);
record->clearNull(id);
}
}
}

View File

@ -132,10 +132,6 @@ const USHORT RPB_s_no_data = 0x04; // nobody is going to access the data
const USHORT RPB_s_undo_data = 0x08; // data got from undo log
const USHORT RPB_s_sweeper = 0x10; // garbage collector - skip swept pages
#define SET_NULL(record, id) record->rec_data [id >> 3] |= (1 << (id & 7))
#define CLEAR_NULL(record, id) record->rec_data [id >> 3] &= ~(1 << (id & 7))
#define TEST_NULL(record, id) record->rec_data [id >> 3] & (1 << (id & 7))
const unsigned int MAX_DIFFERENCES = 1024; // Max length of generated Differences string
// between two records
@ -165,6 +161,29 @@ public:
double rec_dummy; // this is to force next field to a double boundary
UCHAR rec_data[1]; // THIS VARIABLE MUST BE ALIGNED ON A DOUBLE BOUNDARY
};
void setNull(USHORT id)
{
rec_data[id >> 3] |= (1 << (id & 7));
}
void clearNull(USHORT id)
{
rec_data[id >> 3] &= ~(1 << (id & 7));
}
bool isNull(USHORT id)
{
return ((rec_data[id >> 3] & (1 << (id & 7))) != 0);
}
void nullify()
{
// Zero the record buffer and initialize all fields to NULLs
const size_t null_bytes = (rec_format->fmt_count + 7) >> 3;
memset(rec_data, 0xFF, null_bytes);
memset(rec_data + null_bytes, 0, rec_length - null_bytes);
}
};
// rec_flags

View File

@ -1077,7 +1077,7 @@ void VIO_copy_record(thread_db* tdbb, record_param* org_rpb, record_param* new_r
for (USHORT i = 0; i < new_record->rec_format->fmt_count; i++)
{
CLEAR_NULL(new_record, i);
new_record->clearNull(i);
if (EVL_field(new_rpb->rpb_relation, new_record, i, &new_desc))
{
@ -1087,7 +1087,7 @@ void VIO_copy_record(thread_db* tdbb, record_param* org_rpb, record_param* new_r
}
else
{
SET_NULL(new_record, i);
new_record->setNull(i);
if (new_desc.dsc_dtype)
{
@ -5400,7 +5400,7 @@ static SSHORT set_metadata_id(thread_db* tdbb, Record* record, USHORT field_id,
dsc desc2;
desc2.makeShort(0, &value);
MOV_move(tdbb, &desc2, &desc1);
CLEAR_NULL(record, field_id);
record->clearNull(field_id);
return value;
}
@ -5427,7 +5427,7 @@ static void set_security_class(thread_db* tdbb, Record* record, USHORT field_id)
dsc desc2;
desc2.makeText((USHORT) name.length(), CS_ASCII, (UCHAR*) name.c_str());
MOV_move(tdbb, &desc2, &desc1);
CLEAR_NULL(record, field_id);
record->clearNull(field_id);
}
}
@ -5453,7 +5453,7 @@ static void set_system_flag(thread_db* tdbb, Record* record, USHORT field_id, SS
dsc desc2;
desc2.makeShort(0, &flag);
MOV_move(tdbb, &desc2, &desc1);
CLEAR_NULL(record, field_id);
record->clearNull(field_id);
}