You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/lib/proxysql_find_charset.cpp

127 lines
4.4 KiB

#include "proxysql_find_charset.h"
// 'proxysql_structs.h'
///////////////////////////////////////////////////////////////////////////////
#include <cstdint>
#include "openssl/ssl.h"
#include "proxysql_structs.h"
///////////////////////////////////////////////////////////////////////////////
#include <string.h>
const MARIADB_CHARSET_INFO * proxysql_find_charset_nr(unsigned int nr) {
const MARIADB_CHARSET_INFO * c = mariadb_compiled_charsets;
do {
if (c->nr == nr) {
return c;
}
++c;
} while (c[0].nr != 0);
return NULL;
}
/**
* @brief Finds the default (first) collation for the supplied 'charset name'.
* @details Previously, this function just returned the first collation found (default). Since v2.5.3, this
* function takes into consideration the thread variable 'SQL_COLLATION_CONNECTION'
* ('mysql-default_collation_connection'). This was introduced for being able to serve the same default
* collation as the server (for bootstrap mode) in case it's detected to be a MySQL 8
* ('utf8mb4_0900_ai_ci'), instead of the retrocompatible default collation ('utf8mb4_general_ci'). This
* change also allows users to select the default collation that they please for a particular charset, if
* the collection specified via 'mysql-default_collation_connection', isn't found, the first found collation
* (original default) will be retrieved.
* @param name The 'charset name' for which to find the default collation.
* @return The collation found, NULL if none is find.
*/
MARIADB_CHARSET_INFO * proxysql_find_charset_name(const char *name_) {
const char* default_collation = mysql_thread___default_variables[SQL_COLLATION_CONNECTION];
MARIADB_CHARSET_INFO *c = (MARIADB_CHARSET_INFO *)mariadb_compiled_charsets;
MARIADB_CHARSET_INFO* charset_collation = nullptr;
const char *name;
if (strcasecmp(name_,(const char *)"utf8mb3")==0) {
name = (const char *)"utf8";
} else {
name = name_;
}
do {
if (!strcasecmp(c->csname, name)) {
if (charset_collation == nullptr) {
charset_collation = c;
}
if (default_collation == nullptr) {
charset_collation = c;
break;
} else {
if (!strcmp(default_collation, c->name)) {
charset_collation = c;
break;
}
}
}
++c;
} while (c[0].nr != 0);
return charset_collation;
}
/**
* @brief Find charset and collation information based on the given charset name and collation name.
*
* This function searches for charset and collation information in the compiled charsets based on the provided
* charset name and collation name. It performs case-insensitive comparisons to find a match.
*
* @param csname_ The name of the charset.
* @param collatename_ The name of the collation.
* @return A pointer to the MARIADB_CHARSET_INFO structure representing the charset and collation information
* if a match is found. If no matching charset and collation are found, it returns NULL.
*/
MARIADB_CHARSET_INFO * proxysql_find_charset_collate_names(const char *csname_, const char *collatename_) {
MARIADB_CHARSET_INFO *c = (MARIADB_CHARSET_INFO *)mariadb_compiled_charsets;
char buf[64];
const char *csname;
const char *collatename;
if (strcasecmp(csname_,(const char *)"utf8mb3")==0) {
csname = (const char *)"utf8";
} else {
csname = csname_;
}
if (strncasecmp(collatename_,(const char *)"utf8mb3", 7)==0) {
memcpy(buf,(const char *)"utf8",4);
strcpy(buf+4,collatename_+7);
collatename = buf;
} else {
collatename = collatename_;
}
do {
if (!strcasecmp(c->csname, csname) && !strcasecmp(c->name, collatename)) {
return c;
}
++c;
} while (c[0].nr != 0);
return NULL;
}
/**
* @brief Find charset and collation information based on the given collation name.
*
* This function searches for charset and collation information in the compiled charsets based on the provided
* collation name. It performs case-insensitive comparisons to find a match.
*
* @param collatename The name of the collation to search for.
* @return A pointer to the MARIADB_CHARSET_INFO structure representing the charset and collation information
* if a match is found. If no matching collation is found, it returns NULL.
*/
MARIADB_CHARSET_INFO * proxysql_find_charset_collate(const char *collatename) {
MARIADB_CHARSET_INFO *c = (MARIADB_CHARSET_INFO *)mariadb_compiled_charsets;
do {
if (!strcasecmp(c->name, collatename)) {
return c;
}
++c;
} while (c[0].nr != 0);
return NULL;
}