8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-28 03:23:03 +01:00
firebird-mirror/src/dsql/BlrDebugWriter.cpp
alexpeshkoff fc12495d0e Modified IStatement interface in our API:
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.
2013-02-17 12:08:53 +00:00

150 lines
3.9 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.
* Alex Peshkov
*/
#include "firebird.h"
#include "consts_pub.h"
#include "dyn_consts.h"
#include "gen/iberror.h"
#include "../jrd/jrd.h"
#include "../jrd/exe.h"
#include "../dsql/BlrDebugWriter.h"
#include "../dsql/StmtNodes.h"
#include "../dsql/dsql.h"
#include "../jrd/blr.h"
#include "../jrd/DebugInterface.h"
#include "../dsql/errd_proto.h"
using namespace Firebird;
namespace Jrd {
void BlrDebugWriter::raiseError(const Arg::StatusVector& vector)
{
ERRD_post(vector);
}
void BlrDebugWriter::beginDebug()
{
fb_assert(debugData.isEmpty());
debugData.add(fb_dbg_version);
debugData.add(CURRENT_DBG_INFO_VERSION);
}
void BlrDebugWriter::endDebug()
{
debugData.add(fb_dbg_end);
}
void BlrDebugWriter::putDebugSrcInfo(ULONG line, ULONG col)
{
debugData.add(fb_dbg_map_src2blr);
debugData.add(line);
debugData.add(line >> 8);
debugData.add(line >> 16);
debugData.add(line >> 24);
debugData.add(col);
debugData.add(col >> 8);
debugData.add(col >> 16);
debugData.add(col >> 24);
const ULONG offset = (getBlrData().getCount() - getBaseOffset());
debugData.add(offset);
debugData.add(offset >> 8);
debugData.add(offset >> 16);
debugData.add(offset >> 24);
}
void BlrDebugWriter::putDebugVariable(USHORT number, const MetaName& name)
{
debugData.add(fb_dbg_map_varname);
debugData.add(number);
debugData.add(number >> 8);
USHORT len = MIN(name.length(), MAX_UCHAR);
debugData.add(len);
debugData.add(reinterpret_cast<const UCHAR*>(name.c_str()), len);
}
void BlrDebugWriter::putDebugArgument(UCHAR type, USHORT number, const TEXT* name)
{
fb_assert(name);
debugData.add(fb_dbg_map_argument);
debugData.add(type);
debugData.add(number);
debugData.add(number >> 8);
USHORT len = strlen(name);
if (len > MAX_UCHAR)
len = MAX_UCHAR;
debugData.add(len);
debugData.add(reinterpret_cast<const UCHAR*>(name), len);
}
void BlrDebugWriter::putDebugSubFunction(DeclareSubFuncNode* subFuncNode)
{
debugData.add(fb_dbg_subfunc);
dsql_udf* subFunc = subFuncNode->dsqlFunction;
const MetaName& name = subFunc->udf_name.identifier;
USHORT len = MIN(name.length(), MAX_UCHAR);
debugData.add(len);
debugData.add(reinterpret_cast<const UCHAR*>(name.c_str()), len);
HalfStaticArray<UCHAR, 128>& subDebugData = subFuncNode->blockScratch->debugData;
const ULONG count = ULONG(subDebugData.getCount());
debugData.add(UCHAR(count));
debugData.add(UCHAR(count >> 8));
debugData.add(UCHAR(count >> 16));
debugData.add(UCHAR(count >> 24));
debugData.add(subDebugData.begin(), count);
}
void BlrDebugWriter::putDebugSubProcedure(DeclareSubProcNode* subProcNode)
{
debugData.add(fb_dbg_subproc);
dsql_prc* subProc = subProcNode->dsqlProcedure;
const MetaName& name = subProc->prc_name.identifier;
USHORT len = MIN(name.length(), MAX_UCHAR);
debugData.add(len);
debugData.add(reinterpret_cast<const UCHAR*>(name.c_str()), len);
HalfStaticArray<UCHAR, 128>& subDebugData = subProcNode->blockScratch->debugData;
const ULONG count = ULONG(subDebugData.getCount());
debugData.add(UCHAR(count));
debugData.add(UCHAR(count >> 8));
debugData.add(UCHAR(count >> 16));
debugData.add(UCHAR(count >> 24));
debugData.add(subDebugData.begin(), count);
}
} // namespace Jrd