mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-01 00:43:03 +01:00
fc12495d0e
1. Never allocate empty statement - always use att->prepare() to create statement interface 2. Separated IStatement into 2 parts - statement itself and resultset. 3. Added stmt->openCursor() (and att->openCursor() for unprepared statements) to create IResultSet. 4. Always use IMessageMetadata (former IParametersMetadata) to pass message fromat info from client, therefore avoiding need in BLR generation in client applications.
121 lines
3.0 KiB
C++
121 lines
3.0 KiB
C++
/*
|
|
* The contents of this file are subject to the Interbase 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.Inprise.com/IPL.html
|
|
*
|
|
* Software distributed under the License is distributed on an
|
|
* "AS IS" basis, 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 Inprise Corporation
|
|
* and its predecessors. Portions created by Inprise Corporation are
|
|
* Copyright (C) Inprise Corporation.
|
|
*
|
|
* All Rights Reserved.
|
|
* Contributor(s): ______________________________________.
|
|
* Adriano dos Santos Fernandes - refactored from others modules.
|
|
*/
|
|
|
|
#include "firebird.h"
|
|
#include "consts_pub.h"
|
|
#include "dyn_consts.h"
|
|
#include "gen/iberror.h"
|
|
#include "../common/classes/BlrWriter.h"
|
|
#include "../jrd/blr.h"
|
|
|
|
|
|
namespace Firebird {
|
|
|
|
|
|
// Write out a string valued attribute.
|
|
void BlrWriter::appendString(UCHAR verb, const char* string, USHORT length)
|
|
{
|
|
// TMN: Doesn't this look pretty awkward? If we are given
|
|
// a verb, the length is a ushort, else it's uchar.
|
|
if (verb)
|
|
{
|
|
appendUChar(verb);
|
|
appendUShort(length);
|
|
}
|
|
else
|
|
{
|
|
fb_assert(length <= MAX_UCHAR);
|
|
appendUChar(length);
|
|
}
|
|
|
|
if (string)
|
|
appendBytes(reinterpret_cast<const UCHAR*>(string), length);
|
|
}
|
|
|
|
// Input
|
|
// blr_ptr: current position of blr being generated
|
|
// verb: blr byte of which number is an argument
|
|
// number: value to be written to blr
|
|
// Function
|
|
// Write out a numeric valued attribute.
|
|
void BlrWriter::appendNumber(UCHAR verb, SSHORT number)
|
|
{
|
|
if (verb)
|
|
appendUChar(verb);
|
|
|
|
appendUShortWithLength(number);
|
|
}
|
|
|
|
void BlrWriter::appendUShortWithLength(USHORT val)
|
|
{
|
|
// append an USHORT value, prepended with the USHORT length of an USHORT
|
|
appendUShort(2);
|
|
appendUShort(val);
|
|
}
|
|
|
|
void BlrWriter::appendULongWithLength(ULONG val)
|
|
{
|
|
// append an ULONG value, prepended with the USHORT length of an ULONG
|
|
appendUShort(4);
|
|
appendULong(val);
|
|
}
|
|
|
|
void BlrWriter::appendVersion()
|
|
{
|
|
appendUChar(isVersion4() ? blr_version4 : blr_version5);
|
|
}
|
|
|
|
// Write out a string of blr as part of a ddl string, as in a view or computed field definition.
|
|
void BlrWriter::beginBlr(UCHAR verb)
|
|
{
|
|
if (verb)
|
|
appendUChar(verb);
|
|
|
|
baseOffset = blrData.getCount();
|
|
|
|
// put in a place marker for the size of the blr, since it is unknown
|
|
appendUShort(0);
|
|
appendVersion();
|
|
}
|
|
|
|
// Complete the stuffing of a piece of blr by going back and inserting the length.
|
|
void BlrWriter::endBlr()
|
|
{
|
|
appendUChar(blr_eoc);
|
|
|
|
// go back and stuff in the proper length
|
|
|
|
UCHAR* blr_base = &blrData[baseOffset];
|
|
const ULONG length = (blrData.getCount() - baseOffset) - 2;
|
|
|
|
if (length > 0xFFFF)
|
|
raiseError(Arg::Gds(isc_too_big_blr) << Arg::Num(length) << Arg::Num(0xFFFF));
|
|
|
|
*blr_base++ = (UCHAR) length;
|
|
*blr_base = (UCHAR) (length >> 8);
|
|
}
|
|
|
|
void BlrWriter::raiseError(const Arg::StatusVector& vector)
|
|
{
|
|
vector.raise();
|
|
}
|
|
|
|
} // namespace Jrd
|