Skip to content

Commit 4fa00f1

Browse files
committed
Improvement #8356 : Make Trace use HEX representation for parameter values ​​of types [VAR]CHAR CHARACTER SET OCTETS and [VAR]BINARY.
1 parent b4c5b07 commit 4fa00f1

File tree

3 files changed

+77
-64
lines changed

3 files changed

+77
-64
lines changed

src/jrd/trace/TraceObjects.cpp

Lines changed: 67 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,67 @@
5656

5757
using namespace Firebird;
5858

59+
namespace
60+
{
61+
62+
// Convert text descriptor into UTF8 string.
63+
// Binary data converted into HEX representation.
64+
bool descToUTF8(const dsc* param, string& result)
65+
{
66+
UCHAR* address;
67+
USHORT length;
68+
69+
switch (param->dsc_dtype)
70+
{
71+
case dtype_text:
72+
address = param->dsc_address;
73+
length = param->dsc_length;
74+
break;
75+
76+
case dtype_varying:
77+
address = param->dsc_address + sizeof(USHORT);
78+
length = *(USHORT*) param->dsc_address;
79+
fb_assert(length <= param->dsc_length - 2);
80+
break;
81+
82+
default:
83+
return false;
84+
}
85+
86+
if (param->getCharSet() == CS_BINARY)
87+
{
88+
// Convert OCTETS and [VAR]BINARY to HEX string
89+
90+
char* hex = result.getBuffer(length * 2);
91+
92+
for (const UCHAR* p = address; p < address + length; p++)
93+
{
94+
UCHAR c = (*p & 0xF0) >> 4;
95+
*hex++ = c + (c < 10 ? '0' : 'A' - 10);
96+
97+
c = (*p & 0x0F);
98+
*hex++ = c + (c < 10 ? '0' : 'A' - 10);
99+
}
100+
return result.c_str();
101+
}
102+
103+
string src(address, length);
104+
105+
try
106+
{
107+
if (!Jrd::DataTypeUtil::convertToUTF8(src, result, param->dsc_sub_type, status_exception::raise))
108+
result = src;
109+
}
110+
catch (const Firebird::Exception&)
111+
{
112+
result = src;
113+
}
114+
115+
return true;
116+
}
117+
118+
} // namespace
119+
59120
namespace Jrd {
60121

61122
const char* StatementHolder::ensurePlan(bool explained)
@@ -287,38 +348,11 @@ const dsc* TraceSQLStatementImpl::DSQLParamsImpl::getParam(FB_SIZE_T idx)
287348
const char* TraceSQLStatementImpl::DSQLParamsImpl::getTextUTF8(CheckStatusWrapper* status, FB_SIZE_T idx)
288349
{
289350
const dsc* param = getParam(idx);
290-
UCHAR* address;
291-
USHORT length;
292351

293-
switch (param->dsc_dtype)
294-
{
295-
case dtype_text:
296-
address = param->dsc_address;
297-
length = param->dsc_length;
298-
break;
299-
300-
case dtype_varying:
301-
address = param->dsc_address + sizeof(USHORT);
302-
length = *(USHORT*) param->dsc_address;
303-
break;
304-
305-
default:
306-
return NULL;
307-
}
352+
if (descToUTF8(param, m_tempUTF8))
353+
return m_tempUTF8.c_str();
308354

309-
string src(address, length);
310-
311-
try
312-
{
313-
if (!DataTypeUtil::convertToUTF8(src, temp_utf8_text, param->dsc_sub_type, status_exception::raise))
314-
temp_utf8_text = src;
315-
}
316-
catch (const Firebird::Exception&)
317-
{
318-
temp_utf8_text = src;
319-
}
320-
321-
return temp_utf8_text.c_str();
355+
return nullptr;
322356
}
323357

324358

@@ -351,38 +385,11 @@ const dsc* TraceParamsImpl::getParam(FB_SIZE_T idx)
351385
const char* TraceParamsImpl::getTextUTF8(CheckStatusWrapper* status, FB_SIZE_T idx)
352386
{
353387
const dsc* param = getParam(idx);
354-
UCHAR* address;
355-
USHORT length;
356388

357-
switch (param->dsc_dtype)
358-
{
359-
case dtype_text:
360-
address = param->dsc_address;
361-
length = param->dsc_length;
362-
break;
363-
364-
case dtype_varying:
365-
address = param->dsc_address + sizeof(USHORT);
366-
length = *(USHORT*) param->dsc_address;
367-
break;
368-
369-
default:
370-
return NULL;
371-
}
372-
373-
string src(address, length);
374-
375-
try
376-
{
377-
if (!DataTypeUtil::convertToUTF8(src, temp_utf8_text, param->dsc_sub_type, status_exception::raise))
378-
temp_utf8_text = src;
379-
}
380-
catch (const Firebird::Exception&)
381-
{
382-
temp_utf8_text = src;
383-
}
389+
if (descToUTF8(param, m_tempUTF8))
390+
return m_tempUTF8.c_str();
384391

385-
return temp_utf8_text.c_str();
392+
return nullptr;
386393
}
387394

388395

src/jrd/trace/TraceObjects.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ class TraceSQLStatementImpl :
267267
DsqlRequest* const m_stmt;
268268
const Firebird::Array<dsql_par*>* m_params = nullptr;
269269
Firebird::HalfStaticArray<dsc, 16> m_descs;
270-
Firebird::string temp_utf8_text;
270+
Firebird::string m_tempUTF8;
271271
};
272272

273273
DsqlRequest* const m_stmt;
@@ -340,7 +340,7 @@ class TraceParamsImpl :
340340

341341
private:
342342
TraceDescriptors* m_descs;
343-
Firebird::string temp_utf8_text;
343+
Firebird::string m_tempUTF8;
344344
};
345345

346346

src/utilities/ntrace/TracePluginImpl.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,13 +829,19 @@ void TracePluginImpl::appendParams(ITraceParams* params)
829829
switch (parameters->dsc_dtype)
830830
{
831831
case dtype_text:
832-
paramtype.printf("char(%d)", parameters->dsc_length);
832+
if (parameters->getTextType() == fb_text_subtype_binary)
833+
paramtype.printf("binary(%d)", parameters->dsc_length);
834+
else
835+
paramtype.printf("char(%d)", parameters->dsc_length);
833836
break;
834837
case dtype_cstring:
835838
paramtype.printf("cstring(%d)", parameters->dsc_length - 1);
836839
break;
837840
case dtype_varying:
838-
paramtype.printf("varchar(%d)", parameters->dsc_length - 2);
841+
if (parameters->getTextType() == fb_text_subtype_binary)
842+
paramtype.printf("varbinary(%d)", parameters->dsc_length - 2);
843+
else
844+
paramtype.printf("varchar(%d)", parameters->dsc_length - 2);
839845
break;
840846
case dtype_blob:
841847
paramtype = "blob";

0 commit comments

Comments
 (0)