Move length-encoded integer/string functions to maxsql

This commit is contained in:
Esa Korhonen
2018-11-29 14:41:10 +02:00
parent 5e03ff35eb
commit 655e5fab5b
12 changed files with 170 additions and 173 deletions

View File

@ -33,126 +33,6 @@
#include <maxscale/alloc.h>
#include <maxscale/config.hh>
/**
* @brief Calculate the length of a length-encoded integer in bytes
*
* @param ptr Start of the length encoded value
* @return Number of bytes before the actual value
*/
size_t mxs_leint_bytes(const uint8_t* ptr)
{
uint8_t val = *ptr;
if (val < 0xfb)
{
return 1;
}
else if (val == 0xfc)
{
return 3;
}
else if (val == 0xfd)
{
return 4;
}
else
{
return 9;
}
}
/**
* @brief Converts a length-encoded integer to @c uint64_t
*
* @see https://dev.mysql.com/doc/internals/en/integer.html
* @param c Pointer to the first byte of a length-encoded integer
* @return The value converted to a standard unsigned integer
*/
uint64_t mxs_leint_value(const uint8_t* c)
{
uint64_t sz = 0;
if (*c < 0xfb)
{
sz = *c;
}
else if (*c == 0xfc)
{
memcpy(&sz, c + 1, 2);
}
else if (*c == 0xfd)
{
memcpy(&sz, c + 1, 3);
}
else if (*c == 0xfe)
{
memcpy(&sz, c + 1, 8);
}
else
{
mxb_assert(*c == 0xff);
MXS_ERROR("Unexpected length encoding '%x' encountered when reading "
"length-encoded integer.",
*c);
}
return sz;
}
/**
* Converts a length-encoded integer into a standard unsigned integer
* and advances the pointer to the next unrelated byte.
*
* @param c Pointer to the first byte of a length-encoded integer
*/
uint64_t mxs_leint_consume(uint8_t** c)
{
uint64_t rval = mxs_leint_value(*c);
*c += mxs_leint_bytes(*c);
return rval;
}
/**
* @brief Consume and duplicate a length-encoded string
*
* Converts a length-encoded string to a C string and advances the pointer to
* the first byte after the string. The caller is responsible for freeing
* the returned string.
* @param c Pointer to the first byte of a valid packet.
* @return The newly allocated string or NULL if memory allocation failed
*/
char* mxs_lestr_consume_dup(uint8_t** c)
{
uint64_t slen = mxs_leint_consume(c);
char* str = (char*)MXS_MALLOC((slen + 1) * sizeof(char));
if (str)
{
memcpy(str, *c, slen);
str[slen] = '\0';
*c += slen;
}
return str;
}
/**
* @brief Consume a length-encoded string
*
* Converts length-encoded strings to character strings and advanced
* the pointer to the next unrelated byte.
* @param c Pointer to the start of the length-encoded string
* @param size Pointer to a variable where the size of the string is stored
* @return Pointer to the start of the string
*/
char* mxs_lestr_consume(uint8_t** c, size_t* size)
{
uint64_t slen = mxs_leint_consume(c);
*size = slen;
char* start = (char*) *c;
*c += slen;
return start;
}
MYSQL* mxs_mysql_real_connect(MYSQL* con, SERVER* server, const char* user, const char* passwd)
{
auto ssl = server->ssl().config();