mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-24 04:03:03 +01:00
Better assertions, code simplification and minor optimization
This commit is contained in:
parent
5a5a76c56d
commit
a1c2fbc1c8
@ -501,7 +501,7 @@ static void get_trigger_dependencies(DeferredWork*, bool, jrd_tra*);
|
||||
static void load_trigs(thread_db*, jrd_rel*, TrigVector**);
|
||||
static Format* make_format(thread_db*, jrd_rel*, USHORT *, TemporaryField*);
|
||||
static void put_summary_blob(thread_db* tdbb, blb*, enum rsr_t, bid*, jrd_tra*);
|
||||
static void put_summary_record(thread_db* tdbb, blb*, enum rsr_t, const UCHAR*, USHORT);
|
||||
static void put_summary_record(thread_db* tdbb, blb*, enum rsr_t, const UCHAR*, ULONG);
|
||||
static void setup_array(thread_db*, blb*, const TEXT*, USHORT, TemporaryField*);
|
||||
static blb* setup_triggers(thread_db*, jrd_rel*, bool, TrigVector**, blb*);
|
||||
static void setup_trigger_details(thread_db*, jrd_rel*, blb*, TrigVector**, const TEXT*, bool);
|
||||
@ -6204,13 +6204,18 @@ static void put_summary_blob(thread_db* tdbb, blb* blob, rsr_t type, bid* blob_i
|
||||
|
||||
// Go ahead and open blob
|
||||
blb* blr = blb::open(tdbb, transaction, blob_id);
|
||||
fb_assert(blr->blb_length <= MAX_USHORT);
|
||||
|
||||
USHORT length = (USHORT) blr->blb_length;
|
||||
HalfStaticArray<UCHAR, 128> buffer;
|
||||
ULONG length = blr->blb_length;
|
||||
// We cannot deal with chunks longer than a max blob segment (minus one)
|
||||
fb_assert(length < MAX_USHORT);
|
||||
|
||||
length = (USHORT) blr->BLB_get_data(tdbb, buffer.getBuffer(length), (SLONG) length);
|
||||
put_summary_record(tdbb, blob, type, buffer.begin(), length);
|
||||
HalfStaticArray<UCHAR, BUFFER_TINY> buffer;
|
||||
UCHAR* p = buffer.getBuffer(length + 1);
|
||||
*p++ = (UCHAR) type;
|
||||
|
||||
length = blr->BLB_get_data(tdbb, p, length);
|
||||
|
||||
blob->BLB_put_segment(tdbb, buffer.begin(), length + 1);
|
||||
}
|
||||
|
||||
|
||||
@ -6218,7 +6223,7 @@ static void put_summary_record(thread_db* tdbb,
|
||||
blb* blob,
|
||||
rsr_t type,
|
||||
const UCHAR* data,
|
||||
USHORT length)
|
||||
ULONG length)
|
||||
{
|
||||
/**************************************
|
||||
*
|
||||
@ -6230,31 +6235,17 @@ static void put_summary_record(thread_db* tdbb,
|
||||
* Put an attribute record to the relation summary blob.
|
||||
*
|
||||
**************************************/
|
||||
// We cannot deal with chunks longer than a max blob segment (minus one)
|
||||
fb_assert(length < MAX_USHORT);
|
||||
|
||||
SET_TDBB(tdbb);
|
||||
|
||||
fb_assert(length < MAX_USHORT); // otherwise length + 1 wraps. Or do we bugcheck???
|
||||
UCHAR temp[129];
|
||||
|
||||
UCHAR* const buffer = ((size_t) (length + 1) > sizeof(temp)) ?
|
||||
FB_NEW_POOL(*getDefaultMemoryPool()) UCHAR[length + 1] : temp;
|
||||
|
||||
UCHAR* p = buffer;
|
||||
HalfStaticArray<UCHAR, BUFFER_TINY> buffer;
|
||||
UCHAR* p = buffer.getBuffer(length + 1);
|
||||
*p++ = (UCHAR) type;
|
||||
memcpy(p, data, length);
|
||||
|
||||
try {
|
||||
blob->BLB_put_segment(tdbb, buffer, length + 1);
|
||||
}
|
||||
catch (const Firebird::Exception&)
|
||||
{
|
||||
if (buffer != temp)
|
||||
delete[] buffer;
|
||||
throw;
|
||||
}
|
||||
|
||||
if (buffer != temp)
|
||||
delete[] buffer;
|
||||
blob->BLB_put_segment(tdbb, buffer.begin(), length + 1);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user