API динамических столбцов
Эта страница описывает API клиентской части для чтения и записи блобов динамических столбцов.
Обычно следует использовать функции динамических столбцов, которые выполняются внутри сервера MariaDB и позволяют получить доступ к содержимому динамических столбцов без каких-либо клиентских библиотек.
Если по какой-либо причине вам необходимо читать/записывать блоки динамических столбцов на клиенте, этот API предоставляет такую возможность.
Где получить
API является частью libmysql библиотеки клиента C. Для его использования необходимо включить этот заголовочный файл
#include <mysql/ma_dyncol.h>
и связать его с libmysql.
Структуры данных
DYNAMIC_COLUMN
DYNAMIC_COLUMN представляет собой упакованный блок динамического столбца. По сути, это строка с длиной, определенная следующим образом:
/* A generic-purpose arbitrary-length string defined in MySQL Client API */
typedef struct st_dynamic_string
{
char *str;
size_t length,max_length,alloc_increment;
} DYNAMIC_STRING;
...
typedef DYNAMIC_STRING DYNAMIC_COLUMN;
DYNAMIC_COLUMN_VALUE
Блок динамических столбцов хранит пары {имя, значение}. Для представления значения в доступной форме используется структура DYNAMIC_COLUMN_VALUE.
struct st_dynamic_column_value
{
DYNAMIC_COLUMN_TYPE type;
union
{
long long long_value;
unsigned long long ulong_value;
double double_value;
struct {
MYSQL_LEX_STRING value;
CHARSET_INFO *charset;
} string;
struct {
decimal_digit_t buffer[DECIMAL_BUFF_LENGTH];
decimal_t value;
} decimal;
MYSQL_TIME time_value;
} x;
};
typedef struct st_dynamic_column_value DYNAMIC_COLUMN_VALUE;
Каждое значение имеет тип, который определяется членом type.
| тип | поле структуры |
|---|---|
DYN_COL_NULL |
- |
DYN_COL_INT |
value.x.long_value |
DYN_COL_UINT |
value.x.ulong_value |
DYN_COL_DOUBLE |
value.x.double_value |
DYN_COL_STRING |
value.x.string.value, value.x.string.charset
|
DYN_COL_DECIMAL |
value.x.decimal.value |
DYN_COL_DATETIME |
value.x.time_value |
DYN_COL_DATE |
value.x.time_value |
DYN_COL_TIME |
value.x.time_value |
DYN_COL_DYNCOL |
value.x.string.value |
Примечания
- Значения с типом
DYN_COL_NULLникогда не встречаются в блоках динамических столбцов. - Тип
DYN_COL_DYNCOLозначает, что значение является упакованным динамическим блоком. Именно так реализуются вложенные динамические столбцы. - Перед сохранением значения в
value.x.decimal.value, необходимо вызватьmariadb_dyncol_prepare_decimal()для инициализации места хранения.
enum_dyncol_func_result
enum enum_dyncol_func_result используется в качестве возвращаемого значения.
| значение | имя | значение |
|---|---|---|
| 0 | ER_DYNCOL_OK |
OK |
| 0 | ER_DYNCOL_NO |
(то же, что и ER_DYNCOL_OK, но для функций, возвращающих ДА/НЕТ) |
| 1 | ER_DYNCOL_YES |
Ответ ДА или успех |
| 2 | ER_DYNCOL_TRUNCATED |
Операция выполнена успешно, но данные были усечены |
| -1 | ER_DYNCOL_FORMAT |
Неправильный формат закодированной строки |
| -2 | ER_DYNCOL_LIMIT |
Превышен предел реализации |
| -3 | ER_DYNCOL_RESOURCE |
Недостаточно ресурсов |
| -4 | ER_DYNCOL_DATA |
Неправильные входные данные |
| -5 | ER_DYNCOL_UNKNOWN_CHARSET |
Неизвестный набор символов |
Код результата, меньший нуля, представляет собой условия ошибки.
Справочник по функциям
Функции представлены парами:
-
xxx()работает со старым (до MariaDB-10.0.1) форматом блоков динамических столбцов, где столбцы идентифицируются по номерам. -
xxx_named()может работать как со старым, так и с новым форматом данных. Если она изменяет блок, она преобразует его в новый формат данных.
Следует использовать функции xxx_named(), если нет необходимости сохранять совместимость данных с версиями MariaDB до 10.0.1.
mariadb_dyncol_create_many
Создает упакованный динамический блок из массивов значений и имён.
enum enum_dyncol_func_result
mariadb_dyncol_create_many(DYNAMIC_COLUMN *str,
uint column_count,
uint *column_numbers,
DYNAMIC_COLUMN_VALUE *values,
my_bool new_string);
enum enum_dyncol_func_result
mariadb_dyncol_create_many_named(DYNAMIC_COLUMN *str,
uint column_count,
MYSQL_LEX_STRING *column_keys,
DYNAMIC_COLUMN_VALUE *values,
my_bool new_string);
где
str |
OUT |
Упакованный динамический блок будет помещён сюда |
column_count |
IN |
Количество столбцов |
column_numbers |
IN |
Массив номеров столбцов (старый формат) |
column_keys |
IN |
Массив имён столбцов (новый формат) |
values |
IN |
Массив значений столбцов |
new_string |
IN |
Если TRUE, то str будет повторно инициализирован (а не освобождён) перед использованием |
mariadb_dyncol_update_many
Добавляет или обновляет столбцы в блоке динамических столбцов. Для удаления столбца обновите его значение до «нет значения» типа DYN_COL_NULL
enum enum_dyncol_func_result
mariadb_dyncol_update_many(DYNAMIC_COLUMN *str,
uint column_count,
uint *column_numbers,
DYNAMIC_COLUMN_VALUE *values);
enum enum_dyncol_func_result
mariadb_dyncol_update_many_named(DYNAMIC_COLUMN *str,
uint column_count,
MYSQL_LEX_STRING *column_keys,
DYNAMIC_COLUMN_VALUE *values);
str |
IN/OUT |
Блок динамических столбцов, который будет изменён. |
column_count |
IN |
Количество столбцов в следующих массивах |
column_numbers |
IN |
Массив номеров столбцов (старый формат) |
column_keys |
IN |
Массив имён столбцов (новый формат) |
values |
IN |
Массив значений столбцов |
mariadb_dyncol_exists
Проверяет, существует ли столбец с заданным именем в блоке
enum enum_dyncol_func_result mariadb_dyncol_exists(DYNAMIC_COLUMN *str, uint column_number); enum enum_dyncol_func_result mariadb_dyncol_exists_named(DYNAMIC_COLUMN *str, MYSQL_LEX_STRING *column_key);
str |
IN |
Упакованная строка динамических столбцов. |
column_number |
IN |
Номер столбца (старый формат) |
column_key |
IN |
Имя столбца (новый формат) |
Функция возвращает ДА/НЕТ или код ошибки
mariadb_dyncol_column_count
Получает количество столбцов в блоке динамического столбца
enum enum_dyncol_func_result mariadb_dyncol_column_count(DYNAMIC_COLUMN *str, uint *column_count);
str |
IN |
Упакованная строка динамических столбцов. |
column_count |
OUT |
Количество ненулевых столбцов в строке динамических столбцов |
mariadb_dyncol_list
Список столбцов в блоке динамических столбцов.
enum enum_dyncol_func_result
mariadb_dyncol_list(DYNAMIC_COLUMN *str, uint *column_count, uint **column_numbers);
enum enum_dyncol_func_result
mariadb_dyncol_list_named(DYNAMIC_COLUMN *str, uint *column_count,
MYSQL_LEX_STRING **column_keys);
str |
IN |
Упакованная строка динамических столбцов. |
column_count |
OUT |
Количество столбцов в следующих массивах |
column_numbers |
OUT |
Массив номеров столбцов (старый формат). Вызывающий должен освободить этот массив. |
column_keys |
OUT |
Массив имён столбцов (новый формат). Вызывающий должен освободить этот массив. |
mariadb_dyncol_get
Получить значение одного столбца
enum enum_dyncol_func_result
mariadb_dyncol_get(DYNAMIC_COLUMN *org, uint column_number,
DYNAMIC_COLUMN_VALUE *value);
enum enum_dyncol_func_result
mariadb_dyncol_get_named(DYNAMIC_COLUMN *str, MYSQL_LEX_STRING *column_key,
DYNAMIC_COLUMN_VALUE *value);
str |
IN |
Упакованная строка динамических столбцов. |
column_number |
IN |
Массив номеров столбцов (старый формат) |
column_key |
IN |
Массив имён столбцов (новый формат) |
value |
OUT |
Значение столбца |
Если столбец не найден, возвращается NULL как значение столбца.
mariadb_dyncol_unpack
Получить значения всех столбцов
enum enum_dyncol_func_result
mariadb_dyncol_unpack(DYNAMIC_COLUMN *str,
uint *column_count,
MYSQL_LEX_STRING **column_keys,
DYNAMIC_COLUMN_VALUE **values);
str |
IN |
Упакованная строка динамических столбцов для распаковки. |
column_count |
OUT |
Количество столбцов в следующих массивах |
column_keys |
OUT |
Массив имён столбцов (должен быть освобождён вызывающим) |
values |
OUT |
Массив значений столбцов (должен быть освобождён вызывающим) |
mariadb_dyncol_has_names
Проверка, использует ли блок динамических столбцов новый формат данных (формат, в котором столбцы идентифицируются по именам)
my_bool mariadb_dyncol_has_names(DYNAMIC_COLUMN *str);
str |
IN |
Упакованная строка динамических столбцов. |
mariadb_dyncol_check
Проверка, имеет ли блок динамических столбцов правильный формат данных.
enum enum_dyncol_func_result mariadb_dyncol_check(DYNAMIC_COLUMN *str);
str |
IN |
Упакованная строка динамических столбцов. |
mariadb_dyncol_json
Получение содержимого блока динамических столбцов в формате JSON
enum enum_dyncol_func_result mariadb_dyncol_json(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json);
str |
IN |
Упакованная строка динамических столбцов. |
json |
OUT |
Представление в формате JSON |
mariadb_dyncol_val_TYPE
Получение значения динамического столбца как одного из основных типов
enum enum_dyncol_func_result
mariadb_dyncol_val_str(DYNAMIC_STRING *str, DYNAMIC_COLUMN_VALUE *val,
CHARSET_INFO *cs, my_bool quote);
enum enum_dyncol_func_result
mariadb_dyncol_val_long(longlong *ll, DYNAMIC_COLUMN_VALUE *val);
enum enum_dyncol_func_result
mariadb_dyncol_val_double(double *dbl, DYNAMIC_COLUMN_VALUE *val);
str или ll или dbl
|
OUT |
Значение столбца |
val |
IN |
Значение |
mariadb_dyncol_prepare_decimal
Инициализация DYNAMIC_COLUMN_VALUE перед тем, как можно будет установить значение value.x.decimal.value
void mariadb_dyncol_prepare_decimal(DYNAMIC_COLUMN_VALUE *value);
value |
OUT |
Значение столбца |
Эта функция связывает value.x.decimal.value с value.x.decimal.buffer.
mariadb_dyncol_value_init
Инициализирует структуру DYNAMIC_COLUMN_VALUE до безопасного значения по умолчанию.
#define mariadb_dyncol_value_init(V) (V)->type= DYN_COL_NULL
mariadb_dyncol_column_cmp_named
Сравнение двух имён столбцов (в настоящее время имена столбцов сравниваются с помощью memcmp())
int mariadb_dyncol_column_cmp_named(const MYSQL_LEX_STRING *s1,
const MYSQL_LEX_STRING *s2);
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/dynamic-column-api/