mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-02 10:40:38 +01:00
Small refactoring.
This commit is contained in:
parent
7ef0a0aa14
commit
15e4367810
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -190,7 +190,6 @@ public:
|
||||
ULONG sizeLimit;
|
||||
};
|
||||
|
||||
void clearRecord(Record*);
|
||||
void putField(thread_db*, Record*, const DumpField&, int);
|
||||
|
||||
private:
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user