75 lines
2.3 KiB
C

/*
Copyright (c) 2015, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
#ifndef XA_AUX_H
#define XA_AUX_H
#include "m_string.h" // _dig_vec_lower
/**
Function serializes XID which is characterized by by four last arguments
of the function.
Serialized XID is presented in valid hex format and is returned to
the caller in a buffer pointed by the first argument.
The buffer size provived by the caller must be not less than
8 + 2 * XIDDATASIZE + 4 * sizeof(XID::formatID) + 1, see
XID::serialize_xid() that is a caller and plugin.h for XID declaration.
@param buf pointer to a buffer allocated for storing serialized data
@param fmt formatID value
@param gln gtrid_length value
@param bln bqual_length value
@param dat data value
@return the value of the buffer pointer
*/
inline char *serialize_xid(char *buf, long fmt, long gln, long bln,
const char *dat)
{
int i;
char *c= buf;
/*
Build a string like following pattern:
X'hex11hex12...hex1m',X'hex21hex22...hex2n',11
and store it into buf.
Here hex1i and hex2k are hexadecimals representing XID's internal
raw bytes (1 <= i <= m, 1 <= k <= n), and `m' and `n' even numbers
half of which corresponding to the lengths of XID's components.
*/
*c++= 'X';
*c++= '\'';
for (i= 0; i < gln; i++)
{
*c++=_dig_vec_lower[((uchar*) dat)[i] >> 4];
*c++=_dig_vec_lower[((uchar*) dat)[i] & 0x0f];
}
*c++= '\'';
*c++= ',';
*c++= 'X';
*c++= '\'';
for (; i < gln + bln; i++)
{
*c++=_dig_vec_lower[((uchar*) dat)[i] >> 4];
*c++=_dig_vec_lower[((uchar*) dat)[i] & 0x0f];
}
*c++= '\'';
sprintf(c, ",%lu", fmt);
return buf;
}
#endif /* XA_AUX_H */