Резюме
Эта глава содержит информацию о API NDB, который используется, чтобы
написать приложения, работающие с данными в
NDB
.
Эта секция обсуждает приготовления, необходимые для написания и компилирования приложения API NDB.
Резюме
Эта секция предоставляет информацию о компилировании и компоновке приложения NDB API, включая требования и варианты компоновщика и компилятора.
Чтобы использовать API NDB с MySQL, вы должны иметь библиотеку клиента
libndbclient
и ее связанные заголовочные файлы,
они устанавливаются вместе с обычными библиотеками клиента MySQL и
заголовками. Они автоматически устанавливаются, когда вы
собираете MySQL с опцией
-DWITH_NDBCLUSTER=ON
или используете двоичный пакет, который поддерживает
NDB
.
Это руководство предназначено для использования с MySQL NDB Cluster 7.2 и выше.
Заголовочные файлы. Чтобы собрать исходные файлы, которые
используют API NDB, необходимо гарантировать, что необходимые заголовочные
файлы могут быть найдены. Заголовочные файлы, определенные для NDB и MGM API,
устанавливаются в следующих подкаталогах MySQL
include
:
include/mysql/storage/ndb/ndbapi
include/mysql/storage/ndb/mgmapi
Флаги компилятора. MySQL-определенные необходимые флаги компилятора могут быть определены, используя утилиту mysql_config, которая является частью установки MySQL:
$ mysql_config --cflags -I/usr/local/mysql/include/mysql -Wreturn-type \ -Wtrigraphs -W -Wformat -Wsign-compare \ -Wunused-mcpu=pentium4 -march=pentium4
Это устанавливает путь включения для заголовочных файлов MySQL, но не для
определенных для API NDB. Опция
--include
в
mysql_config
возвращает общий путь включения:
shell> mysql_config --include -I/usr/local/mysql/include/mysql
Необходимо добавить пути подкаталога явно, чтобы добавление всего
необходимого собрало флаги к переменной оболочки
CXXFLAGS
, которая должна выглядеть примерно так:
CFLAGS="$CFLAGS "`mysql_config --cflags` CFLAGS="$CFLAGS "`mysql_config --include`/storage/ndb CFLAGS="$CFLAGS "`mysql_config --include`/storage/ndb/ndbapi CFLAGS="$CFLAGS "`mysql_config --include`/storage/ndb/mgmapi
Если вы не намереваетесь использовать функции управления NDB Cluster,
последняя строка в предыдущем примере может быть опущена. Однако, если вы
интересуетесь только функциями управления и не хотите получить доступ к
данным NDB Cluster кроме как из MySQL, тогда можно опустить строку,
ссылающуюся на каталог ndbapi
.
Приложения NDB API должны быть скомпонованы с библиотеками клиента MySQL и
NDB
. Библиотеки NDB
также требует некоторых функций от библиотеки
mystrings
, таким образом, это должно
быть также учтено.
Необходимые флаги компоновщика для библиотеки клиента MySQL возвращены
mysql_config
--libs
.
Для многопоточных приложений необходимо использовать
--libs_r
:
$ mysql_config --libs_r -L/usr/local/mysql-5.1/lib/mysql -lmysqlclient_r \ -lz -lpthread -lcrypt -lnsl -lm -lpthread \ -L/usr/lib -lssl -lcrypto
Теперь необходимо только добавить -lndbclient
в LD_FLAGS
:
LDFLAGS="$LDFLAGS "`mysql_config --libs_r` LDFLAGS="$LDFLAGS -lndbclient"
Это часто быстрее и более просто использовать автоинструменты GNU, чем
написать ваши собственные make-файлы. В этой секции мы обеспечиваем макрос
autoconf
WITH_MYSQL
, который может использоваться, чтобы
добавить --with-mysql
к файлу конфигурации, и это
автоматически устанавливает правильный компилятор и флаги компоновщика для
данной установки MySQL.
Все примеры в этой главе включают общий файл
mysql.m4
с определением
WITH_MYSQL
. Типичный полный пример состоит из
фактического исходного файла и следующих файлов помощника:
acinclude
configure.in
Makefile.m4
automake
также требует, чтобы вы обеспечили файлы
README
,
NEWS
,
AUTHORS
и
ChangeLog
, однако, их
можно оставить пустыми.
Чтобы создать все необходимые файлы, скомандуйте:
aclocal
autoconf
automake -a -c
configure --with-mysql=/mysql/prefix/path
Обычно это должно быть сделано только однажды, после чего make приспосабливает любые изменения файла.
Пример 1-1: acinclude.m4.
m4_include([../mysql.m4])
Пример 1-2: configure.in.
AC_INIT(example, 1.0) AM_INIT_AUTOMAKE(example, 1.0) WITH_MYSQL() AC_OUTPUT(Makefile)
Пример 1-3: Makefile.am.
bin_PROGRAMS = example example_SOURCES = example.cc
Пример 1-4: WITH_MYSQL для включения в acinclude.m4.
dnl dnl configure.in helper macros dnl AC_DEFUN([WITH_MYSQL], [ AC_MSG_CHECKING(for mysql_config executable) AC_ARG_WITH(mysql, [--with-mysql=PATH path to mysql_config binary or mysql prefix dir], [ if test -x $withval -a -f $withval then MYSQL_CONFIG=$withval elif test -x $withval/bin/mysql_config -a -f $withval/bin/mysql_config then MYSQL_CONFIG=$withval/bin/mysql_config fi ], [ if test -x /usr/local/mysql/bin/mysql_config -a -f /usr/local/mysql/bin/mysql_config then MYSQL_CONFIG=/usr/local/mysql/bin/mysql_config elif test -x /usr/bin/mysql_config -a -f /usr/bin/mysql_config then MYSQL_CONFIG=/usr/bin/mysql_config fi ]) if test "x$MYSQL_CONFIG" = "x" then AC_MSG_RESULT(not found) exit 3 else AC_PROG_CC AC_PROG_CXX # add regular MySQL C flags ADDFLAGS=`$MYSQL_CONFIG --cflags` # add NDB API specific C flags IBASE=`$MYSQL_CONFIG --include` ADDFLAGS="$ADDFLAGS $IBASE/storage/ndb" ADDFLAGS="$ADDFLAGS $IBASE/storage/ndb/ndbapi" ADDFLAGS="$ADDFLAGS $IBASE/storage/ndb/mgmapi" CFLAGS="$CFLAGS $ADDFLAGS" CXXFLAGS="$CXXFLAGS $ADDFLAGS" LDFLAGS="$LDFLAGS "`$MYSQL_CONFIG --libs_r`" -lndbclient -lmystrings -lmysys" LDFLAGS="$LDFLAGS "`$MYSQL_CONFIG --libs_r`" -lndbclient -lmystrings" AC_MSG_RESULT($MYSQL_CONFIG) fi ])
Резюме
Эта секция показывает подключение к NDB Cluster.
Приложения NDB API требуют один или больше включаемых файлов:
Приложения, получающие доступ к данным NDB Cluster через NDB API,
должны включать файл NdbApi.hpp
.
Приложения, использующие клиентский MySQL API, а также API NDB, должны
также включать mysql.h
(в дополнение к
NdbApi.hpp
).
Для приложений, которые используют функции управления NDB Cluster из
MGM API нужен файл mgmapi.h
.
Перед использованием API NDB это должно сначала быть инициализировано
вызовом функции ndb_init()
.
Как только применение API NDB завершено, можно вызвать
ndb_end(0)
, чтобы выполнить любую необходимую
очистку. Следует иметь в виду что, прежде чем вы вызовете эту функцию, все
объекты
Ndb_cluster_connection
, созданные в вашем
приложении NDB API, должны быть очищены или разрушены, иначе потоки,
созданные, когда вызывался метод
connect()
объекта
Ndb_cluster_connection
,
не выходят правильно, что вызывает ошибки после завершения программы.
Когда Ndb_cluster_connection
создается статически, вы не должны вызвать
ndb_end()
в том же самом объеме, как объект
связи. Когда объект связи создается динамично, можно разрушить его
использованием delete()
перед вызовом
ndb_end()
.
Каждая из функций ndb_init()
и
ndb_end()
определяется в файле
storage/ndb/include/ndb_init.h
.
Должно быть возможно использовать fork()
в
NDB API, но необходимо сделать так до запроса
ndb_init()
или
my_init()
, чтобы не разделять такие ресурсы, как
файлы и связи между процессами.
Чтобы установить связь с сервером, необходимо создать экземпляр
Ndb_cluster_connection
, чей конструктор
берет в качестве его аргумента строку подключения.
Если никакая строка подключения не задана, предполагается
localhost
.
Связь кластера на самом деле не начинается до вызова метода
Ndb_cluster_connection::connect()
.
Когда вызвано без любых аргументов, попытка подключения повторена
неопределенно долго, однажды в секунду, до успеха. Никакое сообщение не
сделано, пока связь не будет установлена.
По умолчанию узел API соединяется с ближайшим
узлом данных. Это обычно узел данных на той же самой машине как самый
близкий вследствие того, что транспортировка общей памяти может
использоваться вместо медленного TCP/IP. Это может привести к плохому
распределению нагрузки в некоторых случаях, таким образом, возможно провести
в жизнь циклическую схему связи узла, вызывая метод
set_optimized_node_selection()
с
0
как его аргумент до запроса
connect()
.
connect()
начинает связь только с узлом
управления NDB Cluster. Чтобы позволить связи с узлами данных, надо
использовать
wait_until_ready()
после
connect()
,
wait_until_ready()
ждет заданное число секунд
для связи с узлом данных, который будет установлен.
В следующем примере инициализация и связь обработаны в двух функциях
example_init()
и
example_end()
,
которые включены в последующие примеры посредством включения файла
example_connection.h
.
Пример 2-1: Пример связи.
#include <stdio.h> #include <stdlib.h> #include <NdbApi.hpp> #include <mysql.h> #include <mgmapi.h> Ndb_cluster_connection* connect_to_cluster(); void disconnect_from_cluster(Ndb_cluster_connection *c); Ndb_cluster_connection* connect_to_cluster() { Ndb_cluster_connection* c; if (ndb_init()) exit(EXIT_FAILURE); c= new Ndb_cluster_connection(); if (c->connect(4, 5, 1)) { fprintf(stderr, "Unable to connect to cluster within 30 seconds.\n\n"); exit(EXIT_FAILURE); } if (c->wait_until_ready(30, 0) < 0) { fprintf(stderr, "Cluster was not ready within 30 seconds.\n\n"); exit(EXIT_FAILURE); } return c; } void disconnect_from_cluster(Ndb_cluster_connection *c) { delete c; ndb_end(2); } int main(int argc, char* argv[]) { Ndb_cluster_connection *ndb_connection= connect_to_cluster(); printf("Connection Established.\n\n"); disconnect_from_cluster(ndb_connection); return EXIT_SUCCESS; }
Резюме
Следующие две секции обсуждают обозначение и другие соглашения, сопровождаемые API NDB относительно объектов базы данных MySQL, а также обработку типов данных MySQL в приложениях API NDB.
Эта секция обсуждает отображение объектов базы данных MySQL к API NDB.
Базы данных и схемы. Базы данных и схемы
не представляются объектами как таковыми в API NDB. Вместо этого они
смоделированы как признаки объектов
Table
и
Index
.
Значение признака database
одного из этих объектов всегда то же самое, как название базы данных MySQL,
которой принадлежат таблица или индекс. Значение признака
Table
или
Index
объекта всегда 'def
' (для
default).
Таблицы. Имена таблиц MySQL непосредственно отображены к
именам таблиц NDB
без модификации.
Имена таблиц, начинающиеся с 'NDB$
',
резервируются для внутреннего пользования, как таблица
SYSTAB_0
в базе данных
sys
.
Индексы. Есть два типа индексов NDB:
Hash indexes уникальны, но не сортированы.
B-tree indexes сортированы, но разрешают двойные значения.
Названия уникальных индексов и первичных ключей обработаны следующим образом:
Для MySQL индекс UNIQUE
,
создаются хэш-индекс и B-tree. Индекс B-tree использует название MySQL
индекса, название хэш-индекса произведено, приложив
'$unique
' к имени индекса.
Для первичного ключа MySQL создается только индекс B-tree.
Этому индексу дают имя PRIMARY
.
Нет никакого дополнительного хэша, однако, уникальность первичного ключа
гарантируется, заставляя MySQL включить внутренний первичный ключ таблицы
NDB
.
Имена столбцов и значения. Имена столбцов
NDB
совпадают со своими названиями в MySQL.
Эта секция предоставляет информацию о пути, которым типы данных MySQL представляются в столбцах таблицы NDBCLUSTER и как к этим значениям можно получить доступ в приложениях NDB API.
Типы числовых данных. Типы данных MySQL
TINYINT
,
SMALLINT
,
INT
и
BIGINT
отображаются к типам
NDB
, имеющим те же самые имена и требования
хранения, как их коллеги из MySQL.
Типы данных MySQL
FLOAT
и
DOUBLE
отображаются к типам
NDB
, имеющим те же самые
имена и требования хранения.
Типы символьных данных. Пространство памяти для столбцов MySQL
CHAR
определяется максимальным количеством
знаков и набором символов колонки. Для большинства (но не всех) наборов
символов, каждый символ берет один байт.
Используя utf8
, каждый символ
требует трех байт, utfmb4
требует
до четырех байт на символ. Можно сосчитать максимальное количество байт,
необходимых на символ в данном наборе символов, проверив колонку
Maxlen
в выводе
SHOW CHARACTER SET
.
Значение столбца NDB
VARCHAR
отображает MySQL
VARCHAR
, за исключением того, что первые два
байта NDB
VARCHAR
резервируются для длины последовательности. Сервисная функция, как показано
здесь, может сделать значение VARCHAR
готовым к
употреблению в приложении NDB API:
void make_ndb_varchar(char *buffer, char *str) { int len = strlen(str); int hlen = (len > 255) ? 2 : 1; buffer[0] = len & 0xff; if (len > 255) buffer[1] = (len / 256); strcpy(buffer+hlen, str); }
Можно использовать эту функцию как показано здесь:
char myVal[128+1]; // Size of myVal (+1 for length) ... make_ndb_varchar(myVal, "NDB is way cool!!"); myOperation->setValue("myVal", myVal);
См. раздел 2.5.11
для полного примера программы, который пишет и читает значения
VARCHAR
и VARBINARY
в и мз таблицы, используя API NDB.
Требования хранения MySQL для столбцов
VARCHAR
или
VARBINARY
зависят от того, сохранена ли колонка в памяти или на диске:
Для колонок в памяти
NDB
поддерживает колонки переменной ширины с 4-байтовым выравниванием.
Это означает что (например), последовательность
'abcde'
, сохраненная в столбце
VARCHAR(50)
, используя набор символов
latin1
, занимает 12 байтов: в этом случае
2-байтовые 5 символов это 10, округленные к следующему
кратному 4 значению, дают 12.
Для дисковых столбцов данных
VARCHAR
и
VARBINARY
сохранены как
столбцы фиксированной ширины. Это означает, что каждый из этих типов требует
того же самого объема хранения, как
CHAR
того же самого размера.
Каждая строка в столбце NDB Cluster
BLOB
или
TEXT
составлена из двух отдельных частей.
Одна из них имеет фиксированный размер (256 байтов) и на самом деле сохранена
в оригинальной таблице. Другая состоит из любых данных сверх 256 байтов,
которые сохранили в скрытой таблице. Строки в ней всегда 2000 байт длиной.
Это означает, что запись size
байт
TEXT
или
BLOB
требует:
256 байт, если
.size
<= 256
256+2000*
((
байт иначе.size
-256)\2000)+1)
Временные типы данных. Хранение временных типов в API NDB зависит
от того, используются ли старые типы MySQL
без долей секунды или новые типы с поддержкой доли
секунды. Поддержка долей секунды была введена в MySQL 5.6, а также версиях
NDB Cluster на основе его, то есть NDB 7.3 и NDB 7.4.
Эти версии используют новые временные типы по умолчанию, но могут
использовать старые, запуская
mysqld с опцией
--create-old-temporals=ON
.
NDB 7.5 и позже, то есть, версии NDB Cluster на основе MySQL 5.7 и позже,
могут прочитать и написать данные, используя старые временные типы, но не
могут составить таблицы, которые используют старые типы. Посмотрите
Fractional Seconds in Time Values.
Поскольку поддержка старых временных типов будет удалена
в будущем выпуске, вы поощряетесь мигрировать любые таблицы, используя старые
временные типы для новых версий этих типов. Можно сделать это, выполнив
ALTER TABLE
на любой таблице, использующей старые типы,
или посредством поддержки и восстановления любых таких таблиц.
Вы видите, использует ли данная таблица старые или новые временные
типы, проверяя вывод
ndb_desc,
поставляемой с NDB Cluster. Считайте таблицу, созданную в базе данных
test
, используя следующую команду, при запуске
mysqld без опции
--create-old-temporals
:
CREATE TABLE t1 (c1 DATETIME, c2 DATE, c3 TIME, c4 TIMESTAMP, c5 YEAR) ENGINE=NDB;
Соответствующая часть (блок Attributes
)
вывода ndb_desc:
shell> ndb_desc -dtest t1
...
-- Attributes --
c1 Datetime2(0) NULL AT=FIXED ST=MEMORY
c2 Date NULL AT=FIXED ST=MEMORY
c3 Time2(0) NULL AT=FIXED ST=MEMORY
c4 Timestamp2(0) NOT NULL AT=FIXED ST=MEMORY DEFAULT 0
c5 Year NULL AT=FIXED ST=MEMORY
Названия новых временных типов MySQL имеют суффикс с
2
(например,
Datetime2
). Предположите, что мы перезапускаем
mysqld с
--create-old-temporals=ON
и затем составьте таблицу t2
, также в
базе данных test
:
CREATE TABLE t2 (c1 DATETIME, c2 DATE, c3 TIME, c4 TIMESTAMP, c5 YEAR) ENGINE=NDB;
Вывод от выполнения
ndb_desc
на этой таблице включает блок Attributes
:
shell> ndb_desc -dtest t2
...
-- Attributes --
c1 Datetime NULL AT=FIXED ST=MEMORY
c2 Date NULL AT=FIXED ST=MEMORY
c3 Time NULL AT=FIXED ST=MEMORY
c4 Timestamp NOT NULL AT=FIXED ST=MEMORY DEFAULT 0
c5 Year NULL AT=FIXED ST=MEMORY
Затронутые типы MySQL:
TIME
,
DATETIME
и
TIMESTAMP
.
Новые версии этих типов отражены в API NDB как
Time2
, Datetime2
,
and Timestamp2
, соответственно, каждый
поддерживает доли секунды максимум с 6 цифрами точности.
Новые варианты используют кодирование с обратным порядком байтов
целочисленных значений, которые обрабатываются, чтобы определить
компоненты каждого временного типа.
Для части доли секунды каждого из этих типов точность затрагивает число необходимых байтов, как показано в следующей таблице:
Таблица 2.1. Точность новых временных типов NDB API
Точность | Надо байт | Диапазон |
---|---|---|
0 | 0 | Нет |
1 | 1 | 0-9 |
2 | 1 | 0-99 |
3 | 2 | 0-999 |
4 | 2 | 0-9999 |
5 | 3 | 0-99999 |
6 | 3 | 0-999999 |
Дробная часть для каждого из новых временных типов сохранена в формате с обратным порядком байтов, то есть, с самым старшим байтом в начале.
Двоичные расположения старых и новых версий этих типов описаны в следующих нескольких параграфах.
Time
: Старая
версия типа сохранена как 24-bit signed int
в формате с прямым порядком байтов (младший байт первый. Байт 0 (биты 0-7)
соответствует часам, байт 2 (биты 8-15) минутам и байт 2 (биты 16-23)
секундам, согласно этой формуле:
value = 10000 * hour + 100 * minute + second
Бит 23 служит знаковым битом, если этот бит установлен, временное значение считают отрицательным.
Time2
: Новый тип
TIME
добавлен в NDB 7.3 и 7.4 (MySQL 5.6)
и сохранен как 3-байтовый обратный порядок байтов и от 0 до 3 байт для
дробной части. Целая часть закодирована как показано в следующей таблице:
Таблица 2.2. Кодирование Time2
Биты | Смысл | Диапазон |
---|---|---|
23 | Знаковый бит | 0-1 |
22 | Интервал | 0-1 |
22-13 | Час | 1-1023 |
12-7 | Минута | 0-63 |
6-0 | Секунда | 0-63 |
Любые дробные байты в дополнение к этому обработаны, как описано ранее.
Date
: Представление для типа MySQL
DATE
не изменено через версии NDB и использует
3-байтовое целое число без знака, сохраненное с прямым порядком байтов.
Кодирование показано здесь:
Таблица 2.3. Кодирование Date
Биты | Смысл | Диапазон |
---|---|---|
23-9 | Год | 0-32767 |
8-5 | Месяц | 0-15 |
4-0 | День | 0-31 |
Datetime
: Старая
версия типа MySQL DATETIME
представляется 64-битным unsigned значением, сохраненным в порядке байтов
хоста с использованием следующей формулы:
value = second + minute * 102 + hour * 104 + day * 106 + month * 108 + year * 1010
DateTime2
: Новый
тип DATETIME
закодирован как 5-байтовый обратный
порядок байтов с дополнительной дробной частью от 0 до 3 байт, дробная часть
обрабатывается как описано ранее. Старшие 5 байт закодированы
как показано здесь:
Таблица 2.4. Кодирование DateTime2
Биты | Смысл | Диапазон |
---|---|---|
23 | Знаковый бит | 0-1 |
22 | Интервал | 0-1 |
22-13 | Час | 1-1023 |
12-7 | Минута | 0-63 |
6-0 | Секунда | 0-63 |
Биты YearMonth
закодированы как
Year = YearMonth / 13
и
Month = YearMonth % 13
.
Timestamp
: Старая
версия этого типа использует 32-битное unsigned значение секунд с начала
эпохи Unix, сохраненное в порядке байтов хоста.
Timestamp2
: Это версия
TIMESTAMP
в NDB 7.3 и 7.4 (MySQL 5.6)
использует 4 байта с обратным порядком байтов для integer (unsigned).
Дополнительная 3-байтовая дробная часть закодирована как показано
ранее в этой секции.
Дополнительная информация. Больше информации и примеров
как выражены в API NDB типы данных можно найти в
ndb/src/common/util/NdbSqlUtil.cpp
. См. также
раздел 2.5.13,
который обеспечивает пример простого применения API NDB, которое использует
тип данных Timestamp2
.
Эта секция предоставляет иерархический список всех классов, интерфейсов и структур, выставленных API NDB.
Эта секция предоставляет подробный список всех классов, интерфейсов и
структур, определенных в NDB
API.
Каждый листинг включает следующую информацию:
Описание и цель класса, интерфейса или структуры.
Указатели, когда это применимо, к родительским и дочерним классам.
Подробные списки всех публичных членов, включая описания всех параметров методов и типов значений.
Класс, интерфейс и описания структуры обеспечиваются в алфавитном порядке. Для иерархического листинга посмотрите раздел 2.2.
Резюме
Эта секция описывает структуру
AutoGrowSpecification
.
Родительский класс.
NdbDictionary
.
Описание.
AutoGrowSpecification
это структура данных,
определенная в классе
NdbDictionary
и применяется
в качестве параметра или возвращаемого значения некоторых методов классов
Tablespace
и
LogfileGroup
, см. разделы
2.3.38 и
2.3.13.
Методы.
AutoGrowSpecification
имеет следующие методы:
Таблица 2.5. NdbDictionary::AutoGrowSpecification
Имя | Описание |
---|---|
min_free |
??? |
max_size |
??? |
file_size |
??? |
filename_pattern |
??? |
Резюме
Этот класс представляет колонку в таблице NDB Cluster.
Родительский класс.
NdbDictionary
Дочерние классы. Нет
Описание. Каждый экземпляр Column
символизуется его типом, который определяется многими спецификаторами типа:
Встроенный тип
Длина массива или максимальная длина
Точность и масштаб ( в настоящее время не применяется)
Набор символов (применим только к столбецм, используя строковые типы данных
Размеры частей (применим только к столбцам
BLOB
)
Эти типы в целом соответствуют типам данных MySQL и их вариантам.
Форматы данных те же самые, как в MySQL. API NDB не оказывает поддержки для
создания таких форматов, однако, они проверяются ядром
NDB
.
Методы. В следующей таблице перечислены публичные методы этого класса и цели использования каждого метода:
Таблица 2.6.
Метод | Описание |
---|---|
Column() |
Конструктор класса, есть также конструктор копии |
~Column() |
Деструктор класса |
equal() |
Сравнивает объекты Column |
getArrayType() |
Получает тип массива колонки |
getCharset() |
Используемый набор символов последовательности (текста) столбца (неприменим к столбецм, не хранящим данные о символах) |
getColumnNo() |
Получает номер столбца |
getDefaultValue() |
Возвращает значение по умолчанию столбца |
getInlineSize() |
Получает действующий размер BLOB
(неприменим к другим типам столбца) |
getLength() |
Получает длину столбца |
getName() |
Получает название столбца |
getNullable() |
Проверяет, может ли столбец быть установлен в
NULL |
getPartitionKey() |
Проверяет, является ли столбец частью ключа разделения таблицы |
getPartSize() |
Получает размер части BLOB
(неприменим к другим типам столбца) |
getPrecision() |
Получает точность колонки (используемый только для десятичных типов) |
getPrimaryKey() |
Проверяет, является ли столбец частью первичного ключа таблицы |
getScale() |
Получает масштаб колонки (используемый только для десятичных типов) |
getSize() |
Получает размер элемента |
getSizeInBytesForRecord() |
Получает пространство, требуемое для колонки
NdbRecord
, согласно типу колонки (добавлен в NDB 7.3.10 и NDB 7.4.7) |
getStripeSize() |
Получает размер полосы колонки BLOB (неприменим к другим типам столбца) |
getStorageType() |
Получает тип хранения этой колонки |
getType() |
Получает тип колонки (значение Type
) |
setArrayType() |
Устанавливает ArrayType столбца |
setCharset() |
Устанавливает набор символов, используемый колонкой, содержащей данные о символах (неприменим к нетекстовым столбецам) |
setDefaultValue() |
Устанавливает значение столбца по умолчанию |
setInlineSize() |
Устанавливает действующий размер для столбца
BLOB (неприменим к столбцам
не-BLOB ) |
setLength() |
Устанавливает длину колонки |
setName() |
Определяет имя колонки |
setNullable() |
Переключает возможность задания столбцу значения null |
setPartitionKey() |
Определяет, является ли столбец частью ключа разделения таблицы |
setPartSize() |
Устанавливает размер части для столбца BLOB
(неприменим к не-BLOB ) |
setPrecision() |
Устанавливает точность колонки (используемый только для десятичных типов) |
setPrimaryKey() |
Определяет, является ли столбец частью первичного ключа |
setScale() |
Устанавливает масштаб колонки (используемый только для десятичных типов) |
setStorageType() |
Устанавливает тип хранения этого столбца |
setStripeSize() |
Устанавливает размер полосы для BLOB
(неприменим к не-BLOB ) |
setType() |
Устанавливает Type столбца |
Для подробных описаний и примеров использования для каждого из этих методов см. раздел 2.3.2.4.
Столбцы, созданные этим классом, невидимы для MySQL Server. Это означает, что к ним не могут получить доступ клиенты MySQL, и что они не могут копироваться. По этим причинам часто предпочтительно избежать работать с ними.
В NDB API имена столбцов обработаны чувствительным к регистру способом. Это отличается от MySQL C API. Чтобы уменьшить возможность для ошибки, рекомендуется, чтобы вы последовательно называли все колонки, используя верхний регистр или строчные буквы.
Типы. Это публичные типы класса
Column
:
Таблица 2.7.
Тип | Описание |
---|---|
ArrayType |
Определяет формат внутренней памяти колонки |
StorageType |
Определяет, сохранен ли столбец в памяти или на диске |
Type |
Тип данных колонки. У столбцов NDB
есть те же самые типы данных, как в MySQL |
Резюме
Этот тип описывает внутренний формат признака
Column
.
Описание. Формат хранения признака может быть фиксированным или переменным.
Возможные значения. Возможные значения показывают с описаниями в следующей таблице:
Таблица 2.8.
Имя | Описание |
---|---|
ArrayTypeFixed |
сохраненный как постоянное число байтов |
ArrayTypeShortVar |
сохраненный как переменное число байтов, дополнительно 1 байт |
ArrayTypeMediumVar |
сохраненный как переменное число байтов, дополнительно 2 байта |
Фиксированный формат хранения быстрее, но также
обычно требует большего количества пространства, чем переменный формат.
По умолчанию ArrayTypeShortVar
для типов
Var*
и ArrayTypeFixed
для остальных. Этого обычно хватает.
Резюме
Этот тип описывает тип хранения, используемый объектом
Column
.
Описание. Тип хранения, используемый для данной колонки, может быть
в памяти или на диске. Колонки, сохраненные на диске, означают, что меньше
RAM требуется в целом, но такие колонки не могут быть внесены в индекс и
потенциально намного медленнее по доступу. Умолчание
StorageTypeMemory
.
Возможные значения.
Таблица 2.9.
Имя | Описание |
---|---|
StorageTypeMemory |
Сохраните колонку в памяти |
StorageTypeDisk |
Сохраните колонку на диске |
Резюме
Type
используется, чтобы описать тип данных
объекта Column
.
Описание. Типы данных для объектов
Column
походят на типы данных, используемые MySQL. Типы
Tinyint
,
Tinyintunsigned
,
Smallint
,
Smallunsigned
,
Mediumint
,
Mediumunsigned
,
Int
, Unsigned
,
Bigint
,
Bigunsigned
,
Float
и Double
(то есть, типы с Tinyint
до
Double
в порядке, перечисленном в таблице
Enumeration Values) могут использоваться в множествах.
Возможные значения.
Таблица 2.10.
Имя | Описание |
---|---|
Undefined |
Не определено |
Tinyint |
1-byte signed integer |
Tinyunsigned |
1-byte unsigned integer |
Smallint |
2-byte signed integer |
Smallunsigned |
2-byte unsigned integer |
Mediumint |
3-byte signed integer |
Mediumunsigned |
3-byte unsigned integer |
Int |
4-byte signed integer |
Unsigned |
4-byte unsigned integer |
Bigint |
8-byte signed integer |
Bigunsigned |
8-byte signed integer |
Float |
4-byte float |
Double |
8-byte float |
Olddecimal |
Signed decimal используется до MySQL 5.0 |
Olddecimalunsigned |
Unsigned decimal используется до MySQL 5.0 |
Decimal |
Signed decimal используется в MySQL 5.0 и позже |
Decimalunsigned |
Unsigned decimal используется в MySQL 5.0 и позже |
Char |
Множество фиксированной длины из 1-байтовых символов, максимальная длина 255 символов |
Varchar |
Множество переменной длины из 1-байтовых символов, максимальная длина 255 символов |
Binary |
Множество фиксированной длины из 1-байтовых двоичных символов, максимальная длина 255 символов |
Varbinary |
Множество переменной длины из 1-байтовых двоичных символов, максимальная длина 255 символов |
Datetime |
8-байтовое значение даты и времени с точностью 1 секунда (устарело) |
Date |
4-байтовое значение даты, с точностью 1 день |
Blob |
Blob, см. раздел 2.3.18 |
Text |
Текстовый вариант blob |
Bit |
Битовое значение, длина определяет число битов |
Longvarchar |
2-байтный Varchar |
Longvarbinary |
2-байтный Varbinary |
Time |
Время без даты (устарел) |
Year |
1-байтовое значение года в диапазоне 1901-2155 (то же самое, как в MySQL) |
Timestamp |
Unix time (устарел) |
Time2 |
Время без даты с долями секунды. Добавлен в NDB 7.3.1. |
Datetime2 |
8-байтовое значение даты и времени с долями секунды. Добавлен в NDB 7.3.1. |
Timestamp2 |
Unix time с долями секунды. Добавлен в NDB 7.3.1. |
Начиная с NDB 7.3.1, NDB API обеспечивает доступ к типам времени с
микросекундами, добавленными в MySQL 5.6
(
TIME
,
DATETIME
и
TIMESTAMP
) как
Time2
, Datetime2
и
Timestamp2
. Time
,
Datetime
и
Timestamp
устарели с той же самой версии.
Используйте
setPrecision()
, чтобы установить до 6
дробных цифр (по умолчанию 0). Форматы данных как в MySQL и должны
использовать правильную длину в байтах. С тех пор, как
NDB
может сравнить любое из этих значений как
двоичные строки, это не выполняет проверок на фактических данные.
Не путайте Column::Type
с
Object::Type
.
Резюме
Эта секция документирует публичные методы класса
Column
.
Оператор присваивания (=
) перегружен для
этого класса, так, чтобы он всегда выполнил глубокую копию.
Как с другими объектами базы данных, создание объекта
Column
и изменения признака существующих столбцов, сделанных, используя API NDB,
невидимы из MySQL. Например, если вы изменяете тип данных с использованием
колонки
Column::setType()
, MySQL
расценит тип колонки, как являющейся неизменным. Единственное исключение к
этому правилу относительно столбцов: можно поменять имя существующего столбца
с использованием
Column::setName()
.
Также помните, что API NDB обращается с именами столбцов чувствительным к регистру способом.
Описание. Можно создать новый
Column
или скопировать существующий, используя конструктор класса.
Column
,
созданный с использованием API NDB,
невидим сервером MySQL.
API NDB обращается с именами столбцов чувствительным к регистру способом. Например, если вы создадите колонку, названную myColumn, вы не будете в состоянии получить доступ к ней позже, используя имя Mycolumn. Можно уменьшить возможность для ошибки, назвав все колонки последовательно, используя только какой-то один регистр.
Сигнатура. Можно создать любой новый экземпляр класс
Column
или скопировать существующий объект
Column
:
Конструктор для нового
Column
:
Column
(
const char* name
= ""
)
Конструктор копии:
Column
(
const Column& column
)
Параметры. Создавая новый экземпляр
Column
,
конструктор берет отдельный аргумент, который является названием новой
колонки, которая будет создана. Конструктор копии также берет один параметр,
в этом случае, это ссылка на копируемый экземпляр
Column
.
Возвращаемое значение.
Объект Column
.
Деструктор.
Деструктор класса
Column
не берет аргументов.
Описание. Этот метод используется, чтобы сравнить
Column
с другим, чтобы определить, одинаковы ли два объекта
Column
.
Сигнатура.
bool equal
(
const Column& column
) const
Параметры. equal()
берет единственный параметр, ссылку на экземпляр
Column
.
Возвращаемое значение.
true
, если сравниваемые колонки равны, иначе
false
.
Описание. Этот метод получает тип массива колонки.
Сигнатура.
ArrayType getArrayType ( void ) const
Параметры. Нет.
Возвращаемое значение.
ArrayType
, см.
раздел 2.3.2.1.
Описание. Это вернет набор символов столбца.
Этот метод применим только к столбецм, чей
Type
Char
,
Varchar
или Text
.
NDB APIобращается с именами столбцов чувствительным к регистру способом, myColumn и Mycolumn это разные столбцы.
Сигнатура.
CHARSET_INFO* getCharset ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на структуру
CHARSET_INFO
, определяющую набор символов и
сопоставление. Это совпадает со структурой MySQL
MY_CHARSET_INFO
, см.
mysql_get_character_set_info() в MySQL Manual.
Описание. Этот метод получает порядковый номер колонки в рамках ее
таблицы или индекса. Если столбец часть индекса (такой как тогда, когда
возвращено
getColumn()
), это отображено к его положению в том индексе, а не в
таблице, содержащей индекс.
Сигнатура.
int getColumnNo ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер столбца как integer.
Описание. Получает данные о значении столбца по умолчанию.
Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по
умолчанию, надо использовать
Table::hasDefaultValues()
.
Сигнатура.
const void* getDefaultValue
(
unsigned int* len
= 0
) const
Параметры.
len
содержит длину значения по умолчанию или 0, если столбец может быть null или
не имеет никакого значения по умолчанию.
Возвращаемое значение. Данные о значении по умолчанию.
Описание. Этот метод получает действующий размер
BLOB
то есть, число начальных байтов, чтобы
сохранить в признаке blob таблицы. Эта часть обычно находится в оперативной
памяти и может быть внесена в индекс.
Этот метод применим только к столбцам BLOB
.
Сигнатура.
int getInlineSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Действующий размер колонки
BLOB
как integer.
Описание. Этот метод получает длину колонки. Это длина массива для колонки или максимальная длина для множества переменной длины.
Сигнатура.
int getLength ( void ) const
Параметры. Нет.
Возвращаемое значение. Максимальная длина массива колонки как integer.
Описание. Этот метод возвращает название колонки, для которой его вызывают.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название колонки.
Описание. Этот метод используется, чтобы определить, может ли
столбец быть установлен в NULL
.
Сигнатура.
bool getNullable ( void ) const
Параметры. Нет.
Возвращаемое значение. true
,
если столбец может быть установлен в NULL
,
иначе false
.
Описание. Этот метод используется, чтобы проверить, является ли столбец частью ключа разделения таблицы.
Ключ разделения это ряд признаков,
используемых, чтобы распределить кортежи на узлы данных. Этот ключ это
хеш-функция, определенная для NDB
.
Примером, где это было бы полезно, является применение отслеживания ресурсов, включающее многократные склады и регионы, где могло бы быть хорошо использовать ID склада и id округа как ключ разделения. Это поместило бы все данные для определенного района и склада в том же самом узле хранения. В местном масштабе к каждому фрагменту полный первичный ключ будет все еще использоваться с алгоритмом хеширования в таком случае.
Для получения дополнительной информации о разделении, схемы выделения разделов и разделении ключей в MySQL см. Partitioning в MySQL Manual.
Единственный тип определенного пользователями разделения, которое
поддерживается для использования с
NDB
, это
ключевое разделение, включая линейное ключевое разделение.
Сигнатура.
bool getPartitionKey ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если столбец часть ключа разделения для
таблицы, иначе false
.
Описание. Этот метод используется, чтобы получить размер части
BLOB
то есть, число байтов, которые сохранены в
каждом кортеже таблицы blob.
Этот метод применим только к столбцам
BLOB
.
Сигнатура.
int getPartSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер части колонки как integer.
В случае Tinyblob
это значение
0
(то есть, только действующие байты сохранены).
Описание. Этот метод получает точность колонки.
Этот метод применим только к десятичным столбецам.
Сигнатура.
int getPrecision ( void ) const
Параметры. Нет.
Возвращаемое значение. Точность колонки как integer.
Точность определяется как количество значащих цифр, для получения
дополнительной информации посмотрите обсуждение типа данных
DECIMAL
в
Numeric Data Types.
Описание. Этот метод используется, чтобы определить, является ли столбец частью первичного ключа таблицы.
Сигнатура.
bool getPrimaryKey ( void ) const
Параметры. Нет.
Возвращаемое значение. true
,
если столбец часть первичного ключа таблицы, которой этот столбец
принадлежит, иначе false
.
Описание. Этот метод вернет масштаб для десятичного значения столбца.
Этот метод применим только к десятичным столбцам.
Сигнатура.
int getScale ( void ) const
Параметры. Нет.
Возвращаемое значение. Масштаб десятичной колонки как integer.
Масштаб десятичной колонки представляет количество цифр, которые могут быть
сохранены после десятичной точки. Для этого значения возможно быть
0
. См. описание типа данных
DECIMAL
в
Numeric Data Types.
Описание. Эта функция используется, чтобы получить размер колонки.
Сигнатура.
int getSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер колонки в байтах (integer).
Описание. Получает пространство, требуемое для данной колонки
NdbRecord
, в зависимости от типа колонки следующим образом:
Для BLOB это значение совпадает с
sizeof(NdbRecord*)
, который составляет 4 или 8
байтов (размер указателя зависит от платформы).
Для столбцов всех других типов это совпадает со значением,
возвращенным
getSize()
.
Этот метод был добавлен в NDB 7.3.10 и NDB 7.4.7.
Сигнатура.
int getSizeInBytesForRecord ( void ) const
Параметры. Нет.
Возвращаемое значение. integer.
Описание. Этот метод получает тип хранения колонки.
Сигнатура.
StorageType getStorageType ( void ) const
Параметры. Нет.
Возвращаемое значение. Значение StorageType
, см. раздел 2.3.2.2.
Описание. Этот метод получает размер полосы
BLOB
то есть, количество последовательных
частей, чтобы сохранить в каждом узле кластера.
Сигнатура.
int getStripeSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер полосы колонки как integer.
Описание. Этот метод получает тип данных колонки.
Сигнатура.
Type getType ( void ) const
Параметры. Нет.
Возвращаемое значение. Type
(тип данных) колонки. Для списка возможных значений посмотрите
раздел 2.3.2.3.
Описание. Устанавливает тип массива для колонки.
Сигнатура.
void setArrayType
(
ArrayType type
)
Параметры. Значение
Column::ArrayType
. См.
раздел 2.3.2.1.
Возвращаемое значение. Нет.
Описание. Этот метод может использоваться, чтобы установить набор
символов и сопоставление столбца типа Char
,
Varchar
или
Text
.
Этот метод применим только к столбцам
Char
, Varchar
и
Text
.
Изменения, внесенные в колонки, используя этот метод, невидимы в MySQL.
Сигнатура.
void setCharset
(
CHARSET_INFO* cs
)
Параметры. Этот метод берет один параметр.
cs
это указатель на структуру
CHARSET_INFO
.
Для получения дополнительной информации посмотрите
раздел 2.3.2.4.4.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает значение столбца в его
умолчание, если он у него есть, иначе это устанавливает колонку в
NULL
.
Чтобы определить, есть ли у таблицы какие-либо колонки со значениями по
умолчанию, надо использовать
Table::hasDefaultValues()
.
Сигнатура.
int setDefaultValue ( const void*buf
, unsigned intlen
)
Параметры. Этот метод берет 2 аргумента: указатель
buf
и длину данных
len
, как число значащих байтов.
Для типов фиксированного размера это размер типа. Для типов переменной длины,
ведущие 1 или 2 байта, которые указывают на
buffer
также содержат информацию о размере как
нормальную для типа.
Возвращаемое значение. 0 на успехе, 1 на неудаче.
Описание. Этот метод получает действующий размер
BLOB
то есть, число начальных байтов, чтобы
сохранить в признаке blob таблицы. Эта часть обычно сохраняется в оперативной
памяти и может вноситься в указателе и интерпретироваться.
Этот метод применим только к BLOB
.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setInlineSize
(
int size
)
Параметры. integer size
новый действующий размер для BLOB
.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает длину колонки. Для множества переменной длины это максимальная длина, иначе это длина массива.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setLength
(
int length
)
Параметры. Этот метод берет отдельный аргумент integer
length
, это
новая длина для колонки.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы определить имя колонки.
setName()
единственный метод
Column
,
результат которого видим MySQL Server. MySQL не видит никаких других
изменений, внесенных в существующие столбцы, используя API NDB.
Сигнатура.
void setName
(
const char* name
)
Параметры. Этот метод берет отдельный аргумент новое название колонки.
Возвращаемое значение. Нет.
Описание. Этот метод переключает возможность столбца хранить null.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setNullable
(
bool nullable
)
Параметры. true
позволяет вставить
NULL
в колонку, если
nullable
=
false
, этот метод выполняет эквивалент изменения колонки к
NOT NULL
в MySQL.
Возвращаемое значение. Нет.
Описание. Этот метод позволяет добавить колонку к ключу разделения таблицы, к которой это принадлежит, или удалить колонку из ключа разделения таблицы.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Для получения дополнительной информации посмотрите раздел 2.3.2.4.11.
Сигнатура.
void setPartitionKey
(
bool enable
)
Параметры. Единственный параметр
enable
типа Boolean.
true
to this method
делает колонку частью ключа разделения таблицы, если
enable
=
false
, тогда столбец удален
из ключа разделения.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает размер части
BLOB
то есть, число байтов, чтобы сохранить в
каждом кортеже BLOB
.
Этот метод применим только к BLOB
.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setPartSize
(
int size
)
Параметры. integer size
это число байтов, чтобы сохранить в BLOB
.
Используя ноль для этого значения, только действующие байты могут быть
сохранены, в действительности делая тип колонки
TINYBLOB
.
Возвращаемое значение. Нет.
Описание. Этот метод может использоваться, чтобы установить точность десятичной колонки.
Этот метод применим только к десятичным столбцам.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setPrecision
(
int precision
)
Параметры. Этот метод берет единственный параметр: целое число, значение новой точности колонки. Для получения дополнительной информации о десятичной точности и масштабе, посмотрите разделы 2.3.2.4.13 и 2.3.2.4.15.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы сделать колонку частью первичного ключа таблицы или удалить ее из первичного ключа.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setPrimaryKey
(
bool primary
)
Параметры. Если true
,
столбец становится частью первичного ключа таблицы, если
false
, тогда столбец удален
из первичного ключа.
Возвращаемое значение. Нет.
Описание. Этот метод может использоваться, чтобы установить масштаб десятичной колонки.
Этот метод применим только к десятичным столбцам.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setScale
(
int scale
)
Параметры. Этот метод берет единственный параметр integer
scale
, новый масштаб для десятичной
колонки. Для получения дополнительной информации о десятичной точности и
масштабе, посмотрите разделы
2.3.2.4.13 и
2.3.2.4.15.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает размер полосы
BLOB
то есть, количество последовательных
частей, чтобы сохранить в каждом узле кластера.
Этот метод применим только к BLOB
.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setStripeSize
(
int size
)
Параметры. Этот метод берет отдельный аргумент. integer
size
новый размер
полосы для колонки.
Возвращаемое значение. Нет.
Описание. Устанавливает тип хранения для колонки.
Сигнатура.
void setStorageType
(
StorageType type
)
Параметры. Значение
Column::StorageType
. См.
раздел 2.3.2.2.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает
Type
(тип данных) колонки.
setType()
сбрасывает
все атрибуты столбца к их значениям
по умолчанию, это должен быть первый метод, который вы называете, изменяя
признаки данной колонки.
Изменения, внесенные в колонки, используя этот метод, невидимы MySQL.
Сигнатура.
void setType
(
Type type
)
Параметры. Этот метод берет единственный параметр
Column::Type
. По умолчанию
The default is Unsigned
.
Для листинга всех разрешенных значений посмотрите
раздел 2.3.2.3.
Возвращаемое значение. Нет.
Резюме
Эта секция покрывает класс Datafile
.
Родительский класс.
Object
.
Дочерние классы. Нет
Описание. Класс Datafile
моделирует файл данных Cluster Disk Data, который используется, чтобы хранить
данные таблицы Disk Data.
В настоящее время только неиндексируемые данные столбца могут храниться на диске. Индексы и индексированные столбцы сохранены в памяти.
NDB Cluster до MySQL 5.1 не поддерживал Disk Data и файлы данных,
таким образом класс Datafile
недоступен
приложениям API NDB, написанным для этих более старых выпусков.
Методы. В следующей таблице перечислены публичные методы этого класса и цели использования каждого метода:
Таблица 2.11.
Имя | Описание |
---|---|
Datafile() |
Конструктор класса |
~Datafile() |
Деструктор класса |
getFileNo() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
getFree() |
Получает количество свободного пространства в файле данных |
getNode() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
getObjectId() |
Получает идентификатор объекта файла данных |
getObjectStatus() |
Получает статус объекта файла данных |
getObjectVersion() |
Получает версию объекта файла данных |
getPath() |
Получает путь файловой системы к файлу данных |
getSize() |
Получает размер файла данных |
getTablespace() |
Получает название табличного пространства, которому принадлежит файл данных |
getTablespaceId() |
Получает ID табличного пространства, которому принадлежит файл данных |
setNode() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
setPath() |
Устанавливает название и местоположение файла данных в файловой системе |
setSize() |
Устанавливает размер файла данных |
setTablespace() |
Устанавливает табличное пространство, которому принадлежит файл данных |
Типы.
Класс Datafile
не определяет публичных типов.
Описание. Этот метод создает новый экземпляр
Datafile
или копию существующего.
Сигнатура. Создать новый экземпляр:
Datafile ( void )
Создать копию существующего экземпляра
Datafile
:
Datafile
(
const Datafile& datafile
)
Параметры. Новый экземпляр:
Нет.
Конструктор копии: ссылка на экземпляр
Datafile
, который будет скопирован.
Возвращаемое значение.
Объект
Datafile
.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
Uint32 getFileNo ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер файла как unsigned 32-bit integer.
Описание. Этот метод получает свободное пространство, доступное в файле данных.
Сигнатура.
Uint64 getFree ( void ) const
Параметры. Нет.
Возвращаемое значение. Число байтов, свободных в файле данных как unsigned 64-bit integer.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
Uint32 getNode ( void ) const
Параметры. Нет.
Возвращаемое значение. ID узла как unsigned 32-bit integer.
Описание. Этот метод используется, чтобы получить идентификатор объекта файла данных.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта файла данных как integer.
Описание. Этот метод используется, чтобы получить статус объекта файла данных.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Файл данных
Status
. См.
раздел 2.3.31.4.
Описание. Этот метод получает версию объекта файла данных (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта файла данных как integer.
Описание. Этот метод возвращает путь файловой системы к файлу данных.
Сигнатура.
const char* getPath ( void ) const
Параметры. Нет.
Возвращаемое значение. Путь к файлу данных в файловой системе узла данных, строка (указатель на символ).
Описание. Этот метод получает размер файла данных в байтах.
Сигнатура.
Uint64 getSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер файла данных в байтах как unsigned 64-bit integer.
Описание. Этот метод может использоваться, чтобы получить название табличного пространства, которому принадлежит файл данных.
Можно также получить доступ к ID связанного табличного пространства непосредственно. Посмотрите раздел 2.3.3.11.
Сигнатура.
const char* getTablespace ( void ) const
Параметры. Нет.
Возвращаемое значение. Название связанного табличного пространства.
Описание. Этот метод получает ID табличного пространства, которому принадлежит файл данных.
Можно также получить доступ к названию связанного табличного пространства непосредственно. Посмотрите раздел 2.3.3.10.
Сигнатура.
Uint32 getTablespaceId ( void ) const
Параметры. Нет.
Возвращаемое значение. Этот метод возвращает ID табличного пространства как unsigned 32-bit integer.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
void setNode
(
Uint32 nodeId
)
Параметры. nodeId
узла,
на котором файл данных должен быть расположен (unsigned 32-bit integer).
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает путь к файлу данных в файловой системе узла данных.
Сигнатура.
const char* setPath ( void ) const
Параметры. Путь к файлу, строка.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает размер файла данных.
Сигнатура.
void setSize
(
Uint64 size
)
Параметры. Этот метод берет единственный параметр: желаемый размер
size
в байтах для файла данных как
unsigned 64-bit integer.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы связать файл данных с табличным пространством.
Сигнатуры. setTablespace()
может быть вызван любым из двух способов, перечисленных здесь:
Используя название табличного пространства, как показано здесь:
void setTablespace
(
const char* name
)
Используя ссылку на объект
Tablespace
.
void setTablespace
(
const class Tablespace& tablespace
)
Параметры. Этот метод берет единственный параметр, который может быть одним из следующего:
Имя name
табличного пространства (указатель на символ).
Ссылка tablespace
для
передачи объекта
Tablespace
.
Возвращаемое значение. Нет.
Резюме
Эта секция описывает класс Dictionary
.
Родительский класс.
NdbDictionary
.
Дочерние классы.
List
.
Описание. Это используется для определения и получения метаданных объекта данных. Это также включает методы для создания и удаления объектов базы данных.
Методы. В следующей таблице перечислены публичные методы этого класса:
Таблица 2.12.
Имя | Описание |
---|---|
Dictionary() |
Метод конструктора класса |
~Dictionary() |
Метод деструктора |
beginSchemaTrans() |
Начинает транзакцию схемы |
createDatafile() |
Создает файл данных |
createEvent() |
Создает событие |
createForeignKey() |
Создает внешний ключ |
createHashMap() |
Создает хэш-карту |
createIndex() |
Создает индекс |
createLogfileGroup() |
Создает группу файла журнала |
createRecord() |
Создает объект
Ndbrecord |
createTable() |
Составляет таблицу |
createTablespace() |
Создает табличное пространство |
createundofile() |
Создает undofile |
dropDatafile() |
Удаляет файл данных |
dropEvent() |
Удаляет событие |
dropForeignKey() |
Удаляет внешний ключ |
dropIndex() |
Удаляет индекс |
dropLogfileGroup() |
Удаляет группу файла журнала |
dropTable() |
Удаляет таблицу |
dropTablespace() |
Удаляет табличное пространство |
dropundofile() |
Удаляет undofile |
endSchemaTrans() |
Заканчивает (передает и завершает) транзакцию схемы |
getDatafile() |
Получает файл данных, имеющий имя |
getDefaultHashMap() |
Получает хэш-карту таблицы по умолчанию |
getEvent() |
Получает событие, имеющее имя |
getForeignKey() |
Получает внешний ключ, имеющий имя или ссылку |
getHashMap() |
Получает хэш-карту по ее имени или связанной таблице |
getIndex() |
Получает индекс, имеющий имя |
getLogfileGroup() |
Получает группу файла журнала, имеющую имя |
getNdbError() |
Восстанавливает последнюю ошибку |
getTable() |
Получает таблицу, имеющую имя |
getTablespace() |
Получает табличное пространство, имеющее имя |
getundofile() |
Получает undofile по имени |
hasSchemaTrans() |
Говорит, существует ли транзакция схемы в настоящее время |
initDefaultHashMap() |
Инициализирует хэш-карту по умолчанию таблицы |
invalidateTable() |
Лишает законной силы объект таблицы |
listObjects() |
Получает список объектов в словаре |
listIndexes() |
Получает список индексов, определенных на данной таблице |
listEvents() |
Получает список событий, определенных в словаре |
prepareHashMap() |
Создает или восстанавливает хэш-карту, которая может быть обновлена |
removeCachedTable() |
Удаляет таблицу из местного кэша |
removeCachedIndex() |
Удаляет индекс из местного кэша |
Объекты базы данных, такие как таблицы и индексы, созданные с
использованием методов Dictionary::create
,
не могут быть замечены MySQL Server. Это означает, что к ним не могут
получить доступ клиенты MySQL, и что они не могут копироваться.
По этим причинам часто предпочтительно избежать работать с ними.*
()
Класс Dictionary
не имеет методов
для работы непосредственно со столбцами. Необходимо использовать методы
класса Column
с этой целью, см. раздел 2.3.2.
Типы. См. разделы 2.3.14 и 2.3.5.
Описание. Этот метод создает новый экземпляр класса
Dictionary
.
Конструктор и деструктор для этого класса защищенные методы, а не публичные.
Сигнатура.
protected Dictionary
(
Ndb& ndb
)
Параметры. Объект
Ndb
.
Возвращаемое значение.
Объект
Dictionary
.
Деструктор. Деструктор не берет параметров и ничего не возвращает.
protected ~Dictionary ( void )
Описание. Начинает транзакцию схемы. Ошибка происходит, если
транзакция уже активна или если ядерные метаданные блокированы.
Можно определить, существует ли уже транзакция схемы, используя метод
hasSchemaTrans()
.
Операция по метаданным происходит каждый раз, когда объекты данных созданы, изменены или удалены, такая операция может создать дополнительные подоперации в ядре NDB.
Объект Ndb
и его связанный
Dictionary
поддерживают одну транзакцию схемы за один раз.
По умолчанию каждая операция по метаданным выполняется отдельно,
то есть, для каждой операции транзакция схемы начата неявно, операция
(включая любые подоперации) выполняется и транзакция закончена.
Также возможно начать и закончить транзакцию схемы явно и выполнить ряд определенных пользователями операций атомарно в ее границах. В этом случае все операции в транзакции схемы имеют успех или прерваны и отменены как единица. Это сделано, выполнив шаги, перечисленные здесь:
Чтобы начать транзакцию схемы, вызовите
beginSchemaTrans()
.
Выполните желаемые операции (например,
createTable()
).
Закончите транзакцию схемы, вызывая
endSchemaTrans
.
Каждую операцию посылают в ядро NDB, которое разбирает и сохраняет ее. Неудача разбора приводит к откату к предыдущей пользовательской операции перед возвратом, в этом пункте пользователь может продолжить или прервать всю транзакцию.
После того, как все операции были представлены,
endSchemaTrans()
обрабатывает
и передает их. В случае ошибки немедленно прерывается транзакция.
Если пользователь выходит перед запросом
endSchemaTrans()
, ядро NDB
прерывает транзакцию. Если пользователь выходит перед возвратом из
endSchemaTrans()
,
ядро продолжает запрос, и о его статусе завершения
сообщает в регистрации кластера.
Сигнатура.
int beginSchemaTrans ( void )
Параметры. Нет.
Возвращаемое значение. 0 на успехе, -1 на ошибке.
Описание. Этот метод создает новый файл данных, заданный объектом
Datafile
.
Сигнатура.
int createDatafile
(
const Datafile& dFile
)
Параметры. Отдельный аргумент: ссылка на экземпляр
Datafile
.
Возвращаемое значение. 0 на успехе, -1 на ошибке.
Описание. Создает событие, учитывая ссылку на объект
Event
.
Необходимо иметь в виду, что API NDB не отслеживает ассигнованные
объекты-события, что означает, что пользователь должен удалить
Event
, если
это было получено, используя createEvent()
,
после того, как этот объект больше не требуется.
Сигнатура.
int createEvent
(
const Event& event
)
Параметры. Ссылка event
на объект Event
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Создает объект
ForeignKey
, учитывая ссылку на этот объект и
ID Object
.
Сигнатура.
int createForeignKey
(
const ForeignKey&,
ObjectId* = 0,
int flags
= 0
)
Параметры. Ссылка на объект
ForeignKey
и Object
ID. Дополнительная значение flags
, если используется, позволяет создание внешнего ключа, не выполняя
проверок внешнего ключа. Если установлено, его значение должно быть
CreateFK_NoVerify
(1).
Возвращаемое значение.
0
при успехе.
Описание. Создает
HashMap
.
Сигнатура.
int createHashMap ( const HashMap&hashmap
, ObjectId*id
= 0 )
Параметры. Ссылка на хэш-карту и опционально ID, который будет назначен на нее. Добавлено в NDB 7.2.7.
Возвращаемое значение. 0 на успехе, на неудаче вернет -1 и устанавливает ошибку.
Описание. Этот метод создает индекс, заданный экземпляром
Index
и возможно дополнительным экземпляром
Table
.
Сигнатура. Этот метод может быть вызван с или без ссылки на объект таблицы:
int createIndex
(
const Index& index
)
int createIndex ( const Index&index
, const Table&table
)
Параметры. Надо: ссылка на
объект Index
.
Опционально: ссылка на объект
Table
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод создает новую группу файла журнала, заданную
экземпляром
LogfileGroup
.
Сигнатура.
int createLogfileGroup
(
const LogfileGroup& lGroup
)
Параметры. Отдельный аргумент, ссылка на объект
LogfileGroup
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы создать объект
NdbRecord
для использования в таблице или операций по просмотру индекса.
Сигнатура. Вызов этого метода зависит от того, должна ли получающаяся NdbRecord использоваться в операциях по индексу или таблице:
Чтобы создать
NdbRecord
для использования в операциях по
таблице используйте следующее:
NdbRecord* createRecord ( const Table*table
, const RecordSpecification*recSpec
, Uint32length
, Uint32elSize
)
Чтобы создать
NdbRecord
для использования в операциях по
индексу можно использовать любое из следующего:
NdbRecord* createRecord ( const Index*index
, const Table*table
, const RecordSpecification*recSpec
, Uint32length
, Uint32elSize
)
или
NdbRecord* createRecord ( const Index*index
, const RecordSpecification*recSpec
, Uint32length
, Uint32elSize
)
Параметры.
Dictionary::createRecord()
берет следующие параметры:
Если
NdbRecord
должна использоваться с индексом, указатель на объект
Index
.
Если NdbRecord
должна использоваться с таблицей, этот параметр опущен. См.
раздел 2.3.11.
Указатель на объект
Table
, представляющий таблицу, которая будет
просмотрена. Если
Ndbrecord
будет использоваться с индексом, тогда это произвольно
определяет таблицу, содержащую этот индекс.
См. раздел 2.3.37.
RecordSpecification
используется, чтобы описать колонку. См.
раздел 2.3.34.
Длина length
записи.
elSize
задает
размер элементов, составляющих запись.
Возвращаемое значение.
NdbRecord
для использования в операциях, включающих данную таблицу или индекс.
Пример. См. раздел 2.3.27.
Описание. Составляет таблицу, используя данный экземпляр
Table
.
Таблицы, созданные с использованием этого метода, не могут быть видны MySQL Server, не могут быть обновлены клиентами MySQL и не могут копироваться.
Сигнатура.
int createTable
(
const Table& table
)
Параметры. Экземпляр
Table
. См.
раздел 2.3.37.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод создает новое табличное пространство, заданное
объектом Tablespace
.
Сигнатура.
int createTablespace
(
const Tablespace& tSpace
)
Параметры. Этот метод требует отдельного аргумента: ссылки на
экземпляр
Tablespace
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод создает новый файл отмен, заданный объектом
undofile
.
Сигнатура.
int createundofile
(
const undofile& uFile
)
Параметры. Этот метод требует одного аргумента: ссылки на экземпляр
undofile
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод удаляет файл данных, заданный объектом
Datafile
.
Сигнатура.
int dropDatafile
(
const Datafile& dFile
)
Параметры. Отдельный аргумент: ссылка на экземпляр
Datafile
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод удаляет событие учитывая ссылку на объект
Event
.
Сигнатура.
int dropEvent ( const char*name
, intforce
= 0 )
Параметры. Этот метод берет два параметра:
name
имя события, которое будет удалено, как строка.
По умолчанию dropEvent()
терпит неудачу, если определенное событие не существует. Можно отвергнуть это
поведение, передав любое ненулевое значение для дополнительного параметра
force
, в этом случае никакая
проверка не осуществлена относительно того, есть ли на самом деле такое
событие, и ошибка возвращена, только если событие существует, но
по любой причине невозможно его удалить.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод удаляет внешний ключ учитывая ссылку на
объект
ForeignKey
.
Сигнатура.
int dropForeignKey ( const ForeignKey& )
Параметры. Ссылка на удаляемый объект
ForeignKey
.
Возвращаемое значение.
0
при успехе.
Описание. Этот метод удаляет индекс, переданный экземпляром
Index
,
и возможно дополнительным экземпляром
Table
.
Сигнатура.
int dropIndex
(
const Index& index
)
int dropIndex ( const Index&index
, const Table&table
)
Параметры. Этот метод берет два параметра, один из которых дополнительный:
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Берет экземпляр
LogfileGroup
и удаляет соответствующую
группу файла журнала.
Сигнатура.
int dropLogfileGroup
(
const LogfileGroup& lGroup
)
Параметры. Отдельный аргумент, ссылка на объект
LogfileGroup
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Удаляет таблицу, заданную экземпляром
Table
.
Сигнатура.
int dropTable
(
const Table& table
)
В NDB 7.3.5 и позже этот метод пропускает все ограничения внешнего ключа
на table
, то есть таблица удалена
безотносительно того, действует ли она как родительская таблица, дочерняя
таблица или обе (Bug #18069680).
До NDB 8.0.17 таблица NDB
, удаляемая с
использованием этого метода, сохранялась в словаре данных MySQL, но не могла
быть удалена, используя
DROP TABLE
в клиенте
mysql. В NDB 8.0.17 и выше
такие таблицы могут быть удалены, используя DROP
TABLE
(Bug #29125206, Bug #93672).
Параметры. Экземпляр
Table
. См.
раздел 2.3.37.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод удаляет табличное пространство, заданное
объектом
Tablespace
.
Сигнатура.
int dropTablespace
(
const Tablespace& tSpace
)
Параметры. Этот метод требует отдельного аргумента:
ссылки на экземпляр
Tablespace
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод удаляет файл отката, заданный объектом
undofile
.
Сигнатура.
int dropundofile
(
const undofile& uFile
)
Параметры. Этот метод требует один аргумент: ссылку на экземпляр
undofile
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Заканчивает транзакцию схемы, начатую
beginSchemaTrans()
,
операции будут обработаны и переданы или прерваны и отменены.
Этот метод объединяет операционное выполнение и закрытие, отдельные методы
для этих задач не требуются. Этот метод можно вызвать успешно, даже если
никакая транзакция схемы в настоящее время неактивна.
Как со многими другими методами API NDB, возможно для
endSchemaTrans()
переписывать любой текущий код
ошибки. Поэтому необходимо сначала проверить и сохранить любой код ошибки,
который, возможно, следовал из предыдущей, неудавшейся операции.
Сигнатура.
int endSchemaTrans
(
Uint32 flags
= 0
)
Параметры. Флаги определяют, как законченная транзакция обработана. По умолчанию 0 заставляет транзакцию быть переданной.
Dictionary::SchemaTransFlag. Можно также использовать с
endSchemaTrans()
любое из этих значений
SchemaTransFlag
:
SchemaTransAbort
(= 1):
Заставляет транзакцию быть прерванной.
SchemaTransBackground
(= 2):
Заставляет транзакцию выполняться в фоновом режиме, результат написан
регистрации кластера в то время, как приложение продолжается,
не ожидая ответа.
Возвращаемое значение.
0 при удаче, в случае ошибки -1 и установит код ошибки
NdbError
.
Описание. Этот метод используется, чтобы получить объект
Datafile
,
учитывая ID узла данных, где файл данных расположен и путь к файлу данных в
файловой системе того узла.
Сигнатура.
Datafile getDatafile ( Uint32nodeId
, const char*path
)
Параметры. Этот метод должен быть вызван, используя два аргумента, как показано здесь:
32-bit unsigned integer nodeId
узла данных, где файл данных расположен.
path
задает путь к файлу данных в файловой системе узла
(строка как указатель на символ).
Возвращаемое значение. Объект
Datafile
, см.
раздел 2.3.3.
Описание. Получите хэш-карту таблицы по умолчанию.
Добавлен в NDB 7.2.7.
Сигнатура.
int getDefaultHashMap ( HashMap&dst
, Uint32fragments
)
или
int getDefaultHashMap ( HashMap&dst
, Uint32buckets
, Uint32fragments
)
Возвращаемое значение. 0 при успехе, при неудаче -1 и установит ошибку.
Описание. Этот метод используется, чтобы получить новый объект
Event
,
представляющий событие, учитывая имя события.
getEvent()
ассигнует память каждый раз, когда
это успешно вызывают. Необходимо иметь в виду, что последовательные вызовы
этого метода, используя то же самое событие, вызывают возвращение
многократных отдельных объектов.
NDB API не отслеживает ассигнованные объекты-события, что означает, что
пользователь должен удалить каждый
Event
,
созданный с использованием getEvent()
,
после того, как объект больше не требуется.
Сигнатура.
const Event* getEvent
(
const char* eventName
)
Параметры. Строка eventName
как указатель на символ.
Возвращаемое значение. Указатель на объект
Event
.
См. раздел 2.3.6.
Описание. Этот метод используется, чтобы получить новый объект
ForeignKey
, представляющий событие, учитывая ссылку на внешний ключ и его имя.
Сигнатура.
int getForeignKey ( ForeignKey&dst
, const char*name
)
Параметры. Ссылка на внешний ключ и
name
как указатель на символ.
Возвращаемое значение. Указатель на объект
ForeignKey
.
Описание. Получает хэш-карту по имени или таблице.
Добавлено в NDB 7.2.7.
Сигнатура.
int getHashMap ( HashMap&dst
, const char*name
)
или
int getHashMap ( HashMap&dst
, const Table*table
)
Параметры. Ссылка на хэш-карту и имя или на
Table
.
Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.
Описание. Этот метод получает указатель на индекс, учитывая название индекса и название таблицы, которой принадлежит индекс.
Сигнатура.
const Index* getIndex ( const char*iName
, const char*tName
) const
Параметры. Требуются два параметра:
Название индекса (iName
).
Название таблицы, которой принадлежит индекс
(tName
).
Оба это строковые значения, представленные указателями на символ.
Возвращаемое значение. Указатель на
Index
. См.
раздел 2.3.11.
Описание.
Этот метод получает объект
LogfileGroup
, учитывая имя
группы файла журнала.
Сигнатура.
LogfileGroup getLogfileGroup
(
const char* name
)
Параметры. Имя name
группы файла журнала.
Возвращаемое значение.
Экземпляр
LogfileGroup
, см.
раздел 2.3.13.
Описание. Этот метод получает ошибку
NDB
API.
Сигнатура.
const struct NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение. Ссылка на объект
NdbError
,
см. раздел 2.3.20.
Описание. Этот метод может использоваться, чтобы получить доступ к таблице с известным именем. Посмотрите раздел 2.3.37.
Сигнатура.
const Table* getTable
(
const char* name
) const
Параметры. Имя name
.
Возвращаемое значение. Указатель на таблицу или
NULL
, если нет никакой таблицы с именем
name
.
Описание. Учитывая имя или ID табличного пространства, этот метод
возвращает объект
Tablespace
.
Сигнатуры. Этот метод может быть вызван любым из этих способов:
Используя имя табличного пространства:
Tablespace getTablespace
(
const char* name
)
Используя ID табличного пространства:
Tablespace getTablespace
(
Uint32 id
)
Параметры. Любой из следующего:
ul>name
имя табличного
пространства, последовательность (как указатель на символ).
unsigned 32-bit integer id
табличного пространства.
Возвращаемое значение. Объект
Tablespace
, рассмотренный в
discussed in разделе 2.3.38.
Описание. Этот метод получает объект
undofile
,
учитывая ID узла, где файл отмены расположен и путь файловой системы к файлу.
Сигнатура.
undofile getundofile ( Uint32nodeId
, const char*path
)
Параметры. Этот метод требует следующих двух аргументов:
nodeId
узла данных, где расположен файл отмены, это значение передается как
32-bit unsigned integer.
path
путь к файлу отмены
в файловой системе узла (строка как указатель на символ).
Возвращаемое значение.
Экземпляр undofile
. См. раздел 2.3.39.
Описание. Говорит, продолжается ли транзакция схемы API NDB.
Сигнатура.
bool hasSchemaTrans ( void ) const
Параметры. Нет.
Возвращаемое значение. TRUE
, если
транзакция схемы происходит, иначе FALSE
.
Описание. Инициализирует хэш-карту по умолчанию для таблицы.
Добавлено в NDB 7.2.7.
Сигнатура.
int initDefaultHashMap ( HashMap& dst, Uint32 fragments )
или
int initDefaultHashMap ( HashMap& dst, Uint32 buckets, Uint32 fragments )
Параметры. Ссылка на хэш-карту и количество фрагментов. Произвольно количество букетов.
Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.
Описание. Этот метод используется, чтобы лишить законной силы кэшированный индексный объект.
Сигнатура. На индекс, лишенный законной силы этим методом, можно
сослаться как на объект
Index
(используя указатель) или по имени индекса и таблицы,
как показано здесь:
void invalidateIndex ( const char*indexName
, const char*tableName
) void invalidateIndex ( const Index*index
)
Параметры. Названия индекса, который будет удален из кэша
и таблицы, которой это принадлежит
(indexName
и
tableName
, соответственно)
или указатель на объект
Index
.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы лишить законной силы кэшированный объект таблицы.
Сигнатура.
void invalidateTable
(
const char* name
)
Допустимо использовать объект
Table
, а не
название таблицы, как показано здесь:
void invalidateTable
(
const Table* table
)
Параметры. Имя name
таблицы, которая будет удалена из кэша таблиц или указатель на объект
Table
.
Возвращаемое значение. Нет.
Описание. Этот метод возвращает список всех событий, определенных в рамках словаря.
Сигнатура.
int listEvents
(
List& list
)
Параметры. Ссылка на объект
List
. См.
раздел 2.3.14.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы получить
List
всех индексов в таблице, учитывая название таблицы. См.
раздел 2.3.14.
Сигнатура.
int listIndexes ( List&list
, const char*table
) const
Параметры. listIndexes()
берет два аргумента, оба из которых требуются:
Ссылка на List
, это содержит индексы после вызова метода.
Название таблицы table
,
чьи индексы должны быть перечислены.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод используется, чтобы получить список объектов в словаре. Возможно получить все объекты в словаре или ограничить список объектами единственного типа.
Сигнатуры.
int listObjects ( List&list
, Object::Typetype
= Object::TypeUndefined ) const
или
int listObjects ( List&list
, Object::Typetype
, boolfullyQualified
) const
Параметры. Ссылка на объект
List
требуется: это список, который содержит
объекты словаря после вызова listObjects()
. См.
раздел 2.3.14. Дополнительный второй
аргумент type
может использоваться, чтобы ограничить список только объектами заданного типа
то есть, указанного
Object::Type
. См.
раздел 2.3.31.6.
Если type
не задан, тогда список содержит все объекты словаря.
Можно также определить, действительно ли имена объектов в
list
полностью квалифицированы (то есть, включает ли имя объекта базу данных,
схему и возможно имя таблицы). Если вы определяете
fullyQualified
, тогда необходимо
также определить type
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Создает или получает хэш-карту, подходящую для изменения. Требует, чтобы транзакция схемы произошла, посмотрите раздел 2.3.4.2.
Добавлено в NDB 7.2.7.
Сигнатура.
int prepareHashMap ( const Table&oldTable
, Table&newTable
)
или
int prepareHashMap ( const Table&oldTable
, Table&newTable
, Uint32buckets
)
Параметры. Ссылки на старые и новые таблицы. Произвольно число букетов.
Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.
Описание. Этот метод освобождает
NdbRecord
, когда это больше не необходимо.
Сигнатура.
void releaseRecord
(
NdbRecord* record
)
Параметры.
NdbRecord
для очистки.
Возвращаемое значение. Нет.
Пример. См. раздел 2.3.27.
Описание. Этот метод удаляет указанную таблица из местного кэша.
Сигнатура.
void removeCachedTable
(
const char* table
)
Параметры. Название table
для удаления из кэша.
Возвращаемое значение. Нет.
Описание. Этот метод удаляет указанный индекс из местного кэша.
Сигнатура.
void removeCachedIndex ( const char*index
, const char*table
)
Параметры. Метод removeCachedIndex()
требует двух аргументов:
Имя индекса index
для удаления.
Имя таблицы table
,
в которой найден индекс.
Возвращаемое значение. Нет.
Резюме
Эта секция обсуждает структуру Element
.
Родительский класс.
List
.
Описание. Структура Element
моделирует элемент списка, это используется, чтобы хранить объект в
List
,
заполненный
Dictionary
методами
listObjects()
,
listIndexes()
и
listEvents()
.
Атрибуты. Element
имеет атрибуты:
Таблица 2.13.
Атрибут | Тип | Начальное значение | Описание |
---|---|---|---|
id |
unsigned int |
0 |
ID объекта |
type |
Object::Type
|
Object::TypeUndefined |
Тип объекта, см. раздел 2.3.31.6 |
state |
Object::State
|
Object::StateUndefined |
Статус объекта, см. раздел 2.3.31.3 |
store |
Object::Store
|
Object::StoreUndefined |
Как объект хранится, см. раздел 2.3.31.5 |
database |
char* |
0 |
База данных, в которой найден объект |
schema |
char* |
0 |
Схема, в которой найден объект |
name |
char* |
0 |
Имя объекта |
Резюме
Эта секция обсуждает класс Event
,
его методы и определенные типы.
Родительский класс.
NdbDictionary
Дочерние классы. Нет
Описание. Этот класс представляет событие базы данных в NDB Cluster.
Методы.
Таблица 2.14.
Имя | Описание |
---|---|
Event() |
Конструктор класса |
~Event() |
Деструктор |
addEventColumn() |
Добавляет столбец, в котором должны быть обнаружены события |
addEventColumns() |
Добавляет многочисленные колонки, в которых должны быть обнаружены события |
addTableEvent() |
Добавляет тип события, которое должно быть обнаружено |
getDurability() |
Получает длительность события |
getEventColumn() |
Получает колонку, для которой определяется событие |
getName() |
Получает имя события |
getNoOfEventColumns() |
Получает количество столбцов, для которых определяется событие |
getObjectId() |
Получает идентификатор объекта события |
getObjectStatus() |
Получает статус объекта события |
getObjectVersion() |
Получает версию объекта события |
getReport() |
Получает варианты сообщения события |
getTable() |
Получает объект Table , на
котором определяется событие |
getTableEvent() |
Проверка, должно ли событие быть обнаружено |
getTableName() |
Получает название таблицы, на которой определяется событие |
mergeEvents() |
Устанавливает флаг слияния события |
setDurability() |
Устанавливает длительность события |
setName() |
Определяет имя события |
setReport() |
Варианты сообщения события |
setTable() |
Устанавливает объект
Table , на котором определяется событие |
Улучшенное Event API (NDB 7.4.3 и выше).
NDB 7.4.3 вводит управляемый эпохой Event API, который заменяет более раннюю
основанную на GCI модель. Новая версия API также упрощает обнаружение ошибок
и обработку. Эти изменения осознаны в API NDB, осуществив много новых методов
для Ndb
и
NdbEventOperation
, устарев несколько других методов обоих классов
и добавив новый тип
TableEvent
.
Некоторые новые методы непосредственно заменяют устаревшие, но не все устаревшие отображены к новым, некоторые из которых совершенно новые. Старые методы (устаревшие) показывают в первой колонке следующей таблицы и новые методы во второй колонке, старые методы, соответствующие новым методам, показывают в той же самой строке.
Таблица 2.15.
Обработка ошибок используя новый API достигается, проверяя значение,
возвращенное из
getEventType2()
, и больше не обрабатывается,
используя методы
hasError()
и
clearError()
, которые теперь устарели.
В поддержку этого изменения, диапазон возможных типов
TableEvent
расширен перечисленными здесь:
TE_EMPTY
: Пустая эпоха.
TE_INCONSISTENT
:
Непоследовательная эпоха: недостающие данные или переполнение.
TE_OUT_OF_MEMORY
:
Непоследовательные данные: буфер событий или память переполнены.
Результат этих изменений состоит в том, что в NDB 7.4.3 и позже можно проверить ошибки, проверяя тип события таблицы, как показано здесь:
NdbDictionary::Event::TableEvent* error_type = 0; NdbEventOperation* pOp = nextEvent2(); if (pOp->isErrorEpoch(error_type) { switch (error_type) { case TE_INCONSISTENT : // Handle error/inconsistent epoch... break; case TE_OUT_OF_MEMORY : // Handle error/inconsistent data... break; //... } }
Для получения дополнительной информации см. подробные описания для
методов Ndb
и
NdbEventOperation
в
разделе 2.3.6.23.
Типы. Это публичныетипы класса Event
:
Таблица 2.16.
Имя | Описание |
---|---|
TableEvent() |
Представляет тип события таблицы |
EventDurability() |
Определяет объем события, доступность и время жизни |
EventReport() |
Определяет возможность сообщения для события таблицы |
Описание. Этот метод используется, чтобы добавить колонку, на которой должны быть обнаружены события. Столбец может быть обозначен ID или именем.
Необходимо вызвать
Dictionary::createEvent()
прежде, чем любые ошибки будут обнаружены. Посмотрите
раздел 2.3.4.4.
Если вы знаете несколько столбцов по имени, можно позволить обнаружение
событий на всех сразу при помощи
addEventColumns()
. См.
раздел 2.3.6.2.
Сигнатура. Идентификация события, используя его идентификатор столбца:
void addEventColumn
(
unsigned attrId
)
Идентификация колонки по имени:
void addEventColumn
(
const char* columnName
)
Параметры. Этот метод берет отдельный аргумент, который может быть любым одним из следующего:
ID столбца (attrId
),
который должен быть целым числом больше чем или равным
0
и меньше, чем значение, возвращенное
getNoOfEventColumns()
.
Имя столбца name
(как
постоянный указатель на символ).
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы позволить обнаружение событий на нескольких столбцах в то же время. Необходимо использовать названия столбцов.
Как и addEventColumn()
, надо вызвать
Dictionary::createEvent()
прежде, чем любые ошибки будут обнаружены. Посмотрите
раздел 2.3.4.4.
Сигнатура.
void addEventColumns ( intn
, const char**columnNames
)
Параметры. Этот метод требует двух аргументов, перечисленных здесь:
Количество столбцов n
(integer).
Названия столбцов columnNames
это должно быть передано как указатель на указатель на символ.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы добавить типы событий, которые должны быть обнаружены.
Сигнатура.
void addTableEvent
(
const TableEvent te
)
Параметры. Этот метод требует значение
TableEvent
.
Возвращаемое значение. Нет.
Описание. Конструктор
Event
создает новый экземпляр с именем,
произвольно связанный с таблицей.
Необходимо иметь в виду, что API NDB не отслеживает ассигнованные
объекты-события, что означает, что пользователь должен явно удалить
the Event
после того, как это больше не используется.
Сигнатуры.
Event
(
const char* name
)
Альтернативно, можно использовать имя событий и связанную таблицу:
Event ( const char*name
, const NdbDictionary::Table&table
)
Параметры. Как минимум, имя
name
(как постоянный указатель на
символ), поскольку событие требуется. Произвольно, событие может также быть
связано с таблицей, этим аргументом, когда существует, является ссылка на
объхект Table
(см. раздел 2.3.37).
Возвращаемое значение. Новый экземпляр
Event
.
Деструктор. Деструктор для этого класса поставляется как
виртуальный метод, который не берет аргументов и чей тип возвращения
void
.
Резюме
Эта секция обсуждает EventDurability
,
тип, определенный классом
Event
.
Описание. Значения этого типа используются, чтобы описать жизнь или постоянство события, а также его объем.
Возможные значения.
Таблица 2.17.
Имя | Описание |
---|---|
ED_UNDEFINED |
Событие не определено или неподдержанного типа. |
ED_SESSION |
Это событие сохраняется только на время текущей сессии и доступно только
текущему приложению. Это удалено после того, как приложение разъединяется или
после перезапуска кластера. Значение ED_SESSION
резервируется для будущего использования и еще не поддерживается ни в каком
выпуске кластера NDB. |
ED_TEMPORARY |
Любое приложение может использовать событие, но это удалено после
перезапуска кластера. Значение ED_TEMPORARY
резервируется для будущего использования и еще не поддерживается ни в каком
выпуске кластера NDB. |
ED_PERMANENT |
Любое приложение может использовать событие и это сохраняется, пока не
удалено приложением, даже после перезапуска кластера. Значение
ED_PERMANENT резервируется для будущего
использования и еще не поддерживается ни в каком выпуске кластера NDB.
|
Резюме
Эта секция обсуждает тип EventReport
,
определенный классом
Event
.
Описание. Значения этого типа используются, чтобы определить возможности сообщения для событий таблицы.
Возможные значения.
Таблица 2.18.
Имя | Описание |
---|---|
ER_UPDATED |
Сообщение о событиях обновления. |
ER_ALL |
Сообщение обо всех событиях, за исключением тех, которые не приводят к
любым обновлениям действующих частей столбцов
BLOB . |
ER_SUBSCRIBE |
Сообщение о подписных событиях. |
ER_DDL |
Сообщение о событиях DDL (см. раздел 2.3.6.20). |
Описание. Этот метод получает жизнь и объем события (то есть,
EventDurability
).
Сигнатура.
EventDurability getDurability ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение
EventDurability
.
Описание. Этот метод используется, чтобы получить определенную колонку из числа тех, на которых определяется событие.
Сигнатура.
const Column* getEventColumn
(
unsigned no
) const
Параметры. Номер (no
)
колонки, как получено использованием
getNoOfColumns()
(см.
раздел 2.3.6.10).
Возвращаемое значение. Указатель на
Column
,
соответствующий no
.
Описание. Этот метод получает название события.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название события, как указатель на символ.
Описание. Этот метод получает количество столбцов, на которых определяется событие.
Сигнатура.
int getNoOfEventColumns ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество столбцов (integer) или
-1
в случае ошибки.
Описание. Этот метод получает статус объекта события.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Статус объекта события. Для возможных значений посмотрите раздел 2.3.31.4.
Описание. Этот метод получает версию объекта события (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта события как integer.
Описание. Этот метод получает идентификатор объекта события.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта события как integer.
Описание. Этот метод используется, чтобы получить опции сообщения для этого события.
Сигнатура.
EventReport getReport ( void ) const
Параметры. Нет.
Возвращаемое значение. Опции сообщения определяются в разделе 2.3.6.6.
Описание. Этот метод используется, чтобы найти таблицу,
с которой связано событие. Это возвращает ссылку на объект
Table
.
Можно также получить название таблицы непосредственно, используя
getTableName()
.
Сигнатура.
const NdbDictionary::Table* getTable ( void ) const
Параметры. Нет.
Возвращаемое значение. Таблица, с которой событие связано,
если есть, как указатель на объект
Table
,
иначе NULL
. См.
раздел 2.3.37.
Описание. Этот метод используется, чтобы проверить, будет ли данное событие таблицы обнаружено.
Сигнатура.
bool getTableEvent
(
const TableEvent te
) const
Параметры. Этот метод берет единственный параметр, тип события
таблицы, то есть значение
TableEvent
.
Возвращаемое значение. Этот метод вернет
true
, если событие
TableEvent
типа te
будет обнаружено. Иначе возвращаемое значение
false
.
Описание. Этот метод получает название таблицы, с которой событие
связано, может служить удобной альтернативой
getTable()
. См.
раздел 2.3.6.15.
Сигнатура.
const char* getTableName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название таблицы, связанной с этим событием, как указатель на символ.
Описание. Этот метод используется, чтобы установить
флаг слияния событий, который является
по умолчанию false
. Установка его к
true
подразумевает, что события
слиты следующим образом:
Для данного
NdbEventOperation
, связанного с этим
событием, события на том же самом первичном ключе в том же самом глобальном
индексе контрольной точки (GCI) слиты в единственное событие.
Событие таблицы blob создается для каждого признака blob и события blob обработаны как часть главных событий таблицы.
Данные о Blob из событий части blob могут быть прочитаны через
методы NdbBlob
как единственное значение.
В настоящее время этот флаг не унаследован
NdbEventOperation
и должен быть установлен
на
NdbEventOperation
явно, см.
раздел 2.3.21.
Сигнатура.
void mergeEvents
(
bool flag
)
Параметры. Значение
flag
.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает длительность события то есть, время жизни и объем.
Сигнатура.
void setDurability(EventDurability ed
)
Параметры. Этот метод требует значение
EventDurability
.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы установить возможность сообщения для события. Значения возможных опций могут быть найдены в разделе 2.3.6.6.
Сообщение о событиях DDL. Необходимо вызвать
setReport()
с использованием
EventReport
= ER_DDL
(добавлено в тех же самых версиях кластера NDB).
Например, чтобы позволить событие DDL, сообщающее относительно объекта
Event
с
именем myEvent
,
необходимо вызвать этот метод как показано здесь:
myEvent.setReport(NdbDictionary::Event::ER_DDL);
Сигнатура.
void setReport
(
EventReport er
)
Параметры. Значение опции
EventReport
.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы определить имя события. Имя должно быть уникальным среди всех событий, видимых от текущего приложения (см. раздел 2.3.6.7).
Можно также определить имя события, сначала создав его. Посмотрите раздел 2.3.6.4.
Сигнатура.
void setName
(
const char* name
)
Параметры. Имя name
для события (как постоянный указатель на символ).
Возвращаемое значение. Нет.
Описание. Этот метод определяет таблицу, на которой должны быть обнаружены события.
По умолчанию обнаружение событий происходит на всех столбецх в таблице.
Используйте addEventColumn()
, чтобы
отвергнуть это поведение. Для получения дополнительной информации посмотрите
раздел 2.3.6.1.
Сигнатура.
void setTable
(
const NdbDictionary::Table& table
)
NDB 7.2.14, NDB 7.3.3 и позже поддерживают использование указателя с этим методом, как показано здесь:
void setTable
(
const NdbDictionary::Table*; table
)
Когда используется так, эта версия setTable()
вернет -1, если указатель таблицы NULL
(Bug
#16329082).
Параметры. Этот метод требует единственного параметра, ссылки на таблицу (см. раздел 2.3.37) на которой должны быть обнаружены события. NDB 7.2.14, NDB 7.3.3 и позже: ссылка или указатель на таблицу могут использоваться.
Возвращаемое значение. Нет. NDB 7.2.14, NDB 7.3.3 и позже: -1, если используется указатель null для таблицы.
Резюме
Эта секция описывает тип TableEvent
,
определенный классом
Event
.
Описание.
TableEvent
используется, чтобы классифицировать
типы событий, которые могут быть связаны с таблицами в API NDB.
Возможные значения.
Таблица 2.19.
Имя | Описание |
---|---|
TE_INSERT |
Событие вставки на таблице |
TE_DELETE |
Событие удаления на таблице |
TE_UPDATE |
Событие обновления на таблице |
TE_DROP |
Происходит, когда таблица удалена |
TE_ALTER |
Происходит, когда определение таблицы изменяется |
TE_CREATE |
Происходит, когда таблица составлена |
TE_GCP_COMPLETE |
Происходит на завершении глобальной контрольной точки |
TE_CLUSTER_FAILURE |
Происходит на неудачах кластера |
TE_STOP |
Происходит, когда операция событий остановлена |
TE_NODE_FAILURE |
Происходит, когда узел кластера терпит неудачу |
TE_SUBSCRIBE |
Происходит, когда узел кластера подписывается на событие |
TE_UNSUBSCRIBE |
Происходит, когда узел кластера отказывается от подписки на событие |
TE_EMPTY |
Пустая эпоха получена от узлов данных |
TE_INCONSISTENT |
Недостающие данные или переполнение буфера в узле данных |
TE_OUT_OF_MEMORY |
Переполнение в буфере событий |
TE_ALL |
Происходит, когда любое событие имеет место на таблице (не релевантно, когда определенное событие получено) |
TE_EMPTY
,
TE_INCONSISTENT
и TE_OUT_OF_MEMORY
добавлены в NDB 7.4.3.
Резюме
Эта секция описывает структуру
EventBufferMemoryUsage
.
Родительский класс.
Ndb
.
Описание. Эта структура была добавлена в NDB 7.4.3
для работы со статистикой использования буферной памяти событий.
Это используется в качестве аргумента
Ndb::get_event_buffer_memory_usage()
.
Атрибуты.
Таблица 2.20.
Имя | Тип | Начальное значение | Описание |
---|---|---|---|
allocated_bytes |
unsigned |
Нет | Полная ассигнованная буферная память событий в байтах |
used_bytes |
unsigned |
Нет | Используемая общая память в байтах |
usage_percent |
unsigned |
Нет | Использование буферной памяти событий как процент
(100 * used_bytes/allocated_bytes ) |
Резюме
Этот класс представляет внешний ключ на таблице
NDB
.
Это было добавлено в NDB API в NDB Cluster 7.3.
Родительский класс.
Object
.
Дочерние классы. Нет.
Методы.
Таблица 2.21.
Имя | Описание |
---|---|
ForeignKey() |
Конструктор класса |
~ForeignKey() |
Деструктор класса |
getName() |
Получите имя внешнего ключа |
getParentTable() |
Получите родительскую таблицу внешнего ключа |
getChildTable() |
Получите дочернюю таблицу внешнего ключа |
getParentColumnCount() |
Получите количество столбцов в родительской таблице |
getChildColumnCount() |
Получите количество столбцов в дочерней таблице |
getParentColumnNo() |
Получите номер столбца в родительской таблице |
getChildColumnNo() |
Получите номер столбца в дочерней таблице |
getParentIndex() |
0, если ключ часть первичного ключа родительской таблицы |
getChildIndex() |
0, если дочерние ссылки решены, используя первичный ключ дочерней таблицы |
getOnUpdateAction() |
Получите действие обновления внешнего ключа
(
FkAction ) |
getOnDeleteAction() |
Получите действие удаления внешнего ключа
(
FkAction ) |
setName() |
Определите имя внешнего ключа |
setParent() |
Установите родительскую таблицу внешнего ключа |
setChild() |
Установите дочернюю таблицу внешнего ключа |
setOnUpdateAction() |
Установите действие обновления внешнего ключа
(
FkAction ) |
setOnDeleteAction() |
Установите действие удаления внешнего ключа
(
FkAction ) |
getObjectStatus() |
Получите статус объекта |
getObjectId() |
Получите идентификатор объекта |
getObjectVersion() |
Получите версию объекта |
Типы. Класс ForeignKey
имеет
один публичный тип,
FkAction
.
Описание. Создайте совершенно новую ссылку внешнего ключа или копию существующего.
Сигнатура. Новый экземпляр:
ForeignKey ( void )
Конструктор копии:
ForeignKey ( const ForeignKey& )
Параметры. Для нового экземпляра: Нет.
Для конструктора копии: ссылка на существующий экземпляр
ForeignKey
.
Возвращаемое значение. Новый экземпляр
ForeignKey
.
FkAction
это перечисление, которое
представляет действие для внешнего ключа, когда обновление или удаление
выполняется на родительской таблице.
Возможные значения.
Таблица 2.22.
Имя | Описание |
---|---|
NoAction |
NO ACTION : Отсроченная проверка. |
Restrict |
RESTRICT :
Отклоните операцию на родительской таблице. |
Cascade |
CASCADE : Выполните операцию на строке из
родительской таблицы, выполните ту же самую операцию при соответствии
строкам в дочерней таблице. |
SetNull |
SET NULL : Выполните операцию на
строке из родительской таблицы, установите любые колонки внешнего ключа
соответствия в дочерней таблице к NULL . |
SetDefault |
SET DEFAULT : В настоящее время не
поддержано в NDB Cluster. |
См. FOREIGN KEY Constraints в MySQL Manual.
Описание. Получает название экземпляра
ForeignKey
, для которого вызван метод.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение.
Имя ForeignKey
.
Описание. Получает родительскую таблицу для экземпляра
ForeignKey
, для которого вызван метод.
Сигнатура.
const char* getParentTable ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на родительскую таблицу
ForeignKey
.
Описание. Получает дочернюю таблицу для экземпляра
ForeignKey
, для которого вызван метод.
Сигнатура.
const char* getChildTable ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на дочернюю таблицу
ForeignKey
.
Описание. Получает количество столбцов в родительской таблице этого
ForeignKey
.
Сигнатура.
unsigned getParentColumnCount ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество столбцов в родительской таблице.
Описание. Получает количество столбцов в дочерней таблице этого
ForeignKey
.
Сигнатура.
unsigned getChildColumnCount ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество столбцов в дочерней таблице.
Описание. 0, если дочерняя таблица ссылается на первичный ключ родительской таблицы.
Сигнатура.
const char* getParentIndex ( void ) const
Параметры. Нет.
Возвращаемое значение. См. описание.
Описание. 0, если дочерние ссылки решены, используя первичный ключ дочерней таблицы.
Сигнатура.
const char* getChildIndex ( void ) const
Параметры. Нет.
Возвращаемое значение. См. описание.
Описание. Этот метод получает порядковый номер колонки внешнего
ключа в родительской таблице для данного индекса. См. документацию для
Column::getColumnNo()
.
Сигнатура.
int getParentColumnNo
(
unsigned no
) const
Параметры. Нет.
Возвращаемое значение. Порядковый номер колонки.
Описание. Этот метод получает порядковый номер колонки внешнего
ключа в дочерней таблице для данного индекса. См. документацию для
Column::getColumnNo()
.
Сигнатура.
int getChildColumnNo
(
unsigned no
) const
Параметры. Нет.
Возвращаемое значение. Порядковый номер колонки.
Описание. Получите действие ON UPDATE
внешнего ключа. Это
ForeignKey::FkAction
и имеет одно из
значений NoAction
,
Restrict
, Cascade
или SetNull
.
Сигнатура.
FkAction getOnUpdateAction ( void ) const
Параметры. Нет.
Возвращаемое значение. Порядковый номер колонки.
Описание.
Описание. Получите действие ON DELETE
внешнего ключа. Это
ForeignKey::FkAction
и имеет одно из
значений NoAction
,
Restrict
, Cascade
или SetNull
.
Сигнатура.
FkAction getOnDeleteAction ( void ) const
Параметры. Нет.
Возвращаемое значение. Порядковый номер колонки.
Описание. Определите имя экземпляра
ForeignKey
, для которого вызван метод.
Сигнатура.
void setName ( const char* )
Параметры. Имя ForeignKey
.
Возвращаемое значение. Нет.
Описание. Установить родительскую таблицу
ForeignKey
, учитывая ссылку на таблицу и
произвольно индекс, чтобы использовать в качестве внешнего ключа.
Сигнатура.
void setParent ( const Table&, const Index* index = 0, const Column* cols[] = 0 )
Параметры. Ссылка на
Table
. Произвольно индекс, используя
обозначенную колонку или колонки.
Возвращаемое значение. Нет.
Описание. Установите дочернюю таблицу
ForeignKey
, учитывая ссылку на таблицу и
произвольно индекс, чтобы использовать в качестве внешнего ключа.
Сигнатура.
void setChild ( const Table&, const Index*index
= 0, const Column*cols
[] = 0 )
Параметры. Ссылка на
Table
. Произвольно индекс, используя
обозначенную колонку или колонки.
Возвращаемое значение. Нет.
Описание. Установите действие ON UPDATE
внешнего ключа.
Сигнатура.
void setOnUpdateAction ( FkAction )
Параметры. Действие ON UPDATE
, которое
будет выполнено. Это должно быть
ForeignKey::FkAction
с одним из значений
NoAction
,
Restrict
, Cascade
или SetNull
.
Возвращаемое значение. Нет
Описание. Установите действие ON DELETE
внешнего ключа.
Сигнатура.
void setOnUpdateAction ( FkAction )
Параметры. Действие ON DELETE
, которое
будет выполнено. Это должно быть
ForeignKey::FkAction
с одним из значений
NoAction
,
Restrict
, Cascade
или SetNull
.
Возвращаемое значение. Нет
Описание. Получите статус объекта (см.
раздел 2.3.31.4) для этого объекта
ForeignKey
.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Статус объекта
ForeignKey
как значение типа
Object::Status
.
См. документацию этого типа для возможных значений и их интерпретации.
Описание. Получите идентификатор объекта (см.
раздел 2.3.31.7) для
данного объекта ForeignKey
.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. ID объекта
ForeignKey
как возвращено
Object::getObjectId()
.
Описание. Получите версию объекта (см.
раздел 2.3.31.9)
для этого объекта ForeignKey
.
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер версии объекта
ForeignKey
(integer) как возвращено
Object::getObjectVersion()
.
Родительский класс.
NdbOperation
.
Описание. Эта структура используется, чтобы определить
дополнительное значение, чтобы получить как часть
NdbRecord
.
Члены. Элементы, составляющие эту структуру, показаны в следующей таблице:
Таблица 2.23.
Имя | Тип | Описание |
---|---|---|
column |
const
|
Чтобы определить дополнительное значение, чтобы читать, вызывающий
должен обеспечить это, а также (произвольно
NULL ) указатель
appStorage . |
appStorage |
void* |
Если этот указатель null, то полученное значение сохранено в памяти,
управляемой объектом
NdbRecAttr . Иначе полученное значение
сохранено в местоположении, указанном (и все еще доступном с использованием
объекта NdbRecAttr
). Обязанность вызывающего гарантировать, что
следующие условия выполнены:
|
recAttr |
NdbRecAttr
* |
После того, как операция определяется,
recAttr содержит указатель на
объект NdbRecAttr
для получения данных. |
В настоящее время чтение blob не может быть определено, используя
GetValueSpec
.
См. раздел 2.3.27.
Резюме
Этот класс представляет хэш-карту в NDB Cluster. Добавлен в NDB 7.2.7.
Родительский класс.
Object
.
Дочерние классы. Нет.
Методы.
Таблица 2.24.
Имя | Описание |
---|---|
HashMap() |
Конструктор класса |
~HashMap() |
Деструктор класса |
setName() |
Определите имя для hashmap |
getName() |
Получает имя hashmap |
setMap() |
Устанавливает длину и значения hashmap |
getMapLen() |
Получает длину hashmap |
getMapValues() |
Получает значения в hashmap |
equal() |
Сравнивает значения из этой hashmap с значениями из другой hashmap |
getObjectStatus() |
Получает статус объекта hashmap |
getObjectVersion() |
Получает версию объекта схемы hashmap |
getObjectId() |
Получает ID hashmap |
Типы. Класс HashMap
не имеет публичных типов.
Описание. Конструктор класса
HashMap
не требует никаких аргументов. Конструктор копии также доступен.
См. раздел 2.3.4.6.
Сигнатура. Основной конструктор:
HashMap HashMap ( void )
Конструктор копии:
HashMap HashMap
(
const HashMap& hashmap
)
Деструктор:
virtual ~HashMap ( void )
Параметры.
Нет или адрес существующего
объекта HashMap
, который будет скопирован.
Возвращаемое значение. Новый экземпляр
HashMap
, возможно копия существующего.
Описание. Определяет имя хэш-карты.
Сигнатура.
void setName
(
const char* name
)
Параметры. Имя, которое будет назначено hashmap.
Возвращаемое значение. Нет.
Описание. Получает название хэш-карты.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название хэш-карты.
Описание. Назначает ряд значений карте.
Сигнатура.
void setMap ( const Uint32*values
, Uint32len
)
Параметры. Указатель на ряд
values
длиной
len
.
Возвращаемое значение. Нет.
Описание. Получает длину хэш-карты, то есть, количество значений,
которые это содержит. Можно получить значения с использованием
getMapValues()
.
Сигнатура.
Uint32 getMapLen ( void ) const
Параметры. Нет.
Возвращаемое значение. Длина хэш-карты.
Описание. Получает значения из карты.
Сигнатура.
int getMapValues ( Uint32*dst
, Uint32len
) const
Параметры. Указатель на ряд значений
(dst
) и количество значений
(len
).
Возвращаемое значение. 0 при успехе, при неудаче -1 и установит ошибку.
Описание. Сравнивает (только) значения этой
HashMap
со значениями из другой.
Сигнатура.
bool equal
(
const HashMap& hashmap
) const
Параметры. Ссылка на карту, с которой будет сравнена эта.
Возвращаемое значение. Нет.
Описание. Этот метод получает статус
HashMap
для которой это вызвано. Возвращаемое значение имеет тип
Object::Status
.
Сигнатура.
virtual Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Возвращает текущий
Status
для HashMap
.
Описание. Метод получает версию объекта схемы хэш-карты.
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер версии объекта integer.
Описание. Этот метод получает ID хэш-карты.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта integer.
Резюме
Эта секция обеспечивает ссылку на класс
Index
и его публичные члены.
Родительский класс.
NdbDictionary
.
Дочерние классы. Нет.
Описание. Этот класс представляет индекс на столбце таблицы
NDB Cluster
. Это потомок класса
NdbDictionary
, использующий класс
Object
.
Методы.
Таблица 2.25.
Имя | Описание |
---|---|
Index() |
Конструктор класса |
~Index() |
Деструктор |
addColumn() |
Добавляет объект
Column в индекс |
addColumnName() |
Добавляет столбец по имени к индексу |
addColumnNames() |
Добавляет многочисленные колонки по именам к индексу |
getColumn() |
Получает колонки (часть) индекса |
getLogging() |
Проверка, зарегистрирован ли индекс на диске |
getName() |
Получает название индекса |
getNoOfColumns() |
Получает количество столбцов, принадлежащих индексу |
getObjectStatus() |
Получает статус индексного объекта |
getObjectVersion() |
Получает версию индексного объекта |
getObjectId() |
Получает ID индексного объекта |
getTable() |
Получает название внесенной в индекс таблицы |
getType() |
Получает тип индекса |
setLogging() |
Включает/отключает регистрацию индекса на диске |
setName() |
Определяет имя индекса |
setTable() |
Определяет имя таблицы, которая будет индексирована |
setType() |
Установите тип индекса |
Типы. У индекса есть один публичный тип
Type
.
Если вы создаете или изменяете индексы, используя
NDB
API, эти модификации не могут быть видны
MySQL. Единственное исключение: переименование индекса с использованием
Index::setName()
.
Описание. Это используется, чтобы создать новый экземпляр
Index
.
Созданные с использованием API NDB индексы не видны MySQL Server.
Сигнатура.
Index
(
const char* name
= ""
)
Параметры. Название нового индекса. Возможно создать индекс без
имени, и затем назначить имя ему позже с использованием
setName()
. См.
раздел 2.3.11.15.
Возвращаемое значение. Новый экземпляр
Index
.
Деструктор. Деструктор (~Index()
)
поставляется как виртуальный метод.
Описание. Этот метод может использоваться, чтобы добавить колонку к индексу.
Порядок столбцов соответствует порядку, в котором они добавляются к индексу. Однако это имеет значение только с упорядоченными индексами.
Сигнатура.
void addColumn
(
const Column& c
)
Параметры. Ссылка c
к колонке, которая должна быть добавлена к индексу.
Возвращаемое значение. Нет.
Описание. Этот метод работает таким же образом, как
addColumn()
за исключением того, что это берет
название колонки в качестве параметра. Посмотрите
раздел 2.3.11.5.
Сигнатура.
void addColumnName
(
const char* name
)
Параметры. Имя name
колонки, которая будет добавлена к индексу как постоянный
указатель на символ.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы добавить несколько имен столбцов к определению индекса.
Как addColumn()
и
addColumnName()
, индексы пронумерованы в
порядке, в котором они были добавлены. Однако, это имеет значение только
для упорядоченных индексов.
Сигнатура.
void addColumnNames ( unsignednoOfNames
, const char**names
)
Параметры. Этот метод берет два параметра, перечисленные здесь:
Количество столбцов и имен
noOfNames
для добавления к индексу.
Имена names
для добавления к индексу (как указатель на указатель).
Возвращаемое значение. Нет.
Описание. Этот метод получает колонку в указанной позиции в индексе.
Сигнатура.
const Column* getColumn
(
unsigned no
) const
Параметры. Порядковый номер позиции
no
колонки как unsigned integer.
Используйте getNoOfColumns()
, чтобы определить,
сколько столбцов составляет индекс, см.
раздел 2.3.11.8.
Возвращаемое значение. Столбец, имеющий позицию
no
в индексе, как указатель на
экземпляр Column
. См. раздел 2.3.2.
Описание. Используйте этот метод, чтобы определить, была ли регистрация на диск позволена для индекса.
Индексы, которые не зарегистрированы, восстановлены, когда кластер запущен или перезапущен.
Упорядоченные индексы в настоящее время не поддерживают регистрацию на диске, они восстановлены каждый раз, когда кластер запущен. Это включает перезапуски.
Сигнатура.
bool getLogging ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
: Индекс регистрируется на диск.
false
: Индекс не регистрируется на диск.
Описание. Этот метод используется, чтобы получить название индекса.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название индекса, как постоянный указатель на символ.
Описание. Этот метод используется, чтобы получить количество столбцов, составляющих индекс.
Сигнатура.
unsigned getNoOfColumns ( void ) const
Параметры. Нет.
Возвращаемое значение. unsigned integer, представляющий количество столбцов в индексе.
Описание. Этот метод получает статус объекта индекса.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение.
A Status
, см.
раздел 2.3.31.4.
Описание. Этот метод получает версию объекта индекса (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта индекса как integer.
Описание. Этот метод используется, чтобы получить идентификатор объекта индекса.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта как integer.
Описание. Этот метод может использоваться, чтобы получить название таблицы, которой принадлежит индекс.
Сигнатура.
const char* getTable ( void ) const
Параметры. Нет.
Возвращаемое значение. Название таблицы, как постоянный указатель на символ.
Описание. Этот метод может использоваться, чтобы найти тип индекса.
Сигнатура.
Type getType ( void ) const
Параметры. Нет.
Возвращаемое значение. Тип индекса. Посмотрите раздел 2.3.11.18.
Описание. Этот метод используется, чтобы включить или отключить регистрацию индекса на диск.
Сигнатура.
void setLogging
(
bool enable
)
Параметры.
setLogging()
берет единственный булев параметр
enable
. Если
enable
=
true
, тогда регистрация позволена для индекса,
если false, выключена.
Возвращаемое значение. Нет.
Описание. Этот метод определяет имя индекса.
Это единственный метод
Index::set
, результат которого видим MySQL Server.*
()
Сигнатура.
void setName
(
const char* name
)
Параметры. Желаемое имя name
для индекса как постоянный указатель на символ.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает таблицу, которая должна быть внесена в индекс. На таблицу ссылаются по имени.
Сигнатура.
void setTable
(
const char* name
)
Параметры. Имя name
таблицы, которая будет внесена в индекс как постоянный указатель на символ.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы установить тип индекса.
Сигнатура.
void setType
(
Type type
)
Параметры. Тип type
индекса, см. раздел 2.3.11.18.
Возвращаемое значение. Нет.
Описание. Это перечислимый тип, который описывает вид индекса
столбца, представленного экземпляром
Index
.
Не путайте этот перечислимый тип с
Object::Type
или с
Column::Type
.
Возможные значения.
Таблица 2.26.
Имя | Описание |
---|---|
Undefined |
Неопределенный тип объекта (начальная буква/значение по умолчанию) |
UniqueHashIndex |
Уникальный неупорядоченный хэш-индекс (только тип индекса поддержанный в настоящее время) |
OrderedIndex |
Групповой, упорядоченный индекс |
Родительский класс.
NdbIndexScanOperation
.
Описание. IndexBound
это структура, используемая, чтобы описать границы просмотра индекса для
NdbRecord
.
Члены.
Таблица 2.27.
Имя | Тип | Описание |
---|---|---|
low_key |
const char* |
Строка, содержащая нижнюю границу для просмотра (или
NULL для просмотра с начала). |
low_key_count |
Uint32 |
Количество столбцов в нижней границе (для ограничения частичным префиксом). |
low_inclusive |
bool |
True для отношения <= , false для
< . |
high_key |
const char* |
Строка, содержащая верхнюю границу для просмотра (или
NULL для просмотра до конца). |
high_key_count |
Uint32 |
Количество столбцов в верхней границе (для ограничения частичным префиксом). |
high_inclusive |
bool |
True для отношения >= , false для
> . |
range_no |
Uint32 |
Значение, чтобы определить границу, может быть прочитано, используя
метод get_range_no() (см.
раздел 2.3.23.4
). Это значение должна быть меньше 8192 (0, если это не используется).
Для упорядоченных просмотров range_no
должен строго увеличиваться для каждого диапазона, иначе набор результатов не
будет сортирован правильно. |
См. раздел 2.3.27.
Резюме
Эта секция обсуждает класс LogfileGroup
,
который представляет группу файла журнала NDB Cluster Disk Data.
Родительский класс.
NdbDictionary
.
Дочерние классы. Нет.
Описание. Этот класс представляет группу файла журнала NDB Cluster Disk Data, которая используется для того, чтобы хранить дисковые данные файла отмен. Для получения общей информации о группах файла журнала и файла отмен см. NDB Cluster Disk Data Tables в MySQL Manual.
Только неиндексируемые данные столбца могут храниться на диске. Индексы и колонки индексов всегда хранятся в памяти.
Методы.
Таблица 2.28.
Имя | Описание |
---|---|
LogfileGroup() |
Конструктор класса |
~LogfileGroup() |
Виртуальный деструктор |
getAutoGrowSpecification() |
Получает значения группы файла журнала
AutoGrowSpecification |
getName() |
Получает имя файла журнала |
getObjectId() |
Получает идентификатор объекта группы файла журнала |
getObjectStatus() |
Получает значение статуса объекта группы файла журнала |
getObjectVersion() |
Получает версию объекта файла журнала |
getUndoBufferSize() |
Получает размер буфера UNDO |
группы файла журнала
getUndoFreeWords() |
Получаетколичество свободного пространства в буфере
UNDO |
setAutoGrowSpecification() |
Задает значения
AutoGrowSpecification
для файла журнала |
setName() |
Определяет имя группы файла журнала |
setUndoBufferSize() |
Устанавливает размер буфера
UNDO файла журнала |
Типы. Класс LogfileGroup
самостоятельно не определяет публичных типов. Однако, два из его методов
используют структуру
AutoGrowSpecification
в качестве параметра
или возвращаемого значения. Для получения дополнительной информации
посмотрите раздел 2.3.1.
Описание. Класс LogfileGroup
имеет
два публичных конструктора, один из которых не берет аргументов и создает
абсолютно новый экземпляр. Другой конструктор копии.
Класс
Dictionary
также поставляет методы для создания и разрушения объектов
LogfileGroup
, см.
раздел 2.3.4.
Сигнатуры. Новый экземпляр:
LogfileGroup ( void )
Конструктор копии:
LogfileGroup
(
const LogfileGroup& logfileGroup
)
Параметры. Создавая новый экземпляр, конструктор не берет
параметров. Копируя существующий экземпляр, конструктору нужна ссылка на
экземпляр
LogfileGroup
, который будет скопирован.
Возвращаемое значение. Объект
LogfileGroup
.
Деструктор.
virtual ~LogfileGroup ( void )
Описание. Этот метод получает
AutoGrowSpecification
связанный с группой файла журнала.
Сигнатура.
const AutoGrowSpecification& getAutoGrowSpecification ( void ) const
Параметры. Нет.
Возвращаемое значение. Структура данных
AutoGrowSpecification
, см.
раздел 2.3.1.
Описание. Этот метод получает имя группы файла журнала.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Имя группы файла журнала, строка (как указатель на символ).
Описание. Этот метод используется, чтобы получить идентификатор объекта группы файла журнала.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта файла журнала (integer).
Описание. Этот метод используется, чтобы получить статус объекта
LogfileGroup
.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение.
Status
группы файла журнала, см.
раздел 2.3.31.4.
Описание. Этот метод получает версию объекта файла журнала (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта кластера файла журнала как integer.
Описание. Этот метод получает размер буфера
UNDO
.
Сигнатура.
Uint32 getUndoBufferSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер буфера
UNDO
в байтах.
Описание. Этот метод получает число байтов, неиспользованных в
буфере UNDO
группы файла журнала.
Сигнатура.
Uint64 getUndoFreeWords ( void ) const
Параметры. Нет.
Возвращаемое значение. Число свободных байтов как 64-bit integer.
Описание. Этот метод устанавливает
AutoGrowSpecification
для группы файла журнала.
Сигнатура.
void setAutoGrowSpecification
(
const AutoGrowSpecification& autoGrowSpec
)
Параметры. Данные передаются как единственный параметр в виде
структуры
AutoGrowSpecification
,
см. раздел 2.3.1.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы определить имя для группы файла журнала.
Сигнатура.
void setName
(
const char* name
)
Параметры. Имя name
для группы файла журнала (указатель на символ).
Возвращаемое значение. Нет.
Описание. Этот метод может использоваться, чтобы установить размер
буфера UNDO
группы файла журнала.
Сигнатура.
void setUndoBufferSize
(
Uint32 size
)
Параметры. Размер size
в байтах (32-bit unsigned integer).
Возвращаемое значение. Нет.
Резюме
Эта секция покрывает класс List
.
Родительский класс. Dictionary.
Дочерние классы. Нет.
Описание. Класс List
это подкласс
Dictionary
, который используется для
представления списков, заполняемых методами
Dictionary::listObjects()
,
Dictionary::listIndexes()
и
Dictionary::listEvents()
.
Методы класса. У этого класса есть только два метода, конструктор и деструктор. Никакой метод не берет аргументов.
Конструктор. Запрос конструктора
List
создает новый
List
,
count
и elements
которого установлены равными 0
.
Деструктор. Деструктор ~List()
просто определяется таким способом как, чтобы удалить все элементы и их
свойства. Можно найти его определение в файле
/storage/ndb/include/ndbapi/NdbDictionary.hpp
.
Атрибуты. List
имеет следующие два признака:
count
, unsigned integer,
хранит число элементов в списке.
elements
, указатель на множество
структур данных
Element
, которые содержатся в списке. Посмотрите
раздел 2.3.5.
Типы. Класс List
также определяет
структуру
Element
.
Резюме
Эта секция описывает структуру Key_part_ptr
.
Родительский класс.
Ndb
.
Описание. Key_part_ptr
обеспечивает удобный способ определить ключевые данные, запускаются
транзакции и вычисляюются значения хэш-функции, передаваемые
в указателях на значения ключа распределения.
Когда у ключа распределения есть многократные части, они должны быть переданы
как множество, причем последняя часть равна NULL
.
См. разделы 2.3.16.35 и
2.3.16.3.
Атрибуты.
Таблица 2.29.
Атрибут | Тип | Начальное значение | Описание |
---|---|---|---|
ptr |
const void* |
Нет | Указатель на одно или более значений ключа распределения |
len |
unsigned |
Нет | Длина указателя |
Резюме
Этот класс представляет ядро NDB
,
это основной класс API NDB.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. Любая нетривиальная программа API NDB использует по
крайней мере один экземпляр Ndb
.
При помощи нескольких объектов Ndb
возможно
реализовать многопоточное приложение. Необходимо помнить, что один объект
Ndb
не может быть разделен между потоками,
однако, для единственного потока возможно использовать многократные объекты
Ndb
. Единственный прикладной процесс может
поддержать максимум объектов 4711 Ndb
.
Потребление ресурсов объектами Ndb.
Объект Ndb
потребляет память в пропорции к
размеру самой большой операции, выполненной за жизнь объекта. Это особенно
примечательно в случаях больших транзакций или использования столбцов
BLOB
или
TEXT
.
Эта память выделяется для целой жизни объекта и когда-то используется таким
образом, единственный способ освободить эту память состоит в том, чтобы
разрушить объект (и затем создать новый экземпляр при желании).
Объект Ndb
ориентирован на многопотоковое
исполнение в этом случае каждый объект Ndb
может быть обработан одним потоком за один раз. Если
Ndb
передан другому потоку, тогда приложение
должно гарантировать, что барьер памяти используется, чтобы гарантировать,
что новый поток видит все обновления, выполненные предыдущим потоком.
Семафоры и мьютексы это примеры легких способов обеспечить барьеры памяти, не имея необходимость беспокоиться о понятии барьера памяти.
Также возможно использовать многократные объекты
Ndb
, чтобы выполнить операции на различных
кластерах в отдельном приложении. Посмотрите
здесь
для условий и ограничений, относящихся к такому использованию.
Методы.
Таблица 2.30.
Имя | Описание |
---|---|
Ndb() |
Конструктор класса, представляет связь с кластером NDB. |
~Ndb() |
Деструктор класса, заканчивает связь кластера, когда она больше не должна использоваться |
closeTransaction() |
Закрывает транзакцию |
computeHash() |
Вычисляет значение хэш-функции распределения |
createEventOperation() |
Создает подписку на событие базы данных. См. раздел 2.3.21. |
dropEventOperation() |
Удаляет подписку на событие базы данных |
getDictionary() |
Получает словарь, который используется для работы с информацией схемы базы данных |
getDatabaseName() |
Получает название текущей базы данных |
getDatabaseSchemaName() |
Получает название текущей схемы базы данных |
get_eventbuf_max_alloc() |
Получает текущий максимальный размер буфера событий. Добавлено в NDB 7.2.14 и NDB 7.3.3. |
get_eventbuffer_free_percent() |
Получает процент буферной памяти событий, которая должна быть доступной прежде продолжения буферизации, когда предел был достигнут. Добавлено в NDB 7.4.3. |
get_event_buffer_memory_usage() |
Предоставляет информацию об использовании буферной памяти событий. Добавлено в NDB 7.4.3. |
getGCIEventOperations() |
Получает следующую операцию событий от GCI. Устарело в NDB 7.4.3. |
getHighestQueuedEpoch() |
Получает последнюю эпоху в очереди событий. Добавлено в NDB 7.4.3 |
getLatestGCI() |
Получает новый GCI. Устарело в NDB 7.4.3 |
getNdbError() |
Получает ошибку. См. раздел 2.3.20 |
getNdbErrorDetail() |
Получает дополнительные детали ошибки |
getNdbObjectName() |
Получает имя объекта Ndb , если оно было
установлено. Добавлено в NDB 7.2.17 и NDB 7.3.6 |
getNextEventOpInEpoch2() |
Получает следующую операцию событий в этой глобальной контрольной точке |
getNextEventOpInEpoch3() |
Получает следующую операцию событий в этой глобальной контрольной точке, показывая, любые полученные значения. Добавлено в NDB 7.2.32, 7.3.20, 7.4.18, 7.5.9, 7.6.4 |
getReference() |
Получает ссылку или идентификатор для экземпляра объекта
Ndb |
init() |
Инициализирует объект Ndb
и делает его готовым к употреблению |
isConsistent() |
Последовательны ли все полученные события. Устарело в NDB 7.4.3 |
isConsistentGCI() |
Последовательны ли все полученные события для данной глобальной контрольной точки. Устарело в NDB 7.4.3 |
isExpectingHigherQueuedEpochs() |
Проверяет, есть ли новые очереди эпох или было событие неудачи кластера. Добавлено в NDB 7.2.21, NDB 7.3.10 и NDB 7.4.7 |
nextEvent() |
Получает следующее событие от очереди. Устарело в NDB 7.4.3. |
nextEvent2() |
Получает следующее событие от очереди. Добавлено в NDB 7.4.3. |
pollEvents() |
Ждет события. Устарело в NDB 7.4.3. |
pollEvents2() |
Ждет события. Добавлено в NDB 7.4.3. |
setDatabaseName() |
Определяет имя текущей базы данных |
setDatabaseSchemaName() |
Определяет имя текущей схемы базы данных |
setEventBufferQueueEmptyEpoch() |
Позволяет стоять в очереди пустым событиям. Добавлено в NDB 7.4.11 и NDB 7.5.2 |
set_eventbuf_max_alloc() |
Устанавливает ассигнованный максимальный размер буфера событий. Добавлено в NDB 7.2.14 и NDB 7.3.3 |
set_eventbuffer_free_percent() |
Устанавливает процент буферной памяти событий, которая должна быть доступной прежде, чем продолжить буферизацию, когда предел был достигнут. Добавлено в NDB 7.4.3. |
setNdbObjectName() |
Для целей отладки: определяет произвольное имя для этого объекта
Ndb . Добавлено в NDB 7.2.17 и NDB 7.3.6 |
startTransaction() |
Начинает транзакцию. См. раздел 2.3.30 |
Описание. Это создает экземпляр
Ndb
,
который представляет связь с кластером NDB. Все приложения API NDB должны
начаться с создания по крайней мере одного объекта
Ndb
.
Это требует создания по крайней мере одного экземпляра
Ndb_cluster_connection
,
который служит контейнером для строки подключения кластера.
Сигнатура.
Ndb ( Ndb_cluster_connection*ndb_cluster_connection
, const char*catalogName
= "", const char*schemaName
= "def" )
Параметры. Конструктор класса
Ndb
может взять до 3 параметров, из которых
требуется только первый:
ndb_cluster_connection
экземпляр
Ndb_cluster_connection
,
который представляет строку подключения кластера. См.
раздел 2.3.17.
До NDB 7.3.8 и NDB 7.4.3 было возможно удалить
Ndb_cluster_connection
используемый, чтобы создать экземпляр Ndb
без
удаления объекта Ndb
(Bug #19999242).
catalogName
дополнительный параметр, обеспечивающий пространство имен для таблиц
и индексов, созданных в любой связи из объекта
Ndb
.
Это эквивалентно тому, что mysqld рассматривает как базу данных.
Значение по умолчанию для этого параметра пустая строка.
Дополнительно schemaName
обеспечивает дополнительное пространство имен для таблиц
и индексов, созданных в данном каталоге.
Значение по умолчанию для этого параметра последовательность def.
Возвращаемое значение.
Объект Ndb
.
~Ndb() (Деструктор класса). Деструктор для класса
Ndb
нужно вызвать, чтобы закончить экземпляр
Ndb
.
Это не требует никаких аргументов и любой специальной обработки.
Описание. Это - один из двух методов API NDB, предусмотренных
для закрытия транзакции (другой
NdbTransaction::close()
). Необходимо назвать один из этих двух
методов, чтобы закончить транзакцию, как только это было закончено.
Если транзакция еще не была передана, она прерывается, когда этот метод вызывают. Посмотрите раздел 2.3.16.35.
Сигнатура.
void closeTransaction
(
NdbTransaction *transaction
)
Параметры. Этот метод берет отдельный аргумент, указатель на
транзакцию
NdbTransaction
.
Описание. Этот метод может использоваться, чтобы вычислить значение хэш-функции распределения, учитывая таблицу и ее ключи.
computeHash()
может использоваться только для
таблиц, использующих разделение
NDB
.
Сигнатура.
static int computeHash ( Uint32*hashvalueptr
, const NdbDictionary::Table*table
, const struct Key_part_ptr*keyData
, void*xfrmbuf
= 0, Uint32xfrmbuflen
= 0 )
Параметры.
Если вызов метода успешен,
hashvalueptr
установлен в вычисленное значение хэш-функции.
Указатель на table
(см.
раздел 2.3.37).
keyData
законченное пустым указателем множество указателей на ключевые части, которые
являются частью ключа распределения таблицы. Длина каждой ключевой части
прочитана из метаданных и сравнена с переданным значением (см.
раздел 2.3.15).
xfrmbuf
указатель на
временный буфер, используемый, чтобы вычислить значение хэш-функции.
xfrmbuflen
длина этого буфера.
Если xfrmbuf
=
NULL
(по умолчанию), вызов
malloc()
или
free()
сделан автоматически.
computeHash()
терпит неудачу, если
xfrmbuf
не NULL
и
xfrmbuflen
слишком маленькое.
Ранее предполагалось что память, возвращенная
malloc()
, всегда соответственно выравнивалась,
что не всегда имеет место. Начиная с версий 7.2.13 и 7.3.2 кластера NDB,
когда malloc()
предоставляет буфер этому методу,
буфер явно выровнен после того, как это ассигнуется, и прежде чем это будет
на самом деле использоваться (Bug #16484617).
Возвращаемое значение. 0 при удаче, код ошибки при сбое.
Если вызов метода имеет успех, вычисленное значение хэш-функции сделано
доступным через hashvalueptr
.
Описание. Этот метод создает подписку на событие базы данных.
Подписки событий NDB API не сохраняются после того, как кластер NDB был восстановлен, используя ndb_restore, в таких случаях все подписки должны быть воссозданы явно.
Сигнатура.
NdbEventOperation* createEventOperation
(
const char *eventName
)
Параметры. Этот метод берет отдельный аргумент, уникальное
имя eventName
,
идентифицирующее событие, на которое вы хотите подписаться.
Возвращаемое значение.
Указатель на объект
NdbEventOperation
(или
NULL
в случае неудачи). Посмотрите
раздел 2.3.21.
Описание. Этот метод удаляет подписку на событие базы данных,
представленное объектом
NdbEventOperation
.
Память, используемая операцией события, которое было удалено,
не освобождена, пока буфер событий не был полностью прочитан. Это означает,
что необходимо продолжить вызывать
pollEvents()
и
nextEvent()
в таких случаях пока методы не вернут
0
и NULL
,
соответственно для этой памяти, которая будет освобождена.
Сигнатура.
int dropEventOperation
(
NdbEventOperation *eventOp
)
Параметры. Этот метод требует единственного входного параметра,
указателя на экземпляр
NdbEventOperation
.
Возвращаемое значение. 0 при успехе, любой другой результат указывает на неудачу.
Описание. Этот метод используется, чтобы получить объект для
восстановления или управления информацией о схеме базы данных. Этот объект
Dictionary
содержит метаинформацию обо всех таблицах в кластере.
Словарь, возвращенный этим методом, работает независимо от любой транзакции. См. раздел 2.3.4.
Сигнатура.
NdbDictionary::Dictionary* getDictionary ( void ) const
Параметры. Нет.
Возвращаемое значение.
Экземпляр класса
Dictionary
.
Описание. Этот метод может использоваться, чтобы получить название текущей базы данных.
Сигнатура.
const char* getDatabaseName ( void )
Параметры. Нет.
Возвращаемое значение. Название текущей базы данных.
Описание. Этот метод может использоваться, чтобы получить текущее название схемы базы данных.
Сигнатура.
const char* getDatabaseSchemaName ( void )
Параметры. Нет.
Возвращаемое значение. Название текущей схемы базы данных.
Описание. Проходит по отличным операциям событий, которые являются
частью текущего GCI, становясь действительными после запроса
nextEvent()
. Можно использовать этот метод, чтобы получить итоговую
информацию в течение эпохи (такой как список всех таблиц)
прежде, чем обработать данные о событии.
Этот метод устарел в NDB 7.4.3 и подвергается удалению в будущем выпуске.
В NDB 7.4.3 и позже необходимо использовать
getNextEventOpInEpoch2()
.
Сигнатура.
const NdbEventOperation* getGCIEventOperations ( Uint32*iter
, Uint32*event_types
)
Параметры. Итератор и маска типов событий. Установите для начала
*
.iter
=0
Возвращаемое значение. Следующая операция событий, вернет
NULL
, когда больше нет операций событий. Если
event_types
не
NULL
, тогда после запроса метода это содержит
битовую маску полученных типов событий.
Описание. Получает максимальную память в байтах, которая может
использоваться для буфера событий. Это совпадает с чтением значения
системной переменной MySQL Server
ndb_eventbuffer_max_alloc
.
Добавлено в NDB 7.2.14 и NDB 7.3.3.
Сигнатура.
unsigned get_eventbuf_max_alloc ( void )
Параметры. Нет.
Возвращаемое значение. Максимальная память, доступная для буфера событий, в байтах.
Описание.
Получает ndb_eventbuffer_free_percent
то есть, процент буферной памяти событий, которая должна быть доступной
прежде, чем продолжить буферизацию после тогго, как был достигнут
ndb_eventbuffer_max_alloc
.
Это значение вычисляется как
used
*100/
ndb_eventbuffer_max_alloc
, где
used
это сумма на самом деле
используемой буферной памяти событий в байтах.
Добавлено в NDB 7.4.3.
Сигнатура.
unsigned get_eventbuffer_free_percent ( void )
Параметры. Процент (pct
)
буферной памяти событий, которая должна присутствовать. Действительный
диапазон равняется от 1 до 99, включая границы.
Возвращаемое значение. Нет.
Описание. Получает использование буфера событий как процент
ndb_eventbuffer_max_alloc
.
В отличие от
get_eventbuffer_free_percent()
,
этот метод делает полную информацию об использовании доступной в форме
структуры данных
EventBufferMemoryUsage
.
Добавлено в NDB 7.4.3.
Сигнатура.
void get_event_buffer_memory_usage ( EventBufferMemoryUsage& )
Параметры. Ссылка на структуру
EventBufferMemoryUsage
, которая получает
данные об использовании.
Возвращаемое значение. Нет.
Описание. Добавлено в NDB 7.4.3, этот метод заменяет устаревший
getLatestGCI()
.
До NDB 7.4.7 этот метод возвратил самый большой номер эпохи в очереди
событий. В NDB 7.4.7 и позже это возвращает самый большой номер эпохи
после запроса
pollEvents2()
(Bug #20700220).
Сигнатура.
Uint64 getHighestQueuedEpoch ( void )
Параметры. Нет.
Возвращаемое значение. Новый номер эпохи, integer.
Описание. Получает индекс для новой глобальной контрольной точки.
Этот метод устарел в NDB 7.4.3. В NDB 7.4.3 и позже необходимо
использовать
getHighestQueuedEpoch()
.
Сигнатура.
Uint64 getLatestGCI ( void )
Параметры. Нет.
Возвращаемое значение. Новый GCI, integer.
Описание. Этот метод предоставляет вам два различных способа
получить объект
NdbError
, представляющий состояние ошибки. Для более подробной
информации об обработке ошибок в API NDB см.
NDB Cluster API Errors.
Сигнатура. Метод getNdbError()
имеет два варианта.
Первый из них просто получает новую ошибку:
const NdbError& getNdbError ( void )
Второй вариант возвращает ошибку при соответствии данному коду ошибки:
const NdbError& getNdbError
(
int errorCode
)
Независимо от того, которая версия метода используется, объект
NdbError
сохраняется, пока следующий метод API NDB не вызван.
Параметры. Чтобы получить новую ошибку, просто вызовите
getNdbError()
без любых параметров. Получить
ошибку при соответствии определенному
errorCode
можно, вызвав
метод, принимающий код (int
)
в качестве параметра. Для списка кодов ошибок API NDB и соответствующих
сообщений об ошибках, посмотрите раздел
2.4.
Возвращаемое значение. Объект
NdbError
, содержащий информацию об ошибке,
включая ее тип и, когда это применимо, контекстная информация относительно
того, как ошибка возникла. Посмотрите
раздел 2.3.20.
Описание. Этот метод обеспечивает легкий и безопасный способ
получить доступ к любой дополнительной информации об ошибке, вместо того,
чтобы читать эти дополнительные детали от объекта
NdbError
(свойство details
, устарело в пользу
getNdbErrorDetail()
, см. Bug #48851).
Этот метод позволяет хранение таких деталей в предоставленном пользователем
буфере, возвращая указатель на начало этого буфера. Если последовательность,
содержащая детали, превышает длину буфера, это усечено,
чтобы ему соответствовать.
getErrorDetail()
обеспечивает источник ошибки в форме последовательности. В случае нарушения
ограничения на уникальность данных (ошибка 893),
эта последовательность поставляет полностью определенное имя индекса, где
порождена проблема, в формате
database-name
/
schema-name
/
table-name
/
index-name
,
(NdbError.details
поставляет только ID индекса
и часто неочевидно, которой таблице этот индекс принадлежит. Независимо от
типа ошибки и деталей относительно этой ошибки, последовательность,
полученная getErrorDetail()
,
всегда заканчивается пустым указателем.
Сигнатура.
const char* getNdbErrorDetail ( const NdbError&error
, char*buffer
, Uint32bufferLength
) const
Параметры. Чтобы получить подробную информацию об ошибке, вызовите
getNdbErrorDetail()
со ссылкой на объект
NdbError
,
buffer
и длину этого буфера
(unsigned 32-bit integer).
Возвращаемое значение. Когда дополнительные детали о
error
доступны, этот метод возвращает указатель на начало поставляемого буфера
buffer
. Как указано ранее, если
последовательность, содержащая детали, более длинна, чем
bufferLength
,
последовательность усечена, чтобы соответствовать. Если никакие
дополнительные детали недоступны,
getNdbErrorDetail()
вернет
NULL
.
Описание. Если имя было определено для объекта
Ndb
до его инициализации, можно получить его,
используя этот метод. Используемый для отладки.
Сигнатура.
const char* getNdbObjectName ( void ) const
Параметры. Нет.
Возвращаемое значение. Имя объекта Ndb
,
если было установлено, используя
setNdbObjectName()
. Иначе 0.
Добавлено в NDB 7.2.17 и NDB 7.3.6 (Bug #18419907).
Описание. Проходит по операциям по одиночным событиям, составляющим
текущую глобальную контрольную точку. Используйте следующий
nextEvent2()
, чтобы получить итоговую информацию в течение эпохи,
такую как список всех таблиц, прежде, чем обработать данные о событии.
Исключительные эпохи не начинают операций событий, связанных с ними.
Сигнатура.
const NdbEventOperation* getNextEventOpInEpoch2 ( Uint32*iter
, Uint32*event_types
)
Параметры. Первоначально задайте
iter
= 0, это NULL
,
когда больше нет событий в течение этой эпохи. Если
event_types
не
NULL
,
это считает битовую маску типов событий полученной.
Возвращаемое значение. Указатель на следующий
NdbEventOperation
, если он есть.
Описание. Проходит по операциям по одиночным событиям, составляющим
текущую глобальную контрольную точку. Используйте следующий
nextEvent2()
, чтобы получить итоговую
информацию в течение эпохи, такую как список всех таблиц, прежде, чем
обработать данные о событии. Совпадает с
getNextEventOpInEpoch3()
,
но с добавлением третьего аргумента, который считает слияние всех AnyValues
полученным, показывая, какие биты установлены для всех операций
на данной таблице.
Исключительные эпохи не начинают операций событий, связанных с ними.
Сигнатура.
const NdbEventOperation* getNextEventOpInEpoch2 ( Uint32*iter
, Uint32*event_types
Uint32*cumulative_any_value
)
Параметры. Первоначально задайте
iter
= 0, это NULL
,
когда больше нет событий в течение этой эпохи. Если
event_types
не
NULL
,
это считает битовую маску типов событий полученной. Если
cumulative_any_value
не
NULL
, это считает слияние
всех AnyValues полученным.
Возвращаемое значение. Указатель на следующий
NdbEventOperation
, если есть.
Добавлено в NDB 7.2.32, 7.3.20, 7.4.18, 7.5.9 и 7.6.4 (Bug #26333981).
Описание. Этот метод может использоваться, чтобы получить ссылку на
данный объект Ndb
. Это то же самое значение, которое возвращено для данной операции,
соответствующей этому объекту в выводе
DUMP 2350
.
Сигнатура.
Uint32 getReference ( void )
Параметры. Нет.
Возвращаемое значение. 32-bit unsigned integer.
Описание. Этот метод используется, чтобы инициализировать объект
Ndb
.
Сигнатура.
int init
(
int maxNoOfTransactions
= 4
)
Параметры. Метод init()
берет единственный параметр
maxNoOfTransactions
типа integer.
Этот параметр определяет максимальное количество параллельных объектов
NdbTransaction
, которые могут быть обработаны этим экземпляром
Ndb
.
Максимальное разрешенное значение для
value for maxNoOfTransactions
=
1024, по умолчанию 4.
Каждая операция по просмотру или индексу использует дополнительный объект
NdbTransaction
.
Возвращаемое значение. Этот метод возвращает
int
, который может иметь любой
следующие два значения:
0: указывает, что
объект Ndb
был инициализирован успешно.
-1: указывает на ошибку.
Описание. Проверяет, последовательны ли все события. Если сбой узла происходит, когда ресурсы исчерпаны, события могут быть потеряны и поставленные данные о событии могли бы таким образом быть неполными. Этот метод позволяет определить это.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
NdbEventOperation::getEventType2()
, чтобы
определить тип события в этом экземпляре, имеет ли событие тип
TE_INCONSISTENT
. См.
раздел 2.3.6.23.
Сигнатура.
bool isConsistent
(
Uint64& gci
)
Параметры. Ссылка на глобальный индекс контрольной точки. Это первый непоследовательный найденный GCI, если таковые имеются.
Возвращаемое значение.
true
, если все события последовательны.
Описание. Если сбой узла происходит, когда ресурсы исчерпаны, события могут быть потеряны и поставленные данные о событии могли бы таким образом быть неполными. Этот метод позволяет определить это проверяя, последовательны ли все события в данном GCI.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
NdbEventOperation::getEventType2()
, чтобы
определить тип события в этом экземпляре, имеет ли событие тип
TE_INCONSISTENT
. См.
раздел 2.3.6.23.
Сигнатура.
bool isConsistentGCI
(
Uint64 gci
)
Параметры. Глобальный индекс контрольной точки.
Возвращаемое значение.
true
, если этот GCI последователен,
false
указывает, что GCI
может быть непоследовательным.
Описание. Проверяет были ли эпохи с очередями выше замечены
последним вызовом
Ndb::pollEvents2()
или найдено событие
TE_CLUSTER_FAILURE.
Это возможно, после того, как был сбой кластера
в течение самой высокой очереди эпохи, возвращенной
pollEvents2()
. В этом случае вместо того, чтобы буферизовать
события, необходимо потреблять события с
nextEvent()
пока не обнаруживается
TE_CLUSTER_FAILURE, затем снова соединитесь с
кластером, когда он становится доступным снова.
Добавлено в NDB 7.2.21, NDB 7.3.10 и NDB 7.4.7 (Bug #18753887).
Сигнатура.
bool isExpectingHigherQueuedEpochs ( void )
Параметры. Нет.
Возвращаемое значение. True, если эпохи с очередями были замечены
последним
pollEvents2()
, или в случае сбоя кластера.
Описание. Возвращает следующую операцию событий, имеющую данные из подписной очереди.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
nextEvent2()
.
Сигнатура.
NdbEventOperation* nextEvent ( void )
Параметры. Нет.
Возвращаемое значение. Этот метод возвращает объект
NdbEventOperation
, представляющий следующее событие в подписной
очереди, если есть такое событие. Если нет никакого события в очереди, он
возвращает NULL
.
Начиная с NDB 7.2.17 и NDB 7.3.6, этот метод очищает непоследовательные
события данных из очереди событий, обрабатывая их. Чтобы очистить все такие
события в этих и более поздних версиях, приложения должны вызвать этот метод
даже в случаях, когда
pollEvents()
вернул 0 (Bug #18716991).
Описание. Возвращает операцию событий, связанную с данными, из
очереди событий. Это нужно вызывать неоднократно после того, как
pollEvents2()
наполнит очередь, пока очередь
событий не будет пуста.
Добавлено в NDB 7.4.3, этот метод заменяет устаревший
nextEvent()
.
После запроса этого метода надо использовать
NdbEventOperation::getEpoch()
,
чтобы определить эпоху, затем проверьте тип возвращенного события,
используя
NdbEventOperation::getEventType2()
.
Обработка должна быть предоставлена типами
TableEvent
, включая
TE_EMPTY
,
TE_INCONSISTENT
и
TE_OUT_OF_MEMORY
(введен в NDB 7.4.3).
Никакие другие методы
NdbEventOperation
,
чем эти два, названные здесь, не нужно вызывать в течение исключительной
эпохи. Возвращение пустых эпох (TE_EMPTY
)
может затопить приложение, когда узлы данных не работают. Если это
нежелательно, приложения должны отфильтровать любые пустые эпохи.
Сигнатура.
NdbEventOperation* nextEvent2 ( void )
Параметры. Нет.
Возвращаемое значение. Этот метод возвращает объект
NdbEventOperation
, представляющий следующее событие в очереди
событий, если есть такое событие. Если нет никакого события в очереди, он
возвращает NULL
.
Описание. Этот метод ждет GCP, чтобы закончить. Это используется, чтобы определить, доступны ли какие-либо события в подписной очереди.
метод ждет в течение следующей эпохи , а не следующего GCP. Посмотрите раздел 2.3.21.
В NDB 7.4.3 и позже, вы можете (и должны) использовать
pollEvents2()
вместо этого метода.
До NDB 7.4.7 pollEvents()
не был совместим с
исключительными типами
TableEvent
, добавленными в
NDB 7.4.3 (Bug #20646496), в NDB 7.4.7 и позже
pollEvents()
совместим с этими типами событий,
как описано позже в этой секции.
Сигнатура.
int pollEvents ( intmaxTimeToWait
, Uint64*latestGCI
= 0 )
Параметры. Этот метод берет эти два параметра:
Максимальное время, чтобы ждать, в миллисекундах, перед
отказом и сообщением, что никакие события не были
доступны (то есть, прежде чем метод автоматически возвращает
0
).
Отрицательная величина заставляет ожидание быть неопределенным
. Это не рекомендуется (и не поддерживается методом-преемником
pollEvents2()
).
Индекс новой глобальной контрольной точки. Обычно этому можно
безопасно разрешить принять его значение по умолчанию, которое является
0
.
Возвращаемое значение.
pollEvents()
возвращает значение типа
int
:
> 0
:
Есть события, доступные в очереди.
0
: Нет никаких доступных событий.
В NDB 7.4.7 и позже отрицательная величина указывает на неудачу и
NDB_FAILURE_GCI
(~(Uint64)0
) указывает на сбой кластера
(Bug #18753887), 1 возвращен, сталкиваясь с исключительным событием, кроме
тех случаев, когда найдены только события
TE_EMPTY
, как описано позже в этой секции.
В NDB 7.4.7 и позже, когда pollEvents()
находит исключительное событие во главе очереди событий, метод возвращает 1 и
ведет себя следующим образом:
Пустые события (TE_EMPTY
)
удалены из главы очереди событий, пока событие, содержащее данные, не
найдено. Когда это приводит ко всей очереди, обрабатываемой, не сталкиваясь
ни с какими данными, метод возвращает 0 (никаких доступных событий), а не 1.
Это поведение делает этот тип события очевидным для прикладного использования
pollEvents()
.
После столкновения с событием, содержащим непоследовательные данные
(TE_INCONSISTENT
) из-за переполнения буфера узла
данных, следующий вызов
nextEvent()
удаляет непоследовательные
данные о событии данных из очереди событий и вернет
NULL
. Необходимо проверить несоответствие,
вызывая
isConsistent()
немедленно после этого.
Важно:
Хотя непоследовательные данные о событии удалены из очереди событий, вызывая
nextEvent()
, информация о несоответствии удалена
только другим nextEvent()
после этого, который
на самом деле находит событие, содержащее данные.
Когда pollEvents()
находит событие переполнения буфера данных
(TE_OUT_OF_MEMORY
),
данные о событии добавляются к очереди событий каждый раз, когда
использование буфера событий превышает
ndb_eventbuffer_max_alloc
.
В этом случае следующий вызов nextEvent()
выходит из процесса.
Описание. Ждет события. Срабатывает как только любые данные о событии доступны. Этот метод также перемещает полные данные о событии эпохи в очередь событий.
Добавлено в NDB 7.4.3, этот метод заменяет устаревший
pollEvents()
.
Сигнатура.
int pollEvents2 ( intaMillisecondNumber
, Uint64*highestQueuedEpoch
= 0 )
Параметры. Этот метод берет эти два параметра, перечисленные здесь:
Максимальное время, чтобы ждать, в миллисекундах, перед отказом и
сообщая, что никакие события не были доступны (то есть, прежде чем метод
автоматически возвращает 0
).
В NDB 7.4.7 и позже, определяя отрицательную величину для этого аргумента,
pollEvents2()
возвращает -1,
указывая на ошибку (Bug #20762291).
Индекс самой высокой эпохи с очередями. Обычно этому можно безопасно
разрешить принять значение по умолчанию, которое является
0
. Если это значение не
NULL
и новые данные о событии доступны в
очереди событий, оно установлено в самую высокую эпоху, найденную в
доступных данных о событии.
Возвращаемое значение.
pollEvents2()
вернет integer:
> 0
:
Есть события, доступные в очереди.
0
: Нет никаких доступных событий.
< 0
:
Указывает на неудачу (возможная ошибка).
Описание. Этот метод используется, чтобы определить имя текущей базы данных.
Сигнатура.
void setDatabaseName
(
const char *databaseName
)
Параметры. setDatabaseName()
берет единственный обязательный параметр, название новой базы данных, которая
будет установлена как текущая база данных.
Описание. Этот метод определяет имя текущей схемы базы данных.
Сигнатура.
void setDatabaseSchemaName
(
const char *databaseSchemaName
)
Параметры. Название схемы базы данных.
Описание. Организация очереди пустых эпох отключена по умолчанию. Этот метод может использоваться, чтобы позволить такую организацию очереди, в этом случае любые новые пустые эпохи, входя в буфер событий после вызова метода, стоят в очереди.
Когда организация очереди пустых эпох позволена,
nextEvent()
связывает пустую эпоху с одной и только одной из подписок
(операции событий), связанной с подпиской объекта
Ndb
. Это означает, что может быть не больше, чем
одна пустая эпоха на подписку, даже при том, что у пользователя может быть
много подписок, связанных с тем же самым объектом
Ndb
.
Сигнатура.
void setEventBufferQueueEmptyEpoch
(
bool queue_empty_epoch
)
Параметры. Этот метод берет единственный входной параметр.
Вызов метода с true
позволяет стоять в очереди пустым событиям,
false
отключает такую организацию очереди.
Возвращаемое значение. Нет.
setEventBufferQueueEmptyEpoch()
не имеет никакого связанного метода получателя. Это намерено и происходит
из-за того, что этот сеттер обращается к стоящим в очереди
новым эпохам, тогда как сама очередь
может все еще отразить положение дел, которое существовало до вызыва сеттера.
Таким образом, во время переходного периода, пустая эпоха могла бы быть
найдена в очереди, даже если такая организация очереди выключена.
setEventBufferQueueEmptyEpoch()
добавлен в
NDB 7.4.11 и NDB 7.5.2.
Описание. Устанавливает максимальную память в байтах, которая может
использоваться для буфера событий. Это имеет тот же самый эффект как
установка значения системной переменной MySQL Server
ndb_eventbuffer_max_alloc
.
Добавлено в NDB 7.2.14 и NDB 7.3.3.
Сигнатура.
void set_eventbuf_max_alloc
(
unsigned size
)
Параметры. Желаемый максимум size
для буфера событий в байтах.
Возвращаемое значение. Нет.
Описание. Устанавливает переменную
ndb_eventbuffer_free_percent
то есть, процент буферной памяти событий, которая должна быть доступной
прежде, чем продолжить буферизовать после достижения
ndb_eventbuffer_max_alloc
.
Добавлено в NDB 7.4.3.
Сигнатура.
int set_eventbuffer_free_percent
(
unsigned pct
)
Параметры. Процент (pct
)
буферной памяти событий, которая должна присутствовать.
Действительный диапазон равняется 1-99 включительно.
Возвращаемое значение. Значение, которое было установлено.
Описание. Начиная с NDB 7.2.17 и NDB 7.3.6,
можно определить произвольное, человекочитаемое имя, чтобы определить объект
Ndb
при отладке. Это имя может тогда быть
получено, используя
getNdbObjectName()
(Bug #18419907).
Это должно быть сделано до запроса
init()
для этого объекта, пытаясь определить имя после, инициализация
терпит неудачу с ошибкой.
Можно определить имя только однажды для данного объекта
Ndb
, последующие попытки после определения имени
терпят неудачу с ошибкой.
Сигнатура.
int setNdbObjectName
(
const char* name
)
Параметры. Имя name
.
Возвращаемое значение. 0 при успехе.
Описание. Этот метод используется, чтобы начать новую транзакцию. Есть три варианта, самый простой из них, используя таблицу и ключ разделения или ID разделения, чтобы определить операционного координатора (TC). Третий вариант позволяет вам определить TC посредством указателя на данные ключа.
Когда транзакция закончена, она должна быть закрыта, используя
NdbTransaction::close()
или
Ndb::closeTransaction()
.
Отказ сделать это прерывает транзакцию. Это должно быть сделано независимо от
конечного результата транзакции, даже если она терпит неудачу из-за ошибки.
См. разделы 2.3.16.2 и раздел 2.3.30.1.
Сигнатура.
NdbTransaction* startTransaction ( const NdbDictionary::Table*table
= 0, const char*keyData
= 0, Uint32*keyLen
= 0 )
Параметры. Этот метод берет следующие три параметра:
table
:
Указатель на объект
Table
. Это используется, чтобы определить, на котором узле должен
работать операционный координатор.
keyData
:
Указатель на соответствие ключа разделения таблице
table
.
keyLen
:
Длина ключа разделения в байтах.
Осведомленные о распределении формы startTransaction(). Также возможно использовать осведомленность распределения с этим методом, то есть, чтобы предложить, какой узел должен действовать как операционный координатор.
Сигнатура.
NdbTransaction* startTransaction ( const NdbDictionary::Table*table
, const struct Key_part_ptr*keyData
, void*xfrmbuf
= 0, Uint32xfrmbuflen
= 0 )
Параметры. Определяя операционного координатора, этот метод берет эти четыре параметра:
Указатель на table
(объект Table
), используемый для решения, какой узел должен действовать
как операционный координатор.
Законченное пустым указателем множество указателей на значения столбцов ключа распределения. Длина ключевой части прочитана из метаданных и сравнена с переданным значением.
Key_part_ptr
определяется как показано в
shown in разделе 2.3.15.
Указатель на временный буфер, используемый, чтобы вычислить значение хэш-функции.
Длина буфера.
Если xfrmbuf
=
NULL
(по умолчанию), вызов
malloc()
или
free()
сделан автоматически.
startTransaction()
терпит неудачу, если
xfrmbuf
не NULL
и
xfrmbuflen
слишком маленькое.
Пример. Предположим, что ключ разделения таблицы столбец
BIGINT
.
Тогда вы объявили бы множество ключа распределения как показано здесь:
Key_part_ptr distkey[2];
Значение ключа распределения было бы определено как показано здесь:
unsigned long long distkeyValue= 23;
Указатель на множество ключа распределения был бы установлен следующим образом:
distkey[0].ptr= (const void*) &distkeyValue;
Длина этого указателя была бы установлена соответственно:
distkey[0].len= sizeof(distkeyValue);
Множество ключа распределения должно закончиться
NULL
. Это необходимо, чтобы избежать наличия
дополнительного параметра, обеспечивающего количество
столбцов в ключе распределения:
distkey[1].ptr= NULL; distkey[1].len= NULL;
Установка буфера к NULL
разрешает
startTransaction()
ассигновать и
освобождать память автоматически:
xfrmbuf= NULL; xfrmbuflen= 0;
Можно также определить буфер, чтобы сохранить необходимость сделать явно
malloc()
и free()
,
но вычисление соответствующего размера для этого буфера не простой вопрос,
если буфер не NULL
,
но его длина слишком коротка, тогда startTransaction() терпит неудачу.
Однако, если вы принимаете решение определить буфер,
1 МБ обычно достаточный размер.
Теперь, когда вы начинаете транзакцию, можно получить доступ к узлу, который содержит желаемую информацию непосредственно.
Другая осведомленная о распределении версия этого метода позволяет вам определить таблицу и разделение (используя ID разделения) как намек для отбора операционного координатора, определяется как показано здесь:
NdbTransaction* startTransaction ( const NdbDictionary::Table*table
, Uint32partitionId
)
Если у кластера есть то же самое количество узлов данных, как реплик,
определение операционного координатора не получает улучшения работы,
так как каждый узел данных содержит всю базу данных. Однако, где количество
узлов данных больше, чем количество реплик (например, где
NoOfReplicas
= 2
в кластере с 4 узлами данных), вы увидите улучшение работы при помощи
осведомленной о распределении версии этого метода.
Все еще возможно использовать этот метод как прежде, не определяя
операционного координатора. В любом случае необходимо все еще явно закрыть
транзакцию, независимо от успешности вызова
startTransaction()
.
Возвращаемое значение. При успехе вернет объект
NdbTransaction
, при ошибке вернет
NULL
.
Резюме
Этот класс представляет связь с кластером узлов данных.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. Прикладная программа NDB должна начаться с создания
объекта Ndb_cluster_connection
и как правило
использует один Ndb_cluster_connection
.
Приложение соединяется с сервером управления кластера когда этот объект
вызывает метод
connect()
. При помощи метода
wait_until_ready()
возможно ждать связи, чтобы достигнуть одного или более узлов данных.
Экземпляр Ndb_cluster_connection
,
используется, чтобы создать объект
Ndb
. До NDB 7.3.8 и NDB 7.4.3
было возможно удалить Ndb_cluster_connection
,
используемый, чтобы создать экземпляр Ndb
без удаления объекта Ndb
(Bug #19999242).
Разделение уровня приложения.
Нет никакого ограничения против создания многократных объектов
Ndb_cluster_connection
, представляющих связи с
различными серверами управления в отдельном приложении, ни против
использования их для создания многократных экземпляров класса
Ndb
.
Такие объекты Ndb_cluster_connection
(и экземпляры Ndb
на основе их) не требуются, чтобы соединиться с тем же самым кластером.
Например, возможно выполнить
разделение уровня приложения
данных таким способом, которым данные, встречающие один набор критериев
переданы одному кластеру, используя объект
Ndb
, который
использует объект Ndb_cluster_connection
представляющий связь с кластером в то время, как данные, не соответствующие
тем критериям (или возможно различный набор критериев) можно послать в иной
кластер через иной экземпляр Ndb, который использует
Ndb_cluster_connection
указывающий на второй кластер.
Возможно расширить этот сценарий, чтобы разработать отдельное приложение, которое получает доступ к произвольному числу кластеров. Однако, при этом следующие условия и требования должны иметься в виду:
Сервер управления кластера
(ndb_mgmd)
может соединиться с одним и только одним кластером, не будучи перезапущенным
и повторно настроенным, поскольку это должно прочитать данные, какие узлы
данных составляют кластер, из конфигурационного файла
(config.ini
).
Объект Ndb_cluster_connection
принадлежит единственному серверу управления, имя
хоста которого или IP-адрес используются в создании этого объекта (как
параметр connection_string
конструктора), как только объект создается, он не может использоваться, чтобы
начать связь с различным сервером управления.
См. раздел 2.3.17.1.
Объект Ndb
, использующий эту связь (Ndb_cluster_connection
), не может быть снова использован, чтобы соединиться с иным сервером
управления кластера (и таким образом с иной коллекцией узлов данных,
составляющих кластер). Любой экземпляр
Ndb
связан с определенным Ndb_cluster_connection
когда создан и этот Ndb_cluster_connection
в свою очередь связан с единственным и уникальным сервером управления,
когда он создается.
См. раздел 2.3.16.1.
Связи, описанные выше, сохраняются для сроков существования объектов
Ndb
и
Ndb_cluster_connection
.
Поэтому обязательно в проектировании и реализовывании любого приложения,
что доступ к многократным кластерам в единственной сессии обеспечивается
отдельными экземплярами объектов
Ndb_cluster_connection
и
Ndb
для соединения с каждым сервером управления кластера.
Также важно иметь в виду, что никакое прямое разделение данных или узлов данных между различными кластерами невозможно. Узел данных может принадлежать одному и только одному кластеру и любое движение данных между кластерами должно быть достигнуто на уровне приложения.
Для примеров, демонстрирующих, как связи с двумя различными кластерами могут устанавливаться и использоваться в отдельном приложении, посмотрите разделы 2.5.2 и 3.6.2.
Методы.
Таблица 2.31.
Имя | Описание |
---|---|
Ndb_cluster_connection() |
Конструктор создает связь с кластером узлов данных |
connect() |
Соединяется с сервером управления кластера |
get_auto_reconnect() |
Получает настройки автоповтора соединения для узлов API, используя
|
get_latest_error() |
Действительно ли новая попытка соединиться успешна |
get_latest_error_msg() |
Если новая попытка соединиться провалилась, обеспечивает причину |
get_max_adaptive_send_time() |
Тайм-аут перед адаптивной отправкой всех сигналов |
get_num_recv_threads() |
Количество потоков получения |
get_next_ndb_object() |
Используемый, чтобы повторить кратное число объектов
|
get_recv_thread_activation_threshold() |
Получить уровень активации для связанного потока получения |
get_system_name() |
Получите имя системы кластера |
lock_ndb_objects() |
Отключает создание новых объектов
|
set_auto_reconnect() |
Позволяет или отключает повторное автосоединение с узлами API,
используя |
set_data_node_neighbour() |
SУстанавливает соседний узел для оптимального размещения операционного координатора |
set_max_adaptive_send_time() |
Тайм-аут перед адаптивной передачей всех сигналов |
set_name() |
Обеспечивает название связи |
set_num_recv_threads() |
Определите номер потока получения, которые будет связан |
set_recv_thread_cpu() |
Установите один или несколько CPU для потока получения |
set_optimized_node_selection() |
Используемый, чтобы управлять поведением выбора узла |
set_service_uri() |
URI для публикации в таблице
ndbinfo.processes |
set_timeout() |
Устанавливает тайм-аут связи |
unlock_ndb_objects() |
Позволяет создание новых объектов
|
unset_recv_thread_cpu() |
Сброс привязки потока получения к CPU |
wait_until_ready() |
Ждет, пока связь с одним или более узлами данных не будет успешной |
Описание. Этот метод создает связь с кластером NDB то есть, с
кластером узлов данных. Объект, возвращенный этим методом, требуется, чтобы
создать экземпляр объекта
Ndb
.
Таким образом каждое применение API NDB требует использования
Ndb_cluster_connection
.
Ndb_cluster_connection
имеет двух конструкторов. Первый из них:
Сигнатура.
Ndb_cluster_connection
(
const char* connection_string
= 0
)
Параметры. Эта версия конструктора требует параметр
connection_string
,
указывая на местоположение сервера управления.
Второй конструктор берет ID узла в дополнение к аргументу строки подключения.
Сигнатура.
Ndb_cluster_connection ( const char*connection_string
, intforce_api_nodeid
)
Параметры. Эта версия конструктора берет два аргумента:
connection_string
и ID узла
(force_api_nodeid
),
используемый этим узлом API. Этот ID узла отвергает любое значение
идентификатора узла, заданное
connection_string
.
Возвращаемое значение.
Обе версии: Экземпляр
Ndb_cluster_connection
.
Описание. Этот метод соединяется с сервером управления кластера.
Сигнатура.
int connect ( intretries
= 30, intdelay
= 1, intverbose
= 0 )
Параметры. Этот метод берет три параметра, все из которых дополнительные:
retries
определяет число раз, чтобы повторить связь в случае неудачи.
Значение по умолчанию равняется 30.
0
означает, что никакие дополнительные
попытки соединиться не предприняты в случае неудачи,
использование отрицательной величины для
retries
приводит к бесконечным попыткам подключения.
delay
представляет число секунд между повторными попытками подключения, по
умолчанию 1
секунда.
verbose
указывает, должен ли метод произвести сообщение о своем прогрессе:
1
= да,
0
(по умолчанию) = нет.
Возвращаемое значение. Этот метод возвращает
int
, у которого может быть одно
из следующих 3 значений:
0: Попытка подключения была успешна.
1: Указывает на исправимую ошибку.
-1: Указывает на невосстанавливаемую ошибку.
Описание. Этот метод получает текущее значение
AutoReconnect
для данного
a given
Ndb_cluster_connection
.
Для более подробной информации посмотрите
раздел
2.3.17.12.
Сигнатура.
int get_auto_reconnect ( void )
Параметры. Нет.
Возвращаемое значение. integer 0
или
1
, соответствующее текущему
AutoReconnect
для этой связи.
0
предписывает узлам API
использовать новые связи с кластером в то время, как
1
позволяет узлам API снова
использовать существующие связи.
Описание. Этот метод может использоваться, чтобы определить
действительно ли новая попытка
connect()
предпринята этим
Ndb_cluster_connection
.
Если связь имела успех, get_latest_error()
вернет 0
, иначе вернет
1
.
Если попытка подключения потерпела неудачу, надо использовать
Ndb_cluster_connection::get_latest_error_msg()
, чтобы получить сообщение об ошибке, приводящее причину для неудачи.
Сигнатура.
int get_latest_error ( void ) const
Параметры. Нет.
Возвращаемое значение.
1
или 0
.
Возвращаемое значение 1
указывает, что последняя попытка соединиться провалилась,
если попытка имела успех, возвращается 0
.
Описание. Если новая попытка подключения этим
Ndb_cluster_connection
провалилась (как определено, вызывая
get_latest_error()
), этот метод
предоставляет сообщение об ошибке, поставляющее информацию о причине неудачи.
Сигнатура.
const char* get_latest_error_msg ( void ) const
Параметры. Нет.
Возвращаемое значение. Последовательность, содержащая сообщение об
ошибке, описывающее неудачу
Ndb_cluster_connection::connect()
.
Если новая попытка подключения имела успех, пустая строка возвращена.
Описание. Получите минимальное время в миллисекундах до того, как механизм адаптивной передачи пошлет все сигналы.
Сигнатура.
Uint32 get_max_adaptive_send_time ()
Параметры. Нет.
Возвращаемое значение. Время ожидания в миллисекундах. Это должно всегда быть значением между 0 и 10 включительно.
Описание. Этот метод используется, чтобы итерировать набор
объектов Ndb
,
получая их по одному.
Сигнатура.
const Ndb* get_next_ndb_object
(
const Ndb* p
)
Параметры. Этот метод берет единственный параметр, указатель на
последний объект Ndb
, который был получен или NULL
.
Возвращаемое значение. Возвращает следующий объект
Returns the next
Ndb
или
NULL
, если больше нет объектов
Ndb
.
Итерирование объектов Ndb. Чтобы получить все существующие
объекты
Ndb
, выполните следующее:
Вызовите метод
lock_ndb_objects()
.
Это предотвращает создание любых новых экземпляров
Ndb
до вызова
unlock_ndb_objects()
.
Получите первый доступный
Ndb
, передав
NULL
в
get_next_ndb_object()
.
Можно получить второй объект Ndb
, передавая
указатель, полученный первым вызовом, следующему
get_next_ndb_object()
и т.д.
Когда указатель на последний доступный экземпляр
Ndb
используется, метод вернет NULL
.
После того, как вы получили все желаемые объекты
Ndb
,
необходимо повторно включить создание объектов
Ndb
вызовом
метода
unlock_ndb_objects()
.
Описание. Получите количество потоков приемника.
Сигнатура.
int get_num_recv_threads ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество потоков приемника.
Описание. Получить уровень для активации потока приемника,
связанного
set_recv_thread_cpu()
.
Сигнатура.
int get_recv_thread_activation_threshold ( void ) const
Параметры. Нет.
Возвращаемое значение. Пороговое значение как integer. См. раздел 2.3.17.18.
Описание. Получает имя системы от кластерной конфигурации. Это
значение параметра конфигурации системы
Name
устанавливается в
конфигурационном файле config.ini
.
Сигнатура.
const char* get_system_name ( void ) const
Параметры. Нет.
Возвращаемое значение. Имя кластерной системы. Если не задано
в файле кластерной конфигурации, это произведенное значение в форме
MC_
(например, timestamp
MC_20170426182343
),
используя время, когда сервер управления был запущен.
Описание. Запрос этого метода предотвращает создание новых
экземпляров класса Ndb
. Этот метод нужно вызвать до итерации по объектам
Ndb
, используя
get_next_ndb_object()
.
Сигнатура.
void lock_ndb_objects ( void ) const
Параметры. Нет.
Возвращаемое значение. Нет.
Этот метод был сделан const
в NDB 7.3.15,
7.4.13 и 7.5.4 (Bug #23709232).
См. раздел 2.3.17.7.
Описание. Узел API, который отсоединен от кластера, вынужден
использовать новый объект связи, чтобы снова соединиться, если это поведение
не отвергнуто, установив AutoReconnect = 1
в
файле config.ini
или вызывая этот метод с 1 как
входное значение. Вызов метода с 0 имеет тот же самый эффект как задание
AutoReconnect
(также введен в тех версиях кластера NDB) к 0, то есть, узлы API вынуждены
создать новые связи.
Когда вызван, этот метод отвергает любое значение для
AutoReconnect
из файла
config.ini
.
См. Defining SQL and Other API Nodes in an NDB Cluster.
Сигнатура.
void set_auto_reconnect
(
int value
)
Параметры. Значение value
0 или 1, которое определяет поведение повторного соединения узла API. 0
предписывает узлам API использовать новые связи (объекты
Ndb_cluster_connection
), 1 разрешает узлам API снова использовать
существующие связи с кластером.
Возвращаемое значение. Нет.
Описание. Устанавливает окружение узла данных, используемое для
оптимального размещения операционного координатора. Этот метод используется
после создания Ndb_cluster_connection
, но
до старта любых потоков запроса. Это потому, что этот метод может изменить
внутреннее состояние Ndb_cluster_connection
,
разделенного потоками. Это состояние не ориентировано на многопотоковое
исполнение, изменение его может привести к неоптимальному выбору узла
во время изменения.
Можно использовать системную переменную сервера
ndb_data_node_neighbour
, чтобы
установить соседний узел данных для узла SQL кластера NDB.
Добавлено в NDB 7.5.2.
Сигнатура.
void set_data_node_neighbour
(
Uint32 neighbour_node
)
Параметры. ID узла, который будет использоваться в качестве соседа.
Возвращаемое значение. Нет.
Описание. Установите минимальное время в миллисекундах, которое адаптивный механизм передачи ждет прежде чем послать все сигналы.
Сигнатура.
void set_max_adaptive_send_time
(
Uint32 milliseconds
)
Параметры. Время ожидания в миллисекундах. Диапазон 0-10, по умолчанию 10.
Возвращаемое значение. Нет.
Описание. Определяет имя для связи. Если имя определяется, о нем сообщают в регистрации кластера.
Сигнатура.
void set_name
(
const char* name
)
Параметры. Имя name
,
которое будет использоваться в качестве идентификатора для связи.
Возвращаемое значение. Нет.
Описание. Определите число потоков приемника, связанных с
CPU, определенное использованием
set_recv_thread_cpu()
с порогом,
установленным
set_recv_thread_activation_threshold()
.
Этот метод должен быть вызван прежде, чем попытаться соединиться с любыми другими узлами.
Сигнатура.
int set_num_recv_threads
(
Uint32 num_recv_threads
)
Параметры. Количество потоков. Единственное поддержанное
значение 1
.
Возвращаемое значение.
-1
указывает на ошибку, любое другое значение
указывает на успех.
Описание. Этот метод может использоваться, чтобы отвергнуть
поведение метода connect()
по умолчанию, в отношении которого узел должен быть связан сначала.
Сигнатура.
void set_optimized_node_selection
(
int value
)
Параметры. integer value
.
Возвращаемое значение. Нет.
Описание. Установите уровень для активации потока
приемника, связанного с помощью
set_recv_thread_cpu()
.
Ниже этого уровня потоки обычного пользователя используются,
чтобы получить сигналы.
Сигнатура.
int set_recv_thread_activation_threshold
(
Uint32 threshold
)
Параметры. integer threshold
. 16 или более высокие значения означают, что потоки получения
никогда не используются в качестве приемников. 0 указывает, что поток
получения всегда активна, это сохраняет права опроса для его собственного
исключительного использования, эффективно блокируя все пользовательские
потоки от становления приемниками. В таких случаях нужно соблюдать
аккуратность, чтобы гарантировать, что поток получения не конкурирует с
пользовательским потоком за ресурсы CPU, предпочтительно для него быть
привязанным к CPU для его собственного исключительного использования.
По умолчанию значение 8.
Возвращаемое значение.
-1
указывает на ошибку,
любое другое значение указывает на успех.
Описание. Начиная с NDB 7.5.7 и NDB 7.8.2,
этот метод может использоваться, чтобы создать URI для публикации в столбце
service_URI
строки приложения в таблице
ndbinfo.processes
.
При условии, что этот метод вызывают до
connect()
, URI издается непосредственно
после связи, иначе это издается после задержки в
HeartbeatIntervalDbApi
миллисекунд.
Сигнатура.
int set_service_uri ( const char*scheme
, const char*host
, intport
, const char*path
)
Параметры. Этот метод берет параметры, перечисленные здесь:
scheme
:
Схема URI. Это ограничено к строчным буквам, числам и
знакам .
, +
и
-
. Максимальная длина 16 знаков, любые знаки
сверх этого предела усечены.
host
:
Адрес сети URI или имя хоста. Максимальная длина 48 знаков
(достаточно для адреса сети IPv6), любые знаки сверх этого предела усечены.
Если ноль, каждый узел данных сообщает о сетевом адресе от своей собственной
связи до этого узла. Ndb_cluster_connection
,
который использует многократные транспортеры или сетевые адреса, чтобы
соединиться с различными узлами данных, отражен в
многократных строках таблицы
ndbinfo.processes
.
port
: Порт URI.
Это не издается, если это равно 0.
path
:
Путь URI, возможно сопровождаемый началом строки запроса с
?
. Максимальная объединенная длина пути и
запроса не может превысить 128 знаков.
Путь не может начаться с двойного слэша
(//
).
Возвращаемое значение. 0 при успехе, 1 в случае синтаксической ошибки.
Описание. Установите CPU, с которым должен быть связан поток
приемника. Установите уровень для активации потока приемника, вызвав
set_recv_thread_activation_threshold()
.
Сбросьте привязку потока вызовом
unset_recv_thread_cpu()
.
Сигнатура.
int set_recv_thread_cpu ( Uint16*cpuid_array
, Uint32array_len
, Uint32recv_thread_id
= 0 )
Параметры.
Множество из одного или более CPU ID, с которыми должен быть связан поток получения
Длина этого множества
ID потока получения для привязки, по умолчанию
0
.
Возвращаемое значение.
-1
указывает на ошибку,
любое другое значение указывает на успех.
Описание. Используемый, чтобы установить тайм-аут для связи, ограничить количество времени, которое мы можем заблокировать, соединяясь.
Этот метод на самом деле обертка для функции
ndb_mgm_set_timeout()
, см.
see раздел 3.2.4.12.
Сигнатура.
int set_timeout
(
int timeout_ms
)
Параметры. Длина тайм-аута в миллисекундах
(timeout_ms
).
В настоящее время приняты только кратные 1000 значения.
Возвращаемое значение. 0 при успехе, любое другое значение указывает на ошибку.
Описание. Этот метод отменяет эффекты
lock_ndb_objects()
, позволяя создать новые
экземпляры Ndb
.
unlock_ndb_objects()
должен быть вызван после того, как вы закончили получать объекты
Ndb
, используя
метод
get_next_ndb_object()
.
Сигнатура.
void unlock_ndb_objects ( void ) const
Параметры. Нет.
Возвращаемое значение. Нет.
Этот метод был сделан const
в NDB 7.3.15,
7.4.13 и 7.5.4 (Bug #23709232).
См. раздел 2.3.17.7.
Описание.
Сбросить CPU, к которым привязан поток получения, используя
set_recv_thread_cpu()
.
Сигнатура.
int unset_recv_thread_cpu
(
Uint32 recv_thread_id
)
Параметры. ID потока получения.
Возвращаемое значение.
-1
указывает ошибку, любое другое
значение указывает на успех.
Описание. Этот метод необходим, чтобы установить связи с узлами данных. Это ждет, пока требуемая связь с одним или более узлами данных не будет успешна, или пока не кончится тайм-аут.
Сигнатура.
int wait_until_ready ( inttimeoutBefore
, inttimeoutAfter
)
Параметры.
timeoutBefore
определяет число секунд, чтобы ждать, пока первый
живой узел будет найден. Если это количество
времени превышено без обнаруженных живых узлов, то метод немедленно
возвращает отрицательную величину.
timeoutAfter
определяет число секунд, чтобы ждать после того, как первый
живой узел будет обнаружен для всех узлов, чтобы
стать активным. Если это количество времени превышено без получения активного
узла, то метод немедленно возвращает значение больше 0.
Возвращаемое значение.
wait_until_ready()
вернет
int
, чье значение
интерпретируется следующим образом:
= 0
: все узлы
живые.
> 0
: По крайней мере один узел
живой (однако, неизвестно, живы ли
все узлы).
< 0
: Ошибка произошла.
Резюме
Этот класс представляет обработчик столбца
BLOB
и обеспечивает и доступ для чтения и записи
к значениям столбцов BLOB
.
Этот объект имеет много различных статусов и обеспечивает несколько способов
доступа к BLOB
.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. У этого класса нет публичного конструктора. Экземпляр
NdbBlob
создается, используя метод
NdbOperation::getBlobHandle()
во время операционной фазы подготовки. См.
раздел 2.3.25.
Этот объект действует как обработчик столбца
on a BLOB
.
Хранение данных BLOB.
Данные BLOB
хранятся в 2 местах:
Заголовок и действующие байты сохранены в признаке blob.
Сегменты данных blob сохранены в отдельной таблице
NDB$BLOB_
, где
tid
_
cid
tid
ID таблицы, а
cid
ID столбца blob.
Размеры сегмента данных могут быть установлены, используя соответствующмй
метод Column
, когда таблица составлена. Посмотрите
раздел 2.3.2.
Типы доступа к данным.
NdbBlob
поддерживает 3 типа доступа к данным.
Эти типы доступа к данным могут быть применены в комбинации при условии, что
они используются в порядке, данном выше.
В фазе подготовки методы NdbBlob
getValue()
и
setValue()
используются, чтобы подготовить
чтение или запись BLOB
известного размера.
Также в фазе подготовки
setActiveHook()
используется, чтобы определить установленный порядок, который вызван, как
только обработчик становится активным.
В активной фазе
readData()
и
writeData()
используются, чтобы читать и писать
BLOB
, имеющие произвольные размеры.
Работа с BLOB. Операции BLOB
вступают в силу, когда следующая транзакция выполняется. В некоторых случаях
NdbBlob
вынужден выполнить неявное выполнение.
Чтобы избежать этого, необходимо всегда воздействовать на
полные сегменты данных.
Используйте
NdbTransaction::executePendingBlobOps()
для сброса чтения и записи, который избегает любого штрафа выполнения, если
никакие операции не находятся на рассмотрении. Это не требуется после
выполнения операций или после следующего результата просмотра.
NdbBlob
также поддерживает чтение
данные перед или после blob из событий. Обработчик может быть прочитан после
того, как следующее событие на главной таблице было получено.
Данные становятся доступными немедленно. См.
раздел 2.3.21.
BLOB и NdbOperation. Методы
NdbOperation
, действующие на объекты
NdbBlob
имеют параметры:
NdbOperation::insertTuple()
должен
использовать
NdbBlob::setValue()
, если признак
BLOB
не nullable.
NdbOperation::readTuple()
используемый с любым способом блокировки,
может прочитать, но не написать значения blob.
Когда блокировка LM_CommittedRead
используется с readTuple()
, режим блокировки
автоматически модернизирован до LM_Read
каждый раз, когда к признакам blob получают доступ.
NdbOperation::updateTuple()
может переписать существующее значение с использованием
NdbBlob::setValue()
или обновить его во время активной фазы.
NdbOperation::writeTuple()
всегда переписывает значения blob и должен использовать
NdbBlob::setValue()
, если атрибут
BLOB
не nullable.
NdbOperation::deleteTuple()
создает неявный
недоступный обработчик BLOB
.
Просмотр с любым способом блокировки может использовать свои обработчики, чтобы прочитать значения, но не написать их.
Просмотр, используя способ блокировки LM_Exclusive
может обновить строку и значения blob, применяя
updateCurrentTuple()
,
возвращенная операция должна явно создать собственный обработчик blob.
Просмотр, используя способ блокировки
LM_Exclusive
может удалить значения строки
(и поэтому значения blob) с использованием
deleteCurrentTuple()
,
это создает неявные недоступные обработчики blob.
Операция, которая возвращена
lockCurrentTuple()
, не может обновить blob.
Известные проблемы. Следующее это известные проблемы или
ограничения, с которыми сталкиваются, работая с объектами
NdbBlob
:
Слишком многие ожидающие операции
BLOB
могут переполнить буфера I/O.
Таблица и ее таблицы сегментов данных
BLOB
не создаются атомарно.
Методы.
Таблица 2.32.
Имя | Описание |
---|---|
blobsFirstBlob() |
Получает первый blob в списке |
blobsNextBlob() |
Получает следующий blob в списке |
close() |
Высвободите внутренние средства до передачи или отмены |
getBlobEventName() |
Получает имя события blob |
getBlobTableName() |
Получает имя таблицы сегмента данных blob |
getColumn() |
Получает колонку blob |
getLength() |
Получает длину blob в байтах |
getNdbError() |
Получает ошибку (объект
NdbError ) |
getNdbOperation() |
Получает указатель на операцию
(объект
NdbOperation ), к которой этот объект
NdbBlob принадлежал, когда был создан |
getNull() |
Проверка, является ли значение blob
NULL |
getPos() |
Получает настоящее положение для чтения/записи |
getState() |
Получает состояние объекта NdbBlob |
getValue() |
Готовится читать значение blob |
getVersion() |
Проверка, основан ли blob на запросе или событии |
readData() |
Читает данные из blob |
setActiveHook() |
Определяет отзыв для активации обработчика blob |
setNull() |
Устанавливает blob в NULL |
setPos() |
Устанавливает положение, в котором можно начать читать/писать |
setValue() |
Готовится вставлять или обновлять значение blob |
truncate() |
Усекает blob к данной длине |
writeData() |
Пишет данные blob |
Методы
getBlobTableName()
и
getBlobEventName()
статические.
Большинство методов NdbBlob
(почти все те,
тип возвращения которых int
) вернут
0
при успехе и
-1
при ошибке.
Типы.
Таблица 2.33.
Имя | Описание |
---|---|
ActiveHook() |
Отзыв для
NdbBlob::setActiveHook() |
State() |
Представляет статусы, которые могут быть приняты
NdbBlob .
|
Резюме
ActiveHook это тип данных, определенный для использования в качестве
отзыва для метода setActiveHook()
, см.
раздел 2.3.18.17.
Определение.
ActiveHook
это
пользовательский тип данных, определенный так:
typedef int ActiveHook ( NdbBlob*me
, void*arg
)
Описание. Это отзыв для
NdbBlob::setActiveHook()
, немедленно вызван,
как только подготовленная операция была выполнена (но не передана).
Любые вызовы
getValue()
или
setValue()
выполняются сначала. Обработчик BLOB
активен, так что
readData()
или
writeData()
могут использоваться, чтобы управлять значением
BLOB
. Определенный пользователями аргумент
передается вместе с
NdbBlob
.
setActiveHook()
вернет
ненулевое значение в случае ошибки.
Описание. Этот метод инициализирует список blob, принадлежащих текущей операции, и возвращает первый blob в списке.
Сигнатура.
NdbBlob* blobsFirstBlob ( void )
Параметры. Нет.
Возвращаемое значение. Указатель на желаемый blob.
Описание. Используйте метод, чтобы получить следующий в списке blob. См. раздел 2.3.18.2 .
Сигнатура.
NdbBlob* blobsNextBlob ( void )
Параметры. Нет.
Возвращаемое значение. Указатель на желаемый blob.
Описание. Закрывает обработчик, высвобождая внутренние средства
до совершения или прерывания транзакции. Другими словами, это сигнализирует,
что приложение закончило с чтением от данного blob.
Этот метод можно вызвать только когда blob
State
= Active
.
Операции чтения и блокировки. Когда обработчик blob
создается на операции чтения при использовании
LM_Read
или
LM_Exclusive
как
LockMode
, операцию чтения можно открыть
только когда все обработчики, созданные на этой операции, были закрыты.
Когда строка, содержащая blob, была прочитана со способом блокировки
LM_CommittedRead
, способ автоматически
модернизирован до LM_Read
, чтобы гарантировать
последовательность. В этом случае, когда все обработчики для строки были
закрыты, операция разблокировки строки автоматически выполняется методом
close()
, который добавляет надвигающуюся
операцию записи к blob. Модернизированная блокировка выпущена после вызова
execute()
.
Сигнатура.
int close
(
bool execPendingBlobOps
= true
)
Параметры. У этого метода есть единственный булев параметр
execPendingBlobOps
.
Если значение этого параметра true
(по
умолчанию), любые надвигающиеся операции по blob сброшены прежде, чем
обработчик закрывается. Если
execPendingBlobOps
=
false
, предполагается, что у обработчика нет
ожидающих операций чтения или записи.
Возвращаемое значение. 0 при успехе.
Описание. Этот метод получает имя события blob. Событие создается, если главное событие контролирует колонку blob. Имя включает главное имя события.
Сигнатура.
static int getBlobEventName ( char*name
, Ndb*ndb
, const char*event
, const char*column
)
Параметры.
Название события name
.
ndb
: Соответствующий объект
Ndb
.
event
:
Название главного события.
column
: Столбец blob.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод получает название таблицы сегментов данных blob.
Этот метод обычно имеет использование только для тестирования и отладки.
Сигнатура.
static int getBlobTableName ( char*name
, Ndb*ndb
, const char*table
, const char*column
)
Параметры.
name
:
Название таблицы сегментов данных blob.
ndb
: Соответствующий объект
Ndb
.
table
:
Название главной таблицы.
column
: Столбец blob.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Используйте этот метод, чтобы получить столбец
BLOB
, который принадлежит
NdbBlob
.
Сигнатура.
const Column* getColumn ( void )
Параметры. Нет.
Возвращаемое значение. Объект Column. См. раздел 2.3.2.
Описание. Этот метод получает текущую длину blob в байтах.
Сигнатура.
int getLength
(
Uint64& length
)
Параметры. Ссылка на длину.
Возвращаемое значение. Длина blob в байтах. Для
NULL
этот метод вернет
0
. Чтобы отличить blob длины
0
, используйте
getNull()
.
Описание. Этот метод проверяет, является ли значение
NULL
.
Сигнатура.
int getNull
(
int& isNull
)
Параметры. Ссылка на integer
isNull
.
У этого параметра есть одно из следующих значений, интерпретируемых
как показано здесь:
-1
: blob не определен. Если это
blob без события, этот результат вызывает статусную ошибку.
0
: blob не null.
1
: blob =
NULL
.
Возвращаемое значение. Нет.
Описание. Используйте этот метод, чтобы получить ошибочный объект. Ошибка может быть определенной для blob или может быть скопирована с неудавшейся неявной операции. Код ошибки копируется назад к операции, если у операции уже нет кода ошибки отличного от нуля.
Сигнатура.
const NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение.
Объект NdbError
, см. раздел 2.3.20.
Описание. Этот метод может использоваться, чтобы найти операцию с
который связан обработчик для этого
NdbBlob
.
Сигнатура.
const NdbOperation* getNdbOperation ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на операцию.
Операция, на которую ссылается указатель, возвращенный этим методом, может
быть представлена любым объектом
NdbOperation
или
NdbScanOperation
.
Описание. Этот метод получает текущее положение чтения-записи в blob.
Сигнатура.
int getPos
(
Uint64& pos
)
Параметры. Один параметр, ссылка на положение.
Возвращаемое значение. 0
при успехе
или -1
при неудаче. После успешного вызова
pos
займет текущую позицию
чтения-записи в blob.
Описание. Этот метод получает текущее состояние объекта
NdbBlob
,
для которого это вызвано. Возможные статусы описаны в
разделе 2.3.18.21.
Сигнатура.
State getState ( void )
Параметры. Нет.
Возвращаемое значение.
Значение State
. См.
раздел 2.3.18.21.
Описание. Используйте этот метод, чтобы подготовиться читать
значение blob, значение доступно следующим вызовом. Используйте
getNull()
, чтобы проверять на
NULL
, getLength()
,
чтобы получить фактическую длину blob и проверить на усечение.
getValue()
устанавливает текущее положение
чтения-записи в пункт после конца данных, которые были прочитаны.
Сигнатура.
int getValue ( void*data
, Uint32bytes
)
Параметры. Этот метод берет два параметра. Первым из них является
указатель на data
для чтения,
вторым является количество bytes
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы различать, основана ли на запросе или на событии операция по blob.
Сигнатура.
void getVersion
(
int& version
)
Параметры. Этот метод берет единственный параметр, ссылку на integer на версию blob (операционный тип).
Возвращаемое значение.
-1
: Это
нормальный (основанный на запросе) blob.
0
:
Это базирующийся на операции событий blob после изменения в его данных.
1
:
Это базирующийся на операции событий blob
до любого изменения в его данных.
getVersion()
всегда успешно, предполагая, что
это вызвано как метод действительного экземпляра
NdbBlob
.
Описание. Этот метод используется, чтобы прочитать данные из blob.
Сигнатура.
int readData ( void*data
, Uint32&bytes
)
Параметры. readData()
принимает
указатель на data
для чтения и
ссылку на количество bytes
.
Возвращаемое значение.
0
при успехе,
-1
при ошибке. После успешного вызова
data
указывает на данные, которые
были прочитаны, а bytes
считает число байтов.
Описание. Этот метод определяет отзыв для активации обработчика blob. Очередь подготовленных операций будет выполнена в непередаваемом режиме до этого пункта, затем отзыв вызван. Для получения дополнительной информации посмотрите раздел 2.3.18.1.
Сигнатура.
int setActiveHook ( ActiveHook*activeHook
, void*arg
)
Параметры.
Указатель на значение ActiveHook
,
это отзыв, как объяснено в
разделе 2.3.18.1.
Указатель на void
для любых данных, которые будут переданы отзыву.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод устанавливает значение blob =
NULL
.
Сигнатура.
int setNull ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод устанавливает положение, в котором можно прочитать или написать данные.
Сигнатура.
int setPos
(
Uint64 pos
)
Параметры. Метод setPos() берет единственный параметр
pos
(unsigned 64-bit integer),
который является положением для чтения или написания данных. Значение
pos
должно быть между
0
и текущей длиной blob.
Sparse blob не поддерживаются в API NDB, другими словами, не может быть никаких неиспользованных положений данных.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы подготовиться к вставке
или обновлению blob. Любые существующие данные, которые более длинны, чем
новые данные, усечены. Буфер данных должен остаться действительным, пока
операция не была выполнена. setValue()
устанавливает текущее положение чтения-записи в пункт после конца данных.
Можно установить data
=
null (0
), чтобы создать значение
NULL
.
Сигнатура.
int setValue ( const void*data
, Uint32bytes
)
Параметры.
data
,
это должно вставляться или использоваться, чтобы переписать значение.
bytes
длина
data
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Резюме
Это перечисляемый тип данных, который представляет возможные статусы
NdbBlob
.
Описание.
NdbBlob
может принять любой из этих статусов.
Возможные значения.
Таблица 2.34.
Имя | Описание |
---|---|
Idle |
NdbBlob
еще не был подготовлен к использованию ни с какими операциями. |
Prepared |
Это состояние
NdbBlob до операционного выполнения. |
Active |
Это состояние обработчика BLOB
после выполнения или установки следующего результата, но прежде,
чем транзакция передается. |
Closed |
Это состояние происходит после того, как транзакция была передана. |
Invalid |
Это следует за отменой или завершением транзакции. |
Описание. Этот метод используется, чтобы усечь blob к данной длине.
Сигнатура.
int truncate
(
Uint64 length
= 0
)
Параметры.
truncate()
берет единственный параметр, который
определяет новую длину length
,
к которой blob должна быть усечена. Этот метод не имеет никакого эффекта,
если length
больше, чем текущая длина (которую можно проверить использованием
getLength()
).
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы написать данные
NdbBlob
.
После успешного вызова положение чтения-записи будет на уровне первого байта
после данных, которые были записаны.
Запись после текущего конца данных расширяет blob автоматически.
Сигнатура.
int writeData ( const void*data
, Uint32bytes
)
Параметры. Этот метод берет два параметра, указатель на данные
data
для записи и количество байт
bytes
в них.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Резюме
Этот класс обеспечивает метаинформацию об объектах базы данных, таких как таблицы, колонки и индексы.
В то время как предпочтительный метод создания объекта базы данных и
удаления через MySQL Server, NdbDictionary
также разрешает разработчику выполнять эти задачи через NDB API.
Родительский класс. Нет.
Дочерние классы.
Dictionary
, Column
, Object
.
Описание. Это класс словаря данных, который поддерживает запросы о таблицах, столбцах и индексах. Это также обеспечивает способы определить эти объекты базы данных и удалить их. Оба вида функциональности поставляются, используя внутренние классы. Они включают следующие внутренние классы:
Table
для работы с таблицами
Column
для создания столбцов таблицы
Index
для работы с вторичными индексами
Dictionary
для создания объектов базы данных и схем
Event
для работы с событиями
Дополнительные подклассы
Object
моделируют табличные пространства,
группы файла журнала, файлы данных и файлы отмен, требуемые для работы с
таблицами NDB Cluster Disk Data (введено в MySQL 5.1), а также внешними
ключами (NDB Cluster 7.3 и позже).
Таблицы и индексы, созданные с использованием
NdbDictionary
, не могут быть рассмотрены
из MySQL Server.
Удаление индексов через API NDB, которые были созданы первоначально из кластера NDB, вызывает несоответствия. Возможно, что таблица, из которой один или больше индексов были исключены, используя API NDB, больше не будет применима MySQL после таких операций. В этом случае таблица должен быть удалена, а затем воссоздана с использованием MySQL, чтобы сделать ее доступной для MySQL еще раз.
Методы. NdbDictionary
самостоятельно не имеет никаких публичных методов экземпляра, только
статические методы, которые используются для работы с объектами
NdbRecord
.
Операции, не использующие NdbRecord
,
достигаются посредством подметодов экземпляров классов
NdbDictionary
.
Таблица 2.35.
Имя | Описание |
---|---|
getEmptyBitmask() |
Возвращает битовую маску присутствия пустого столбца, которая может
использоваться с
NdbRecord |
getFirstAttrId() |
Получите первый признак ID, определенный данным объектом
NdbRecord
|
getRecordIndexName() |
Получает название индексного объекта, упомянутого NdbRecord |
getRecordRowLength() |
Получить число байтов для того, чтобы сохранить одну строку
данных, используя данный
NdbRecord
|
getRecordTableName() |
Получает название объекта таблицы, упомянутого NdbRecord |
getRecordType() |
Получает RecordType NdbRecord |
getValuePtr() |
Возвращает указатель на начало хранимых данных, определенных признаком
ID, используя
NdbRecord |
isNull() |
Покажите, является ли колонка null |
setNull() |
Установите колонку в null |
Для числовых эквивалентов перечисленным подклассам
NdbDictionary
посмотрите файл
/storage/ndb/include/ndbapi/NdbDictionary.hpp
в дереве исходных текстов NDB Cluster.
Описание. Возвращает битовую маску присутствия пустого столбца,
которая может использоваться с любым
NdbRecord
, чтобы определить, что нет столбцов
NdbRecord
, которые должны быть включены в операцию.
Сигнатура.
static const unsigned char* getEmptyBitmask ( void )
Параметры. Нет.
Возвращаемое значение. Пустая битовая маска.
Описание. Получите первый признак ID, определенный объектом
NdbRecord
. Вернет false
, если никакой признак
ID не определяется.
Сигнатура.
static bool getFirstAttrId ( const NdbRecord*record
, Uint32&firstAttrId
)
Параметры. Указатель на
NdbRecord
и ссылка на признак
(firstAttrID
).
Возвращаемое значение.
Boolean false
,
когда никакой признак ID не может быть получен.
Описание. Получите следующий признак ID, определенный объектом
NdbRecord
после переданного признака ID. Вернет
false
, когда больше нет признаков ID,
которые будут возвращены.
Сигнатура.
static bool getNextAttrId ( const NdbRecord*record
, Uint32&attrId
)
Параметры. Указатель на
NdbRecord
и ссылка на ID признака.
Возвращаемое значение. Boolean false
,
когда никакой признак ID не может быть получен.
Описание. Получить смещение бита null данного атрибута ID от
начала строки
NdbRecord
. Вернет
false
, если признак ID не присутствует.
Сигнатура.
static bool getNullBitOffset ( const NdbRecord*record
, Uint32attrId
, Uint32&bytes
, Uint32&bit
)
Параметры.
NdbRecord
record
,
в которой можно получить смещение данного признака ID
(attrId
). Смещение выражается как
число байт (bytes
) плюс число бит в
последнем байте (bit
).
Возвращаемое значение. Boolean false
,
если признак с данным ID не присутствует.
Описание. Получить смещение данного атрибута ID от начала строки
NdbRecord
.
Вернет false
, если признак ID не присутствует.
Сигнатура.
static bool getOffset ( const NdbRecord*record
, Uint32attrId
, Uint32&offset
)
Параметры. Смещение offset
данного признака ID с начала строки
NdbRecord
.
Возвращаемое значение.
Boolean false
, если признак ID не присутствует.
Описание. Получите название объекта
Index
, на который ссылается
NdbRecord
.
Если объект
NdbRecord
не IndexAccess
NdbRecord
, метод возвращает пустой указатель.
Сигнатура.
static const char* getRecordIndexName
(
const NdbRecord* record
)
Параметры. Указатель на
NdbRecord
для которого надо получить имя.
Возвращаемое значение. Имя, если есть. Иначе или если объект
NdbRecord
не типа IndexAccess
, этот метод
вернет пустой указатель.
Описание. Получить число байтов, чтобы сохранить одну строку
данных, как описано структурой
NdbRecord
, переданной этому методу.
Сигнатура.
static Uint32 getRecordRowLength
(
const NdbRecord* record
)
Параметры. Объект
NdbRecord
.
Возвращаемое значение. Число байтов на строку.
Описание. Возвратит название объекта таблицы, на который ссылается
NdbRecord
.
Этот метод возвращает пустой указатель, если запись не
TableAccess
.
Сигнатура.
static const char* getRecordTableName
(
const NdbRecord* record
)
Параметры. record
(объект NdbRecord
), для которого надо получить имя таблицы.
Возвращаемое значение. Название таблицы или пустой указатель, если
тип объекта
NdbRecord
не TableAccess
.
Описание. Возвратит тип объекта
NdbRecord
.
Сигнатура.
static RecordType getRecordType ( const NdbRecord* record )
Параметры. Объект
NdbRecord
.
Возвращаемое значение. RecordType
NdbRecord
(IndexAccess
или
TableAccess
).
Описание. Возвращает указатель на начало данных, определенных признаком ID, ища смещение колонки, сохраненной в объекте NdbRecord и возвращая сумму положения строки и смещения.
Этот метод обеспечивает версии row-const и не-row-const.
Сигнатура.
static const char* getValuePtr ( const NdbRecord*record
, const char*row
, Uint32attrId
) static char* getValuePtr ( const NdbRecord*record
, char*row
, Uint32attrId
)
Параметры. Указатель на объект
NdbRecord
, описывающий формат строки, указатель на начало данных строки
(const
в const-версии) и признак ID колонки.
Возвращаемое значение. Указатель на начало признака в строке. Это null, если признак не часть определения NdbRecord.
Описание. Установлен ли бит null для данной колонки в
true
or false
.
Местоположение пустого бита относительно указателя строки получено из
переданного объекта
NdbRecord
. Если столбец не может быть null или он не часть
определения
NdbRecord
, метод вернет false
.
Сигнатура.
static bool isNull ( const NdbRecord*record
, const char*row
, Uint32attrId
)
Параметры. Указатель на объект
NdbRecord
, описывающий формат строки,
указатель на начало данных строки и признак ID колонки, чтобы проверить.
Возвращаемое значение.
Boolean true
,
если признак ID существует в этом
NdbRecord
, он может быть null и пустой бит
этой строки установлен, иначе Boolean false
.
Описание. Установите бит null для данной колонки к поставляемому
значению. Смещение бита получено из переданного объекта
NdbRecord
. Если признак ID не является частью
NdbRecord
или если это не может быть null, этот метод возвращает ошибку (-1).
Сигнатура.
static int setNull ( const NdbRecord*record
, char*row
, Uint32attrId
, boolvalue
)
Параметры. Указатель на record
(объект
NdbRecord
) с описанием формата строки, указатель на начало
данных строки row
,
признак ID колонки (attrId
)
и value
, чтобы
установить бит null (true
или
false
).
Возвращаемое значение.
0 при успехе, -1 если attrId
не часть record
или не может быть null.
Резюме
структуруЭта секция обсуждает структуру NdbError
,
которая содержит статус и другую информацию об ошибках, включая коды
ошибок, классификации и сообщения.
Описание. NdbError
состоит из шести частей, перечисленных здесь, которые устарели:
Error status: Это описывает воздействие ошибки на приложении и отражает то, что должно сделать приложение, когда с ошибкой сталкивается.
Ошибочный статус описан значением типа
Status
. См.
раздел 2.3.20.2.
Error classification: Это представляет логический ошибочный тип или группировку.
Классификация ошибок описана значением типа
Classification
. См.
раздел 2.3.20.1
для возможных классификаций и их интерпретации. Дополнительная информация
предоставляется в разделе
2.4.4.
Error code: Это внутренний код ошибки API NDB, который однозначно определяет ошибку.
Не рекомендуется писать прикладные программы, которые зависят от определенных кодов ошибок. Вместо этого они должны проверить ошибочный статус и классификацию. Больше информации об ошибках может также быть получено, проверив сообщения об ошибках и (когда доступно) сообщения деталей ошибки. Однако, как коды ошибок, эти сообщения об ошибках и сообщения деталей ошибки подвержены изменениям.
Список текущих кодов ошибок, представлен в
разделе 2.4.2.
Этот листинг обновляется с новыми выпусками кластера NDB. Можно также
проверить файл storage/ndb/src/ndbapi/ndberror.c
в исходных текстах NDB Cluster.
MySQL Error code: Это соответствующий код ошибки MySQL Server. Коды ошибок MySQL не обсуждены в этом документе, пожалуйста, см. Server Error Message Reference в MySQL Manual.
Error message: Это универсальное, независимое от контекста описание ошибки.
Error details: Это может часто предоставлять дополнительную информацию (не найденную в сообщении об ошибке) об ошибке, определенную для обстоятельств, при которых сталкиваются с ошибкой. Однако это доступно не во всех случаях.
Где не определено, сообщение деталей ошибки
NULL
.
Это свойство устарело. Для получения деталей ошибки необходимо
использовать метод
Ndb::getNdbErrorDetail()
.
Определенные коды ошибок API NDB, сообщения и детали подлежат изменению без уведомления.
Определение. Структура NdbError содержит следующих участников, типы которых показаны здесь:
Status status
: Ошибочный статус.
Classification classification
:
Ошибочный тип (классификация).
int code
: Код ошибки NDB API.
int mysql_code
: Код ошибки MySQL.
const char* message
: Сообщение об ошибке.
char* details
: Сообщение деталей ошибки.
details
устарел. Необходимо использовать
метод
Ndb::getNdbErrorDetail()
(Bug #48851).
Типы. NdbError
определяет эти два типа данных:
Classification
:
Тип ошибки или логической группировки, которой принадлежит ошибка.
Status
: Ошибочный статус.
Описание. Этот тип описывает тип ошибки или логическую группу, которой это принадлежит.
Возможные значения.
Таблица 2.36.
Имя | Описание |
---|---|
NoError |
Указывает на успех (никакая ошибка не произошла) |
ApplicationError |
Ошибка произошла в прикладной программе |
NoDataFound |
Операция чтения потерпела неудачу из-за одной или нескольких недостающих записей |
ConstraintViolation |
Ограничительное нарушение произошло, такое как попытка вставить кортеж, имеющий значение первичного ключа, который уже есть в целевой таблице |
SchemaError |
Ошибка произошла, пытаясь создать или использовать таблицу |
InsufficientSpace |
Было недостаточно памяти для данных или индексов |
TemporaryResourceError |
С этим типом ошибки, как правило, сталкиваются, когда есть слишком много активных транзакций |
NodeRecoveryError |
Это временный отказ, который был, вероятно, вызван происходящим
восстановлением узла, например, когда информация, посланная между приложением
и NDB потеряна, или когда
есть изменение распределения. |
OverloadError |
Этот тип ошибки часто вызывается, когда недостаточно пространства файла журнала |
TimeoutExpired |
Тайм-аут часто вызываемый мертвой блокировкой |
UnknownResultError |
Неизвестно, была ли транзакция передана |
InternalError |
Серьезная ошибка произошла в NDB |
FunctionNotImplemented |
Приложение попыталось использовать функцию, которая еще не осуществляется |
UnknownErrorCode |
Это замечено, если обработчик ошибок NDB
не может определить правильный код ошибки, чтобы сообщить |
NodeShutdown |
Это вызывается закрытием узла |
SchemaObjectExists |
Приложение попыталось создать объект схемы, который уже существует |
InternalTemporary |
Запрос был отправлен не к основному узлу |
Соответствующая информация, определенная для определенного состояния ошибки, может быть найдена в разделах 2.4.2 и 2.4.4.
Описание. Этот тип используется, чтобы описать статус ошибки.
Возможные значения.
Таблица 2.37.
Имя | Описание |
---|---|
Success |
Никакая ошибка не произошла |
TemporaryError |
Временная и обычно исправимая ошибка, приложение должно повторить операцию, дающую начало ошибке |
PermanentError |
Систематическая ошибка, не восстанавливаемая |
UnknownResult |
Результат или статус операции неизвестны |
Соответствующая информация, определенная для определенного состояния ошибки, может быть найдена в разделе 2.4.4.
Резюме
Эта секция описывает класс NdbEventOperation
,
который используется, чтобы наблюдать изменения (события) в базе данных. Это
обеспечивает базовую функциональность, которая ранее была в
NDB Cluster Replication.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. NdbEventOperation
представляет событие базы данных.
Создание экземпляра NdbEventOperation.
У этого класса нет публичного конструктора или деструтора. Вместо этого
экземпляры NdbEventOperation
создаются как результат вызовов метода на объектах
Ndb
и
NdbDictionary
, согласно следующим условиям:
Должно существовать событие, которое было создано,
используя
Dictionary::createEvent()
.
Этот метод возвращает экземпляр класса
Event
.
Объект NdbEventOperation
создается,
используя
Ndb::createEventOperation()
,
который действует на экземпляр
Event
.
Экземпляр этого класса удален, вызвав
Ndb::dropEventOperation
.
Подробное создание демонстрации в качестве примера и удаление операций событий обеспечиваются в разделе 2.5.8.
Известные проблемы. Со следующими проблемами можно столкнуться, работая с операциями событий в API NDB:
Максимальное количество активных объектов
NdbEventOperation
в настоящее время фиксируются во время компиляции как 2 *
MaxNoOfTables
.
В настоящее время все события
INSERT
,
DELETE
и UPDATE
,
а также все изменения признака посылают в API, даже если были определены
только некоторые признаки. Однако они скрыты от пользователя, и только
соответствующие данные показывают после запроса
Ndb::nextEvent()
.
Отметьте что ложные выходы из
Ndb::pollEvents()
могут произойти и таким образом следующий вызов
nextEvent()
вернет 0, так как не было никаких
доступных данных. В таких случаях просто вызовите
pollEvents()
еще раз.
Код события не проверяет версию схемы таблицы. Когда таблица удалена, удостоверьтесь, что вы пропускаете любые связанные события.
Если вы получили полную эпоху, события с этой эпохи не перепосланы даже в случае неудачи узла. Однако, если неудача узла произошла, последующие эпохи могут содержать двойные события, которые могут быть определены по дубликатам первичного ключа.
В коде NDB Cluster replication дубликаты первичного ключа при
INSERT
обычно обрабатываются, рассматривая такие
вставки как REPLACE
.
Чтобы рассмотреть содержание системной таблицы, содержащей созданные события, можно использовать утилиту ndb_select_all :
Ndb_select_all -d sys 'NDB$EVENTS_0'
Методы.
Таблица 2.38.
Имя | Описание |
---|---|
clearError() |
Очищает новую ошибку. Устарело в NDB 7.4.3. |
execute() |
Активирует NdbEventOperation |
getBlobHandle() |
Получает обработчик для чтения признаков blob |
getEpoch() |
Восстанавливает эпоху для данных о событии, полученных последними. Добавлено в NDB 7.4.3. |
getEventType() |
Получает тип события. Устарело в NDB 7.4.3. |
getEventType2() |
Получает тип события. Добавлено в NDB 7.4.3. |
getGCI() |
Восстанавливает GCI последнего полученного события. Устарело в NDB 7.4.3. |
getLatestGCI() |
Получает новый GCI (было ли соответствующее событие получено или нет) Устарело в NDB 7.4.3. |
getNdbError() |
Получает новую ошибку. |
getPreBlobHandle() |
Получает обработчик для чтения предыдущего признака blob |
getPreValue() |
Восстанавливает предыдущее значение признака |
getState() |
Получает текущее состояние операции событий |
getValue() |
Восстанавливает значение атрибута |
hasError() |
Произошла ли ошибка как часть этой операции. Устарело в NDB 7.4.3. |
isConsistent() |
Обнаруживает потерю событий, вызванную неудачей узла. Устарело в NDB 7.4.3. |
isEmptyEpoch() |
Обнаруживает пустую эпоху. Добавлено в NDB 7.4.3. |
isErrorEpoch() |
Обнаруживает ошибочную эпоху и восстанавливает ошибку, если есть. Добавлено в NDB 7.4.3. |
isOverrun() |
Произошла ли потеря событий из-за переполнения буфера. Устарело в NDB 7.4.3. |
mergeEvents() |
Позволяет событиям быть слитыми |
tableFragmentationChanged() |
Проверка, изменилась ли фрагментация для таблицы |
tableFrmChanged() |
Проверка, что файл .FRM
таблицы изменился |
tableNameChanged() |
Проверяет, изменилось ли название таблицы |
tableRangeListChanged() |
Проверяет, изменилось ли название списка разделения диапазона таблицы |
Типы. NdbEventOperation
определяет один перечислимый тип
State
.
Описание. Очищает ошибку, последний раз связанную с этой операцией событий.
Устарело в NDB 7.4.3.
Сигнатура.
void clearError ( void )
Параметры. Нет.
Возвращаемое значение. Нет.
Описание. Активирует
NdbEventOperation
, так, чтобы это могло
начать получать события. Измененные значения атрибута могут быть получены
после того, как
Ndb::nextEvent()
вернет значение кроме
NULL
.
Один из getValue()
,
getPreValue()
,
getBlobValue()
или
getPreBlobValue()
должен быть вызван перед
invoking execute()
.
Прежде, чем попытаться использовать этот метод, необходимо было прочитать объяснения, обеспеченные в разделах 2.3.16.25, 2.3.21.13 и 2.3.21.
Сигнатура.
int execute ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе и
-1
при неудаче.
Описание. Этот метод используется вместо
getValue()
для blob. Обработчик blob
(NdbBlob
),
возвращенный этим методом поддерживает только операции чтения.
Чтобы получить предыдущее значение для признака blob, надо использовать
getPreBlobHandle()
.
Сигнатура.
NdbBlob* getBlobHandle
(
const char* name
)
Параметры. Имя name
атрибута blob.
Возвращаемое значение. Указатель на объект
NdbBlob
.
Описание. Получает эпоху для полученных данных последнего события.
Добавлено в NDB 7.4.3, этот метод заменяет
getGCI()
, который теперь устарел.
Сигнатура.
Uint64 getEpoch ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер эпохи (integer).
Описание. Этот метод используется, чтобы получить тип события
(
TableEvent
).
Устарело в NDB 7.4.3. В NDB 7.4.3 и позже необходимо использовать
вместо этого
getEventType2()
.
Сигнатура.
NdbDictionary::Event::TableEvent getEventType ( void ) const
Параметры. Нет.
Возвращаемое значение.
TableEvent
.
Описание. Этот метод используется, чтобы получить тип события
(
TableEvent
).
Добавлено в NDB 7.4.3, этот метод заменяет устаревший
getEventType()
.
Сигнатура.
NdbDictionary::Event::TableEvent getEventType2 ( void ) const
Параметры. Нет.
Возвращаемое значение.
TableEvent
.
Описание. Этот метод восстанавливает GCI для последнего события.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
getEpoch()
.
Сигнатура.
Uint64 getGCI ( void ) const
Параметры. Нет.
Возвращаемое значение. Глобальный индекс контрольной точки последнего полученного события (integer).
Описание. Этот метод получает новый GCI.
Этот метод возвращает последнее число эпохи.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо использовать
Ndb::getHighestQueuedEpoch()
.
Полученное с использованием этого метода GCI не обязательно связано с событием.
Сигнатура.
Uint64 getLatestGCI ( void ) const
Параметры. Нет.
Возвращаемое значение. Индекс последней глобальной контрольной точки, integer.
Описание. Этот метод получает новую ошибку.
Сигнатура.
const struct NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение. Ссылка на структуру
NdbError
.
Описание. Эта функция совпадает с
getBlobHandle()
за исключением того, что это
используется, чтобы получить доступ к предыдущему значению признака blob.
См. раздел 2.3.21.3
.
Сигнатура.
NdbBlob* getPreBlobHandle
(
const char* name
)
Параметры. Имя name
для атрибута blob.
Возвращаемое значение.
Указатель на
NdbBlob
.
Описание. Этот метод выступает тождественно к getValue() за исключением того, что это используется, чтобы определить поисковую операцию предыдущего значения признака, а не текущего. Посмотрите раздел 2.3.21.13.
Сигнатура.
NdbRecAttr* getPreValue ( const char*name
, char*value
= 0 )
Параметры. Этот метод берет эти два параметра, перечисленные здесь:
Имя name
из признака (как постоянный указатель на символ).
Указатель на value
таким образом, что:
Если значение атрибута не NULL
,
значение атрибута возвращено в этом параметре.
Если значение атрибута NULL
,
значение атрибута сохранено только в объекте
NdbRecAttr
, который возвращен этим методом.
Возвращаемое значение.
Объект NdbRecAttr
, чтобы хранить значение признака или
NULL
, указывающий, что ошибка произошла.
Описание. Этот метод получает текущее состояние операции событий.
Сигнатура.
State getState ( void )
Параметры. Нет.
Возвращаемое значение.
Значение State
. См.
раздел 2.3.21.20.
Описание. Этот метод определяет поиск значения атрибута.
API NDB ассигнует память для объекта
NdbRecAttr
, который должен содержать возвращенное значение атрибута.
Этот метод не получает
значение атрибута от базы данных и объект
NdbRecAttr
, возвращенный этим методом, не удобочитаемый или пригодный для печати
прежде, чем будет вызван
execute()
и
Ndb::nextEvent()
возвратит значение
не-NULL
.
Если определенный признак не изменился, соответствующий
NdbRecAttr
будет в статусе UNDEFINED
.
Это может быть проверено при помощи
NdbRecAttr::isNULL()
, который вернет
-1
.
value
Buffer Memory Allocation.
Это обязанность приложения ассигновать достаточную память для
буфера value
(если не NULL
), этот буфер должен быть выровнен
соответственно. Буфер используется непосредственно (таким образом избегая
штрафа копии), только если он выровнен на 4-байтовой границе и размере
признака в байтах (вычисленный как
NdbRecAttr::get_size_in_bytes()
) кратен 4.
getValue()
получает текущее значение.
Надо использовать
getPreValue()
для получения предыдущего значения.
Сигнатура.
NdbRecAttr* getValue ( const char*name
, char*value
= 0 )
Параметры. Этот метод берет эти два параметра, перечисленные здесь:
Имя name
из признака (как постоянный указатель на символ).
Указатель на value
таким образом, что:
Если значение атрибута не NULL
,
значение атрибута возвращено в этом параметре.
Если значение атрибута NULL
,
тогда значение атрибута сохранено только в объекте
NdbRecAttr
, который возвращен этим методом.
Возвращаемое значение.
Объект NdbRecAttr
, чтобы хранить значение признака или
NULL
указывающий, что ошибка произошла.
Описание. Этот метод используется, чтобы определить, есть ли ошибка, связанная с этой операцией событий.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже, необходимо вместо этого
использовать
getEventType2()
, чтобы
определить тип события. Посмотрите
раздел 2.3.6.23.
Сигнатура.
int hasError ( void ) const
Параметры. Нет.
Возвращаемое значение. Если потеря событий произошла, то этот метод возвращает 0, иначе 1.
Описание. Этот метод используется, чтобы определить, произошла ли потеря событий после сбоя узла.
Устарело в NDB 7.4.3, в NDB 7.4.3 и позже необходимо вместо этого
использовать
getEventType2()
, чтобы определить, имеет ли
событие тип TE_INCONSISTENT
. См.
раздел 2.3.6.23.
Сигнатура.
bool isConsistent ( void ) const
Параметры. Нет.
Возвращаемое значение. Если потеря событий произошла, то этот метод
возвращает false
, иначе
true
.
Описание. Этот метод используется, чтобы определить, отмечают ли потребляемые данные о событии пустую эпоху.
Добавлено в NDB 7.4.3.
Сигнатура.
bool isEmptyEpoch ( void )
Параметры. Нет.
Возвращаемое значение. Если эта эпоха пуста, вернет
true
, иначе
false
.
Описание. Этот метод используется, чтобы определить, отмечают ли потребляемые данные о событии пустую эпоху.
Добавлено в NDB 7.4.3.
Сигнатура.
bool isErrorEpoch
(
NdbDictionary::Event::TableEvent* error_type
= 0
)
Параметры. Если это ошибочная эпоха,
error_type
содержит значение
TableEvent
, соответствующее ошибке.
Возвращаемое значение. Если эта эпоха ошибочна, вернет
true
, иначе
false
.
Описание. Этот метод используется, чтобы определить, произошла ли потеря событий из-за переполнения буфера.
Сигнатура.
bool isOverrun ( void ) const
Параметры. Нет.
Возвращаемое значение. Если буфер событий был переполнен,
то этот метод возвращает true
, иначе
false
.
Описание. Этот метод используется, чтобы установить флаг слияния событий. Для получения информации о слиянии событий посмотрите раздел 2.3.6.18.
Флаг слияния событий по умолчанию false
.
Сигнатура.
void mergeEvents
(
bool flag
)
Параметры.
A Boolean flag
.
Возвращаемое значение. Нет.
Описание. Этот тип описывает состояние операции событий.
Возможные значения.
Таблица 2.39.
Имя | Описание |
---|---|
EO_CREATED |
Операция событий была создана, но
execute() еще не был вызван. |
EO_EXECUTING |
Метод execute()
был вызван для этой операции событий. |
EO_DROPPED |
Операция событий ждет, чтобы быть удаленной и больше не применима. |
EO_ERROR |
Ошибка произошла, операция событий непригодна. |
Значение State
возвращено методом
getState()
.
Описание. Этот метод используется, чтобы проверить, изменилась ли
фрагментация таблицы в связи с событием TE_ALTER
. См.
раздел 2.3.6.23.
Сигнатура.
bool tableFragmentationChanged ( void ) const
Параметры. Нет.
Возвращаемое значение. Вернет true
,
если фрагментация таблицы изменилась, иначе
false
.
Описание.
Используйте этот метод, чтобы определить, изменился ли у таблицы файл
.FRM
в связи с событием
TE_ALTER
, см.
раздел 2.3.6.23.
Сигнатура.
bool tableFrmChanged ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если файл
.FRM
изменен, иначе
method returns false
.
Описание. Этот метод проверяет, изменилось ли имя таблицы как
результат события TE_ALTER
, см
раздел 2.3.6.23.
Сигнатура.
bool tableNameChanged ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если название таблицы изменилось, иначе
false
.
Описание. Используйте этот метод, чтобы проверить, изменилось ли
название списка разделения диапазона таблицы в связи с событием
TE_ALTER
.
Сигнатура.
bool tableRangeListChanged ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если имя раздела диапазона или списка
изменилось, иначе false
.
Резюме
Эта секция описывает класс
NdbIndexOperation
и его публичные методы.
Родительский класс.
NdbOperation
.
Дочерние классы. Нет.
Описание. NdbIndexOperation
представляет операцию по индексу для использования в транзакциях.
Этот класс наследует
NdbOperation
.
NdbIndexOperation
может использоваться только с уникальными хэш-индексами,
чтобы работать с упорядоченными индексами, надо использовать
NdbIndexScanOperation
.
У этого класса нет публичного конструктора. Создать экземпляр
NdbIndexOperation
можно с использованием метода
NdbTransaction::getNdbIndexOperation()
.
Методы.
Таблица 2.40.
Имя | Описание |
---|---|
deleteTuple() |
Удаляет кортеж из таблицы |
getIndex() |
Получает индекс, использованный операцией |
readTuple() |
Читает кортеж от таблицы |
updateTuple() |
Обновляет существующий кортеж в таблице |
Операциям по индексу не разрешают вставить кортежи.
Типы. Класс NdbIndexOperation
не определяет собственных публичных типов.
См. раздел 1.3.2.3.2 .
Описание. Этот метод определяет
NdbIndexOperation
как операцию
DELETE
. Когда метод
NdbTransaction::execute()
вызван,
операция удаляет кортеж из таблицы.
Сигнатура.
int deleteTuple ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Получает индекс, учитывая операцию по индексу.
Сигнатура.
const NdbDictionary::Index* getIndex ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на объект
Index
.
Описание. Этот метод определяет
NdbIndexOperation
как операцию READ
.
Когда метод
NdbTransaction::execute()
вызван,
операция читает кортеж.
Сигнатура.
int readTuple
(
LockMode mode
)
Параметры.
mode
определяет режим блокировки,
используемый операцией чтения. Посмотрите
раздел 2.3.25.15.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод определяет
NdbIndexOperation
как операцию
UPDATE
. При вызове метода
NdbTransaction::execute()
операция обновляет
кортеж, найденный в таблице.
Сигнатура.
int updateTuple ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Резюме
Эта секция обсуждает класс
NdbIndexScanOperation
.
Родительский класс.
NdbScanOperation
.
Дочерние классы. Нет.
Описание. Класс NdbIndexScanOperation
представляет операцию по просмотру, используя упорядоченный индекс.
Этот класс наследует от
NdbScanOperation
и
NdbOperation
.
NdbIndexScanOperation
предназначен
для использования только с упорядоченными индексами, чтобы работать с
уникальными хэш-индексами, применяйте
NdbIndexOperation
.
Методы.
Таблица 2.41.
Имя | Описание |
---|---|
end_of_bound() |
Отмечает конец привязки |
get_range_no() |
Получает число диапазона для текущей строки |
getDescending() |
Проверка, сортирован ли текущий просмотр |
getSorted() |
Проверка, сортирован ли текущий просмотр |
readTuples() |
Читает кортежи, используя индекс |
reset_bounds() |
Сброс границ, помещает в очередь отправки операцию |
setBound() |
Определяет привязанный ключ индекса для просмотра диапазона |
Типы. Класс NdbIndexScanOperation
определяет один публичный тип
BoundType
.
Этот класс также определяет структуру
IndexBound
для использования с операционным использованием
NdbRecord
.
См. разделы 1.3.2.3.3 и 1.3.2.3.4.
Описание. Этот тип используется, чтобы описать связанный ключ.
Числовые значения фиксируются в API и могут использоваться явно, другими словами, допустимо вычислить значения и использовать их.
Возможные значения.
Таблица 2.42.
Значение | Числовое значение | Описание |
---|---|---|
BoundLE |
0 |
Нижняя граница |
BoundLT |
1 |
Строгая нижняя граница |
BoundGE |
2 |
Верхняя граница |
BoundGT |
3 |
Строгая верхняя граница |
BoundEQ |
4 |
Равенство |
Описание. Этот метод используется, чтобы отметить конец привязки, это используется, когда читается пакет индекса (то есть, используя многократные диапазоны).
Сигнатура.
int end_of_bound
(
Uint32 range_no
)
Параметры. Номер диапазона, на котором происходит привязка.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод используется, чтобы проверить, спускается ли просмотр.
Сигнатура.
bool getDescending ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если просмотр сортирован в порядке
убывания, иначе false
.
Описание. Этот метод возвращает номер диапазона для текущей строки.
Сигнатура.
int get_range_no ( void )
Параметры. Нет.
Возвращаемое значение. Номер диапазона (integer).
Описание. Этот метод используется, чтобы проверить, сортирован ли просмотр.
Сигнатура.
bool getSorted ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если просмотр сортирован, иначе
false
.
Описание. Этот метод используется, чтобы прочитать кортежи, используя упорядоченный индекс.
Сигнатура.
virtual int readTuples ( LockModemode
= LM_Read, Uint32flags
= 0, Uint32parallel
= 0, Uint32batch
= 0 )
Параметры. Метод readTuples()
берет эти три параметра:
Режим блокировки mode
для просмотра. Это LockMode
, см.
раздел 2.3.25.15.
Один или более флагов просмотра, многократные
flags
соединяются
OR
вместе, как когда используются с
NdbScanOperation::readTuples()
.
См. раздел 2.3.29.9.
Количество фрагментов, чтобы просмотреть в
parallel
, надо использовать
0
, чтобы определить максимум автоматически.
batch
определяет, сколько записей будет возвращено клиенту от сервера следующим
NdbScanOperation::nextResult(true)
. Надо использовать
0
, чтобы определить максимум автоматически.
Этот параметр был проигнорирован до MySQL 5.1.12, всегда использовался максимум (Bug #20252).
Возвращаемое значение.
integer: 0
при успехе,
-1
при ошибке.
Описание. Перезагружает границы и помещает операцию в список,
который пошлют при следующем вызове
NdbTransaction::execute()
.
Сигнатура.
int reset_bounds
(
bool forceSend
= false
)
Параметры. Установите forceSend
= true
,
чтобы вынудить операцию быть посланной немедленно.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод определяет привязанный ключ индекса,
используемый в просмотре диапазона, и устанавливает границы для просмотров
индекса, определенных, используя
NdbRecord
.
"Старое" использование API (до введения NdbRecord). У каждого ключа индекса могут быть нижняя граница, верхняя граница или обе. Установка ключа, равного значению, определяет верхние и нижние границы. Границы могут быть определены в любом порядке. Противоречивые определения дают ошибку.
Границы должны быть установлены на начальных последовательностях ключей индекса и все кроме возможно связанного последнего должны быть нестрогими. Это означает, например, что a >= 2 AND b > 3 является допустимым, но a >2 AND b >=3 нет.
Просмотр может в настоящее время возвращать кортежи, для которых не
удовлетворены границы. Например, <= 2 &&
b <= 3
не только просматривает индекс до
(a=2, b=3)
, но также вернет
(a=1, b=4)
.
Устанавливая границы на основе равенства, лучше использовать
BoundEQ
вместо эквивалентной пары
BoundLE
и BoundGE
.
Это особенно верно, когда ключ разделения таблицы префикс ключа индекса.
NULL
считается меньше, чем кто-либо
не-NULL
и равный другому
NULL
. Чтобы выполнить сравнения с
NULL
, примените
setBound()
с пустым указателем (0
).
Индекс также хранит все ключи NULL
также и выполнение просмотра индекса с пустым связанным набором возвращает
все кортежи из таблицы.
Сигнатура (старый API). Используя старый API, этот метод можно было вызвать любым из двух способов. Оба из них используют связанный тип и значение, первый также использует название границ, как показано здесь:
int setBound ( const char*name
, inttype
, const void*value
)
Второй способ вызвать этот метод в старом API использует ID границ, а не имя, как показано здесь:
int setBound ( Uint32id
, inttype
, const void*value
)
Параметры (старый API).
Имя name
или
id
признака, на котором должна быть установлена граница.
Тип границы type
см.
раздел 2.3.23.1.
Указатель на границу value
(0
= NULL
).
Работа с NdbRecord. Этот метод вызывают, чтобы добавить диапазон к
операции по просмотру индекса, которая была определена
NdbTransaction::scanIndex()
.
Чтобы добавить больше чем один диапазон, операция по просмотру индекса,
должна быть определена с установленным флагом
SF_MultiRange
, см.
раздел 2.3.29.9.
Где многократные пронумерованные диапазоны определяются с множественными
вызовами setBound()
и просмотр упорядочен,
номер диапазона для каждого диапазона должен быть больше, чем номер диапазона
для ранее определенного диапазона.
Сигнатура.
int setBound ( const NdbRecord*keyRecord
, const IndexBound&bound
)
Параметры. Если используется с
NdbRecord
, этот метод берет 2 параметра:
keyRecord
: Структура
NdbRecord
, соответствующая ключу, который определяет индекс.
bound
для добавления (см.
раздел 2.3.12).
Дополнительная версия этого метода может использоваться, когда приложение
знает, что строки в диапазоне будут найдены только в рамках конкретного
разделения. Это совпадает с показанным ранее, за исключением добавления
PartitionSpec
. Это ограничивает просмотр единственным разделением,
повышая системную эффективность.
Сигнатура (определяя разделение).
int setBound ( const NdbRecord*keyRecord
, const IndexBound&bound
, const Ndb::PartitionSpec*partInfo
, Uint32sizeOfPartInfo
= 0 )
Параметры (определяя разделение).
keyRecord
: Это структура
NdbRecord
, соответствующая ключу, который определяет индекс.
bound
добавляемый к просмотру (см.
раздел 2.3.12).
partInfo
:
Это указатель на
PartitionSpec
,
который предоставляет дополнительную информацию, позволяющую просмотреть
уменьшенный набор разделения.
sizeOfPartInfo
:
Длина спецификации разделения.
keyRecord
и
bound
определяются и используются таким же образом, как
с версией с 2 параметрами этого метода.
Возвращаемое значение.
Returns 0
при успехе,
-1
при неудаче.
Резюме
Эта секция обсуждает класс NdbInterpretedCode
, который может использоваться, чтобы подготовить и выполнить
программу NDB API.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. NdbInterpretedCode
представляет интерпретируемую программу для использования в операциях,
созданных, используя
NdbRecord
,
или с просмотрами, созданными, используя старый API. Класс
NdbScanFilter
может также использоваться,
чтобы произвести интерпретируемую программу NDB, используя этот класс.
Этот интерфейс все еще разрабатывается и
подлежит изменению без уведомления.
NdbScanFilter
API более стабильный API для определения
просмотра и фильтрации программ.
Применение NdbInterpretedCode.
Чтобы создать объект NdbInterpretedCode
,
вызовите конструктор, произвольно поставляя таблица для программы и буфер для
хранения программы. Если никакой таблица не поставляется, то только
инструкции, которые не получают доступ к признакам таблицы, могут
использоваться. Начиная с NDB 8.0.18, экземпляр
Ndbrecord
может использоваться с этой целью вместо
Table
.
Каждая операция API NDB относится к одной таблице, любая
программа NdbInterpretedCode
приложена к той операции.
Если никакой буфер не поставляется, то внутренний буфер динамично
ассигнован и расширен по мере необходимости. Создав объект
NdbInterpretedCode
,
можно добавить инструкции и этикетки к нему, вызвав соответствующие методы,
как описано позже в этой секции. Когда программа закончится, завершите ее,
вызвав метод finalise()
, который закрывает любые
остающиеся внутренние отделения и вызываемые подпрограммы.
Программа может использоваться больше чем одной операцией. Это не должно быть повторно подготовлено к последовательным операциям.
Чтобы использовать программу с
NdbRecord
, передайте его во время
определения операции, используя
OperationOptions
или
ScanOptions
. Когда программа больше не требуется, объект
NdbInterpretedCode
может быть удален.
Проверка на ошибки. По причинам эффективности методы этого класса обеспечивают минимальную проверку на ошибки.
Методы.
Таблица 2.43.
Имя | Описание |
---|---|
NdbInterpretedCode() |
Конструктор класса |
add_reg() |
Добавьте два значения регистра и сохраните результат в третьем регистре |
add_val() |
Добавьте значение к значениям столбца таблицы |
branch_col_and_mask_eq_mask() |
Пройти, если значение столбца AND
битовая маска равно битовой маске |
branch_col_and_mask_eq_zero() |
Пройти, если значение столбца AND
битовая маска равно 0 |
branch_col_and_mask_ne_mask() |
Пройти, если значение столбца AND
битовая маска не равно битовой маске |
branch_col_and_mask_ne_zero() |
Пройти, если значение столбца AND
битовая маска не равно 0 |
branch_col_eq() |
Пройти, если значение столбца равно другому |
branch_col_eq_null() |
Пройти, если значение столбца NULL |
branch_col_ge() |
Пройти, если значение столбца больше чем или равно другому |
branch_col_gt() |
Пройти, если значение столбца больше чем другой |
branch_col_le() |
Пройти, если значение столбца меньше чем или равно другому |
branch_col_like() |
Пройти, если значение столбца соответствует образцу |
branch_col_lt() |
Пройти, если значение столбца меньше чем другой |
branch_col_ne() |
Пройти, если значение столбца не равно другому |
branch_col_ne_null() |
Пройти, если значение столбца не NULL
|
branch_col_notlike() |
Пройти, если значение столбца не соответствует образцу |
branch_eq() |
Пройти, если одно значение регистра равно другому |
branch_eq_null() |
Пройти, если значение регистра NULL |
branch_ge() |
Пройти, если одно значение регистра больше чем или равно другому |
branch_gt() |
Пройти, если одно значение регистра больше другого |
branch_label() |
Переход на метку |
branch_le() |
Пройти, если одно значение регистра меньше чем или равно другому |
branch_lt() |
Пройти, если одно значение регистра меньше другого |
branch_ne() |
Пройти, если одно значение регистра не равно другому |
branch_ne_null() |
Пройти, если значение регистра не NULL
|
call_sub() |
Вызовите подпрограмму |
copy() |
Сделайте глубокую копию объекта
NdbInterpretedCode |
def_label() |
Создайте этикетку для использования в рамках интерпретируемой программы |
def_sub() |
Определите подпрограмму |
finalise() |
Заканчивает интерпретируемую программу и готовит ее к использованию |
getNdbError() |
Получает последнюю ошибку, связанную с этим объектом
NdbInterpretedCode |
getTable() |
Получает таблицу, на которой определяется программа |
getWordsUsed() |
Получает количество слов, используемых в буфере |
interpret_exit_last_row() |
Возвратите строку как часть результата и не проверяйте больше строки в этом фрагменте |
interpret_exit_nok() |
Не возвращайте строку как часть результата |
interpret_exit_ok() |
Возвратите строку как часть результата |
load_const_null() |
Загрузить значение NULL в регистр |
load_const_u16() |
Загрузите 16-битное числовое значение в регистр |
load_const_u32() |
Загрузите 32-битное числовое значение в регистр |
load_const_u64() |
Загрузите 64-битное числовое значение в регистр |
read_attr() |
Прочитайте значение столбца таблицы в регистр |
ret_sub() |
Возвратитесь из подпрограммы |
sub_reg() |
Вычтите два значения регистра и сохраните результат в третьем регистре |
sub_val() |
Вычтите значение из значения столбца таблицы |
write_attr() |
Напишите значение регистра в столбец таблицы |
См. раздел 2.3.24.1.
Типы. Этот класс не определяет публичных типов.
Следующие несколько секций предоставляют информацию о выполнении различных
типов операций с методами
NdbInterpretedCode
,
включая использование ресурсов.
Методы, описанные в этой секции, используются, чтобы загрузить постоянные
величины в регистры
NdbInterpretedCode
. Пространство, требуемое
каждым из этих методов, показывают в следующей таблице:
Таблица 2.44.
Метод | Буфер (слов) | Сообщение запроса (слов) |
---|---|---|
load_const_null() | 1 | 1 |
load_const_u16() | 1 | 1 |
load_const_u32() | 2 | 2 |
load_const_u64() | 3 | 3 |
NdbInterpretedCode
предоставляет два метода для копирования
значений между колонкой в текущей строке таблицы и регистром программы.
read_attr()
используется, чтобы скопировать
значение столбца таблицы в регистр программы,
write_attr()
используется, чтобы скопировать
значение регистра программы в столбец таблицы. Оба этих метода требуют, чтобы
таблица была определен, создавая объект
NdbInterpretedCode
, для которого их вызывают.
Пространство, требуемое каждым из этих методов, показывают в следующей таблице:
Таблица 2.45.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
read_attr() | 1 | 1 |
write_attr() | 1 | 1 |
См. разделы 2.3.24.43 и 2.3.24.47.
NdbInterpretedCode
предоставляет два метода для выполнения
арифметических операций в регистрах. Используя
add_reg()
,
можно загрузить сумму двух регистров в другой регистр,
sub_reg()
позволяет загрузить разность двух регистров в другой регистр.
Пространство, требуемое каждым из этих методов, показывают в следующей таблице:
Таблица 2.46.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
add_reg() | 1 | 1 |
sub_reg() | 1 | 1 |
См. разделы 2.3.24.3 и 2.3.24.45.
Класс
NdbInterpretedCode
позволяет вам определить этикетки в рамках интерпретируемых программ и
предоставляет много методов для выполнения переходов к ним
на основе любого из следующих типов условий:
Сравнение между двумя значениями регистра
Сравнение между значением столбца и данной константой
Соответствует ли значение столбца данному образцу
Чтобы определить этикетку, используйте метод
def_label()
.
Чтобы выполнить безусловный переход к этикетке, используйте метод
branch_label()
.
Чтобы выполнить переход на данную этикетку на основе сравнения значений
регистра, используйте один из методов
branch_
(
*
()
branch_ge()
,
branch_gt()
,
branch_le()
,
branch_lt()
,
branch_eq()
,
branch_ne()
,
branch_ne_null()
или
branch_eq_null()
).
См.
раздел 2.3.24.1.5.
Чтобы выполнить переход на данную этикетку на основе
сравнения значений столбца таблицы, используйте один из методов
branch_col_
(
*
()branch_col_ge()
,
branch_col_gt()
,
branch_col_le()
,
branch_col_lt()
,
branch_col_eq()
,
branch_col_ne()
,
branch_col_ne_null()
или
branch_col_eq_null()
). См.
раздел 2.3.24.1.6.
Чтобы выполнить переход на данную этикетку на основе сопоставления с
образцом значения столбца таблицы, используйте один из методов
branch_col_like()
или
branch_col_notlike()
.
См.
раздел 2.3.24.1.7.
Большинство из них используется, чтобы ветвиться на основе результатов
сравнений регистров. Есть также два метода, используемые, чтобы сравнить
значение регистра с NULL
.
Все эти методы требуют в качестве параметра, чтобы этикетка была определена
методом
def_label()
.
Эти методы могут считаться выполнением следующей логики:
if (register_value1condition
register_value2) gotoLabel
Пространство, требуемое каждым из этих методов, показывают в следующей таблице:
Таблица 2.47.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
branch_ge() | 1 | 1 |
branch_gt() | 1 | 1 |
branch_le() | 1 | 1 |
branch_lt() | 1 | 1 |
branch_eq() | 1 | 1 |
branch_ne() | 1 | 1 |
branch_ne_null() | 1 | 1 |
branch_eq_null() | 1 | 1 |
Методы, описанные в этой секции, используются, чтобы выполнить переход на
основе сравнения между значением столбца таблицы и данной постоянной
величиной. Каждый из этих методов ожидает признак ID колонки, значение
которой должно быть проверено, а не ссылку на объект
Column
.
Эти методы, за исключением
branch_col_eq_null()
и
branch_col_ne_null()
,
могут считаться выполнением следующей логики:
if (constant_valuecondition
column_value) gotoLabel
В каждом случае (еще раз за исключением
branch_col_eq_null()
и
branch_col_ne_null()
),
произвольная постоянная первый параметр, переданный методу.
Требования места для каждого из этих методов показывают в следующей
таблице, где L
представляет длину постоянной величины:
Таблица 2.48.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
branch_col_eq_null() | 2 | 2 |
branch_col_ne_null() | 2 | 2 |
branch_col_eq() | 2 | 2 + CEIL(
|
branch_col_ne() | 2 | 2 + CEIL(
|
branch_col_lt() | 2 | 2 + CEIL(
|
branch_col_le() | 2 | 2 + CEIL(
|
branch_col_gt() | 2 | 2 + CEIL(
|
branch_col_ge() | 2 | 2 + CEIL(
|
Выражение CEIL(
это количество целых 8-байтовых слов,
требуемых, чтобы хранить постоянную величину, которая будет сравнена.L
/8)
Класс
NdbInterpretedCode
предоставляет два метода, которые могут
использоваться, чтобы ветвиться на основе сравнения между колонкой,
содержащей символьные данные (то есть,
a
CHAR
,
VARCHAR
,
BINARY
или
VARBINARY
)
и образцом регулярного выражения.
Синтаксис образца, поддержанный регулярным выражением, совпадает с MySQL
Server LIKE
и NOT LIKE
, включая метасимволы _
и
%
, см.
String Comparison Functions and Operators.
Это тот же самый синтаксис образца регулярного выражения, который
поддерживается
NdbScanFilter
, см.
раздел 2.3.28.3.
Таблица должна поставляться, когда объект
NdbInterpretedCode
создан.
Образец регулярного выражения должен быть в простом формате
CHAR
, даже если столбец на самом деле
VARCHAR
(другими словами, не
должно быть никаких ведущих байтов длины).
Эти функции ведут себя как показано здесь:
if (column_value
[NOT] LIKEpattern
) gotoLabel
;
Требования к месту для этих методов показывают в следующей таблице, где
L
представляет длину постоянной величины:
Таблица 2.49.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
branch_col_like() | 2 | 2 + CEIL(
|
branch_col_notlike() | 2 | 2 + CEIL(
|
CEIL(
это количество целых 8-байтовых слов,
требуемых, чтобы хранить постоянную величину, которая будет сравнена.L
/8)
Эти инструкции используются, чтобы ветвиться на основе результата
логического сравнения AND
между значением
столбца BIT
и образцом битовой маски.
Использование этих методов требует, чтобы таблица поставлялась когда
объект
NdbInterpretedCode
создан. Значение маски должно быть того же
самого размера, как сравниваемый столбец. BIT
передаются в и из API NDB как 32-битные слова с битами, приведенными в
порядок от младшего значащего бита до старшего значащего бита.
На x86 это первый байт (байт 0), на SPARC и PPC, это последний байт.
Длина буфера и продолжительность запроса для каждого из методов, перечисленных здесь, требует суммы пространства, равного 2 словам плюс ширина столбца, округленная к самому близкому целому слову:
Методы, описанные в этой секции, используются, чтобы сказать транслятору, что обработка текущей строки завершена и (в случае просмотров) включать ли эту строку в результаты просмотра.
Требования к месту для этих методов показывают в следующей таблице, где
L
представляет длину постоянной величины:
Таблица 2.50.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
interpret_exit_ok() | 1 | 1 |
interpret_exit_nok() | 1 | 1 |
interpret_exit_last_row() | 1 | 1 |
Методы, описанные в этой секции, могут использоваться, чтобы вставить многоадресные команды (использующие определенные регистры) в интерпретируемую программу.
В дополнение к обновлению столбца таблицы эти методы используют списки
регистров 6 и 7, заменяя любое существующее содержание регистра 6 значениею
первоначального столбца и любое существующее содержание регистра 7 измененным
значением столбца. Сама таблица должна быть ранее определена, создавая
объект
NdbInterpretedCode
, для которого вызван метод.
Требования к месту для этих методов показывают в следующей таблице, где
L
представляет длину постоянной величины:
Таблица 2.51.
Метод | Буфер (слова) | Сообщение запроса (слова) |
---|---|---|
add_val() | 4 | 1, если поставляемое значение >= 216: 2, если >= 232: 3 |
sub_val() | 4 | 1, если поставляемое значение >= 216: 2, если >= 232: 3 |
NdbInterpretedCode
допускает подпрограммы, которые могут быть
вызваны из интерпретируемых программ с каждой подпрограммой, определяемой
уникальным числом. Подпрограммы могут быть определены, только следуя всем
главным инструкциям по программе.
Числа определяют, что подпрограммы должны быть смежными, однако, они не должны быть ни в каком конкретном порядке.
Начало подпрограммы обозначается, вызывая метод
def_sub()
.
ret_sub()
заканчивает подпрограмму, все инструкции после
def_sub()
принадлежат подпрограмме, пока она
не будет закончена, используя этот метод.
Подпрограмму вызывают, используя метод
call_sub()
.
Как только подпрограмма закончится, выполнение программы продолжится с инструкции немедленно после той, которая вызвала подпрограмму. Подпрограммы могут также быть вызваны от других подпрограмм, в настоящее время максимальная глубина стека подпрограмм равняется 32.
Некоторые дополнительные служебные методы, поставляемые
NdbInterpretedCode
:
copy()
:
Копирует существующую интерпретируемую программу, выполняя глубокую копию на
связанном объекте
NdbInterpretedCode
.
finalise()
:
Готовит интерпретируемую программу, решая все команды
ветвления и вызовы подпрограммы.
getTable()
:
Получает ссылку на таблицу, для которой был определен объект
NdbInterpretedCode
.
getNdbError()
: Связывает новую ошибку с этим
объектом
NdbInterpretedCode
.
getWordsUsed()
:
Получает количество слов, используемых из буфера.
Описание. Это конструктор класса
NdbInterpretedCode
.
Сигнатура.
NdbInterpretedCode ( const NdbDictionary::Table*table
= 0, Uint32*buffer
= 0, Uint32buffer_word_size
= 0 )
Альтернативный конструктор (NDB 8.0.18 и позже).
NdbInterpretedCode ( const NdbRecord&, Uint32*buffer
= 0, Uint32buffer_word_size
= 0);
Параметры.
table
на которой нужно
управлять этой программой. До NDB 8.0.18 должен поставляться этот параметр,
если программа определена для таблицы, то есть, если это читает от или пишет
столбцы в таблице. В NDB 8.0.18 и позже конструктор принимает
NdbRecord
вместо Table
.
Указатель на buffer
из 32-битных слов, используемых, чтобы сохранить программу.
buffer_word_size
длина переданного буфера. Если программа превышает эту длину, лишние
инструкции потерпят неудачу с ошибкой 4518
Too many instructions in interpreted program.
Альтернативно, если никакой буфер не будет передан, буфер будет динамично ассигнован внутренне и расширен пока добавляются инструкции.
Возвращаемое значение. Экземпляр
NdbInterpretedCode
.
Описание. Этот метод суммирует значения, сохраненные в любых двух данных регистрах, и хранит результат в третьем регистре.
Сигнатура.
int add_reg ( Uint32RegDest
, Uint32RegSource1
, Uint32RegSource2
)
Параметры. Этот метод берет три параметра. Первым из них является
регистр, в котором должен быть сохранен результат
(RegDest
). Второй и третий
параметры (RegSource1
и
RegSource2
) это
регистры, значения которых должны быть суммированы.
Возможно повторное использоване для хранения результата одного из
регистров, значения которых суммированы, то есть,
RegDest
может быть
RegSource1
или
RegSource2
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод добавляет указанное значение к значению
данного столбца таблицы и помещает оригинальное и измененное значения
столбцов в регистры 6 и 7. Это эквивалентно следующей серии вызовов
NdbInterpretedCode
, где
attrId
ID признака столбца таблицы
и aValue
значение, которое будет добавлено:
read_attr(6,attrId
); load_const_u32(7,aValue
); add_reg(7,6,7); write_attr(attrId
, 7);
aValue
может быть 32-bit
или 64-bit integer.
Сигнатура. Этот метод может быть призван любым из двух способов, в
зависимости от того, aValue
32-bit или 64-bit.
32-bit aValue
:
int add_val ( Uint32attrId
, Uint32aValue
)
64-bit aValue
:
int add_val ( Uint32attrId
, Uint64aValue
)
Параметры. ID признака столбца таблицы и 32-битное или 64-битное integer, которое будет добавлено к этому значению столбца.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы сравнить значение столбца
BIT
с битовой маской, если значение столбца
AND
с битовой маской равно битовой маске,
выполнение передается на указанную этикетку, определенную в вызове метода.
Сигнатура.
int branch_col_and_mask_eq_mask ( const void*mask
, Uint32unused
, Uint32attrId
, Uint32Label
)
Параметры.
Указатель на константу
mask
, которой надо
сравнить значение столбца.
Uint32
, которое в настоящее время
не используется
.
attrId
колонки, которая будет сравнена.
Программная этикетка Label
для перехода, если условие верно.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы сравнить столбец
BIT
с битовой маской, если значение столбца
AND
с битовой маской равно
0
, тогда выполнение переходит
к указанной этикетке, определенной в вызове метода.
Сигнатура.
int branch_col_and_mask_eq_zero ( const void*mask
, Uint32unused
, Uint32attrId
, Uint32Label
)
Параметры.
Указатель на константу
mask
, с которой
сравнить значение столбца.
Uint32
в настоящее время
не используется
.
attrId
колонки, которая будет сравнена.
Этикетка Label
для перехода, если условие верно.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы сравнить
столбец BIT
с битовой маской,
AND
с битовой маской не равно битовой маске,
выполнение передается на указанную этикетку, определенную в вызове метода.
Сигнатура.
int branch_col_and_mask_ne_mask ( const void*mask
, Uint32unused
, Uint32attrId
, Uint32Label
)
Параметры.
Указатель на константу
mask
,
с которой надо сравнить.
Uint32
пока
не используется
.
attrId
колонки, которая будет сравнена.
Этикетка Label
на которую
передать выполнение, если условие верно.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы сравнить
значение BIT
с битовой маской,
если значение столбца AND
с битовой маской не равно 0
, выполнение
переходит к указанной этикетке, определенной в вызове метода.
Сигнатура.
int branch_col_and_mask_ne_zero ( const void*mask
, Uint32unused
, Uint32attrId
, Uint32Label
)
Параметры.
Указатель на константу
mask
,
с которой надо сравнить.
Uint32
пока
не используется
.
attrId
колонки, которая будет сравнена.
Этикетка Label
на которую передать выполнение, если условие верно.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если значения равны. В NDB 8.0.18 и позже, это может также использоваться, чтобы сравнить две колонки на равенство.
Сигнатура. Сравните колонку со значением:
int branch_col_eq ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Сравните две колонки:
int branch_col_eq ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Сравнивая колонку и значение, этот метод берет следующие четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно быть сравнено
с val
.
Этикетка Label
(ранее определенная использованием def_label()
)
для перехода, если значения равны.
Сравнивая два значения столбца таблицы, требуемые параметры показывают здесь:
AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Местоположение, чтобы перейти, если сравненные колонки равны. Должно быть уже
определено, используя
def_label()
.
Используя этот метод, чтобы сравнить две колонки, колонки должны иметь точно тот же самый тип.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод проверяет значение столбца таблицы и
переходит на обозначенную этикетку программы, если значение столбца
NULL
.
Сигнатура.
int branch_col_eq_null ( Uint32attrId
, Uint32Label
)
Параметры.
Признак ID столбца таблицы.
Этикетка программы для перехода, если значение столбца
NULL
.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если значение столбца соответствует. В NDB 8.0.18 и позже это может также использоваться, чтобы сравнить две колонки и выполнить переход, если значение первой колонки больше или равно второй.
Сигнатура. Сравните значение с колонкой:
int branch_col_ge ( const void*val
, Uint32len
, Uint32attrId
, Uint32label
)
Сравните значения двух столбцов:
int branch_col_ge ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Когда используется сравнение значения с колонкой, этот метод берет эти четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно быть
сравнено с val
.
label
(ранее определенная с использованием
def_label()
).
Метод берет параметры, перечисленные здесь, когда используется, чтобы сравнить две колонки:
AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Этикетка для перехода.
Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа больше, чем значение столбца. В NDB 8.0.18 и позже этот метод перегружен таким образом, что это может использоваться, чтобы сравнить два значения столбцов и сделать переход, если первое больше, чем второе.
Сигнатура. Сравните значение с колонкой:
int branch_col_ge ( const void*val
, Uint32len
, Uint32attrId
, Uint32label
)
Сравните значения двух столбцов:
int branch_col_ge ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Когда используется, чтобы сравнить значение со столбцом таблицы, этот метод берет следующие четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно
быть сравнено val
.
Label
(ранее определенная
с использованием def_label()
).
Метод берет эти три параметра, перечисленные здесь, когда используется, чтобы сравнить две колонки:
AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Этикетка для перехода.
Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа меньше или равна значению столбца. Начиная с NDB 8.0.18 это может также использоваться, чтобы сравнить два значения столбца таблицы этим способом.
Сигнатура. Сравните значение столбца таблицы с константой:
int branch_col_le ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Сравните значения двух столбцов таблицы:
int branch_col_ge ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет эти четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно быть сравнено с
val
.
Label
(ранее определенная с использованием
def_label()
).
Метод берет эти три параметра, перечисленные здесь, когда используется, чтобы сравнить два значения столбца таблицы:
AttrId1
:
ID признака первого столбца таблицы, значение которого должна быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Этикетка для перехода.
Сравнивая две колонки, типы столбцов должны быть точно теми же самыми во всех отношениях.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод проверяет значение столбца таблицы на соответствие образцу регулярного выражения и переходит на обозначенную этикетку программы, если оно соответствует.
Сигнатура.
int branch_col_like ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Параметры.
Образец регулярного выражения
(val
), см.
раздел 2.3.24.1.7
.
Длина образца (в байтах).
Признак ID для проверяемого столбца таблицы.
Этикетка программы, чтобы перейти.
Возвращаемое значение.
0
при успехе,
-1
при неудаче
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если константа меньше, чем значение столбца. В NDB 8.0.18 и позже два значения столбца таблицы могут быть сравнены вместо этого.
Сигнатура. Сравните значение столбца таблицы с константой:
int branch_col_lt ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Сравните два значения столбца таблицы:
int branch_col_lt ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет следующие четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно быть сравнено
с val
.
Label
(ранее определенная с использованием
def_label()
).
Когда используется, чтобьы сравнить два значения столбца таблицы,
branch_col_lt()
берет следующие три параметра:
AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Этикетка для перехода.
Сравнивая два значения столбца таблицы, типы значений столбца таблицы должны быть точно теми же самыми. Это означает, что у них должны быть та же самая длина, точность и масштаб.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает значение столбца таблицы с произвольной постоянной и переходит на указанную этикетку программы, если две значения не равны. В NDB 8.0.18 и позже это может также использоваться, чтобы сравнить значение столбца таблицы с другим значением столбца таблицы вместо этого.
Сигнатура. Сравните значение столбца таблицы с константой:
int branch_col_ne ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Сравните два значения столбца таблицы:
int branch_col_ne ( Uint32attrId1
, Uint32attrId2
, Uint32label
)
Параметры. Сравнивая значение столбца таблицы с константой, этот метод берет эти четыре параметра:
Постоянная величина
(val
).
Длина значения (в байтах).
ID признака столбца таблицы, значение которого должно быть сравнено с
val
.
Label
(ранее определенная с использованием
def_label()
).
Сравнивая два значения столбца таблицы, требуемые параметры показывают здесь:
AttrId1
:
ID признака первого столбца таблицы, значение которого должно быть сравнено.
AttrId2
:
Признак ID второго столбца таблицы.
label
:
Местоположение, чтобы перейти, если сравненные колонки разные.
Должно быть уже определено, используя
def_label()
.
Используя этот метод, чтобы сравнить два значения столбца таблицы, колонки должны иметь точно тот же самый тип.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод проверяет значение столбца таблицы и
переходит на обозначенную этикетку программы, если значение столбца не
NULL
.
Сигнатура.
int branch_col_ne_null ( Uint32attrId
, Uint32Label
)
Параметры.
Признак ID столбца таблицы.
Этикетка для перехода.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод подобен
branch_col_like()
,
это проверяет значение столбца таблицы на соответствие образцу регулярного
выражения, однако, это переходит на
этикетку программы, только если образец и значение столбца
разные.
Сигнатура.
int branch_col_notlike ( const void*val
, Uint32len
, Uint32attrId
, Uint32Label
)
Параметры.
Образец регулярного выражения
(val
), см.
раздел 2.3.24.1.7
.
Длина образца (в байтах).
Признак ID для проверяемого столбца таблицы.
Этикетка программы для перехода.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает два значения регистра, если они равны, интерпретируемая программа переходит к указанной этикетке.
Сигнатура.
int branch_eq ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра, регистры, значения
которых должны быть сравнены, это
RegLvalue
и
RegRvalue
, и этикетка
Label
для перехода. Она должна
быть заранее задана через def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает значение регистра с
NULL
, если значение регистра null,
программа переходит на указанную этикетку.
Сигнатура.
int branch_eq_null ( Uint32RegLvalue
, Uint32Label
)
Параметры. Этот метод берет два параметра: регистр, значение
которого должно быть сравнено с NULL
,
(RegLvalue
) и этикетка
Label
для перехода.
Label
должна быть определена
def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает два значения регистра, если первое больше или равно второму, программа переходит на этикетку.
Сигнатура.
int branch_ge ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра:
регистры, значения которых должны быть сравнены
(RegLvalue
и
RegRvalue
) и этикетка
Label
для перехода.
Label
должна быть задана с
def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает два значения регистра, если первое больше, чем второе, программа переходит на этикетку.
Сигнатура.
int branch_gt ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра:
регистры, значения которых должны быть сравнены
(RegLvalue
и
RegRvalue
) и метка
Label
для перехода.
Label
должна быть определена ранее,
используя def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод выполняет безусловный переход к этикетке программы (см. раздел 2.3.24.30).
Сигнатура.
int branch_label
(
Uint32 Label
)
Параметры. Этот метод берет единственный параметр, этикетку
Label
, определенную с
использованием def_label()
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает два значения регистра, если первое меньше или равно второму, переходит на этикетку.
Сигнатура.
int branch_le ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены (RegLvalue
и RegRvalue
) и этикетку
Label
для перехода.
Label
должна быть определена через
def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод сравнивает два значения регистра, если первое меньше, чем второе, переходит на этикетку.
Сигнатура.
int branch_lt ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены (RegLvalue
и RegRvalue
) и
Label
для перехода.
Label
должна быть задана через
def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает два значения регистра, если они не равны, то переходит на этикетку.
Сигнатура.
int branch_ne ( Uint32RegLvalue
, Uint32RegRvalue
, Uint32Label
)
Параметры. Этот метод берет три параметра: регистры, значения
которых должны быть сравнены (RegLvalue
и RegRvalue
) и этикетку
Label
, которая должна быть
определена через
def_label()
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод сравнивает значение регистра с
NULL
, если значение не null,
переходит на этикетку.
Сигнатура.
int branch_ne_null ( Uint32RegLvalue
, Uint32Label
)
Параметры. Этот метод берет два параметра: регистр, значение
которого должно быть сравнено с NULL
(RegLvalue
) и этикетку для перехода
Label
, определенную через
def_label()
(см.
раздел 2.3.24.30).
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы вызвать подпрограмму.
Сигнатура.
int call_sub
(
Uint32 SubroutineNumber
)
Параметры. Этот метод берет единственный параметр, номер, определяющее подпрограмму, которую вызовут.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Делает глубокую копию объекта
NdbInterpretedCode
.
Сигнатура.
int copy
(
const NdbInterpretedCode& src
)
Параметры. Ссылка на копию.
Возвращаемое значение. 0 при успехе или код ошибки.
Описание. Этот метод определяет этикетку, которая будет использоваться в качестве цели одного или более переходов в программе.
def_label()
использует буфер с 2 словами
и не требует никакого пространства для сообщений запроса.
Сигнатура.
int def_label
(
int LabelNum
)
Параметры. Этот метод берет единственный параметр
LabelNum
,
чье значение должно быть уникально среди всех значений, используемых для
этикеток в рамках интерпретируемой программы.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод используется, чтобы отметить начало подпрограммы. Посмотрите раздел 2.3.24.1.11.
Сигнатура.
int def_sub
(
Uint32 SubroutineNumber
)
Параметры. Единственный параметр, номер определенной подпрограммы.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод готовит интерпретируемую программу, включая
любые подпрограммы, решая все команды ветвления и обращения к подпрограммам.
Это нужно вызвать перед использованием программы и можно вызвать только
однажды для любого данного объекта
NdbInterpretedCode
.
Если никакие инструкции не были определены, этот метод пытается вставить
вызов метода
interpret_exit_ok()
до завершения.
Сигнатура.
int finalise ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод возвращает новую ошибку, связанную с этим
объектом
NdbInterpretedCode
.
Сигнатура.
const class NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение. Ссылка на объект
NdbError
.
Описание. Этот метод может использоваться, чтобы получить ссылку на
таблицу, для который определен объект
NdbInterpretedCode
.
Сигнатура.
const NdbDictionary::Table* getTable ( void ) const
Параметры. Нет.
Возвращаемое значение.
Указатель на объект
Table
. NULL
, если никакой объект
таблицы не задан, при создании
NdbInterpretedCode
.
Описание. Этот метод возвращает количество слов от буфера, которые использовались, является ли буфер тем, который создан пользователями или внутренне обеспеченный буфер.
Сигнатура.
Uint32 getWordsUsed ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-битное количество слов в буфере.
Описание. Для операции по просмотру вызов этого метода указывает, что эта строка должна быть возвращена как часть просмотра, и что больше строк в этом фрагменте не должно быть просмотрено. Для других типов операций метод заставляет операцию быть прерванной.
Сигнатура.
int interpret_exit_last_row ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Для операций просмотра этот метод используется, чтобы указать, что текущая строка не должна быть возвращена как часть просмотра, и программа должна идти дальше к следующей строке. Это заставляет другие типы операций быть прерванными.
Сигнатура.
int interpret_exit_nok
(
Uint32 ErrorCode
= 626
// HA_ERR_KEY_NOT_FOUND
)
Параметры. Этот метод берет единственный (дополнительный) параметр
ErrorCode
.
Для полного списка кодов ошибок NDB посмотрите
раздел 2.4.2. Если не задано,
умолчание 626 (HA_ERR_KEY_NOT_FOUND/Tuple did not exist
. Приложения должны использовать код ошибки 626 или другой код в
диапазоне 6000-6999 включительно.
До NDB 7.2.1 ErrorCode
по умолчанию был кодом ошибки NDB
899 (Rowid already allocated). Это значение все еще
поддерживается для обратной совместимости (Bug #16176006).
Для любых значений кроме упомянутых здесь, поведение этого метода не
определено, и подвержено изменениям в любое время
без предшествующего уведомления.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Для операции по просмотру этот метод указывает, что текущая строка должна быть возвращена как часть результатов просмотра и что программа должна идти дальше к следующей строке. Для других операций вызов этого метода заставляет интерпретируемую программу завершиться.
Сигнатура.
int interpret_exit_ok ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод используется, чтобы загрузить
NULL
в регистр.
Сигнатура.
int load_const_null
(
Uint32 RegDest
)
Параметры. Этот метод берет единственный параметр: регистр, в
который нужно поместить NULL
.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод загружает 16-битовое значение в указанный регистр.
Сигнатура.
int load_const_u16 ( Uint32RegDest
, Uint32Constant
)
Параметры.
RegDest
:
Регистр, в который должно быть загружено значение.
Constant
значение, которое будет загружено.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод загружает 32-битовое значение в указанный регистр.
Сигнатура.
int load_const_u32 ( Uint32RegDest
, Uint32Constant
)
Параметры.
RegDest
:
Регистр, в который должно быть загружено значение.
Constant
значение, которое будет загружено.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод загружает 64-битовое значение в указанный регистр.
Сигнатура.
int load_const_u64 ( Uint32RegDest
, Uint64Constant
)
Параметры.
RegDest
:
Регистр, в который должно быть загружено значение.
Constant
значение, которое будет загружено.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Метод read_attr()
используется, чтобы прочитать значение столбца таблицы в регистр программы.
Столбец может быть определен при помощи признака ID или как указатель на
объект Column
.
Сигнатура. Этот метод можно вызвать любым из двух способов. Первый из них, ссылаясь на колонку по ее ID, как показано здесь:
int read_attr ( Uint32RegDest
, Uint32attrId
)
Альтернативно, можно сослаться на колонку как на объект
Column
:
int read_attr ( Uint32RegDest
, const NdbDictionary::Column*column
)
Параметры.
Регистр, в который должно быть скопировано значение столбца
(RegDest
).
Любая из следующих ссылок на столбец таблицы, значение которого должно быть скопировано:
Признак столбца таблицы ID
(attrId
).
Указатель на объект column
то есть, указатель на объект
Column
, ссылающийся на столбец таблицы.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод отмечает конец текущей подпрограммы.
Сигнатура.
int ret_sub ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод получает различие между значениями, сохраненными в любых двух данных регистрах, и хранит результат в третьем регистре.
Сигнатура.
int sub_reg ( Uint32RegDest
, Uint32RegSource1
, Uint32RegSource2
)
Параметры. Этот метод берет три параметра. Первым из них является
регистр, в котором должен быть сохранен результат
(RegDest
). Второй и третий
параметры (RegSource1
и
RegSource2
) это регистры, значения
которых должны быть вычтены. Другими словами, значение регистра
RegDest
вычислено так:
(значение в регистреRegSource1
) - (значение в регистреRegSource2
)
Возможно снова использовать один из регистров, значения которых вычтены
для хранения результата, то есть,
RegDest
может быть
RegSource1
или
RegSource2
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод вычитает указанное значение из значения
данного столбца таблицы и помещает оригинальные и измененные значения
столбцов в регистры 6 и 7. Это эквивалентно следующей серии вызовов
NdbInterpretedCode
, где
attrId
это ID столбца таблицы, а
aValue
значение,
которое будет вычтено:
read_attr(6,attrId
); load_const_u32(7,aValue
); sub_reg(7,6,7); write_attr(attrId
, 7);
aValue
может быть
32-bit или 64-bit integer.
Сигнатура. Этот метод может быть вызван любым из двух способов, в
зависимости от разрядности aValue
.
32-bit aValue
:
int sub_val ( Uint32attrId
, Uint32aValue
)
64-bit aValue
:
int sub_val ( Uint32attrId
, Uint64aValue
)
Параметры. ID признака столбца таблицы и 32-bit или 64-bit integer значение, которое будет вычтено из значения этого столбца.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод используется, чтобы скопировать значение
регистра к столбцу таблицы. Столбец может быть определен при помощи признака
ID или как указатель на объект
Column
.
Сигнатура. Этот метод может быть вызван любым из двух способов. Первый из них требует ссылки на колонку по признаку ID, как показано здесь:
int read_attr ( Uint32attrId
, Uint32RegSource
)
Можно также сослаться на колонку как на объект
Column
:
int read_attr ( const NdbDictionary::Column*column
, Uint32RegSource
)
Параметры.
Ссылка на столбец таблицы, в который должно быть скопировано значение регистра. Это может иметь любое значение из следующего:
Признак столбца таблицы ID
(attrId
).
Указатель на объект column
,
ссылающийся на столбец таблицы.
Регистр, значение которого должно быть скопировано
(RegSource
).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Резюме
Эта секция обсуждает класс NdbOperation
.
Родительский класс. Нет.
Дочерние классы.
NdbIndexOperation
,
NdbScanOperation
.
Описание. NdbOperation
представляет
универсальную операцию с данными. Его подклассы
представляют более определенные типы операций. Посмотрите
раздел 2.3.25.18
для списка операционных типов и их соответствующих субклассов
NdbOperation
.
Методы.
Таблица 2.52.
Имя | Описание |
---|---|
deleteTuple() |
Удаляет кортеж из таблицы |
equal() |
Определяет условие поиска, используя равенство |
getBlobHandle() |
Используется, чтобы получить доступ к признакам blob |
getLockHandle() |
Получает обработчик блокировки для операции |
getLockMode() |
Получает способ блокировки операции |
getNdbError() |
Получает последнюю ошибку |
getNdbErrorLine() |
Получает номер метода, где последняя ошибка произошла |
getTableName() |
Получает название таблицы, используемой для этой операции |
getTable() |
Получает объект таблицы для этой операции |
getNdbTransaction() |
Получает объект
NdbTransaction для этой операции |
getType() |
Получает тип операции |
getValue() |
Ассигнует значение атрибута для более позднего доступа |
insertTuple() |
Добавляет новый кортеж к таблице |
readTuple() |
Читает кортеж от таблицы |
setValue() |
Определяет признак, чтобы установить или обновить |
updateTuple() |
Обновляет существующий кортеж в таблице |
writeTuple() |
Вставляет или обновляет кортеж |
У этого класса нет публичного конструктора. Чтобы создать экземпляр
NdbOperation
, необходимо использовать
NdbTransaction::getNdbOperation()
.
Типы. Класс NdbOperation
определяет три публичных типа, показанные в следующей таблице:
Таблица 2.53.
Имя | Описание |
---|---|
AbortOption() |
Определяет, вызывает ли неудавшаяся операция неудачу транзакции |
LockMode() |
Тип блокировки, используемой, выполняя операцию чтения |
Type() |
Операционные типы доступа |
См. раздел 1.3.2.3.2.
Описание.
Этот тип используется, чтобы определить, должны ли неудавшиеся операции
вынудить транзакцию быть прерванной. Это используется в качестве аргумента
метода execute()
, см.
раздел 2.3.30.6.
Возможные значения.
Таблица 2.54.
Имя | Описание |
---|---|
AbortOnError |
Неудавшаяся операция заставляет транзакцию прерываться. |
AO_IgnoreOnError |
Проигнорированы неудавшиеся операции, транзакция продолжает выполняться. |
DefaultAbortOption |
Значение AbortOption
установлено согласно операционному типу:
|
См. раздел 2.3.30.6.
Описание. Этот метод определяет
NdbOperation
как DELETE
. Когда метод
NdbTransaction::execute()
вызван, операция удаляет
кортеж из таблицы.
Сигнатура.
virtual int deleteTuple ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод определяет условие поиска с равенством.
Условие верно, если у признака есть данное значение. Чтобы установить условия
поиска на многократных признаках, используйте несколько вызовов
equal()
, в таких случаях все они должны быть
удовлетворены для кортежа, который будет отобран.
Если признак имеет фиксированный размер, его значение должно включать все
байты. В особенности значение Char
должна быть дополнено пробелами. Если признак имеет переменный размер, его
значение должно начаться с 1 или 2 байтов длины с прямым порядком байтов (2,
если тип Long*
).
Используя insertTuple()
,
можно также определить ключ поиска с setValue()
.
См. раздел 2.3.25.17.
Сигнатура. Есть 10 версий equal()
,
каждая имеет немного отличающиеся параметры. Все они перечисляются здесь:
intequal ( const char*name
, const char*value
) intequal ( const char*name
, Int32value
) intequal ( const char*name
, Uint32value
) intequal ( const char*name
, Int64value
) intequal ( const char*name
, Uint64value
) intequal ( Uint32id
, const char*value
) intequal ( Uint32id
, Int32value
) intequal ( Uint32id
, Uint32value
) intequal ( Uint32id
, Int64value
) intequal ( Uint32id
, Uint64value
)
Параметры.
Первый параметр может иметь любое из следующего:
Имя name
признака (последовательность).
id
признака
unsigned 32-bit integer).
Второй параметр это признак
value
для проверки.
Это значение может быть любым из следующих 5 типов:
String
32-bit integer
Unsigned 32-bit integer
64-bit integer
Unsigned 64-bit integer
Возвращаемое значение.
-1
в случае ошибки.
Описание. Этот метод используется вместо
getValue()
или
setValue()
для признаков blob.
Это создает обработчик blob (объект
NdbBlob
).
Второй вызов с тем же самым аргументом возвращает ранее созданный обработчик,
связанный с операцией и сохраняется автоматически.
Сигнатура. У этого метода есть две формы, в зависимости от того, вызывают ли это с именем или ID признака blob:
virtual NdbBlob* getBlobHandle ( const char* name )
или
virtual NdbBlob* getBlobHandle ( Uint32 id )
Параметры. Этот метод берет единственный параметр, который может быть любой одним из следующего:
name
: имя признака
id
признака
Возвращаемое значение. Независимо от используемого типа параметра,
это возвращает указатель на экземпляр
NdbBlob
.
Описание. Возвращает указатель на обработчик блокировки текущей
операции. Когда используется с
NdbRecord
, обработчик блокировки нужно
сначала вызвать с опцией OO_LOCKHANDLE
.
Для других операций этот метод может использоваться один. В любом случае
объект NdbLockHandle
возвращенный этим методом,
не может использоваться, пока операция не была выполнена.
Использование методов работы с блокировкой.
Коллективные или монопольные блокировки, взятые операциями чтения в
транзакции, обычно действуют, пока транзакция не передает или прерывается.
Такие блокировки могут быть выпущены, прежде чем транзакция передает или
прерывается, вызывая обработчик блокировки, определяя операцию чтения.
Как только операция чтения была выполнена,
NdbLockHandle
может использоваться, чтобы создать новую операцию разблокировки
(с
NdbTransaction::unlock()
).
Когда операция разблокировки выполняется, блокировка строки, созданная
операцией чтения, выпущена.
Шаги, требуемые, чтобьы выпустить эти блокировки, перечисляются здесь:
Определите операцию чтения первичного ключа нормальным способом со
способом блокировки LM_Read
или
LM_Exclusive
.
Вызовите
NdbOperation::getLockHandle()
во время операционного определения или для
Ndbrecord
установите опцию
OO_LOCKHANDLE
при вызове
NdbTransaction::readTuple()
.
Вызовите
NdbTransaction::execute()
,
строка теперь блокирована с этого момента как нормальная.
Используйте данные, возможно сделав вызовы
NdbTransaction::execute()
.
Вызовите
NdbTransaction::unlock()
, передав
const NdbLockHandle
, полученную ранее, чтобы
создать операцию разблокировки.
Вызовите
NdbTransaction::execute()
,
это разблокирует строку.
Примечания:
Как с другими операционными типами, операции разблокировки могут быть скомплектованы пакет.
Каждый объект NdbLockHandle
относится к блокировке, добавленной на строку единственной операцией чтения
первичного ключа. У единственной строки в базе данных могут быть
параллельные многократные блокировки (LM_Read
)
и она может иметь многократных ожидающих держателей блокировки
(LM_Exclusive
), так что выпуск одного держателя
блокировки может не привести к изменению заметного статуса блокировки строки.
Обработчики блокировки поддерживаются для операций просмотра, обработчик блокировки нужно требовать, прежде чем блокировка выполняется.
Обработчики блокировки и операции разблокировки не поддерживаются для операций чтения уникального индекса.
Сигнатура.
const NdbLockHandle* getLockHandle ( void ) const
или
const NdbLockHandle* getLockHandle ( void )
Параметры. Нет.
Возвращаемое значение.
Указатель на NdbLockHandle
, который
может использоваться методами
NdbTransaction
unlock()
и
releaseLockHandle()
.
Описание. Этот метод получает способ блокировки операции.
Сигнатура.
LockMode getLockMode ( void ) const
Параметры. Нет.
Возвращаемое значение. Значение
LockMode
. См.
раздел 2.3.25.15.
Описание. Этот метод получает новую ошибку (объект
NdbError
).
Сигнатура.
const NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение.
Объект
NdbError
.
Описание. Этот метод получает номер метода, в котором произошла последняя ошибка.
Сигнатура.
int getNdbErrorLine ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер метода (integer).
Описание. Этот метод используется, чтобы получить объект таблицы, связанный с операцией.
Сигнатура.
const NdbDictionary::Table* getTable ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на экземпляр
Table
.
Описание. Этот метод получает название таблицы, используемой для операции.
Сигнатура.
const char* getTableName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название таблицы.
Описание. Получает объект
NdbTransaction
.
Сигнатура.
virtual NdbTransaction* getNdbTransaction ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на объект
NdbTransaction
.
Описание. Этот метод используется, чтобы получить тип доступа для этой операции.
Сигнатура.
Type getType ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение
Type
.
Описание. Этот метод готовится к поиску значения атрибута.
API NDB ассигнует память для объекта
NdbRecAttr
, который позже используется,
чтобы получить значение атрибута. Это может быть сделано при помощи одного из
многих методов
NdbRecAttr
, точный метод, который будет
использоваться зависит от типа данных признака. Это включает общий метод
NdbRecAttr::aRef()
, который получает
данные как char*
, независимо от фактического
типа. Однако, это не безопасно с точки зрения типов и требует внимания.
Этот метод не получает
значение атрибута из базы данных, объект
NdbRecAttr
, возвращенный этим методом, не
удобочитаемый или пригодный для печатания перед запросом
NdbTransaction::execute()
.
Если определенный признак не изменился, соответствующий
NdbRecAttr
имеет состояние UNDEFINED
.
Это может быть проверено при помощи
NdbRecAttr::isNULL()
, который в такой
ситуации вернет -1
.
См. разделы 2.3.30.6 и 2.3.26.13.
Сигнатура. Есть три версии этого метода, каждая имеющая различные параметры:
NdbRecAttr* getValue ( const char*name
, char*value
= 0 ) NdbRecAttr* getValue ( Uint32id
, char*value
= 0 ) NdbRecAttr* getValue ( const NdbDictionary::Column*col
, char*value
= 0 )
Параметры. У всех трех форм этого метода есть два параметра, второй
параметр, является дополнительным (по умолчанию
0
). Они отличаются только относительно типа
первого параметра, который может быть любым из следующего:
Имя name
атрибута.
id
атрибута.
Столбец column
таблицы,
на котором определяется признак.
Во всех трех случаях второй параметр это буфер символов в который
не-NULL
значение атрибута возвращено.
Если признак NULL
, только объект
NdbRecAttr
возвращен этим методом.
Если value
не указанано в вызове
getValue()
или оно равно 0, объект
NdbRecAttr
обеспечивает управление памятью для того, чтобы хранить полученные
данные. Если максимальный размер полученных данных выше маленького
фиксированного размера, malloc()
используется, чтобы сохранить его: для небольших размеров обеспечивается
маленький внутренний буфер (кратный 32 байтам). Это хранение организовано
экземпляром
NdbRecAttr
, это освобождено, когда операция выпущена, любые
данные, написанные здесь, которые вы хотите сохранить, должны быть
скопированы в другом месте, прежде чем это освобождение памяти происходит.
Если вы передаете указатель отличный от нуля для
value
,
тогда предполагается, что это указывает на часть памяти, которая является
достаточно большой, чтобы содержать максимальное значение колонки,
любые возвращенные данные написаны именно там.
Указатель должен быть выровнен по 32 битам.
Столбцы индекса не могут использоваться вместо столбцов таблицы с этим
методом. В случаях, где столбец таблицы недоступен, можно использовать
название атрибута, полученное с
getName()
.
Возвращаемое значение. Указатель на объект
NdbRecAttr
, чтобы содержать значение
признака или NULL
в случае ошибки.
Получение целых чисел. Значения Integer могут быть получены
от буфера value
, переданного как
второй параметр этого метода, и от объекта
NdbRecAttr
. С другой стороны, символьные данные доступны от
NdbRecAttr
, если никакой буфер не был передан в
getValue()
(см.
раздел 2.3.26.2).
Однако, символьные данные написаны в буфер, только если он предоставлен, в
этом случае это не может быть получено от объекта
NdbRecAttr
, который был возвращен. В последнем случае
NdbRecAttr::aRef()
возвращает буфер, указывающий на пустую строку.
Доступ к битовым значениям.
Следующий пример показывает, как проверить данный бит в буфере
value
. Здесь
op
это операция (объект
NdbOperation
), name
это
название колонки, от которой можно получить битовое значение, а
trans
это объект
NdbTransaction
:
Uint32 buf[]; op->getValue(name, buf); /* bit column */ trans->execute(); if (buf[X/32] & 1 << (X & 31)) /* check bit X */ { /* bit X set */ }
Описание. Этот метод определяет
NdbOperation
для опреации
INSERT
. Когда
NdbTransaction::execute()
вызван, эта операция добавляет
новый кортеж к таблице.
Сигнатура.
virtual int insertTuple ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот тип описывает способ блокировки, используемый, выполняя операцию чтения.
Возможные значения.
Таблица 2.55.
Имя | Описание |
---|---|
LM_Read |
Чтение с коллективной блокировкой |
LM_Exclusive |
Чтение с монопольной блокировкой |
LM_CommittedRead |
Проигнорируйте блокировку, чтение последней передачи |
LM_SimpleRead |
Чтение с коллективной блокировкой, но выпустите блокировку непосредственно |
Есть также поддержка грязных чтений
(LM_Dirty
),
но это обычно только во внутренних целях и не должно использоваться для
задач, развернутых в производственном режиме.
Описание. Этот метод определяет операцию
NdbOperation
READ
. Когда метод
NdbTransaction::execute()
вызван, операция читает кортеж.
Сигнатура.
virtual int readTuple
(
LockMode mode
)
Параметры.
mode
определяет способ блокировки, используемый операцией чтения. Посмотрите
раздел 2.3.25.15.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод определяет признак, который будет установлен или обновлен.
Есть много методов
NdbOperation::setValue()
, которые берут определенный тип в
качестве входа (значение вместо того, чтобы передать указатель).
Обязанность прикладного программиста использовать правильные типы.
Однако API NDB действительно проверяет, что приложение посылает правильную
длину в интерфейс, как дано в параметре длины. Значение
char*
может содержать любой тип данных или любой
тип множества. Если длина не обеспечивается, или если она установлена в ноль,
то API предполагает, что указатель правилен и не проверяет его.
Чтобы установить значение NULL
,
используйте следующую конструкцию:
setValue("ATTR_NAME", (char*)NULL);
Когда вы используете insertTuple()
, NDB API
автоматически обнаруживает, что он, как предполагается, использует
equal()
.
Кроме того, необязательно, используя
insertTuple()
, применять
setValue()
на ключевых признаках перед другими признаками.
Сигнатура. Есть 14 версий
NdbOperation::setValue()
, каждая с немного отличающимися
параметрами, как перечислено здесь:
int setValue ( const char*name
, const char*value
) int setValue ( const char*name
, Int32value
) int setValue ( const char*name
, Uint32value
) int setValue ( const char*name
, Int64value
) int setValue ( const char*name
, Uint64value
) int setValue ( const char*name
, floatvalue
) int setValue ( const char*name
, doublevalue
) int setValue ( Uint32id
, const char*value
) int setValue ( Uint32id
, Int32value
) int setValue ( Uint32id
, Uint32value
) int setValue ( Uint32id
, Int64value
) int setValue ( Uint32id
, Uint64value
) int setValue ( Uint32id
, floatvalue
) int setValue ( Uint32id
, doublevalue
)
Параметры. Этот метод требует следующих двух параметров:
Первый параметр определяет признак, который будет установлен и может быть одним любым из следующего:
Имя name
признака (string).
id
признака
(unsigned 32-bit integer).
Второй параметр value
это
значение, в которое должен быть установлен признак, его тип может быть любым
из следующих 7 типов:
String (const char*
)
32-bit integer
Unsigned 32-bit integer
64-bit integer
Unsigned 64-bit integer
Double
Float
См. раздел 2.3.25.3.
Возвращаемое значение.
-1
при ошибке.
Описание. Type
используется, чтобы описать операционный тип доступа. Каждый тип доступа
поддерживается
NdbOperation
или один из его подклассов, как
показано в следующей таблице:
Возможные значения.
Таблица 2.56.
Имя | Описание | Применимый класс |
---|---|---|
PrimaryKeyAccess |
Чтение, вставка, обновление или удаление, используя первичный ключ таблицы | NdbOperation
|
UniqueIndexAccess |
Чтение, обновление или удаление, используя уникальный индекс |
NdbIndexOperation |
TableScan |
Полное сканирование таблицы |
NdbScanOperation |
OrderedIndexScan |
Упорядоченный просмотр индекса |
NdbIndexScanOperation |
Описание. Этот метод определяет операцию
NdbOperation
WRITE
.
Когда вызван метод
NdbTransaction::execute()
операция пишет кортеж в таблицу. Если кортеж уже существует, он обновляется,
иначе вставка происходит.
Сигнатура.
virtual int writeTuple ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот метод определяет операцию
NdbOperation
UPDATE
. Когда вызван метод
NdbTransaction::execute()
, операция обновляет
кортеж, найденный в таблице.
Сигнатура.
virtual int updateTuple ( void )
Параметры. Нет.
Возвращаемое значение.
Returns 0
при успехе,
-1
при ошибке.
Резюме
Секция описывает класс NdbRecAttr
и его публичные методы.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание.
NdbRecAttr
содержит значение признака.
Объект NdbRecAttr
используется, чтобы сохранить
значение атрибута после того, как он был восстановлен, используя метод
NdbOperation::getValue()
. Этот объект ассигнуется API NDB.
Краткий пример показывают здесь:
MyRecAttr = MyOperation->getValue("ATTR2", NULL); if (MyRecAttr == NULL) goto error; if (MyTransaction->execute(Commit) == -1) goto error; ndbout << MyRecAttr->u_32_value();
См. раздел 2.5.1.
Объект NdbRecAttr
создается с его значением
только когда вызван
NdbTransaction::execute()
.
До этого значение не определена. Используйте
NdbRecAttr::isNULL()
, чтобы
проверить, определяется ли значение. Это означает, что у объекта
NdbRecAttr
есть действительная информация только между вызовами
NdbTransaction::execute()
и
Ndb::closeTransaction()
.
Значение NULL
указывает
-1
до вызова
NdbTransaction::execute()
.
Методы.
NdbRecAttr
имеет много методов для получения
значений различных простых типов непосредственно от экземпляра этого класса.
Также возможно получить ссылку на значение независимо от ее фактического
типа, при помощи
NdbRecAttr::aRef()
, но
необходимо знать, что это небезопасно с точки зрения
типов и требует аккуратности.
Таблица 2.57.
Имя | Описание |
---|---|
~NdbRecAttr() |
Деструктор |
aRef() |
Получает указатель на значение атрибута |
char_value() |
Получает значение атрибута Char |
clone() |
Делает глубокую копию объекта RecAttr
|
double_value() |
Получает значение атрибута Double
как double (8 байт) |
float_value() |
Получает значение атрибута Float
как float (4 байта) |
get_size_in_bytes() |
Получает размер признака в байтах |
getColumn() |
Получает колонку, которой принадлежит признак |
getType() |
Получает тип признака
(
Column::Type ) |
isNULL() |
Проверка, является ли признак NULL |
int8_value() |
Получает значение атрибута Tinyint
как 8-bit integer |
int32_value() |
Получает значение атрибута Int
как 32-bit integer |
int64_value() |
Получает значение атрибута Bigint
как 64-bit integer |
medium_value() |
Получает значение атрибута Mediumint
как 32-bit integer |
short_value() |
Получает значение атрибута Smallint
как 16-bit integer |
u_8_value() |
Получает значение атрибута Tinyunsigned
как unsigned 8-bit integer |
u_32_value() |
Получает значение атрибута Unsigned
как unsigned 32-bit integer |
u_64_value() |
Получает значение атрибута Bigunsigned
как unsigned 64-bit integer |
u_char_value() |
Получает значение атрибута Char
как unsigned char |
u_medium_value() |
Получает значение атрибута Mediumunsigned
как unsigned 32-bit integer |
u_short_value() |
Получает значение атрибута Smallunsigned
как unsigned 16-bit integer |
У класса
NdbRecAttr
нет публичного конструктора, экземпляр этого объекта
создается, используя
NdbTransaction::execute()
. См.
раздел 2.3.26.1.
Типы. Класс NdbRecAttr
не определяет публичных типов.
Описание.
Это деструктор класса
NdbRecAttr
.
Необходимо удалить только копии объектов
NdbRecAttr
, которые были созданы в вашем приложении, используя метод
clone()
.
Сигнатура.
~NdbRecAttr ( void )
Параметры. Нет.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы получить ссылку на
значение атрибута, как указатель на char
.
Этот указатель выровнен соответственно для типа данных.
Память освобождена API NDB, когда выполнен
NdbTransaction::close()
в транзакции, которая читают значение.
Сигнатура.
char* aRef ( void ) const
Параметры. Указатель на значение атрибута. Поскольку этот указатель
постоянный, этот метод можно вызвать в любое время после
NdbOperation::getValue()
.
Возвращаемое значение. Нет.
Описание. Этот метод получает Char
,
сохраненный в объекте
NdbRecAttr
и возвращает его как
char
.
Сигнатура.
char char_value ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение char
.
Описание. Этот метод создает глубокую копию объекта
NdbRecAttr
.
Копия, созданная этим методом, должна быть удалена приложением, когда больше не нужна.
Сигнатура.
NdbRecAttr* clone ( void ) const
Параметры. Нет.
Возвращаемое значение.
Объект
NdbRecAttr
.
Это полная копия оригинала, включая все данные.
Описание. Этот метод получает значение
Double
, сохраненное в объекте
NdbRecAttr
и возвращает его как double.
Сигнатура.
double double_value ( void ) const
Параметры. Нет.
Возвращаемое значение. Значение double (8 байт).
Описание.
Этот метод получает значение Float
,
сохраненное в объекте
NdbRecAttr
и возвращает его как float.
Сигнатура.
float float_value ( void ) const
Параметры. Нет.
Возвращаемое значение. Значение float (4 байта).
Описание. Можно использовать этот метод, чтобы получить размер признака (элемента).
Сигнатура.
Uint32 get_size_in_bytes ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер признака в байтах как unsigned 32-bit integer.
Описание. Этот метод используется, чтобы получить колонку, которой принадлежит признак.
Сигнатура.
const NdbDictionary::Column* getColumn ( void ) const
Параметры. Нет.
Возвращаемое значение.
Указатель на объект
Column
.
Описание. Этот метод используется, чтобы получить тип данных колонки.
Сигнатура.
NdbDictionary::Column::Type getType ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение
Column::Type
.
Описание. Этот метод получает значение
Small
, сохраненное в объекте
NdbRecAttr
и возвращает как
8-bit signed integer.
Сигнатура.
int8 int8_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 8-bit signed integer.
Описание.
Этот метод получает значение Int
,
сохраненное в объекте
NdbRecAttr
и возвращает как
32-bit signed integer.
Сигнатура.
int32 int32_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-bit signed integer.
Описание.
Этот метод получает значение Bigint
,
сохраненное в объекте
NdbRecAttr
и возвращает как 64-bit signed integer.
Сигнатура.
int64 int64_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 64-bit signed integer.
Описание.
Этот метод проверяет, является ли значение атрибута
NULL
.
Сигнатура.
int isNULL ( void ) const
Параметры. Нет.
Возвращаемое значение. Одно из следующих трех значений:
-1
:
Значение атрибута не определяется из-за ошибки.
0
:
Значение атрибута определяется, но не NULL
.
1
:
Значение атрибута определяется и NULL
.
Если
NdbTransaction::execute()
еще не был вызван, значение, возвращенное
isNULL()
не определяется.
Описание.
Этот метод получает значение Mediumint
,
сохраненное в объекте
NdbRecAttr
и возвращает как
32-bit signed integer.
Сигнатура.
int32 medium_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-bit signed integer.
Описание.
Этот метод получает значение Smallint
,
сохраненное в объекте
NdbRecAttr
и возвращает как 16-bit signed integer (short).
Сигнатура.
short short_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 16-bit signed integer.
Описание.
Этот метод получает значение Smallunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 8-bit unsigned integer.
Сигнатура.
Uint8 u_8_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 8-bit unsigned integer.
Описание.
Этот метод получает значение Unsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 32-bit unsigned integer.
Сигнатура.
Uint32 u_32_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-bit unsigned integer.
Описание.
Этот метод получает значение Bigunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 64-bit unsigned integer.
Сигнатура.
Uint64 u_64_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 64-bit unsigned integer.
Описание.
Этот метод получает значение Char
,
сохраненное в объекте
NdbRecAttr
и возвращает как unsigned char
.
Сигнатура.
Uint8 u_char_value ( void ) const
Параметры. Нет.
Возвращаемое значение.
8-bit unsigned char
.
Описание.
Этот метод получает значение Mediumunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 32-bit unsigned integer.
Сигнатура.
Uint32 u_medium_value ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-bit unsigned integer.
Описание.
Этот метод получает значение Smallunsigned
,
сохраненное в объекте
NdbRecAttr
и возвращает как 16-bit (short) unsigned integer.
Сигнатура.
Uint16 u_short_value ( void ) const
Параметры. Нет.
Возвращаемое значение. short (16-bit) unsigned integer.
NdbRecord
это интерфейс, который
предоставляет отображение полной или частичной записи, сохраненной в
NDB
. В последнем случае это может использоваться
вместе с битовым массивом, чтобы помочь в доступе.
NdbRecord
не имеет никаких собственных
методов API, скорее это действует как обработчик, который может быть передан
между различными вызовами метода во многих различных видах операций, включая
следующие операционные типы:
Чтение уникального и первичного ключей.
Сканирование таблицы и просмотры индекса.
Операции DML, включающие уникальные или первичные ключи.
Операции, включающие границы индекса.
Тот же самый NdbRecord
может использоваться
одновременно в многократных операциях, транзакциях и потоках.
NdbRecord
может быть создан в программах API
NDB, вызывая метод
createRecord()
класса
Dictionary
. Кроме того, у многих методов API NDB есть дополнительные декларации,
которые позволяют программисту усилить
NdbRecord
:
Следующие члены
NdbIndexScanOperation
и
NdbDictionary
могут также использоваться с
просмотрами NdbRecord
:
IndexBound
структура, используемая, чтобы описать границы просмотра индекса.
RecordSpecification
структура, используемая,
чтобы определить смещения диапазона и колонки.
Можно также использовать NdbRecord
с
новой структурой
PartitionSpec
, чтобы выполнить просмотры,
которые используют в своих интересах сокращение разделения посредством
варианта
NdbIndexScanOperation::setBound()
,
это было добавлено в тех же самых выпусках NDB Cluster.
Резюме
Эта секция обсуждает класс NdbScanFilter
и его публичные члены.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. NdbScanFilter
обеспечивает альтернативное средство определения фильтров для
операций по просмотру.
До MySQL 5.1.14 методы сравнения этого класса не работали со значениями
BIT
(Bug #24503).
Разработка этого интерфейса продолжается: особенности класса
NdbScanFilter
, вероятно, изменятся
далее в будущих выпусках.
Методы.
Таблица 2.58.
Имя | Описание |
---|---|
NdbScanFilter() |
Метод конструктора |
~NdbScanFilter() |
Метод деструктора |
begin() |
Начинает комплекс (набор условий) |
cmp() |
Сравнивает значение столбца с произвольным значением |
end() |
Заканчивает комплекс |
eq() |
Тест на равенство |
ge() |
Тест на большее или равное условие |
getNdbError() |
Обеспечивает доступ к информации об ошибке |
getNdbOperation() |
Получает связанный
NdbOperation |
gt() |
Тесты на условие больше чем |
isfalse() |
Определяет термин в комплексе как
FALSE |
isnotnull() |
Тест, не является ли значение столбца
NULL |
isnull() |
Тест, является ли значение столбца
NULL |
istrue() |
Определяет термин в комплексе как
TRUE |
le() |
Тест на меньше или равно |
lt() |
Тест на меньше |
ne() |
Тест на неравенство |
Методы сравнения целого числа NdbScanFilter.
NdbScanFilter
обеспечивает несколько удобных методов, которые могут использоваться вместо
cmp()
, когда произвольное значение, которое будет сравнено,
является целым числом:
eq()
,
ge()
,
gt()
,
le()
,
lt()
и
ne()
.
Каждый из этих методов по существу обертка для
cmp()
, который включает соответствующее значение
BinaryCondition
для параметра
condition
нужного метода, например,
NdbScanFilter::eq()
определяется так:
int eq(intcolumnId
, Uint32value
) { return cmp(BinaryCondition::COND_EQ,columnId
,&value
, 4); }
Типы. Класс NdbScanFilter
определяет два публичных типа:
BinaryCondition
:
Тип условия, такой как нижняя или верхняя граница.
Group
:
Логический оператор группировки, такой как AND
или OR
.
Описание. Этот метод используется, чтобы начать комплекс и
определяет логический оператор для группировки условий, составляющих
комплекс. По умолчанию AND
.
Сигнатура.
int begin
(
Group group
= AND
)
Параметры. Значение Group
: одно из
AND
, OR
,
NAND
или NOR
.
См. раздел 2.3.28.14.
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Этот тип представляет условие на основе сравнения
значения столбца с некоторым произвольным значением,
то есть, связанное условие. значение этого типа используется в качестве
первого аргумента
NdbScanFilter::cmp()
.
Возможные значения.
Таблица 2.59.
Имя | Описание | Тип столбца в сравнении |
---|---|---|
COND_EQ |
Равенство (= ) |
Любой |
COND_NE |
Неравенство (<> or
!= ) |
Любой |
COND_LE |
Нижняя граница (<= ) |
Любой |
COND_LT |
Строгая нижняя граница (< ) |
Любой |
COND_GE |
Верхняя граница (>= ) |
Любой |
COND_GT |
Строгая верхняя граница (>) | Любой |
COND_LIKE |
Выражение LIKE |
Строчный или двоичный |
COND_NOTLIKE |
Выражение NOT LIKE |
Строчный или двоичный |
COL_AND_MASK_EQ_MASK |
Значение столбца AND
битовая маска равно битовой маске |
BIT |
COL_AND_MASK_NE_MASK |
Значение столбца AND битовая маска не
равно битовой маске |
BIT |
COL_AND_MASK_EQ_ZERO |
Значение столбца AND
битовая маска равно 0 |
BIT |
COL_AND_MASK_NE_ZERO |
Значение столбца AND
битовая маска не равно 0 |
BIT |
Когда используется в сравнениях с COND_EQ
,
COND_NE
, COND_LT
,
COND_LE
, COND_GT
или COND_GE
, символы фиксированной длины и
значения столбцов двоичных данных должны префикс с размером столбца и
дополнены по длине. Это не надо для таких значений, когда используется в
сравнениях COND_LIKE
,
COND_NOTLIKE
,
COL_AND_MASK_EQ_MASK
,
COL_AND_MASK_NE_MASK
,
COL_AND_MASK_EQ_ZERO
или
COL_AND_MASK_NE_ZERO
.
Сравнения строк. Последовательности сравниваются с использованием
COND_LIKE
и
COND_NOTLIKE
, это может использовать метасимволы
образца %
и _
. См.
раздел 2.3.28.3.
Сравнение BIT.
Сравнивающие BIT
операторы это
COL_AND_MASK_EQ_MASK
,
COL_AND_MASK_NE_MASK
,
COL_AND_MASK_EQ_ZERO
и
COL_AND_MASK_NE_ZERO
. Соответствующие методы
доступны для
NdbInterpretedCode
и
NdbOperation
, см.
раздел
2.3.24.1.8.
Описание. Этот метод используется, чтобы определить сравнение между
данным значением и значением колонки. Начиная с NDB 8.0.18, это может также
использоваться, чтобы сравнить две колонки. Этот метод на самом деле не
выполняет сравнение, которое сделано позже, выполняя просмотр для которого
определен этот
NdbScanFilter
.
Во многих случаях, где значение, которое будет сравнено, является целым
числом, можно вместо этого использовать один из нескольких удобных методов,
обеспеченных
NdbScanFilter
. См.
здесь.
Сигнатура.
int cmp ( BinaryConditioncondition
, intcolumnId
, const void*value
, Uint32length
= 0 )
Дополнительно в NDB 8.0.18 и позже:
int cmp ( BinaryConditioncondition
, intColumnId1
, intColumnId2
)
Параметры. Когда используется, чтобы сравнить значение с колонкой, этот метод берет следующие параметры:
condition
:
Это представляет условие, которым будет сравнено значение колонки, имеющей
идентификатор столбца ID columnID
с некоторым произвольным значением.
condition
это значение
BinaryCondition
, см.
раздел 2.3.28.2.
Значения condition
COND_LIKE
или
COND_NOTLIKE
используются, чтобы сравнить
значение столбца с образцом последовательности.
columnId
:
Это идентификатор колонки, который может быть получен, используя метод
Column::getColumnNo()
.
value
:
значение, которое будет сравнено, дается как указатель на
void
.
Используя COND_LIKE
или
COND_NOTLIKE
,
value
рассматривается как образец последовательности. Эта последовательность не
должна быть дополнена или использовать префикс. Последовательность
value
может включать метасимволы
образца или wildcard
%
и _
:
Таблица 2.60.
Метасимвол | Описание |
---|---|
% |
Ноль или больше знаков |
_ |
Точно один символ |
Чтобы соответствовать литералам
% или _,
используйте наклонную черту влево (\
)
как символ ESC. Чтобы соответствовать литералу
\, используйте \\
.
Это те же самые подстановочные символы, которые поддерживаются SQL
LIKE
и NOT LIKE
и интерпретируются таким же образом. Посмотрите
String Comparison Functions and Operators.
length
:
Длина значения, которое будет сравнено. Значение по умолчанию
0
. Использование 0
для length
имеет тот же самый эффект как сравнение с NULL
,
это использует метод
isnull()
.
Когда используется, чтобы сравнить две колонки,
cmp()
берет следующие параметры:
condition
:
Условие, которое будет проверено, сравнивая колонки. Условие может быть любым
из BinaryCondition
EQ
, NE
,
LT
, LE
,
GT
или GE
.
Другие значения не приняты.
columnID1
:
ID первого из этих двух столбцов, которые будут сравнены.
columnID1
:
ID второй колонки.
Колонки, сравниваемые, используя этот метод, должны иметь точно тот же самый тип. Это включает длину, точность, масштаб и все другие подробные сведения.
Возвращаемое значение.
Этот метод возвращает integer: 0
при успехе,
-1
при неудаче.
Описание. Это метод конструктора для
NdbScanFilter
и создает новый экземпляр класса.
Сигнатура.
NdbScanFilter
(
class NdbOperation* op
)
Параметры. Этот метод берет единственный параметр, указатель на
NdbOperation
, к которому применяется фильтр.
Возвращаемое значение. Новый экземпляр
NdbScanFilter
.
Деструктор. Деструктор не берет аргументов и не возвращает
значение. Это нужно вызвать, чтобы удалить объект
NdbScanFilter
, когда это больше не нужно.
Описание. Этот метод заканчивает комплекс, сигнализируя, что больше нет условий, которые будут добавлены к нему.
Сигнатура.
int end ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе или
-1
при неудаче.
Описание. Этот метод используется, чтобы выполнить тест на равенство значения столбца и целого числа.
Сигнатура.
int eq ( intColId
, Uint32value
)
или
int eq ( intColId
, Uint64value
)
Параметры.
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым нужно сравнить значение столбца, это целое число может быть 32 бита или 64 бита и в любом случае unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Определяет термин текущей группы как
FALSE
.
Сигнатура.
int isfalse ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы проверить, не является ли
значение столбца NULL
.
Сигнатура.
int isnotnull
(
int ColId
)
Параметры. ID колонки, значение которой должно быть проверено.
Возвращаемое значение.
0
, если столбец не
NULL
.
Описание. Этот метод используется, чтобы проверить, является ли
значение столбца NULL
.
Сигнатура.
int isnull
(
int ColId
)
Параметры. ID колонки, значение которой должно быть проверено.
Возвращаемое значение.
0
, если столбец
NULL
.
Описание. Определяет термин текущей группы как
TRUE
.
Сигнатура.
int istrue ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы выполнить тест больше чем или равно на значении столбца и целом числе.
Сигнатура. Этот метод принимает 32-битные и 64-битные значения:
int ge ( intColId
, Uint32value
) int ge ( intColId
, Uint64value
)
Параметры.
Аналогично
eq()
,
lt()
,
le()
и
другим методам типа
NdbScanFilter
,
этот метод берет два параметра:
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым нужно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и всегда unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание.
Поскольку ошибки, с которыми сталкиваются, строя
NdbScanFilter
не распространяются на вовлеченный объект
to any involved
NdbOperation
, необходимо использовать этот
метод, чтобы получить доступ к информации об ошибке.
Сигнатура.
const NdbError& getNdbError ( void )
Параметры. Нет.
Возвращаемое значение.
Ссылка на
NdbError
.
Описание. Если
NdbScanFilter
был построен с
NdbOperation
,
этот метод может использоваться, чтобы получить указатель на объект
NdbOperation
.
Сигнатура.
NdbOperation* getNdbOperation ( void )
Параметры. Нет.
Возвращаемое значение.
Указатель на
NdbOperation
, связанный с этим
NdbScanFilter
, если он есть, иначе
NULL
.
Описание.
Этот тип используется, чтобы описать логические операторы и используется с
методом begin()
, см.
раздел 2.3.28.1.
Возможные значения.
Таблица 2.61.
Значение | Описание |
---|---|
AND |
Логический AND :
|
OR |
Логический OR :
|
NAND |
Логический NOT AND :
NOT ( |
NOR |
Логический NOT OR : NOT
( |
Описание. Этот метод используется, чтобы выполнить тест больше чем (строгая верхняя граница) на значении столбца и целом числе.
Сигнатура. Этот метод берет значения 32-bit и 64-bit:
int gt ( intColId
, Uint32value
) int gt ( intColId
, Uint64value
)
Параметры.
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым можно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и всегда unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы выполнить тест меньше чем или равно на значении столбца и целом числе.
Сигнатура. У этого метода есть два варианта, чтобы обработать 32-битные и 64-битные значения:
int le ( intColId
, Uint32value
) int le ( intColId
, Uint64value
)
Параметры.
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым нужно сравнить значение столбца, это целое число может составлять 32 бита или 64 бита, в любом случае unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы провести тест меньше (строгая нижняя граница) на значении столбца и целом числе.
Сигнатура.
int lt ( intColId
, Uint32value
) int lt ( intColId
, Uint64value
)
Параметры.
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым можно сравнить значение столбца, это целое число может составлять 32-bit или 64-bit и unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы выполнить тест на неравенство на значении столбца и целом числе.
Сигнатура.
int ne ( intColId
, Uint32value
) int ne ( intColId
, Uint64value
)
Параметры.
ID (ColId
)
колонки, значение которой должно быть проверено
integer с которым нужно сравнить значение столбца, это целое число может составлять 32 бита или 64 бита и unsigned.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Резюме
Эта секция описывает класс NdbScanOperation
и его члены класса.
Родительский класс.
NdbOperation
.
Дочерние классы.
NdbIndexScanOperation
.
Описание.
Класс NdbScanOperation
представляет операцию по просмотру, используемую в транзакции.
Этот класс наследует
NdbOperation
.
Методы.
Таблица 2.62.
Имя | Описание |
---|---|
close() |
Закрывает просмотр |
deleteCurrentTuple() |
Удаляет текущий кортеж |
lockCurrentTuple() |
Блокирует текущий кортеж |
nextResult() |
Получает следующий кортеж |
getNdbTransaction() |
Получает объект
NdbTransaction для этого просмотра |
getPruned() |
Используемый, чтобы узнать, сокращен ли этот просмотр к единственному разделению |
readTuples() |
Читает кортежи |
restart() |
Перезапускает просмотр |
updateCurrentTuple() |
Обновляет текущий кортеж |
У этого класса нет публичного конструктора. Чтобы создать экземпляр
NdbScanOperation
, необходимо использовать
метод
NdbTransaction::getNdbScanOperation()
.
Типы. Этот класс определяет единственный публичный тип
ScanFlag
.
См. разделы 1.3.2.3.3 и 1.3.2.3.4.
Описание. Запрос этого метода закрывает просмотр. Строки, возвращенные этим просмотром, больше недоступны после того, как просмотр был закрыт, используя этот метод.
См. здесь для получения информации о многократных потоках, пытающихся выполнить тот же самый просмотр с монопольной блокировкой и как это может затронуть закрытие просмотров.
Сигнатура.
void close ( boolforceSend
= false, boolreleaseOp
= false )
Параметры.
forceSend
по умолчанию
false
, вызывает
close()
с этим параметром =
true
, чтобы вынудить
транзакции быть посланными.
releaseOp
по умолчанию
false
, установите это в
true
, чтобы выпустить операцию.
До NDB 7.2.19 и NDB 7.3.8 буфер, ассигнованный
NdbScanOperation
для получения просмотренных строк не был
освобожден до закрытия
NdbTransaction
, владеющего операцией по
просмотру (Bug #75128, Bug #20166585). В этих и последующих версиях кластера
NDB буфер освобожден каждый раз, когда курсор, работающий с набором
результатов, закрывается, используя метод
close()
, независимо от значения
releaseOp
.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы удалить текущий кортеж.
Сигнатура.
const NdbOperation* deleteCurrentTuple ( NdbTransaction*takeOverTrans
, const NdbRecord*record
, char*row
= 0, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOpts
= 0 )
См. раздел 2.3.27.
Параметры. Когда используется с интерфейсом
NdbRecord
, этот метод берет параметры, перечисленные здесь:
Транзакция (takeOverTrans
), которая должна выполнить блокировку, используя
NdbRecord
с просмотрами, этот параметр не дополнительный.
NdbRecord
, ссылающийся на просмотр. Это значение
record
требуется, даже если никакие записи не читаются.
Строка row
из которой можно читать. Установите это в NULL
,
если чтение не планируется.
Дополнительный указатель mask
. Если это присутствует, то просматриваются только колонки, для которых
установлен соответствующий бит в маске.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный контроль
операционных определений. Структура
OperationOptions
передается с флагами, указывающими, какие операционные варианты определения
присутствуют. Не все операционные типы поддерживают все операционные
варианты. Опции, поддержанные для каждого типа операции,
показываются в следующей таблице:
Таблица 2.63.
Операционный тип (метод) | Поддержанные флаги
OperationOptions |
---|---|
readTuple() |
OO_ABORTOPTION ,
OO_GETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED |
insertTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_ANYVALUE |
updateTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED ,
OO_ANYVALUE |
writeTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_ANYVALUE |
deleteTuple() |
OO_ABORTOPTION ,
OO_GETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED ,
OO_ANYVALUE |
Дополнительный параметр sizeOfOptions
используется, чтобы сохранить обратную совместимость этого
взаимодействия с предыдущими определениями структуры
OperationOptions
. Если необычный размер обнаружен интерфейсным
внедрением, он может использовать это, чтобы определить, как интерпретировать
переданную структуру
OperationOptions
.
Чтобы позволить эту функциональность, вызывающий должен передать
sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Если варианты определяются, их длина
(sizeOfOpts
)
должна быть определена также.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Получает объект
NdbTransaction
для этого просмотра.
Сигнатура.
NdbTransaction* getNdbTransaction ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на объект
NdbTransaction
.
Описание. Этот метод используется, чтобы определить, была ли данная
операция по просмотру сокращена к единственному разделению. Для просмотров,
определенных, используя
NdbRecord
,
getPruned()
действительно только после того, как просмотр был выполнен.
Сигнатура.
bool getPruned ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если просмотр сокращен к
единственному разделению таблицы.
Описание. Этот метод блокирует текущий кортеж.
Сигнатура. В MySQL 5.1 и позже этот метод можно вызвать с дополнительным единственным параметром любым из этих двух способов:
NdbOperation* lockCurrentTuple
(
void
)
NdbOperation* lockCurrentTuple
(
NdbTransaction* lockTrans
)
Следующая сигнатура также поддерживается для этого метода, используя
NdbRecord
:
NdbOperation *lockCurrentTuple ( NdbTransaction*takeOverTrans
, const NdbRecord*record
, char*row
= 0, const unsigned char*mask
= 0 )
Этот метод также поддерживает определение одного или более
OperationOptions
(также используя
NdbRecord
):
NdbOperation *lockCurrentTuple ( NdbTransaction*takeOverTrans
, const NdbRecord*record
, char*row
= 0, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры (старый стиль). Этот метод берет единственный дополнительный параметр: транзакцию, которая должна выполнить блокировку. Если это опущено, транзакция текущая.
Параметры (используя NdbRecord).
Используя интерфейс
NdbRecord
, этот метод берет эти параметры, как
описано в следующем списке:
Транзакция (takeOverTrans
), которая должна выполнить блокировку, используя
NdbRecord
с просмотрами, этот параметр не дополнительный.
NdbRecord
, ссылающийся на просмотр. Это требуется, даже если никакие
записи не читаются.
Строка row
из которой
читать. Если чтение не планируется, установите в
NULL
.
Указатель mask
дополнительный. Если это присутствует, то просматриваются только колонки,
для которых установлен соответствующий бит в маске.
opts
может взять любое значение из следующих
OperationOptions
:
OO_ABORTOPTION
,
OO_GETVALUE
и
OO_ANYVALUE
.
Если варианты определяются, их длина
(sizeOfOptions
)
должна быть определена также.
Возвращаемое значение. Этот метод возвращает указатель на объект
NdbOperation
или NULL
.
Описание. Этот метод используется, чтобы получить следующий кортеж
в транзакции просмотра. После каждого вызова
nextResult()
, буферы и объекты
NdbRecAttr
, определенные в
NdbOperation::getValue()
,
обновляются с значениями от просмотренного кортежа.
До NDB 7.2.7:
Когда приложение API NDB вызвало этот метод снова после того, как предыдущий
вызов возвратил конец файла (код возврата 1), операционный объект был
потерян и NDB возвращал -1 (неопределенный) (Bug #11748194).
Теперь: Когда
nextResult()
выполняется после конца файла,
NDB
вернет код ошибки 4210
(Ndb sent more info than length specified)
и дополнительный операционный объект освобожден, возвратив его к
неработающему списку для правильного узла TC.
Сигнатура. Этот метод может быть вызван одним из двух способов. Первый доступен с MySQL 5.1:
int nextResult ( boolfetchAllowed
= true, boolforceSend
= false )
Также возможно использовать этот метод как показано здесь:
int nextResult ( const char*&outRow
, boolfetchAllowed
= true, boolforceSend
= false )
Параметры (версия с 2 параметрами). Этот метод берет следующие два параметра:
Обычно API NDB связывается с ядром
NDB
для большего количества кортежей каждый раз,
когда это необходимо, установка fetchAllowed
= false
мешает этому происходить.
Выключение fetchAllowed
установкой в false
предписывает
NDB
обработать любые записи, которые это уже
имеет в своих кэшах. Ккогда там больше ничего нет, это возвращает
2
. Необходимо тогда вызвать
nextResult()
с
fetchAllowed
=
true
, чтобы связаться с
NDB
для большего количества записей.
Пока nextResult(false)
возвращает
0
, необходимо передать запись другой транзакции,
используя
execute(NdbTransaction::NoCommit)
.
Когда nextResult(false)
возвращает
2
, необходимо обычно выполнять и передавать
другую транзакцию. Это заставляет передать любые блокировки
другой транзакции, сделать обновления или удаления, а затем снять блокировки.
После этого можно вызвать nextResult(true)
,
чтобы иметь больше записей, полученных и кэшированных в NDB API.
Если вы не передадите записи другой транзакции, блокировки на них будут
выпущены в следующий раз, когда с ядром NDB
связываются для большего количества записей.
Выключение fetchAllowed
может быть полезным, когда вы хотите обновить или удалить все записи,
полученные в данной транзакции, поскольку выполнение этого экономит время и
ускоряет обновления или удаления отсканированных записей.
forceSend
по умолчанию
false
и может обычно опускаться. Однако,
установка этого параметра в true
указывает,
которые транзакции немедленно посылают. Посмотрите
раздел 1.3.4.
Параметры (версия с 3 параметрами). Этот метод можно также вызвать со следующими тремя параметрами:
Вызов nextResult()
устанавливает указатель на следующую строку в
outRow
(если возвращает 0).
Этот указатель действителен (только) до следующего вызова
nextResult()
, когда
fetchAllowed
= true.
Объект NdbRecord
, определяющий формат строки, должен быть определен заранее,
используя
NdbTransaction::scanTable()
(или
NdbTransaction::scanIndex()
.
Когда false, fetchAllowed
предписывает NDB
обработать любые записи,
которые это уже имеет в его кэшах. См. описание для этого
параметра в предыдущем подразделе.
Установка forceSend
=
true
указывает, которые транзакции немедленно
посылают, как описано в предыдущем подразделе
раздела 1.3.4.
Возвращаемое значение. Этот метод возвращает одно из следующих 4 integer, интерпретируемых как показано в следующем списке:
-1
:
Указывает, что ошибка произошла.
0
: Другой кортеж был получен.
1
:
Больше нет кортежей, чтобы просмотреть.
2
: Больше нет кэшированных записей
(вызовите nextResult(true)
, чтобы получить еще).
Пример. См. раздел 2.5.4.
Описание. Этот метод используется, чтобы выполнить просмотр.
Сигнатура.
virtual int readTuples ( LockModemode
= LM_Read, Uint32flags
= 0, Uint32parallel
= 0, Uint32batch
= 0 )
Параметры.
Режим блокировки mode
,
это значение
LockMode
.
Просмотры с монопольными блокировками.
Просматривая с монопольной блокировкой, нужно соблюдать аккуратность
вследствие того, что, если два потока выполняют этот просмотр одновременно в
том же самом диапазоне, то есть значительная вероятность порождения мертвой
блокировки. Вероятность мертвой блокировки увеличена, если просмотр также
упорядочен (то есть, используя SF_OrderBy
или
SF_Descending
).
Метод
NdbScanOperation::close()
также затронут этой мертвой блокировкой, так как все выдающиеся запросы
обслуживаются, прежде чем просмотр на самом деле закрывается.
Одно или более значений ScanFlag
.
Многократные значения соединяются OR
.
Количество фрагментов, чтобы просмотреть в
parallel
,
0
означает максимальное возможное число,
которое будет использоваться.
Параметр batch
определяет, сколько записей будет возвращено клиенту от сервера следующим
NdbScanOperation::nextResult(true)
.
0
предписывает
определить максимум автоматически.
Этот параметр был проигнорирован до MySQL 5.1.12, использовался максимум (Bug #20252).
Возвращаемое значение.
0
при успехе,
-1
при ошибке.
Описание. Используйте этот метод, чтобы перезапустить просмотр, не
изменяя ни одного из вызовов getValue()
или условий поиска.
Сигнатура.
int restart
(
bool forceSend
= false
)
Параметры. Вызовите этот метод с
forceSend
=
true
, чтобы вынудить
транзакцию быть посланной.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Значения этого типа флаги просмотра, используемые с
методом readTuples()
.
Больше чем один может использоваться, в этом случае, они объединены
OR
как второй аргумент метода. Посмотрите
раздел 2.3.29.7.
Возможные значения.
Таблица 2.64.
Значение | Описание |
---|---|
SF_TupScan |
Просмотр в порядке TUP (то есть, в порядке строк в памяти). Относится только к сканированию таблицы. |
SF_DiskScan |
Просмотр в дисковом порядке (порядок строк на диске). Относится только к сканированию таблицы. |
SF_OrderBy |
Упорядоченный просмотр индекса (возрастание), строки, возвращенные из просмотра индекса, сортированы по ключу индекса. Просмотры в порядке по возрастанию или в порядке по убыванию затронуты этим флагом, который заставляет API выполнять сортировку слиянием среди упорядоченных просмотров каждого фрагмента, чтобы получить единственный сортированный набор результатов. Примечания:
|
SF_OrderByFull |
Аналог SF_OrderBy за исключением того, что
все столбцы ключа добавляются автоматически к битовой маске чтения. |
SF_Descending |
Заставляет упорядоченный просмотр индекса быть выполненным в порядке убывания. |
SF_ReadRangeNo |
Для просмотров индекса, когда этот флаг установлен,
NdbIndexScanOperation::get_range_no()
может быть вызван, чтобы читать назад range_no ,
определенный в
NdbIndexScanOperation::setBound() .
Кроме того, когда этот флаг установлен, и
SF_OrderBy или
SF_OrderByFull
также установлен, результаты из диапазонов, возвращены в их полноте, прежде
чем любые результаты будут возвращены из поддиапазонов. |
SF_MultiRange |
Указывает, что этот просмотр это часть просмотра мультидиапазона, каждый диапазон просматривается отдельно. |
SF_KeyInfo |
Предписывает передать обратно KeyInfo .
Это позволяет опции принять блокировку строки, взятую просмотром, используя
lockCurrentTuple() ,
удостоверяясь то, что ядро передает информацию обратно, чтобы определить
строку и блоикировку. Этот флаг позволен по умолчанию для использования
просмотров LM_Exclusive ,
но должен быть явно определен, чтобы позволить блокировки
LM_Read . См.
LockMode . |
Описание. Этот метод используется, чтобы обновить текущий кортеж.
Сигнатура. Первоначально, этот метод можно было вызвать с одним дополнительным параметром, любым из способов, показанных здесь:
NdbOperation* updateCurrentTuple
(
void
)
NdbOperation* updateCurrentTuple
(
NdbTransaction* updateTrans
)
Также возможно использовать этот метод, используя
NdbRecord
с просмотрами:
NdbOperation* updateCurrentTuple ( NdbTransaction*takeOverTrans
, const NdbRecord*record
, const char*row
, const unsigned char*mask
= 0 )
См. раздел 2.3.27.
(Оригинальные) параметры. Этот метод берет единственный дополнительный параметр: транзакцию, которая должна выполнить блокировку. Если это опущено, транзакция текущая.
Параметры (используя NdbRecord).
Используя интерфейс
NdbRecord
,
этот метод берет следующие параметры, как описано в следующем списке:
Транзакция (takeOverTrans
).
Запись record
(объект
NdbRecord
), ссылка на колонку используется для просмотра.
Строка для чтения row
.
Если никакие признаки не должны быть прочитаны, установите это в
NULL
.
Указатель mask
дополнительный. Если это присутствует, то читаются только колонки, для
которых установлен соответствующий бит в маске.
Возвращаемое значение. Этот метод возвращает объект
NdbOperation
или NULL
.
Резюме
Эта секция описывает класс NdbTransaction
и его публичные члены.
Родительский класс. Нет.
Дочерние классы. Нет.
Описание. Транзакция представляется в API NDB объектом
NdbTransaction
, который принадлежит объекту
Ndb
и создается, используя
Ndb::startTransaction()
.
Транзакция состоит из списка операций, представленных классом
NdbOperation
или одним из его подклассов:
NdbScanOperation
,
NdbIndexOperation
или
NdbIndexScanOperation
.
Каждый операционный доступ обрабатывает точно одну таблицу.
Используя транзакции. После получения объекта
NdbTransaction
это используется следующим образом:
Операция ассигнуется транзакцией, используя любой из следующих методов:
getNdbOperation()
getNdbScanOperation()
getNdbIndexOperation()
getNdbIndexScanOperation()
Запрос одного из этих методов определяет операцию. Несколько операций
могут быть определены на том же самом объекте
NdbTransaction
,
в этом случае они выполняются параллельно. Когда все операции определяются,
метод
execute()
посылает их в ядро
NDB
на выполнение.
Метод
execute()
возвращается когда ядро
NDB
закончило выполнение всех
ранее определенных операций.
Все ассигнованные операции должны быть правильно определены
до вызова метода
execute()
.
execute()
работает в одном из этих трех режимов:
NdbTransaction::NoCommit
:
Выполняет операции, не передавая их.
NdbTransaction::Commit
: Выполняет любую
остающуюся операцию и затем передает завершенную транзакцию.
NdbTransaction::Rollback
:
Отменяет всю транзакцию.
execute()
также оборудован дополнительным параметром обработки ошибок,
который обеспечивает эти две альтернативы:
NdbOperation::AbortOnError
:
Любая ошибка заставляет транзакцию быть прерванной.
Это поведение по умолчанию.
NdbOperation::AO_IgnoreError
:
Транзакция продолжает выполняться, даже если одна или больше операций,
определенных для той транзакции, терпит неудачу.
В MySQL 5.1.15 и ранее, эти значения были
NdbTransaction::AbortOnError
и
NdbTransaction::AO_IgnoreError
.
Методы.
Таблица 2.65.
Имя | Описание |
---|---|
close() |
Закрывает транзакцию |
commitStatus() |
Получает статус передачи транзакции |
deleteTuple() |
Удалите кортеж, используя
NdbRecord |
execute() |
Выполняет транзакцию |
executePendingBlobOps() |
Выполняет транзакцию в режиме NoCommit , если
это включает какие-либо операции по части blob
указанных типов, которые еще не выполняются |
getGCI() |
Получает ID глобальной контрольной точки (GCI) транзакции |
getMaxPendingBlobReadBytes() |
Получает текущий пакетный размер чтения
BLOB |
getMaxPendingBlobWriteBytes() |
Получает текущий пакетный размер записи
BLOB |
getNdbError() |
Получает новую ошибку |
getNdbErrorLine() |
Получает номер строки, где новая ошибка произошла |
getNdbErrorOperation() |
Получает новую операцию, которая вызвала ошибку |
getNextCompletedOperation() |
Получает операции, которые были выполнены, используется для нахождения ошибок |
getNdbOperation() |
Получает
NdbOperation |
getNdbScanOperation() |
Получает
NdbScanOperation |
getNdbIndexOperation() |
Получает
NdbIndexOperation |
getNdbIndexScanOperation() |
Получает
NdbIndexScanOperation |
getTransactionId() |
Получает ID транзакции |
insertTuple() |
Вставьте кортеж, используя
NdbRecord |
readTuple() |
Прочитайте кортеж, используя
NdbRecord |
refresh() |
Защищает транзакцию от тайм-аута |
releaseLockHandle() |
Освободите объект NdbLockHandle
как только это больше не нужно |
scanIndex() |
Выполните просмотр индекса, используя
NdbRecord |
scanTable() |
Выполните просмотр таблицы, используя
NdbRecord |
setMaxPendingBlobReadBytes() |
Установить размер пакета чтения
BLOB |
setMaxPendingBlobWriteBytes() |
Установить размер пакета записи
BLOB |
setSchemaObjectOwnerChecks() |
Включить или отключить проверку собственности объекта схемы |
unlock() |
Создайте операцию разблокировки на текущей транзакции |
updateTuple() |
Обновите кортеж, используя
NdbRecord |
writeTuple() |
Записать кортеж, используя
NdbRecord |
Методы
readTuple()
,
insertTuple()
,
updateTuple()
,
writeTuple()
,
deleteTuple()
,
scanTable()
и
scanIndex()
требуют использования
NdbRecord
.
Типы.
NdbTransaction
определяет 2 публичных типа:
Таблица 2.66.
Имя | Описание |
---|---|
CommitStatusType() |
Описывает статус передачи транзакции |
ExecType() |
Определяет, должна ли транзакция быть передана или отменена |
Описание.
Этот метод закрывает транзакцию. Это эквивалентно запросу
Ndb::closeTransaction()
.
Если транзакция еще не была передана, она прерывается, когда этот метод вызывают. Посмотрите раздел 2.3.16.35.
Сигнатура.
void close ( void )
Параметры. Нет.
Возвращаемое значение. Нет.
Описание. Этот метод получает статус передачи транзакции.
Сигнатура.
CommitStatusType commitStatus ( void )
Параметры. Нет.
Возвращаемое значение.
Значение CommitStatusType
, см.
раздел 2.3.30.3.
Описание. Этот тип используется, чтобы описать статус передачи транзакции.
Возможные значения.
Таблица 2.67.
Имя | Описание |
---|---|
NotStarted |
Транзакция еще не была начата. |
Started |
Транзакция началась, но еще не передается. |
Committed |
Транзакция закончилась и была передана. |
Aborted |
Транзакция была прервана. |
NeedAbort |
Транзакция столкнулась с ошибкой, но еще не была прервана. |
Статус передачи транзакции можно прочитать с помощью метода
commitStatus()
, см.
раздел 2.3.30.2.
Описание. Удаляет кортеж с использованием
NdbRecord
.
Сигнатура.
const NdbOperation* deleteTuple ( const NdbRecord*key_rec
, const char*key_row
, const NdbRecord*result_rec
, char*result_row
, const unsigned char*result_mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры.
key_rec
указатель на
NdbRecord
для таблицы или для индекса. Если на таблицу, то
операция использует первичный ключ, если на индекс, то операция использует
уникальный ключ. В любом случае key_rec
должен включать все колонки ключа.
key_row
переданный к этому методу определяет первичный или уникальный ключ кортежа,
который будет удален и должен остаться действительным до вызова
execute()
.
result_rec
это используемый
NdbRecord
.
result_row
может быть
NULL
, если никакие признаки не
должны быть возвращены.
result_mask
, если не
NULL
, определяет подмножество признаков, которые
будут прочитаны и возвращены клиенту. Маска копируется и не должна оставаться
действительной после вызова этого метода.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный контроль операционных
определений. Структура
OperationOptions
передается с флагами,
указывающими, какие операционные варианты определения присутствуют. Не все
операционные типы поддерживают все операционные варианты, для перечня
вариантов, поддержанных каждым типом операции, посмотрите
раздел 2.3.30.21.
Дополнительный параметр sizeOfOptions
предоставляет обратную совместимость этого взаимодействия с
предыдущими определениями структуры
OperationOptions
.
Если необычный размер обнаружен интерфейсным внедрением, он может
использовать это, чтобы определить, как интерпретировать переданную структуру
OperationOptions
. Чтобы позволить эту функциональность, вызывающий
должен передать sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Возвращаемое значение. const
указатель на
NdbOperation
представление этой операции записи.
Операция может быть проверена при необходимости.
Описание. Этот тип устанавливает тип выполнения транзакции, то
есть, должно ли это выполнить, выполнить и передать или аварийно завершить
работу. Это применяется в качестве параметра метода
execute()
, см.
раздел 2.3.30.6.
Возможные значения.
Таблица 2.68.
Имя | Описание |
---|---|
NoCommit |
Транзакция должна выполнить, но не передать. |
Commit |
Транзакция должна выполнить и быть передана. |
Rollback |
Транзакция должна быть отменена. |
Описание. Этот метод используется, чтобы выполнить транзакцию.
Сигнатура.
int execute ( ExecTypeexecType
, NdbOperation::AbortOptionabortOption
= NdbOperation::DefaultAbortOption, intforce
= 0 )
Параметры.
Тип выполнения (ExecType
), см.
раздел 2.3.30.5.
Выбор аварийного прекращения работы
(
NdbOperation::AbortOption
).
Ошибки, являющиеся результатом этого метода, найдены с
NdbOperation::getNdbError()
, а не с
NdbTransaction::getNdbError()
.
Параметр force
,
который определяет, когда операции нужно послать в ядро
NDB
. Возможные значения:
0
: Обнаружить адаптивным алгоритмом.
1
:
Принудительно, определить адаптивным алгоритмом.
2
: Не принудительно, не
определять адаптивным алгоритмом.
См. раздел 1.3.4.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
То, что транзакция не прерывалась, не обязательно означает, что каждая
операция была успешна, необходимо проверить каждую операцию
индивидуально на ошибки.
В MySQL 5.1.15 и более ранних версиях этот метод вернет
-1
для некоторых ошибок, даже когда сама
транзакция не была прервана. Начиная с MySQL 5.1.16, этот метод сообщает о
неудаче если и только если
транзакция была прервана. Это изменение было внесено из-за того, что было
возможно построить случаи, где не было никакого способа определить, была ли
транзакция на самом деле прервана. Однако, информация об ошибке транзакции
все еще пытается в таких случаях отразить фактический код ошибки и категорию.
Это означает в случае, где ошибка NoDataFound возможна, необходимо теперь проверить на нее явно, как показано в этом примере:
Ndb_cluster_connection myConnection; if (myConnection.connect(4, 5, 1)) { cout << "Unable to connect to cluster within 30 secs." << endl; exit(-1); } Ndb myNdb(&myConnection, "test"); //define operations... myTransaction = myNdb->startTransaction(); if (myTransaction->getNdbError().classification == NdbError:NoDataFound) { cout << "No records found." << endl; //... } myNdb->closeTransaction(myTransaction);
Описание. Этот метод выполняет транзакцию с
ExecType
=NoCommit
, если там остаются какими-либо операциями по части blob
данных типов, которые еще не были выполнены.
Сигнатура.
int executePendingBlobOps
(
Uint8 flags
= 0xFF
)
Параметры.
flags
результат побитового
OR
, равный
1 <<
, где
optype
optype
это
NdbOperation::Type
. Умолчание соответствует
PrimaryKeyAccess
.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
То, что транзакция не прерывалась, не обязательно означает, что каждая
операция была успешна, необходимо проверить каждую операцию
индивидуально на ошибки.
Описание. Этот метод получает ID глобальной контрольной точки (GCI) транзакции.
Каждая переданная транзакция принадлежит GCI. Регистрация для переданной транзакции сохранена яна диске, когда глобальная контрольная точка происходит.
Сравнивая GCI транзакции с значением последнего GCI в перезапущенном NDB Cluster, можно определить, была ли транзакция восстановлена.
Была ли глобальная контрольная точка с этим GCI сохранена на диске, не может быть определено этим методом.
GCI для транзакции просмотра не определен, так как никакие обновления не выполняются в транзакциях просмотра.
Сигнатура.
int getGCI ( void )
Параметры. Нет.
Возвращаемое значение. GCI транзакции или
-1
, если ни один недоступен.
Никакой GCI не доступен до execute()
с ExecType::Commit
.
Описание. Получает текущий пакетный размер в байтах для операций
чтения BLOB
. Когда объем данных
volume of BLOB
,
которые будут прочитаны в данной транзакции, превышает этот размер, все
операции чтения в транзакции выполняются.
Сигнатура.
Uint32 getMaxPendingBlobReadBytes ( void ) const
Параметры. Нет.
Возвращаемое значение. Текущий пакетный размер в байтах. См. раздел 2.3.30.26.
Описание. Получает текущий пакетный размер в байтах для
операции записи BLOB
. Когда объем данных
BLOB
, которые будут написаны в
данной транзакции, превышает это значение, все операции
записи в транзакции выполняются.
Сигнатура.
Uint32 getMaxPendingBlobWriteBytes ( void ) const
Параметры. Нет.
Возвращаемое значение. Текущий пакетный размер в байтах. Посмотрите раздел 2.3.30.27.
Описание. Этот метод используется, чтобы получить новую ошибку
(NdbError
).
Сигнатура.
const NdbError& getNdbError ( void ) const
Параметры. Нет.
Возвращаемое значение.
Ссылка на объект
NdbError
.
См. раздел 1.3.2.3.6.
Описание. Этот метод возвращает номер строки, где новая ошибка произошла.
Сигнатура.
int getNdbErrorLine ( void )
Параметры. Нет.
Возвращаемое значение. Номер строки новой ошибки.
Для получения дополнительной информации об ошибках из-за неправильного обращения в транзакциях посмотрите раздел 1.3.2.3.6.
Описание. Этот метод получает операцию, которая вызвала ошибку.
Чтобы получить больше информации о фактической ошибке, используйте
метод
NdbOperation::getNdbError()
объекта
NdbOperation
, возвращенного
getNdbErrorOperation()
.
Сигнатура.
NdbOperation* getNdbErrorOperation ( void )
Параметры. Нет.
Возвращаемое значение.
Указатель на
NdbOperation
.
Для получения дополнительной информации об ошибках из-за неправильного обращения в транзакциях посмотрите раздел 1.3.2.3.6.
Описание. Этот метод используется, чтобы создать
NdbIndexOperation
,
связанный с данной таблицей.
Все операции по индексу в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.
Сигнатура.
NdbIndexOperation* getNdbIndexOperation
(
const NdbDictionary::Index* index
)
Параметры. Объект
Index
, на котором должна
быть выполнена операция.
Возвращаемое значение. Указатель на новый
NdbIndexOperation
.
Описание. Этот метод используется, чтобы создать
NdbIndexScanOperation
,
связанный с данной таблицей.
Все операции по просмотру индекса в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.
Сигнатура.
NdbIndexScanOperation* getNdbIndexScanOperation
(
const NdbDictionary::Index* index
)
Параметры.
Объект Index
,
на котором должна быть выполнена операция.
Возвращаемое значение. Указатель на новый
NdbIndexScanOperation
.
Описание. Этот метод используется, чтобы создать
NdbOperation
, связанный с данной таблицей.
Все операции в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.
Сигнатура.
NdbOperation* getNdbOperation
(
const NdbDictionary::Table* table
)
Параметры.
Объект Table
,
на котором должна быть выполнена операция.
Возвращаемое значение. Указатель на новый
NdbOperation
.
Описание. Этот метод используется, чтобы создать
NdbScanOperation
, связанный с данной таблицей.
Все операции по просмотру в той же самой транзакции должны быть инициализированы с этим методом. Операции должны быть определены, прежде чем они будут выполнены.
Сигнатура.
NdbScanOperation* getNdbScanOperation
(
const NdbDictionary::Table* table
)
Параметры. Объект
Table
, на котором должна
быть выполнена операция.
Возвращаемое значение. Указатель на новый
NdbScanOperation
.
Описание. Этот метод используется, чтобы получить законченные действия транзакции. Это, как правило, используется, чтобы получить все операции, принадлежащие данной транзакции, чтобы проверить ошибки.
NdbTransaction::getNextCompletedOperation(NULL)
возвращает транзакции первого объекта
NdbOperation
,
NdbTransaction::getNextCompletedOperation(
возвращает объект
myOp
)NdbOperation
, определенный после
NdbOperation
myOp
.
Этот метод должен использоваться только после того, как транзакция была выполнена, но прежде чем транзакция была закрыта.
Сигнатура.
const NdbOperation* getNextCompletedOperation
(
const NdbOperation* op
) const
Параметры. Этот метод требует единственный параметр
op
, который является операцией
(объект
NdbOperation
) или NULL
.
Возвращаемое значение.
Операция после op
или первая операция, определенная для транзакции, если
getNextCompletedOperation()
был вызван,
используя NULL
.
Описание. Этот метод используется, чтобы получить ID транзакции.
Сигнатура.
Uint64 getTransactionId ( void )
Параметры. Нет.
Возвращаемое значение. ID транзакции как unsigned 64-bit integer.
Описание. Вставляет кортеж с использованием
NdbRecord
.
Сигнатура.
const NdbOperation* insertTuple ( const NdbRecord*key_rec
, const char*key_row
, const NdbRecord*attr_rec
, const char*attr_row
, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
const NdbOperation* insertTuple ( const NdbRecord*combined_rec
, const char*combined_row
, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры.
Указатель на
NdbRecord
, показывающий запись
(key_rec
) для вставки.
Строка (key_row
)
данных, которые будут вставлены.
Указатель на
NdbRecord
с признаком
(attr_rec
) для вставки.
Строка (attr_row
)
данных, которые будут вставлены как признак.
Маска mask
, которая может
использоваться, чтобы отфильтровать колонки, которые будут вставлены.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный
контроль операционных определений. Структура
OperationOptions
передается с флагами, указывающими, какие
операционные варианты определения присутствуют. Не все операционные типы
поддерживают все операционные варианты, для перечня вариантов, поддержанных
каждым типом операции, посмотрите
раздел
2.3.30.21.
Дополнительный параметр sizeOfOptions
используется, чтобы сохранить обратную совместимость этого
взаимодействия с предыдущими определениями структуры
OperationOptions
. Если необычный размер обнаружен интерфейсным
внедрением, он может использовать это, чтобы определить, как интерпретировать
переданную структуру
OperationOptions
.
Чтобы позволить эту функциональность, вызывающий должен передать
sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Этот метод можно также вызвать, используя одиночный указатель
NdbRecord
и одиночный char
(combined_rec
,
combined_row
), где
NdbRecord
представляет признак и данные.
Возвращаемое значение.
const
указатель на
NdbOperation
представление этой операции по вставке.
Описание. Этот метод читает кортеж с использованием объектов
NdbRecord
.
Сигнатура.
const NdbOperation* readTuple ( const NdbRecord*key_rec
, const char*key_row
, const NdbRecord*result_rec
, char*result_row
, NdbOperation::LockModelock_mode
= NdbOperation::LM_Read, const unsigned char*result_mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры.
key_rec
указатель на
NdbRecord
для таблицы или для индекса. Если на таблицу, то операция использует
первичный ключ, если на индекс, то операция использует уникальный ключ.
В любом случае key_rec
должен включать все колонки ключа.
key_row
переданный этому методу определяет первичный или уникальный ключ затронутого
кортежа и должен остаться действительным до
execute()
.
Маска, если не NULL
,
определяет подмножество признаков, чтобы прочитать, обновить или вставить.
Только если (mask[
установлена, обрабатывается столбец.
Маска копируется методами, так что не должна оставаться
действительной после вызова.attrId
>> 3] & (1<<(
attrId
& 7)))
result_rec
указатель на
NdbRecord
используемый, чтобы хранить результат.
result_row
определяет буфер для данных о результате.
lock_mode
определяет способ блокировки для операции. Посмотрите
раздел 2.3.25.15.
result_mask
определяет подмножество признаков, чтобы читать. Только если
mask[attrId >> 3]
& (1<<(attrId & 7))
установлены читается весь столбец.
Маска копируется и не должна оставаться действительной после вызова метода.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный
контроль операционных определений.
Структура
OperationOptions
передается с флагами, указывающими, какие
операционные варианты определения присутствуют. Не все операционные типы
поддерживают все операционные варианты, опции, поддержанные для каждого типа
операции, показываются в следующей таблице:
Таблица 2.69.
Операционный тип (метод) | Поддержанные флаги
OperationOptions |
---|---|
readTuple() |
OO_ABORTOPTION ,
OO_GETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED |
insertTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_ANYVALUE |
updateTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED ,
OO_ANYVALUE |
writeTuple() |
OO_ABORTOPTION ,
OO_SETVALUE ,
OO_PARTITION_ID ,
OO_ANYVALUE |
deleteTuple() |
OO_ABORTOPTION ,
OO_GETVALUE ,
OO_PARTITION_ID ,
OO_INTERPRETED ,
OO_ANYVALUE |
Дополнительный параметр sizeOfOptions
используется, чтобы сохранить обратную совместимость этого
взаимодействия с предыдущими определениями структуры
OperationOptions
.
Если необычный размер обнаружен интерфейсным внедрением, он может
использовать это, чтобы определить, как интерпретировать переданную
структуру
OperationOptions
.
Чтобы позволить эту функциональность, надо передать
sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Возвращаемое значение.
Указатель на
NdbOperation
представление этой операции
чтения (это может использоваться, чтобы проверить ошибки).
Описание. Этот метод обновляет тайм-аут транзакции и таким образом избегает прерывания из-за тайм-аута транзакции.
Нежелательно взять блокировку на записи и поддержать ее в течение расширенного времени, так как это может повлиять на другие транзакции.
Сигнатура.
int refresh ( void )
Параметры. Нет.
Возвращаемое значение.
0
при успехе,
-1
при неудаче.
Описание. Этот метод используется, чтобы выпустить обработчик
блокировки (см. раздел
2.3.25.5), когда это больше не требуется. Для
NdbRecord
операции чтения первичного ключа это нельзя вызвать, пока связанная операция
чтения не была выполнена.
Все обработчики блокировки, связанные с данной транзакцией, сняты, когда транзакция закрыта.
Сигнатура.
int releaseLockHandle
(
const NdbLockHandle* lockHandle
)
Параметры.
Объект NdbLockHandle
для освобождения.
Возвращаемое значение. 0 при успехе.
Описание. Выполните просмотр диапазона индекса таблицы с необязательным упорядочиванием.
Сигнатура.
NdbIndexScanOperation* scanIndex ( const NdbRecord*key_record
, const NdbRecord*result_record
, NdbOperation::LockModelock_mode
= NdbOperation::LM_Read, const unsigned char*result_mask
= 0, const NdbIndexScanOperation::IndexBound*bound
= 0, const NdbScanOperation::ScanOptions*options
= 0, Uint32sizeOfOptions
= 0 )
Параметры. key_record
описывает индекс, который будет просмотрен. Это должна быть запись ключа для
индекса, то есть, это должно определить, как минимум, все столбцы ключа
индекса. key_record
должен быть
создан из индекса, который будет просмотрен (а не из базовой таблицы).
result_record
описывает строки, которые будут возвращены из просмотра.
Для упорядоченного просмотра индекса
result_record
должна быть записью ключа для индекса, который будет просмотрен, то есть это
должно включать (как минимум) все колонки в индексе (полный ключ индекса
необходим API NDB для сортировки упорядоченных строк, возвращенных
из каждого фрагмента).
Подобно key_record
,
result_record должен быть создан из базовой таблицы, а не из индекса, который
будет просмотрен. Оба key_record
и
result_record
структуры
NdbRecord
должны остаться на месте, пока операция по просмотру не закрывается.
IndexBound
может быть определен или в этом запросе или в отдельном запросе
NdbIndexScanOperation::setBound()
.
Чтобы выполнить мультидиапазонное чтение,
scan_flags
в структуре
ScanOptions
должно включать SF_MULTIRANGE
.
Дополнительные границы могут быть добавлены, используя последовательные
вызовы
NdbIndexScanOperation::setBound()
.
Чтобы определить равенство связанному, используйте тот же самый указатель
строки для low_key
и
high_key
с установленными низким и высоким битами.
Чтобы определить дополнительные опции, передайте структуру
ScanOptions
.
sizeOfOptions
существует, чтобы позволить обратную совместимость для этого интерфейса.
Этот параметр указывает на размер структуры
ScanOptions
во время сборки клиента и позволяет обнаружение использования в
старинном стиле структуры
ScanOptions
. Если эта функциональность не
требуется, этот аргумент можно оставить установленным в 0.
Для просмотров мультидиапазона указатели
low_key
и high_key
должны быть уникальными. Другими словами, недопустимо снова использовать тот
же самый буфер строк для нескольких различных границ диапазона в рамках
единственного просмотра. Однако допустимо использовать тот же самый указатель
строки как low_key
и
high_key
, чтобы определить
равенство границ, также допустимо снова использовать строки после вызова
scanIndex()
то есть, они не должны оставаться
действительными до
execute()
(в отличие от указателей
NdbRecord
).
Возвращаемое значение.
Текущий
NdbIndexScanOperation
, который может
использоваться для проверки на ошибки.
Описание. Этот метод выполняет сканирование таблицы, используя
объект
NdbRecord
, чтобы читать данные столбца.
Сигнатура.
NdbScanOperation* scanTable ( const NdbRecord*result_record
, NdbOperation::LockModelock_mode
= NdbOperation::LM_Read, const unsigned char*result_mask
= 0, Uint32scan_flags
= 0, Uint32parallel
= 0, Uint32batch
= 0 )
Параметры.
Указатель на
NdbRecord
для хранения результата. Этот
result_record
должен остаться действительным до окончания
execute()
.
lock_mode
для операции. Посмотрите
раздел 2.3.25.15.
Опциональный указатель result_mask
. Если это существует, только колонки для которых соответствующий
бит (в порядке признаков ID order) в
result_mask
установлен,
применяются в просмотре. result_mask
копируется внутренне, таким образом, в отличие от
result_record
не должен быть действительным, когда вызывается
execute()
.
scan_flags
может использоваться, чтобы определить порядок и условия сортировки для
просмотров. Посмотрите
раздел 2.3.29.9.
parallel
желаемый параллелизм или 0
для максимального параллелизма (получающий строки от всех фрагментов
параллельно), который является умолчанием.
batch
определяет, используется ли пакетированием. По умолчанию 0 (нет).
Возвращаемое значение.
Указатель на
NdbScanOperation
представление этого просмотра. Операция может быть
проверена при необходимости.
Описание.
Устанавливает пакетный размер в байтах для операции чтения
BLOB
. Когда объем данных
BLOB
, которые будут прочитаны
в данной транзакции, превышает этот размер, все операции
чтения в транзакции выполняются.
Сигнатура.
void setMaxPendingBlobReadBytes
(
Uint32 bytes
)
Параметры. Пакетный размер, как количество байт
bytes
. Используя 0 можно выключить
пакетное чтение BLOB
, что является поведением
по умолчанию (для обратной совместимости).
Возвращаемое значение. Нет.
Пакетным чтением BLOB
можно также управлять в
клиенте mysql и другом клиентском приложении MySQL, используя опцию MySQL
Server --ndb-blob-read-batch-bytes
и связанные системные переменные MySQL Server.
Описание.
Устанавливает пакетный размер в байтах для операции записи
BLOB
. Когда объем данных
volume of BLOB
, которые будут записаны
в данной транзакции, превышает этот размер, все операции
записи в транзакции выполняются.
Сигнатура.
void setMaxPendingBlobWriteBytes
(
Uint32 bytes
)
Параметры. Пакетный размер, как количество байт
bytes
. Используя 0 можно выключить
пакетную запись BLOB
, что является поведением
по умолчанию (для обратной совместимости).
Возвращаемое значение. Нет.
Пакетной записью BLOB
можно также управлять в
клиенте mysql и другом клиентском приложении MySQL, используя опцию MySQL
Server --ndb-blob-write-batch-bytes
и связанные системные переменные MySQL Server.
Описание.
Включает или отключает проверку собственности объекта схемы, когда
многократные объекты
Ndb_cluster_connection
используются.
Когда эта проверка позволена, объекты, используемые этой транзакцией,
проверяются, чтобы удостовериться, что они принадлежат
NdbDictionary
, принадлежащему этой связи.
Это сделано, приобретя объекты схемы тех же самых имен от связи и сравнив их
с объектами схемы, переданными к транзакции. Если они не
соответствуют, ошибка возвращена.
Этот метод доступен для целей отладки, начиная с NDB 7.2.0, NDB 7.3.9 и NDB 7.4.4 (Bug #19875977). Необходимо знать, что предоставление возможности этой проверки несет потерю производительности, и поэтому необходимо избегать делать ее в производственном применении.
Сигнатура.
void setSchemaObjOwnerChecks
(
bool runChecks
)
Параметры. Единственный параметр
runChecks
.
true
позволяет проверки собственности,
false
запрещает.
Возвращаемое значение. Нет.
Описание.
Этот метод создает операцию разблокировки на текущей транзакции,
когда выполнено, операция удаляет блокировку, на которую ссылаются
NdbLockHandle
(см.
раздел 2.3.25.5),
переданный этому методу.
Сигнатура.
const NdbOperation* unlock ( const NdbLockHandle*lockHandle
, NdbOperation::AbortOptionao
= NdbOperation::DefaultAbortOption )
Параметры. Указатель на обработчик блокировки, кроме того,
произвольно,
AbortOption
значение
ao
.
Если операция терпит неудачу,
AbortOption
определяет, как это обработано,
по умолчанию ошибки заставляют транзакции прерываться.
Возвращаемое значение.
Указатель на
NdbOperation
(созданная операция).
Описание. Обновляет кортеж, используя объект
NdbRecord
.
Сигнатура.
const NdbOperation* updateTuple ( const NdbRecord*key_rec
, const char*key_row
, const NdbRecord*attr_rec
, const char*attr_row
, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры.
key_rec
указатель на
NdbRecord
для таблицы или индекса. Если на таблицу, то операция использует первичный
ключ, если на индексе, то операция использует уникальный ключ. В любом случае
key_rec
должен включать все колонки ключа.
key_row
переданный к этому методу определяет первичный или уникальный ключ
затронутого кортежа и должен остаться действительным до вызова
execute()
.
attr_rec
это
NdbRecord
, ссылающийся на признак, который будет обновлен.
Для операций по уникальному индексу,
attr_rec
должен обратиться к базовой таблице индекса, а не к самому индексу.
attr_row
это буфер, содержащий новые данные для обновления.
mask
, если не
NULL
, определяет подмножество признаков, которые
будут обновлены. Маска копируется и не должна оставаться действительной после
обращения к этому методу.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный контроль операционных
определений. Структура
OperationOptions
передается с флагами, указывающими, какие операционные варианты определения
присутствуют. Не все операционные типы поддерживают все операционные
варианты, для перечня вариантов, поддержанных каждым типом операции,
посмотрите раздел
2.3.30.21.
Дополнительный параметр sizeOfOptions
используется, чтобы сохранить обратную совместимость этого
взаимодействия с предыдущими определениями структуры
OperationOptions
.
Если необычный размер обнаружен интерфейсным внедрением, он может
использовать это, чтобы определить, как интерпретировать переданную структуру
OperationOptions
.
Чтобы позволить эту функциональность, вызывающий должен передать
sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Возвращаемое значение.
NdbOperation
представление этой операции
(может использоваться, чтобы проверить ошибки).
Описание. Этот метод используется с
NdbRecord
, чтобы написать кортеж данных.
Сигнатура.
const NdbOperation* writeTuple ( const NdbRecord*key_rec
, const char*key_row
, const NdbRecord*attr_rec
, const char*attr_row
, const unsigned char*mask
= 0, const NdbOperation::OperationOptions*opts
= 0, Uint32sizeOfOptions
= 0 )
Параметры.
key_rec
указатель на
NdbRecord
для таблицы или индекса. Если на таблице, то операция
использует первичный ключ, если на индексе, то операция использует уникальный
ключ. В любом случае key_rec
должен включать все колонки ключа.
key_row
переданный к этому методу определяет первичный или уникальный ключ кортежа,
который будет написан и должен остаться действительным до
execute()
.
attr_rec
это
NdbRecord
, ссылающийся на признак, который будет написан.
Для операций по уникальному индексу
attr_rec
должен обратиться к базовой таблице индекса, не к самому индексу.
attr_row
буфер, содержащий новые данные.
mask
, если не
NULL
, определяет подмножество признаков, которые
будут написаны. Маска копируется и не должна оставаться действительной после
обращения к этому методу.
OperationOptions
(opts
)
может использоваться, чтобы обеспечить более точный контроль операционных
определений. Структура
OperationOptions
передается с флагами,
указывающими, какие операционные варианты определения присутствуют. Не все
операционные типы поддерживают все операционные варианты, для списка
вариантов, поддержанных каждым типом операции, посмотрите
раздел 2.3.30.21
.
Дополнительный параметр sizeOfOptions
используется, чтобы предоставить обратную совместимость этого
взаимодействия с предыдущими определениями структуры
OperationOptions
. Если необычный размер обнаружен интерфейсным
внедрением, он может использовать это, чтобы определить, как интерпретировать
переданную структуру
OperationOptions
.
Чтобы позволить эту функциональность, вызывающий должен передать
sizeof(NdbOperation::OperationOptions)
для значения этого аргумента.
Возвращаемое значение.
const
указатель на
NdbOperation
представление этой операции записи. Операция может
быть проверена по мере необходимости.
Резюме
Этот класс обеспечивает метаинформацию об объектах базы данных, таких как
таблицы и индексы. Подклассы Object
моделируют эти и другие объекты базы данных.
Родительский класс.
NdbDictionary
.
Дочерние классы.
Datafile
,
Event
,
Index
,
LogfileGroup
,
Table
,
Tablespace
, undofile
, HashMap
, ForeignKey
.
Методы.
Таблица 2.70.
Имя | Описание |
---|---|
getObjectId() |
Получает ID объекта |
getObjectStatus() |
Получает статус объекта |
getObjectVersion() |
Получает версию объекта |
Все 3 метода чистые виртуальные методы и повторно осуществляются в
подклассах Table
, Index
и Event
.
Типы.
Таблица 2.71.
Имя | Описание |
---|---|
FragmentType |
Тип фрагментации, используемый объектом (таблица или индекс) |
State |
Состояние объекта (если применимо) |
Status |
Состояние объекта (если доступно) |
Store |
Хранится объект постоянно или временно |
Type |
Тип объекта (таблица, индекс или другой объект базы данных,
представленный Object ) |
Резюме
Этот тип описывает тип фрагментации
Object
.
Описание. Этот параметр определяет, как данные в таблице или
индексе распределяются среди узлов хранения кластера, то есть, количество
фрагментов на узел. Чем больше таблица, тем больше количество фрагментов,
которые должны использоваться. Обратите внимание на то, что все точные копии
считаются единственным фрагментом. Для таблицы умолчание
FragAllMedium
. Для уникального хэш-индекса
умолчание взято из базовой таблицы и не может в настоящее время изменяться.
Возможные значения.
Таблица 2.72.
Имя | Описание |
---|---|
FragUndefined |
Тип фрагментации не определен или умолчание |
FragAllMedium |
Два фрагмента на узел |
FragAllLarge |
Четыре фрагмента на узел |
DistrKeyHash |
Распределенный хэш-ключ |
DistrKeyLin |
Распределенный линейный хэш-ключ |
UserDefined |
Определено пользователем |
HashMapPartition |
Разделение хэш-карты |
Описание.
Этот тип обеспечивает параметры настройки баланса разделения (типы количества
фрагмента), из которого можно выбрать, используя
setPartitionBalance()
. Это также тип,
возвращенный
getPartitionBalance()
.
Возможные значения.
Таблица 2.73.
Имя | Описание |
---|---|
PartitionBalance_ForRPByLDM |
Используйте один фрагмент на LDM на узел |
PartitionBalance_ForRAByLDM |
Используйте один фрагмент на LDM на группу узлов |
PartitionBalance_ForRPByNode |
Используйте один фрагмент на узел |
PartitionBalance_ForRAByNode |
Используйте один фрагмент на группу узлов |
PartitionBalance_Specific |
Используйте настройки, заданные
setPartitionBalance() |
До NDB 7.5.4 это было известно как
FragmentCountType
и мог взять одно из значений
FragmentCount_OnePerLDMPerNode
,
FragmentCount_OnePerLDMPerNodeGroup
,
FragmentCount_OnePerNode
,
FragmentCount_OnePerNodeGroup
или
FragmentCount_Specific
.
Эти значения соответствуют показанным в предыдущей
таблице в показанном порядке.
Резюме
Этот тип описывает состояние
Object
.
Описание. Этот параметр предоставляет нам состояние объекта. По state определяется, создан ли объект и находится ли в применимом состоянии.
Возможные значения.
Таблица 2.74.
Имя | Описание |
---|---|
StateUndefined |
Неопределенный |
StateOffline |
Офлайн, не применимый |
StateBuilding |
Создается, не применимый (?) |
StateDropping |
Переход в офлайн или удаление, не применимый |
StateOnline |
Онлайн, применимый |
StateBackup |
Онлайн, резервируется, применимый |
StateBroken |
Поврежден, должен быть удален и воссоздан |
Резюме
Этот тип описывает статус
Object
.
Описание. Чтение объекта Status
говорит, доступно ли это в ядре NDB
.
Возможные значения.
Таблица 2.75.
Имя | Описание |
---|---|
New |
Объект существует только в памяти и еще не был создан в ядре
NDB |
Changed |
Объект был изменен в памяти и должен быть передан в ядро
NDB для вступления в силу изменений |
Retrieved |
Объект существует и был прочитан в оперативную память из ядра
NDB |
Invalid |
Объект был лишен законной силы и больше не должен использоваться |
Altered |
Таблица была изменена в ядре NDB ,
но все еще доступна для использования |
Резюме
Этот тип описывает постоянство
Object
.
Описание. Чтение этой значения говорит нам, временный или постоянный объект.
Возможные значения.
Таблица 2.76.
Имя | Описание |
---|---|
StoreUndefined |
Объект не определен |
StoreTemporary |
Временное хранение, объект или данные будут удалены при системном перезапуске |
StorePermanent |
Объект или данные постоянные, это было сохранено на диск |
Резюме
Этот тип описывает тип
Object
.
Описание. Type
объекта
может быть один из нескольких различных видов индекса, триггера, табличного
пространства и так далее.
Возможные значения.
Таблица 2.77.
Имя | Описание |
---|---|
TypeUndefined |
Неопределенный |
SystemTable |
Системная таблица |
UserTable |
Пользовательский таблица (может быть временной) |
UniqueHashIndex |
Уникальный (но неупорядоченный) хэш-индекс |
OrderedIndex |
Упорядоченный (но не уникальный) индекс |
HashIndexTrigger |
Индекс обслуживается (внутреннее ) |
IndexTrigger |
Индекс обслуживается (внутреннее ) |
SubscriptionTrigger |
Резервирование или репликация (внутреннее ) |
ReadOnlyConstraint |
Триггер (внутреннее) |
Tablespace |
Табличное пространство |
LogfileGroup |
Группа файла журнала |
Datafile |
Файл данных |
undofile |
Файл отмен |
ReorgTrigger |
Триггер |
HashMap |
Хэш-карта |
ForeignKey |
Внешний ключ |
FKParentTrigger |
Триггер на родительской таблице внешнего ключа |
FKChildTrigger |
Триггер на дочерней таблице внешнего ключа |
HashMap
добавлено в NDB 7.2.7.
ForeignKey
,
FKParentTrigger
и
FKChildTrigger
добавлены в NDB Cluster 7.3. См.
раздел 2.3.8.
Описание. Этот метод получает ID объекта.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. ID объекта как integer.
Описание. Этот метод получает статус объекта, для которого это вызвано.
Сигнатура.
virtual Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Возвращает текущий
Status
для
Object
.
Описание. Метод получает текущую версию объекта.
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Номер версии объекта как integer.
Родительский класс.
NdbOperation
.
Описание. Эти варианты передаются к основанному на
NdbRecord
первичному ключу и методам просмотра, определенным в классах
NdbTransaction
и
NdbScanOperation
.
Большинство методов NdbTransaction::*Tuple()
(см. раздел 2.3.30) берут
дополнительный параметр sizeOfOptions
. Это дополнительно и предназначается, чтобы разрешить интерфейсному
внедрению оставаться обратно совместимым с не собранными повторно клиентами
старшего возраста, которые могут передать более старую версию структуры
OperationOptions
. Этот эффект достигается,
передавая sizeof(OperationOptions)
в этот параметр.
Каждый тип выбора отмечен как существующий, установив соответствующий бит
в optionsPresent
.
Только типы выбора, отмеченные в
optionsPresent
, имеют
разумные данные. Все данные копируются из структуры
OperationOptions
в операционное время определения. Если никакие варианты не требуются, то
NULL
может быть передан вместо этого.
Члены.
Таблица 2.78.
Имя | Тип | Описание |
---|---|---|
optionsPresent |
Uint64 |
Какие флаги присутствуют. |
[...] | Flags :Принятые имена и значения показывают в следующем списке:
|
Тип флагов. |
abortOption |
AbortOption |
Определенный для операции выбор аварийного прекращения работы, необходимый, только если поведение по умолчанию abortoption не устраивает. |
extraGetValues |
GetValueSpec |
Дополнительный столбец значений для чтения. |
numExtraGetValues |
Uint32 |
Количество значений дополнительного столбца. |
extraSetValues |
SetValueSpec |
Дополнительный столбец значений для установки. |
numExtraSetValues |
Uint32 |
Количество значений дополнительного столбца. |
partitionId |
Uint32 |
Ограничьте просмотр разделением, имеющим этот ID, альтернативно, можно
поставлять
PartitionSpec . Для просмотров индекса
информацию о разделении может поставляться для каждого диапазона. |
interpretedCode |
NdbInterpretedCode |
Интерпретируемый код, чтобы выполнить как часть просмотра. |
anyValue |
Uint32 |
anyValue , используемый
с этой операцией. Это используется NDB Cluster Replication, чтобы сохранить
ID сервера узла SQL. Начиная узел SQL с опцией
--server-id-bits
(которая вызывает использование только части бит из
server_id
для однозначного его определения), установленной в менее, чем 32, остающиеся
биты могут использоваться, чтобы хранить пользовательские данные. |
customData |
void* |
Указатель данных, чтобы связаться с этой операцией. |
partitionInfo |
PartitionSpec |
Информация о разделении для ограничения этого просмотра. |
sizeOfPartInfo |
Uint32 |
Размер информации о разделении ограничения. |
См. раздел 2.3.27.
Резюме
Эта секция описывает структуру
PartitionSpec
.
Родительский класс.
Ndb
.
Описание. PartitionSpec
используется для описания разделения таблицы с точки зрения любого
из следующих критериев:
Определенное разделение ID для таблицы с определенным пользователями разделением.
Множество составлено из значений ключа распределения таблицы для таблицы с родным разделением.
Строка в формате
NdbRecord
, содержащая значения ключа
распределения разделенной таблицы.
Атрибуты.
PartitionSpec
имеет два признака,
SpecType
и Spec
,
которые являются структурой данных, соответствующей этому
SpecType
:
Таблица 2.79.
Перечисление SpecType |
Значение SpecType
(Uint32 ) |
Структура данных | Описание |
---|---|---|---|
PS_NONE |
0 |
Нет | Никакая информация о разделении не предоставляется. |
PS_USER_DEFINED |
1 |
UserDefined |
Для таблицы, имеющей определеное пользователем разделение, нужный раздел определяется его ID. |
PS_DISTR_KEY_PART_PTR |
2 |
KeyPartPtr |
Для таблицы, имеющей родное разделение, множество, содержащее значения ключа распределения таблицы, используется, чтобы определить раздел. |
PS_DISTR_KEY_RECORD |
3 |
KeyRecord |
Разделение определяется, используя значения ключа распределения
родного разделения таблицы, как содержится в строках, данных в формате
NdbRecord
. |
Структура UserDefined.
Структура используется, когда SpecType
=
PS_USER_DEFINED
.
Таблица 2.80.
Атрибут | Тип | Описание |
---|---|---|
partitionId |
Uint32 |
Разделение ID для желаемой таблицы. |
Структура KeyPartPtr.
Структура используется, когда SpecType
=
PS_DISTR_KEY_PART_PTR
.
Таблица 2.81.
Атрибут | Тип | Описание |
---|---|---|
tableKeyParts |
Key_part_ptr |
Указатель на значения ключа распределения для таблицы, имеющей родное разделение. |
xfrmbuf |
void* |
Указатель на временный буфер используется для выполнения вычислений. |
xfrmbuflen |
Uint32 |
Длина временного буфера. |
Структура KeyRecord.
Структура используется, когда SpecType
=
PS_DISTR_KEY_RECORD
.
Таблица 2.82.
Атрибут | Тип | Описание |
---|---|---|
keyRecord |
NdbRecord
|
Строка в формате
NdbRecord содержит
ключи распределения таблицы. |
keyRow |
const char* |
Данные о ключе распределения. |
xfrmbuf |
void* |
Указатель на временный буфер для выполнения вычислений. |
xfrmbuflen |
Uint32 |
Длина временного буфера. |
Определения из Ndb.hpp
.
Поскольку это довольно сложная структура, мы здесь предоставляем оригинальное
определение исходного кода
PartitionSpec
, как дано в
storage/ndb/include/ndbapi/Ndb.hpp
:
struct PartitionSpec { enum SpecType { PS_NONE= 0, PS_USER_DEFINED= 1, PS_DISTR_KEY_PART_PTR= 2, PS_DISTR_KEY_RECORD= 3 }; Uint32 type; union { struct { Uint32 partitionId; } UserDefined; struct { const Key_part_ptr* tableKeyParts; void* xfrmbuf; Uint32 xfrmbuflen; } KeyPartPtr; struct { const NdbRecord* keyRecord; const char* keyRow; void* xfrmbuf; Uint32 xfrmbuflen; } KeyRecord; }; };
Родительский класс.
NdbDictionary
.
Описание. Эта структура используется, чтобы определить колонки и
смещения диапазона, создавая объекты
NdbRecord
.
Члены.
Таблица 2.83.
Имя | Тип | Описание |
---|---|---|
column |
Column
|
Столбец, описанный этой записью (максимальный размер колонки определяет
размер поля для строки). Создавая
NdbRecord для индекса, это должно указать на
колонку, полученную из базовой таблицы, а не из самого индекса. |
offset |
Uint32 |
Смещение данных с начала строки. Для чтения blob обработчик
(NdbBlob ),
а не фактические данные blob, написан в строку.
Это означает, что должно быть доступно, по крайней мере,
sizeof(NdbBlob*) в строке. |
nullbit_byte_offset |
Uint32 |
Смещение с начала строки байта, содержащего бит
NULL . |
nullbit_bit_in_byte |
Uint32 |
Бит NULL (0-7). |
nullbit_byte_offset
и
nullbit_bit_in_byte
не используются для столбцов, которые не могут быть
NULL
.
См. раздел 2.3.27.
Родительский класс.
NdbScanOperation
.
Описание. Эта структура данных используется, чтобы передать
варианты к
NdbRecord
-методам
scanTable()
и
scanIndex()
класса
NdbTransaction
. Каждый тип выбора отмечен как существующий, установив
соответствующий бит в поле optionsPresent
.
Только типы выбора, отмеченные в
optionsPresent
, обработаны.
Все данные копируются из структуры
ScanOptions
в операционное время определения. Если никакие варианты не требуются, то
NULL
может быть передан как указатель
ScanOptions
.
Члены.
Таблица 2.84.
Имя | Тип | Описание |
---|---|---|
optionsPresent |
Uint64 |
Какие варианты присутствуют. |
[...] | Type :
| Тип опций. |
scan_flags |
Uint32 |
Флаги, управляющие поведением просмотра, посмотрите раздел 2.3.29.9 . |
parallel |
Uint32 |
Параллелизм просмотра, 0 (умолчание) устанавливает максимальный параллелизм. |
batch |
Uint32 |
Пакетный размер для передач от узлов данных до узлов API, 0 (умолчание) позволяет этому быть выбранным автоматически. |
extraGetValues |
GetValueSpec |
Дополнительные значения, которые будут прочитаны для каждой строки, соответствующей критериям просмотра. |
numExtraGetValues |
Uint32 |
Количество дополнительных значений, которые будут прочитаны. |
partitionId |
Uint32 |
Ограничьте просмотр разделением, имеющим этот ID, альтернативно, можно
поставлять
PartitionSpec . Для просмотров индекса информация разделения может
поставляться для каждого диапазона. |
interpretedCode |
NdbInterpretedCode |
Интерпретируемый код, чтобы выполнить как часть просмотра. |
customData |
void* |
Указатель данных, чтобы связаться с этой операцией по просмотру. |
partitionInfo |
PartitionSpec |
Информация о разделении для ограничения этого просмотра. |
sizeOfPartInfo |
Uint32 |
Размер информации о разделении ограничения. |
См. раздел 2.3.27.
Родительский класс.
NdbOperation
.
Описание. Эта структура используется, чтобы определить
дополнительное значение, чтобы установить как часть операции в
NdbRecord
.
Члены.
Таблица 2.85.
Имя | Тип | Описание |
---|---|---|
column |
Column
|
Чтобы определить дополнительное значение, чтобы читать, вызывающий должен
обеспечить это, а также указатель (возможно
NULL )
appStorage . |
value |
void* |
Это должно указать на значение, которое будет установлено, или
NULL , если признак должен быть установлен в
NULL . Ззначение копируется, когда операция
определяется и не должно оставаться прежним во время выполнения. |
В настоящее время значения blob не могут быть установлены, используя
SetValueSpec
.
См. раздел 2.3.27.
Резюме
Эта секция описывает класс Table
,
который моделирует таблицу базы данных в API NDB.
Родительский класс.
NdbDictionary
.
Дочерние классы. Нет.
Описание.
Класс Table
представляет таблицу в базе данных NDB Cluster. Этот класс расширяет класс
Object
,
который в свою очередь является внутренним классом для класса
NdbDictionary
.
Возможное использование API NDB, чтобы составить таблицы независимо от
сервера MySQL. Однако обычно нежелательно это делать, так как таблицы,
составленные этим способом, не могут быть замечены сервером MySQL.
Точно так же возможно использовать методы Table
,
чтобы изменить существующие таблицы, но эти изменения (за исключением
переименования) невидимы MySQL.
Вычисление размеров таблицы. Вычисляя хранение данных нужно добавить размер всех признаков (каждый признак потребляет минимум 4 байта) и дополнительно 12 байт. У признаков переменного размера есть размер 12 байтов плюс фактические части хранения данных с дополнительными издержками на основе размера переменной части. Например, рассмотрите таблицу с 5 признаками: один 64-битный признак, один 32-битный признак, два 16-битных признака и одно множество из 64 8-битных признаков. Объем памяти, потребляемый на запись таблицы, является суммой следующего:
8 байтов для 64-битного признака
4 байта для 32-битного признака
8 байтов для двух 16-битных признаков, каждый из них добавляет 4 байта из-за выравнивания по правому краю
64 байта для множества (64 * 1 байт на элемент матрицы)
12 байтов дополнительно
Это составляет 96 байтов на запись. Кроме того, необходимо принять издержки приблизительно из 2% для распределения заголовков страницы и потраченного впустую пространства. Таким образом 1 миллион записей должен потреблять 96 МБ, дополнительный заголовок страницы и другие издежки достигают приблизительно 2 МБ. Примерно 100 МБ.
Методы.
Таблица 2.86.
Имя | Описание |
---|---|
Table() |
Конструктор класса |
~Table() |
Деструктор |
addColumn() |
Добавляет столбец к таблице |
aggregate() |
Вычисляет агрегированные данные для таблицы |
equal() |
Сравнивает таблицу с другой |
getColumn() |
Достает колонку (по имени) из таблицы |
getDefaultNoPartitionsFlag() |
Проверки, используется ли номер разделения по умолчанию |
getFragmentCount() |
Получает количество фрагментов для этой таблицы |
getExtraMetadata() |
Получает дополнительные метаданные для этой таблицы |
getFragmentData() |
Получает данные о фрагменте таблицы (ID, состояние и узел) |
getFragmentDataLen() |
Получает длину данных о фрагменте таблицы |
getFragmentNodes() |
Получает ID узлов данных, на которых расположены фрагменты |
getFragmentType() |
Получает FragmentType таблицы |
getFrmData() |
Получает данные из файла .FRM
таблицы |
getFrmLength() |
Получает длину файла .FRM таблицы |
getHashMap() |
Получает хэш-карту таблицы |
getKValue() |
Получает KValue |
getLinearFlag() |
Получает текущее значение линейного флага хеширования таблицы |
getLogging() |
Проверка, позволена ли регистрация на диск для этой таблицы |
getMaxLoadFactor() |
Получает фактор максимальной нагрузки таблицы |
getMaxRows() |
Получает максимальное количество строк, которые может содержать эта таблица |
getMinLoadFactor() |
Получает минимальный коэффициент загрузки таблицы |
getName() |
Получает название таблицы |
getNoOfColumns() |
Получает количество столбцов в таблице |
getNoOfPrimaryKeys() |
Получает количество столбцов в первичном ключе таблицы |
getObjectId() |
Получает идентификатор объекта таблицы |
getObjectStatus() |
Получает статус объекта таблицы |
getObjectType() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
getObjectVersion() |
Получает версию объекта таблицы |
getPartitionBalance() |
Получает баланс разделения (тип количества фрагментов), используемый для этой таблицы (NDB 7.5.4 и позже) |
getPartitionBalanceString() |
Используемый баланс разделения для этого таблицы как последовательность (NDB 7.5.4 и позже) |
getPartitionId() |
Получает ID разделения из значения хэш-функции |
getPrimaryKey() |
Получает название первичного ключа таблицы |
getRangeListData() |
Получает RANGE или
LIST |
getRangeListDataLen() |
Получает длину RANGE или
LIST |
getRowChecksumIndicator() |
Проверка, был ли индикатор контрольной суммы строки установлен |
getRowGCIIndicator() |
Проверка, был ли индикатор GCI строки установлен |
getSingleUserMode() |
Получает
SingleUserMode |
getTableId() |
Получает ID таблицы |
getTablespace() |
Получает табличное пространство, содержащее эту таблицу |
getTablespaceData() |
Получает ID и версию табличного пространства, содержащего таблицу |
getTablespaceDataLen() |
Получает длину данных о табличном пространстве таблицы |
getTablespaceNames() |
Получает названия табличных пространств, используемых во фрагментах таблицы |
hasDefaultValues() |
Определите, есть ли у таблицы какие-либо колонки, используя значения по умолчанию |
setDefaultNoPartitionsFlag() |
Указывает, должен ли номер разделения по умолчанию использоваться для таблицы |
setExtraMetadata() |
Устанавливает дополнительные метаданные для этой таблицы |
getFragmentCount() |
Получает количество фрагментов для этой таблицы |
setFragmentData() |
Устанавливает ID фрагмента, ID узла и состояние фрагмента |
setFragmentType() |
Устанавливает FragmentType |
setFrm() |
Устанавливает файл .FRM , который будет
использоваться для этой таблицы |
setHashMap() |
Устанавливает хэш-карту таблицы |
setKValue() |
Устанавливает KValue |
setLinearFlag() |
Устанавливает линейный флаг хеширования таблицы |
setLogging() |
Переключает регистрацию таблицы на диск |
setMaxLoadFactor() |
Установит фактор максимальной нагрузки таблицы
(MaxLoadFactor ) |
setMaxRows() |
Определяет максимальное число строк в таблице |
setMinLoadFactor() |
Установит минимальный коэффициент загрузки таблицы
(MinLoadFactor ) |
setPartitionBalance() |
Устанавливает баланс разделения (тип количества фрагментов) для этой таблицы (NDB 7.5.4 и позже) |
setName() |
Определяет имя таблицы |
setObjectType() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
setRangeListData() |
Устанавливает данные разделения LIST и
RANGE |
setRowChecksumIndicator() |
Устанавливает индикатор контрольной суммы строки |
setRowGCIIndicator() |
Устанавливает индикатор GCI строки |
setSingleUserMode() |
Устанавливает
SingleUserMode |
setStatusInvalid() |
|
setTablespace() |
Установит табличное пространство для этой таблицы |
setTablespaceData() |
Устанавливает ID и версию табличного пространства |
setTablespaceNames() |
Определяет имена табличного пространства для фрагментов |
validate() |
Утверждает определение для новой таблицы до ее создания |
Оператор присваивания (=
)
перегружен для этого класса, так, чтобы он всегда выполнял глубокую копию.
Как с другими объектами базы данных, создание объекта
Table
и изменения признака существующих таблиц, сделанные, используя API NDB,
невидимы из MySQL. Например, если вы добавляете новую колонку к таблице,
используя
Table::addColumn()
, MySQL
MySQL не видит новую колонку. Единственное исключение из этого правила
относительно таблиц то, что изменение названия существующей таьблицы
NDB
, используя
Table::setName()
, видимо в MySQL.
Типы. Класс Table
определяет единственный публичный тип
SingleUserMode
.
Описание. Добавляет столбец к таблице.
Сигнатура.
void addColumn
(
const Column& column
)
Параметры. Ссылка на колонку, которая должна быть добавлена к таблице.
Возвращаемое значение.
Нет, но
это действительно создает копию оригинального объекта
Column
.
Описание. Этот метод вычисляет агрегированные данные для таблицы.
Это требуется для таких совокупных методов, как
getNoOfPrimaryKeys()
,
чтобы работать правильно перед тем, как таблица была составлена и получена
через
getTableId()
.
Добавлено в MySQL 5.1.12 (Bug #21690).
Сигнатура.
int aggregate
(
struct NdbError& error
)
Параметры. Ссылка на объект
NdbError
.
Возвращаемое значение. integer, значение которого
0
при успехе и -1
,
если таблица находится в непоследовательном статусе. В последнем случае
также установлен error
.
Описание. Создает экземпляр
Table
. Есть две версии конструктора,
одна для создания нового экземпляра и вторая для конструктора копии.
Таблицы, составленные в API NDB, используя этот метод, недоступны из MySQL.
Сигнатура. Новый экземпляр:
Table
(
const char* name
= ""
)
Конструктор копии:
Table
(
const Table& table
)
Параметры. Для нового экземпляра, название таблицы, которая будет создана. Для копии ссылки на таблицу, которая будет скопирована.
Возвращаемое значение.
Объект Table
.
Деструктор.
virtual ~Table()
Описание. Этот метод используется, чтобы сравнить один экземпляр
Table
с другим.
Сигнатура.
bool equal
(
const Table& table
) const
Параметры. Ссылка на объект
Table
, с которым должен быть
сравнен текущий экземпляр.
Возвращаемое значение.
true
, если эти две таблицы одинаковы, иначе
false
.
Описание. Этот метод используется, чтобы получить определение столбца, учитывая индекс или название колонки.
Сигнатура. Этот метод может быть вызван, используя идентификатор или имя столбца, как показано здесь:
Column* getColumn ( const intAttributeId
) Column* getColumn ( const char*name
)
Параметры. Любой из: индекс колонки в таблице (когда это было бы
возвращено методом колонки getColumnNo()
)
или название колонки.
Возвращаемое значение. Указатель на колонку с указанным индексом
или именем. Если нет такой колонки, то этот метод возвращает
NULL
.
Описание. Этот метод используется, чтобы узнать, используется ли номер разделения по умолчанию для таблицы.
Сигнатура.
Uint32 getDefaultNoPartitionsFlag ( void ) const
Параметры. Нет.
Возвращаемое значение. 32-bit unsigned integer.
Описание. Получите и распакуйте дополнительные метаданные для этой
Table
.
Сигнатура.
int getExtraMetadata ( Uint32&version
, void**data
, Uint32*length
) const
Параметры.
version
:
В соответствии с соглашением, как используется в коде кластера NDB,
1
означает, что дополнительные метаданные
содержатся в файле .frm
file
(BLOB
) как в NDB 7.6 и ранее,
2
означает, что это преобразованная в
последовательную форму информация о словаре как в NDB 8.0.
data
:
Сохраненные полученные данные как метаданные.
length
:
Длина хранииых данных (метаданных).
Возвращаемое значение.
0
при успехе, любое другое значение при ошибке.
Ненулевое значение должно интерпретироваться как код ошибки для типа ошибки.
Добавлено в NDB 8.0.13.
Описание. Этот метод получает количество фрагментов в таблице.
Сигнатура.
Uint32 getFragmentCount ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество фрагментов таблицы как 32-bit unsigned integer.
Описание. Этот метод получает данные о фрагменте таблицы (ID, состояние и узел).
Сигнатура.
const void* getFragmentData ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на данные, которые будут прочитаны.
Описание. Получает длину данных о фрагменте таблицы в байтах.
Сигнатура.
Uint32 getFragmentDataLen ( void ) const
Параметры. Нет.
Возвращаемое значение. Число байтов, которые будут прочитаны как unsigned 32-bit integer.
Описание. Этот метод получает список узлов, хранящих данный фрагмент.
Сигнатура.
Uint32 getFragmentNodes ( Uint32fragmentId
, Uint32*nodeIdArrayPtr
, Uint32arraySize
) const
Параметры.
fragmentId
:
ID желаемого фрагмента.
nodeIdArrayPtr
:
Указатель на множество ID узлов, содержащих этот фрагмент.
Обычно основной фрагмент это запись 0 в этом множестве.
arraySize
:
Размер множества, содержащего ID узлов. Если это меньше, чем количество
фрагментов, то только первые записи
arraySize
написаны в это множество.
Возвращаемое значение.
Возвращаемое значение 0
указывает на ошибку, иначе это количество фрагментов таблицы как
32-bit unsigned integer.
Описание. Этот метод получает тип фрагментации таблицы.
Сигнатура.
FragmentType getFragmentType ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение FragmentType
как определено в
разделе 2.3.31.1.
Описание. Данные из файла
.FRM
, связанного с таблицей.
Сигнатура.
const void* getFrmData ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на данные
.FRM
.
Описание.
Получает длину файла .FRM
таблицы в байтах.
Сигнатура.
Uint32 getFrmLength ( void ) const
Параметры. Нет.
Возвращаемое значение.
Длина файла .FRM
в байтах
(unsigned 32-bit integer).
Описание. Получает используемую хэш-карту для этой таблицы. Введено в NDB 7.2.7.
Сигнатура.
bool getHashMap ( Uint32*id
= 0, Uint32*version
= 0 ) const
Параметры. ID и версия таблицы.
Возвращаемое значение. True, если у таблицы есть хэш-карта, иначе false.
Описание. Этот метод получает KValue, параметр хеширования, который
в настоящее время ограничивается значением 6
.
В будущем выпуске может стать выполнимо установить этот параметр
на другие значения.
Сигнатура.
int getKValue ( void ) const
Параметры. Нет.
Возвращаемое значение.
integer (сейчас всегда 6
).
Описание. Этот метод получает значение линейного флага хеширования таблицы.
Сигнатура.
bool getLinearFlag ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если флаг установлен,
false
, если нет.
Описание. Этот класс используется, чтобы проверить, зарегистрирована ли таблица на диске, то есть, постоянная она или временная.
Сигнатура.
bool getLogging ( void ) const
Параметры. Нет.
Возвращаемое значение.
Если true
, тогда таблица полностью сохранена на
диск. Если false
, таблица временная
и не зарегистрирована на диске, в случае системного перезапуска таблица все
еще существует и сохраняет свое определение, но будет пустой.
Значение регистрации по умолчанию true
.
Описание. Этот метод возвращает коэффициент загрузки (параметр хеширования), когда начинается разделение контейнеров в местных хэш-таблицах.
Сигнатура.
int getMaxLoadFactor ( void ) const
Параметры. Нет.
Возвращаемое значение. integer, максимальное значение которого равняется 100. Когда максимальное значение возвращено, это означает, что использование памяти оптимизировано. Меньшие значения указывают, что меньше данных хранится в каждом контейнере, что означает, что ключи найдены более быстро, однако, это также потребляет больше памяти.
Описание. Этот метод получает максимальное количество строк, которые может вместить таблица. Это используется для вычисления количества разделения.
Сигнатура.
Uint64 getMaxRows ( void ) const
Параметры. Нет.
Возвращаемое значение. Максимальное количество строк таблицы как 64-bit unsigned integer.
Описание.
Этот метод получает значение коэффициента загрузки, когда сокращение
хэш-таблицы начинается. Это должно всегда быть меньше, чем значение,
возвращенное getMaxLoadFactor()
.
Сигнатура.
int getMinLoadFactor ( void ) const
Параметры. Нет.
Возвращаемое значение. integer (на самом деле процент, выраженный как целое число, посмотрите раздел 2.3.37.19).
Описание. Получает название таблицы.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название таблицы (последовательность).
Описание. Этот метод используется, чтобы получить количество столбцов в таблице.
Сигнатура.
int getNoOfColumns ( void ) const
Параметры. Нет.
Возвращаемое значение. integer, представляющий количество столбцов в таблице.
Описание. Этот метод находит количество столбцов первичного ключа в таблице.
Сигнатура.
int getNoOfPrimaryKeys ( void ) const
Параметры. Нет.
Возвращаемое значение. integer, представляющий количество столбцов первичного ключа в таблице.
Описание. Этот метод получает идентификатор объекта таблицы.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта возвращен как integer.
Описание. Этот метод получает статус таблицы, то есть,
Object::Status
.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. A Status
.
См. раздел 2.3.31.4.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
Object::Type getObjectType ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение Type
. См.
раздел 2.3.31.6.
Описание. Этот метод получает версию объекта таблицы (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта таблицы как integer.
Описание. Этот метод получает схему баланса разделения (тип количества фрагментов).
Сигнатура.
Object::PartitionBalance getPartitionBalance ( void ) const
Параметры. Нет.
Возвращаемое значение.
Схема балансирования разделения как значение типа
Object::PartitionBalance
.
До NDB 7.5.4 этот метод был известен как
getFragmentCountType()
.
Описание. Этот метод получает схему баланса разделения (тип количества фрагментов) и возвращает его как последовательность.
Сигнатура.
const char* getPartitionBalanceString ( void ) const
Параметры. Нет.
Возвращаемое значение. Схема балансирования разделения, как значение последовательности.
До NDB 7.5.4 этот метод был известен как
getFragmentCountTypeString()
.
Описание. Получает ID разделения таблицы, данный его значением хэш-функции.
Сигнатура.
Uint32 getPartitionId
(
Uint32 hashvalue
) const
Параметры. hashvalue
.
Отметьте, что если таблица не была на самом деле получена (например, через
getTableId()
),
результат, вероятно, не будет точным или полезным.
Возвращаемое значение.
Идентификатор разделения, соответствующего
hashvalue
.
Описание. Этот метод используется, чтобы получить название первичного ключа таблицы.
Сигнатура.
const char* getPrimaryKey
(
int no
) const
Параметры. Нет.
Возвращаемое значение. Название первичного ключа, последовательность (указатель на символ).
Описание. Этот метод получает диапазон или данные о списке, связанные с таблицей.
Сигнатура.
const void* getRangeListData ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на данные.
Описание. Этот метод получает размер диапазона таблицы или множества списка.
Сигнатура.
Uint32 getRangeListDataLen ( void ) const
Параметры. Нет.
Возвращаемое значение. Длина списка или множества диапазона как integer.
Описание. Проверка, был ли индикатор контрольной суммы строки установлен.
Сигнатура.
bool getRowChecksumIndicator ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
или false
.
Описание. Проверка, был ли индикатор GCI строки установлен.
Сигнатура.
bool getRowGCIIndicator ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
or false
.
Описание. Получает однопользовательский режим таблицы.
Сигнатура.
enum SingleUserMode getSingleUserMode ( void ) const
Параметры. Нет.
Возвращаемое значение.
SingleUserMode
.
Описание. Этот метод получает ID таблицы.
Сигнатура.
int getTableId ( void ) const
Параметры. Нет.
Возвращаемое значение. integer.
Описание. Этот метод используется двумя способами: чтобы получить название табличного пространства, на которое назначена эта таблица, и чтобы проверить, что данное табличное пространство это то, которое используется этой таблицей.
Сигнатуры. Чтобы получить название табличного пространства, вызовите без любых аргументов:
const char* getTablespace ( void ) const
Чтобы определить, является ли табличное пространство тем, которое обозначено данным ID и версией, поставляйте их как аргументы, как показано здесь:
bool getTablespace ( Uint32*id
= 0, Uint32*version
= 0 ) const
Параметры. Число и типы параметров зависят от того, как этот метод используется:
Когда используется, чтобы получить название табличного пространства в использовании таблицей, это вызывают без любых аргументов.
Когда используется, чтобы определить, является ли данное табличное пространство используемым этой таблицей, тогда getTablespace() берет два параметра:
Табличное пространство id
как указатель на 32-bit unsigned integer.
Табличное пространство version
как указатель на 32-bit unsigned integer.
Значение по умолчанию для обоих
id
и
version
это
0
.
Возвращаемое значение. Тип возвращения зависит от того, как метод вызывают.
Когда getTablespace()
вызван без любых аргументов, это возвращает экземпляр объекта
Tablespace
.
Когда вызвано с двумя аргументами, это возвращает
true
, если табличное пространство совпадает с
имеющим заданный ID и обозначенную версию, иначе это возвращает
false
.
Описание. Этот метод получает данные о табличном пространстве таблицы (ID и версия).
Сигнатура.
const void* getTablespaceData ( void ) const
Параметры. Нет.
Возвращаемое значение. Указатель на данные.
Описание. Этот метод используется, чтобы получить длину данных о табличном пространстве таблицы.
Сигнатура.
Uint32 getTablespaceDataLen ( void ) const
Параметры. Нет.
Возвращаемое значение. Длина данных как 32-bit unsigned integer.
Описание. Этот метод получает указатель на названия табличных пространств, используемых во фрагментах таблицы.
Сигнатура.
const void* getTablespaceNames ( void )
Параметры. Нет.
Возвращаемое значение. Возвращает указатель на данные об имени табличного пространства.
Описание. Этот метод получает длину данных об имени табличного
пространства, возвращенных getTablespaceNames()
.
См. раздел 2.3.37.42.
Сигнатура.
Uint32 getTablespaceNamesLen ( void ) const
Параметры. Нет.
Возвращаемое значение. Возвращает длину данных об имени в байтах как 32-бит unsigned integer.
Описание. Используется, чтобы определить, есть ли у таблицы
какие-либо колонки, которые определяются с
не-NULL
по умолчанию.
Чтобы прочитать и написать значения столбцов по умолчанию, надо
использовать
Column::getDefaultValue()
и
Column::setDefaultValue()
.
Сигнатура.
bool hasDefaultValues ( void ) const
Параметры. Нет.
Возвращаемое значение.
true
, если у таблицы есть какие-либо
не-NULL
колонки со значениями по умолчанию,
иначе false
.
Описание. Этот метод устанавливает индикатор, который определяет, используется ли номер разделения по умолчанию для таблицы.
Сигнатура.
void setDefaultNoPartitionsFlag
(
Uint32 indicator
) const
Параметры. Этот метод берет отдельный аргумент
indicator
, 32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Сохраните упакованные дополнительные метаданные для этой
таблицы. Данные упакованы без любой модификации в буфер данного объекта
Table
.
Сигнатура.
int setExtraMetadata ( Uint32version
, const void*data
, Uint32length
)
Параметры.
version
:
Как используется в коде NDB Cluster, 1
значит, что дополнительные метаданные содержат файл
.frm
(BLOB
) как в NDB 7.6 и ранее,
2
значит, что это преобразованная в
последовательную форму информация о словаре как в NDB 8.0. Необходимо знать,
что это просто соглашение, и значения могут быть специализированы, как надо.
data
:
Фактические данные, которые будут сохранены как метаданные.
length
:
Длина данных, которые будут сохранены.
Возвращаемое значение.
0
при успехе.
Любое другое значение указывает на неудачу, в этом случае значение
это код ошибки, указывающее на тип ошибки.
Добавлено в NDB 8.0.13.
Описание. Определяет число фрагментов таблицы.
Сигнатура.
void setFragmentCount
(
Uint32 count
)
Параметры.
count
количество фрагментов, которые будут использоваться для таблицы.
Возвращаемое значение. Нет.
Описание. Этот метод пишет множество, содержащее следующую информацию о фрагменте:
Fragment ID
Node group ID
Fragment State
Сигнатура.
void setFragmentData ( const void*data
, Uint32len
)
Параметры.
Указатель на фрагмент
data
для записи.
Длина (len
)
этих данных в байтах как 32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает тип фрагментации таблицы.
Сигнатура.
void setFragmentType
(
FragmentType fragmentType
)
Параметры. Этот метод берет один аргумент, значение
FragmentType
, см.
раздел 2.3.31.1.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы написать данные файла
.FRM
этой таблицы.
Сигнатура.
void setFrm ( const void*data
, Uint32len
)
Параметры.
Указатель на
data
для записи.
Длина (len
) данных.
Возвращаемое значение. Нет.
Описание. Установите хэш-карту для таблицы. Введено в NDB 7.2.7.
Сигнатура.
int setHashMap ( const class HashMap & )
Параметры. Ссылка на хэш-карту.
Возвращаемое значение. 0 при успехе, при ошибке -1 и установит ошибку.
Описание. Это устанавливает параметр хеширования
KValue
.
Сигнатура.
void setKValue
(
int kValue
)
Параметры. kValue
это
integer. В настоящее время единственное разрешенное значение
6
. В будущей версии это может
стать переменным параметром.
Возвращаемое значение. Нет.
Сигнатура.
void setLinearFlag
(
Uint32 flag
)
Параметры.
flag
это
32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Переключает состояние регистрации таблицы. Посмотрите раздел 2.3.37.18.
Сигнатура.
void setLogging
(
bool enable
)
Параметры.
Если enable
=
true
, тогда регистрация для этой таблицы
позволена, если это false
, она выключена.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает фактор максимальной нагрузки, разделяя контейнеры в местных хэш-таблицах.
Сигнатура.
void setMaxLoadFactor
(
int max
)
Параметры. Этот метод берет единственный параметр
max
, integer, представляющий
процент (например, 45
задает 45%). См.
раздел 2.3.37.19.
Это никогда не должно быть больше, чем минимальный коэффициент загрузки.
Возвращаемое значение. Нет.
Описание. Этот метод определяет максимальное число строк, которые могут быть обработаны таблицей.
Сигнатура.
void setMaxRows
(
Uint64 maxRows
)
Параметры. maxRows
это
64-bit unsigned integer, который представляет максимальное количество строк,
которые будут храниться в таблице.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает минимальный коэффициент загрузки, когда сокращение хэш-таблицы начинается.
Сигнатура.
void setMinLoadFactor
(
int min
)
Параметры. Этот метод берет единственный параметр
min
, integer, задающий процент
(например, 45
значит 45%). См.
раздел 2.3.37.21.
Возвращаемое значение. Нет.
Описание. Этот метод определяет имя таблицы.
Это единственный метод
set
*
()Table
,
чьи эффекты видимы MySQL.
Сигнатура.
void setName
(
const char* name
)
Параметры.
name
новое название таблицы.
Возвращаемое значение. Нет.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
void setObjectType
(
Object::Type type
)
Параметры. Требуемый объект type
. Это должно быть одним из значений Type
, перечисленных в раздел 2.3.31.6
.
Возвращаемое значение. Нет.
Описание. Устанавливает схему балансирования разделения таблицы.
Сигнатура.
void setPartitionBalance
(
Object::PartitionBalance scheme
)
Параметры.
scheme
это схема балансирования разделения, которая будет использоваться для
таблицы. Это значение типа
PartitionBalance
.
Возвращаемое значение. Нет.
До NDB 7.5.4 этот метод был известен как
setFragmentCountType()
.
Описание. Этот метод устанавливает множество, содержащее информацию, которая отображает значения диапазона и список значений к фрагментам. Это по существу сортированная карта, состоящая из пар fragment-ID/value. Для разделения диапазона есть одна пара на фрагмент. Для разделения списка это могло быть любое число пар, но по крайней мере столько же пар, сколько есть фрагментов.
Сигнатура.
void setRangeListData ( const void*data
, Uint32len
)
Параметры.
Указатель на диапазон или список
data
, содержащий пары ID/значения.
Длина (len
) этих данных как
32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Установить индикатор контрольной суммы строки.
Сигнатура.
void setRowChecksumIndicator
(
bool value
) const
Параметры.
true
/false
value
.
Возвращаемое значение. Нет.
Описание. Устанавливает индикатор GCI строки.
Сигнатура.
void setRowGCIIndicator
(
bool value
) const
Параметры.
true
/false
value
.
Возвращаемое значение. Нет.
Описание. Задает для таблицы
SingleUserMode
.
Сигнатура.
void setSingleUserMode
(
enum SingleUserMode
)
Параметры.
Знаяение
SingleUserMode
.
Возвращаемое значение. Нет.
Описание. Вынуждает статус таблицы быть лишенным законной силы.
Сигнатура.
void setStatusInvalid ( void ) const
Параметры. Нет.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает табличное пространство для таблицы.
Сигнатуры. Используя название табличного пространства:
void setTablespace
(
const char* name
)
Используя объект
Tablespace
:
void setTablespace
(
const class Tablespace& tablespace
)
Параметры. Этот метод можно вызвать с отдельным аргументом, который может иметь любой из этих двух типов:
Имя name
табличного пространства (последовательность).
Ссылка на существующий экземпляр
Tablespace
.
См. раздел 2.3.38.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает информацию о табличном пространстве для каждого фрагмента и включает ID и версию табличного пространства.
Сигнатура.
void setTablespaceData ( const void*data
, Uint32len
)
Параметры.
Указатель на data
,
содержащие ID и версию табличного пространства
Длина (len
)
этих данных как 32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Определяет имена табличных пространств, используемых фрагментами таблицы.
Сигнатура.
void setTablespaceNames ( const void*data
Uint32len
)
Параметры.
Указатель на имена табличных пространств
data
Длина (len
)
данных об именах как 32-bit unsigned integer.
Возвращаемое значение. Нет.
Описание. Однопользовательский режим определяет права доступа к таблице.
Возможные значения.
Таблица 2.87.
Имя | Описание |
---|---|
SingleUserModeLocked |
Таблица блокирована (недоступна). |
SingleUserModeReadOnly |
Таблица доступна в режиме только для чтения. |
SingleUserModeReadWrite |
Таблица доступна в режиме чтения и записи. |
Описание. Этот метод утверждает определение для новой
таблицы до того, как это создано и выполняет метод
Table::aggregate()
, а также дополнительные проверки.
validate()
вызван автоматически, когда
таблица составлена или получена. Поэтому обычно не надо явно вызывать
aggregate()
или
validate()
.
Даже после вызова validate()
там могут все еще существовать ошибки, которые могут быть обнаружены только
ядром NDB
, когда таблица на
самом деле составлена.
Добавлено в MySQL 5.1.12 (Bug #21690).
Сигнатура.
int validate
(
struct NdbError& error
)
Параметры. Ссылка на объект
NdbError
.
Возвращаемое значение. integer, значение которого
0
при успехе,
-1
, если таблица находится в непоследовательном
статусе. В последнем случае также установлен
error
.
Резюме
Эта секция обсуждает класс Tablespace
и его публичные члены.
Родительский класс.
NdbDictionary
.
Дочерние классы. Нет.
Описание. Класс Tablespace
моделирует табличное пространство NDB Cluster Disk Data,
которое содержит файлы данных, используемые, чтобы хранить Cluster Disk Data.
Для обзора Cluster Disk Data см.
CREATE TABLESPACE Statement в MySQL Manual.
В настоящее время только неиндексируемые данные столбца могут храниться на диске. Индексы и колонки индексов всегда хранятся в памяти.
NDB Cluster до MySQL 5.1 не поддерживает хранение Disk Data и
табличные пространства, таким образом класс
Tablespace
недоступен приложениям API NDB,
написанным для этих старых выпусков.
Методы.
Таблица 2.88.
Имя | Описание |
---|---|
Tablespace() |
Конструктор класса |
~Tablespace() |
Виртуальный метод деструктора |
getAutoGrowSpecification() |
Используемый, чтобы получить структуру
AutoGrowSpecification ,
связанную с табличным пространством |
getDefaultLogfileGroup() |
Получает имя группы файла журнала табличного пространства по умолчанию |
getDefaultLogfileGroupId() |
Получает ID группы файла журнала табличного пространства по умолчанию |
getExtentSize() |
Получает размер экстента табличного пространства |
getName() |
Получает название табличного пространства |
getObjectId() |
Получает идентификатор объекта экземпляра
Tablespace |
getObjectStatus() |
Используемый, чтобы получить
Object::Status экземпляра
Tablespace , для которого это вызывают |
getObjectVersion() |
Получает версию объекта Tablespace ,
для которого это вызвано |
setAutoGrowSpecification() |
Используемый, чтобы установить особенности табличного пространства |
setDefaultLogfileGroup() |
Устанавливает группу файла журнала табличного пространства по умолчанию |
setExtentSize() |
Устанавливает размер экстентов, используемых табличным пространством |
setName() |
Определяет имя для табличного пространства |
Типы. Класс Tablespace не определяет собственных публичных типов,
однако, два из его методов используют структуру данных
AutoGrowSpecification
.
Описание. Эти методы используются, чтобы создать новый экземпляр
Tablespace
или скопировать существующий.
Класс
Dictionary
также поставляет методы для
создания и удаления табличных пространств.
Сигнатуры. Новый экземпляр:
Tablespace ( void )
Конструктор копии:
Tablespace
(
const Tablespace& tablespace
)
Параметры. Новый экземпляр:
Нет.
Конструктор копии: ссылка на существующий экземпляр
Tablespace
.
Возвращаемое значение.
Объект
Tablespace
.
Деструктор. Класс определяет виртуальный деструктор
~Tablespace()
,
который не берет аргументов и не возвращает значения.
Сигнатура.
const AutoGrowSpecification& getAutoGrowSpecification ( void ) const
Параметры. Нет.
Возвращаемое значение. Ссылка на структуру, которая описывает табличное пространство, см. раздел 2.3.1.
Описание. Этот метод получает имя группы файла журнала табличного пространства по умолчанию.
Альтернативно, можно хотеть получить ID группы файла журнала по умолчанию, посмотрите раздел 2.3.38.4.
Сигнатура.
const char* getDefaultLogfileGroup ( void ) const
Параметры. Нет.
Возвращаемое значение. Имя группы файла журнала (указатель на символ).
Описание. Этот метод получает ID группы файла журнала табличного пространства по умолчанию.
Можно также получить непосредственно имя группы файла журнала по умолчанию, а не ее ID, посмотрите раздел 2.3.38.3.
Сигнатура.
Uint32 getDefaultLogfileGroupId ( void ) const
Параметры. Нет.
Возвращаемое значение. ID группы файла журнала как unsigned 32-bit integer.
Описание. Этот метод используется, чтобы получить extent size, который является размером единиц выделения памяти, используемый табличным пространством.
Тот же самый размер используется для всех файлов данных, содержащихся в данном табличном пространстве.
Сигнатура.
Uint32 getExtentSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер экстента табличного пространства в байтах как unsigned 32-bit integer.
Описание. Этот метод получает идентификатор объекта табличного пространства.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта как integer.
Описание. Этот метод получает название табличного пространства.
Сигнатура.
const char* getName ( void ) const
Параметры. Нет.
Возвращаемое значение. Название табличного пространства, значение последовательности (как указатель на символ).
Описание. Этот метод используется, чтобы получить статус объекта табличного пространства.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение.
Значение
Object::Status
.
Описание. Этот метод получает версию объекта табличного пространства (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта как integer.
Описание. Этот метод используется, чтобы установить особенности табличного пространства.
Сигнатура.
void setAutoGrowSpecification
(
const AutoGrowSpecification& autoGrowSpec
)
Параметры. Этот метод берет единственный параметр, структуру данных
AutoGrowSpecification
.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы установить группу файла журнала табличного пространства по умолчанию.
Сигнатура. Этот метод можно назвать двумя различными способами. Первый использует имя группы файла журнала, как показано здесь:
void setDefaultLogfileGroup
(
const char* name
)
Этот метод можно также вызвать, передав ему ссылку на объект
LogfileGroup
:
void setDefaultLogfileGroup
(
const class LogfileGroup& lGroup
)
Нет никакого метода для установки группы файла журнала как
умолчание для табличного пространства, ссылаясь на ID группы файла журнала.
Другими словами, нет метода
set
, соответствующего *
()
getDefaultLogfileGroupId()
.
Параметры. name
группы файла журнала, которая будет назначена на табличное пространство или
ссылка lGroup
на
группу файла журнала.
Возвращаемое значение. Нет.
Описание. Этот метод устанавливает размер экстента табличного пространства.
Сигнатура.
void setExtentSize
(
Uint32 size
)
Параметры. size
для экстентов этого табличного пространства в байтах.
Возвращаемое значение. Нет.
Описание. Этот метод определяет имя табличного пространства.
Сигнатура.
void setName
(
const char* name
) const
Параметры. Имя name
табличного пространства, последовательность (указатель на символ).
Возвращаемое значение. Нет.
Резюме
Секция обсуждает класс undofile
и его пбуличные методы.
Родительский класс.
NdbDictionary
.
Дочерние классы. Нет.
Описание.
Класс undofile
моделирует файл отмен NDB Cluster
Disk Data, который хранит данные, используемые для того,
чтобы отменить транзакции.
В настоящее время только неиндексируемые данные столбца могут храниться на диске. Индексы и колонки индексов всегда хранятся в памяти.
NDB Cluster до MySQL 5.1 не поддерживает хранение Disk Data и файлы отмен,
поэтому класс undofile
недоступен приложениям API NDB, написанным для этих версий.
Методы.
Таблица 2.89.
Имя | Описание |
---|---|
undofile() |
Конструктор класса |
~undofile() |
Виртуальный деструктор |
getFileNo() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
getLogfileGroup() |
Получает имя группы файла журнала, которой принадлежит файл отмен |
getLogfileGroupId() |
Получает ID группы файла журнала, которой принадлежит файл отмен |
getNode() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
getObjectId() |
Получает идентификатор объекта файла отмен |
getObjectStatus() |
Получает
Status файла отмен |
getObjectVersion() |
Получает версию объекта файла отмен |
getPath() |
Получает путь файловой системы файла отмен |
getSize() |
Получает размер файла отмен |
setLogfileGroup() |
Устанавливает группу файла журнала файла отмен, используя имя группы
файла журнала или ссылку на объект
LogfileGroup
|
setNode() |
Удалено в NDB 7.5.0 (Bug #47960, Bug #11756088) |
setPath() |
Устанавливает путь файловой системы для файла отмен |
setSize() |
Устанавливает размер файла отмен |
Типы. Класс undofile
не определяет публичных типов.
Описание. Конструктор класса может использоваться, чтобы создать
новый экземпляр
undofile
или скопировать существующий.
Сигнатуры. Создает новый экземпляр:
undofile ( void )
Конструктор копии:
undofile
(
const undofile& undofile
)
Параметры. Новый экземпляр: Нет
. Конструктор копии: берет отдельный аргумент, ссылку на копируемый
undofile
.
Возвращаемое значение.
Объект
undofile
.
Деструктор. Класс определяет виртуальный деструктор, который не
берет аргументов и имеет тип возвращения void
.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
Uint32 getFileNo ( void ) const
Параметры. Нет.
Возвращаемое значение. Количество файлов отмен как unsigned 32-bit integer.
Описание. Этот метод получает имя группы файла журнала, которой принадлежит файл отмен.
Сигнатура.
const char* getLogfileGroup ( void ) const
Параметры. Нет.
Возвращаемое значение. Имя группы файла журнала, значение последовательности (как указатель на символ).
Описание. Этот метод получает ID группы файла журнала, которой принадлежит файл отмен.
Также возможно получить имя группы файла журнала непосредственно. Посмотрите раздел 2.3.39.3
Сигнатура.
Uint32 getLogfileGroupId ( void ) const
Параметры. Нет.
Возвращаемое значение. ID группы файла журнала как unsigned 32-bit integer.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
Uint32 getNode ( void ) const
Параметры. Нет.
Возвращаемое значение. ID узла как unsigned 32-bit integer.
Описание. Этот метод получает идентификатор объекта файла отмен.
Сигнатура.
virtual int getObjectId ( void ) const
Параметры. Нет.
Возвращаемое значение. Идентификатор объекта как integer.
Описание. Этот метод используется, чтобы получить статус объекта файла отмен.
Сигнатура.
virtual Object::Status getObjectStatus ( void ) const
Параметры. Нет.
Возвращаемое значение. Значение
Object::Status
.
Описание. Этот метод получает версию объекта файла отмен (см. NDB Schema Object Versions).
Сигнатура.
virtual int getObjectVersion ( void ) const
Параметры. Нет.
Возвращаемое значение. Версия объекта как integer.
Описание. Этот метод получает путь, соответствующий местоположению файла отмен в файловой системе узла данных.
Сигнатура.
const char* getPath ( void ) const
Параметры. Нет.
Возвращаемое значение. Путь файловой системы (как указатель на символ).
Описание. Этот метод получает размер файла отмен в байтах.
Сигнатура.
Uint64 getSize ( void ) const
Параметры. Нет.
Возвращаемое значение. Размер в байтах файла отмен как unsigned 64-bit integer.
Описание. Учитывая имя или ссылку на объект группы файла журнала
метод setLogfileGroup()
назначает файл отмен на эту группу файла журнала.
Сигнатура. Используя название группы файла журнала:
void setLogfileGroup
(
const char* name
)
Используя ссылку на экземпляр
LogfileGroup
:
void setLogfileGroup
(
const class LogfileGroup & logfileGroup
)
Параметры.
Имя name
группы файла журнала (указатель на символ) или ссылка на экземпляр
LogfileGroup
.
Возвращаемое значение. Нет.
Описание. Этот метод не работал, как предназначено и был удален в NDB 7.5.0 (Bug #47960, Bug #11756088).
Сигнатура.
void setNode
(
Uint32 nodeId
)
Параметры. nodeId
узла
данных, куда файл отмен должен быть помещен, unsigned 32-bit integer.
Возвращаемое значение. Нет.
Описание. Этот метод используется, чтобы установить путь файловой системы файла отмен на узле данных, где это находится.
Сигнатура.
void setPath
(
const char* path
)
Параметры. Желаемый путь path
к файлу отмен.
Возвращаемое значение. Нет.
Описание. Устанавливает размер файла отмен в байтах.
Сигнатура.
void setSize
(
Uint64 size
)
Параметры. Намеченный размер size
файла отмен в байтах, unsigned 64-bit integer.
Возвращаемое значение. Нет.
Резюме
Эта секция содержит обсуждение обработки ошибок в приложениях NDB API
а также списки листингов наиболее распространенных кодов ошибок и сообщений
NDB
с их классификациями и вероятными причинами,
для которого они могли бы быть подняты.
Для получения информации о структуре
NdbError
, которая используется, чтобы
передать информацию об ошибке приложениям API NDB, см.
раздел 2.3.20.
Сильно рекомендуется, чтобы вы НЕ
зависели от определенных кодов ошибок в вашем приложении
NDB
API, поскольку они подвержены изменениям со
временем. Вместо этого необходимо использовать
NdbError::Status
и классификация ошибок в вашем исходном коде или работать с выводом
perror
,
чтобы получить информацию об определенном коде ошибки.--ndb
error_code
Если вы находите ситуацию, в которой необходимо использовать определенный код ошибки, пожалуйста, подайте отчет об ошибках на http://bugs.mysql.com/, чтобы мы могли обновить соответствующий статус и классификацию.
Резюме
Эта секция описывает, как ошибки API NDB могут быть обнаружены и отображены на конкретные операции.
NDB API можно получить любым из двух способов:
Когда операция определяется
Когда операция выполняется
Ошибки во время операционного определения.
Ошибки, произведенные во время операционного определения, приводят к коду
возврата неудачи из названного метода. Фактическая ошибка может быть
определена, исследовав соответствующий объект
NdbOperation
или объект
NdbTransaction
.
Ошибки во время операционного выполнения.
Ошибки, происходящие во время операционного выполнения, вызывают прерывание
транзакции, если опция AO_IgnoreError
установлена для операции.
По умолчанию операции чтения работают с
AO_IgnoreError
, а операции записи с
AbortOnError
, но это может быть отвергнуто
пользователем. Когда ошибка во время выполнения заставляет транзакцию быть
прерванной, метод execute()
вернет
код возврата неудачи. Если ошибка проигнорирована из-за
AO_IgnoreError
, метод
execute()
возвращает код успеха, и пользователь
должен исследовать все операции на неудачу с использованием
NdbOperation::getNdbError()
. Поэтому возвращаемое значение
getNdbError()
обычно должно проверяться, даже если execute()
возвращает успех. Если клиентское приложение не отслеживает объекты
NdbOperation
во время выполнения, тогда
NdbTransaction::getNextCompletedOperation()
может использоваться для итерации по ним.
Необходимо также знать, что использование
NdbBlob
может привести к дополнительным операциям, добавляемым к выполненным пакетам.
Это означает что, итерируя законченную операцию с использованием
getNextCompletedOperation()
,
можно столкнуться с операциями, связанными с объектами
NdbBlob
,
которые не были определены вашим запросом.
Чтение с LockMode
=
CommittedRead
не может быть
AbortOnError
.
В этом случае это всегда IgnoreError
.
Во всех экземплярах, где определенные для операции ошибки возникают,
ошибка выполнения с операцией отмечена для операции и связанного
операционного объекта. Где есть многократные операционные ошибки на
одном вызове
NdbTransaction::execute()
,
из-за операционного группирования и использования
AO_IgnoreError
,
только первый отмечен для объекта
NdbTransaction
.
Остающиеся ошибки зарегистрированы только для соответствующего объекта
NdbOperation
.
Также возможно для ошибок произойти во время выполнения, например, неудача узла данных, такие ситуации отмечены для операционного объекта, но не для основных объектов операции. Это вызвано тем, что эти ошибки относятся к транзакции в целом, а не к отдельным операциям в транзакции.
Поэтому приложения должны использовать
NdbTransaction::getNdbError()
как первый способ определить успех
NdbTransaction::execute()
.
Если пакет выполняемых операций включает операции с опцией
AO_IgnoreError
, возможно, что были
многократные отказы, и законченные операции должны быть проверены
индивидуально на ошибки использованием
NdbOperation::getNdbError()
.
Неявный вызов NdbTransaction::execute() в методах BLOB и просмотре.
Операции по просмотру выполняются таким же образом как другие операции, и
также имеют неявный вызов execute()
в рамках
NdbScanOperation::nextResult()
. Когда
NdbScanOperation::nextResult()
указывает на неудачу (то есть, если метод возвращает
-1
),
операционный объект должен быть проверен на ошибку.
NdbScanOperation
может также содержать ошибку, но только если
ошибка не определенная для операции.
Некоторые методы обработки BLOB
также имеют неявный внутренний вызов execute()
и могут испытать операционные неудачи выполнения в этих пунктах. Следующие
методы NdbBlob
могут произвести неявный вызов execute()
,
это означает, что они также требуют проверки объекта
NdbTransaction
на ошибки через
NdbTransaction::getNdbError()
,
если они возвращают код ошибки:
setNull()
truncate()
readData()
writeData()
Резюме. В целом для ошибки возможно произойти во время выполнения (приводя к коду возврата неудачи), вызывая любой из следующих методов:
NdbScanOperation::nextResult()
Этот метод не выполняет неявный
execute()
. Методы
NdbBlob
могут заставить другие определенные операции быть выполненными, когда эти
методы вызывают, однако, nextResult()
не делает этого.
Если это происходит, метод
NdbTransaction::getNdbError()
нужно вызвать, чтобы определить первую ошибку, которая произошла.
Когда операции собраны в пакет и есть операции с
IgnoreError
в пакете, могут быть многократные
операции с ошибками в транзакции. Они могут быть найдены при помощи
NdbTransaction::getNextCompletedOperation()
,
чтобы итерировать по набору законченных операций, вызывая для каждой
NdbOperation::getNdbError()
.
Когда IgnoreError
установлена на любой операции в пакете, метод
NdbTransaction::execute()
указывает на успех даже там, где ошибки
на самом деле произошли, пока ни одна из этих ошибок не заставила транзакцию
быть прерванной. Чтобы определить, были ли какие-либо проигнорированные
ошибки, операционный ошибочный статус должен быть проверен, используя
NdbTransaction::getNdbError()
.
Только если это указывает на успех, вы можете быть
уверены, что никакие ошибки не произошли.
Если код ошибки возвращен этим методом, и операции были собраны в пакет, то
необходимо пройти по всем законченным операциям, чтобы найти все
операции с проигнорированными ошибками.
Пример (pseudocode).
Мы начинаем, выполняя транзакцию, которая, возможно, скомплектовала операции
установила опции AO_IgnoreError
и
AbortOnError
:
int execResult= NdbTransaction.execute(args
);
Для числа и разрешенных значений
args
см.
раздел 2.3.30.6.
Затем, потому что ошибки в операциях с
AO_IgnoreError
не затрагивают execResult,
то есть, значение, возвращенное execute()
,
мы проверяем ошибки в транзакции:
NdbError err= NdbTransaction.getNdbError(); if (err.code != 0) {
Ненулевое значение для кода ошибки означает, что ошибка была поднята в транзакции. Это могло произойти из-за любого из следующих условий:
Ошибка всей транзакции, такая как неудача узла данных, которая заставила транзакцию быть прерванной
Единственная определенная для операции ошибка, такая как ограничительное нарушение, которое заставило транзакцию быть прерванной
Единственная определенная для операции проигнорированная ошибка, такая как ек найденные данные, которая не заставила транзакцию быть прерванной
Первая из многих определенных для операции проигнорированных ошибок, таких как данные не найдены, которая не заставила транзакцию быть прерванной
Первая из многих определенных для операции проигнорированных ошибок, таких как не найденные данные перед операционной ошибкой прерывания (прерванная транзакция)
if (execResult != 0) {
Транзакция была прервана. Рекомендуемая стратегия обработки ошибки в этом случае состоит в том, чтобы проверить операционный ошибочный статус и принять соответствующие меры на основе его значения:
switch (err.status) { case value1: //statement block handlingvalue1
... case value2: //statement block handlingvalue2
... //(etc. ...) case valueN: //statement block handlingvalueN
... }
Так как транзакция была прервана, вообще необходимо пройти по законченным операциям (если таковые имеются) и учесть ошибки, поднятые каждой операцией, только если вы хотите сделать так для сообщения о причинах.
} else {
Сама транзакция не была прервана, но должна быть одна или несколько проигнорированных ошибок. В этом случае необходимо пройти по операциям, чтобы определить, что произошло и обращаться с причиной соответственно.
} }
Чтобы обработать
NdbScanOperation::nextResult()
,
который возвращает -1
,
указывая, что операция потерпела неудачу:
int nextrc= NdbScanOperation.nextResult(args
);
Для числа и разрешенных значений
args
см.
раздел 2.3.29.6.
if (nextrc == -1) {
Во-первых, необходимо проверить объект
NdbScanOperation
для любых ошибок:
NdbError err= NdbScanOperation.getNdbError(); if (err.code == 0) {
Если никакая ошибка не была найдена в операции по просмотру, ошибка должна принадлежать всей транзакции.
} err= NdbTransaction.getNdbError();
Теперь можно обработать ошибку на основе ошибочного статуса:
switch (err.status) { case value1: //statement block handlingvalue1
... case value2: //statement block handlingvalue2
... //(etc. ...) case valueN: //statement block handlingvalueN
... } }
Для получения информации об ошибочных классификационных кодах API NDB и
кодах статусов посмотрите
раздел 2.4.4. В то время как вы не должны полагаться на определенный код
ошибки или текст сообщения в ваших приложениях API NDB,
коды ошибок и сообщения подлежат изменению со временем, может быть полезно
проверить коды ошибок и сообщения, чтобы помочь определить, почему произошла
конкретная неудача. Для получения дополнительной информации о них, посмотрите
раздел 2.4.2. Для подробностей о
NdbError
и типах информации, которая может быть получена из объектов
NdbError
см. раздел 2.3.20.
Эта секция содержит много списков кодов ошибок, один для каждого типа ошибки API NDB. Ошибочные типы включают следующее:
Нет ошибки
Ошибка приложения
Ошибка приложения просмотра
Конфигурация или ошибка приложения
Никакие данные не найдены
Ограничительное нарушение
Ошибка схемы
Пользователь определил ошибку
Недостаточно места
Временная ошибка ресурса
Ошибка восстановления узла
Ошибка перегрузки
Тайм-аут кончился
Закрытие узла
Внутренний временный сбой
Неизвестная ошибка результата
Неизвестный (в настоящее время неиспользованный) код ошибки
Внутренняя ошибка
Функция не реализована
Информация в каждом списке включает для каждой ошибки:
Код ошибки NDB
Соответствующий код ошибки MySQL
Классификационный код NDB
См. раздел 2.4.4 для значений этих классификационных кодов.
Текст сообщения об ошибке
Подобные ошибки сгруппированы в каждом списке. Каждый список упорядочен в алфавитном порядке.
Можно всегда получать последние коды ошибок и информацию от файла
storage/ndb/src/ndbapi/ndberror.cpp
.
(в предыдущих выпусках NDB Cluster этот файл был
ndberror.c
).
Эти типы также показывают в столбце
error_status
таблицы
ndbinfo.error_messages
.
Ошибка MySQL. 0
Сообщение об ошибке. No error
Ошибка MySQL. DMEC
Сообщение об ошибке. Table read-only
Ошибка MySQL. DMEC
Сообщение об ошибке. A backup is already running
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup not supported in diskless mode (change Diskless)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup during software upgrade not supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to allocate buffers (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to setup fs buffers (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to allocate tables (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to insert file header (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to insert table list (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to allocate table memory (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to allocate file record (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed to allocate attribute record (check configuration)
Ошибка MySQL. DMEC
Сообщение об ошибке. Node already reserved
Ошибка MySQL. DMEC
Сообщение об ошибке. Node already connected
Ошибка MySQL. DMEC
Сообщение об ошибке. Node type mismatch
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Сообщение об ошибке. Create foreign key failed - parent key is primary key and on-update-cascade is not allowed
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Сообщение об ошибке. Create foreign key failed in NDB - parent index is not unique index
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Сообщение об ошибке. Create foreign key failed in NDB - No parent row found
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Сообщение об ошибке. Create foreign key failed - child table has Blob or Text column and on-delete-cascade is not allowed
Ошибка MySQL. DMEC
Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Build foreign key failed in NDB - foreign key not found
Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED
Сообщение об ошибке. Drop table not allowed in NDB - referenced by foreign key on another table
Ошибка MySQL. HA_ERR_DROP_INDEX_FK
Сообщение об ошибке. Drop index not allowed in NDB - used as parent index of a foreign key
Ошибка MySQL. HA_ERR_DROP_INDEX_FK
Сообщение об ошибке. Drop index not allowed in NDB - used as child index of a foreign key
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Сообщение об ошибке. Create foreign key failed in NDB - name contains invalid character (/)
Ошибка MySQL. DMEC
Сообщение об ошибке. Zero concurrency in scan
Ошибка MySQL. DMEC
Сообщение об ошибке. Too high concurrency in scan
Ошибка MySQL. DMEC
Сообщение об ошибке. DML count in transaction exceeds config parameter MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations
Ошибка MySQL. DMEC
Сообщение об ошибке. No condition and attributes to read in scan
Ошибка MySQL. HA_ERR_NO_CONNECTION
Сообщение об ошибке. Operation not allowed due to cluster shutdown in progress
Ошибка MySQL. DMEC
Сообщение об ошибке. Operation not allowed or aborted due to single user mode
Ошибка MySQL. DMEC
Сообщение об ошибке. Undefined partition used in setPartitionId
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid no of nodes specified for new nodegroup
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid nodegroup id
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node already in nodegroup
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid nodegroup id, nodegroup already existing
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, no node in nodegroup is started
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node ID invalid or undefined
Ошибка MySQL. DMEC
Сообщение об ошибке. Attribute name or id not found in the table
Ошибка MySQL. DMEC
Сообщение об ошибке. Status Error in NDB
Ошибка MySQL. DMEC
Сообщение об ошибке. No connections to NDB available and connect failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Type in NdbTamper not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. No schema connections to NDB available and connect failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Ndb Init in wrong state, destroy Ndb object and create a new
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many Ndb objects
Ошибка MySQL. DMEC
Сообщение об ошибке. All Not NULL attribute have not been defined
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction is already completed
Ошибка MySQL. DMEC
Сообщение об ошибке. Operation was not defined correctly, probably missing a key
Ошибка MySQL. DMEC
Сообщение об ошибке. Could not start transporter, configuration error
Ошибка MySQL. DMEC
Сообщение об ошибке. Parameter error in API call
Ошибка MySQL. DMEC
Сообщение об ошибке. Scan already complete
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot set name twice for an Ndb object
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot set name after Ndb object is initialised
Ошибка MySQL. DMEC
Сообщение об ошибке. Free percent out of range. Allowed range is 1-99
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad operation reference - double unlock
Ошибка MySQL. DMEC
Сообщение об ошибке. Status Error when defining an operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Variable Arrays not yet supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Set value on tuple key attribute is not allowed
Ошибка MySQL. DMEC
Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL
Ошибка MySQL. DMEC
Сообщение об ошибке. Set value and Read/Delete Tuple is incompatible
Ошибка MySQL. DMEC
Сообщение об ошибке. No Key attribute used to define tuple
Ошибка MySQL. DMEC
Сообщение об ошибке. Not allowed to equal key attribute twice
Ошибка MySQL. DMEC
Сообщение об ошибке. Key size is limited to 4092 bytes
Ошибка MySQL. DMEC
Сообщение об ошибке. Trying to read a non-stored attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Length parameter in equal/setValue is incorrect
Ошибка MySQL. DMEC
Сообщение об ошибке. Ndb sent more info than the length he specified
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistency in list of NdbRecAttr-objects
Ошибка MySQL. DMEC
Сообщение об ошибке. Ndb reports NULL value on Not NULL attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Not all data of an attribute has been received
Ошибка MySQL. DMEC
Сообщение об ошибке. Not all attributes have been received
Ошибка MySQL. DMEC
Сообщение об ошибке. More data received than reported in TCKEYCONF message
Ошибка MySQL. DMEC
Сообщение об ошибке. More than 8052 bytes in setValue cannot be handled
Ошибка MySQL. DMEC
Сообщение об ошибке. It is not allowed to increment any other than unsigned ints
Ошибка MySQL. DMEC
Сообщение об ошибке. Currently not allowed to increment NULL-able attributes
Ошибка MySQL. DMEC
Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits
Ошибка MySQL. DMEC
Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits
Ошибка MySQL. DMEC
Сообщение об ошибке. Trying to jump to a non-defined label
Ошибка MySQL. DMEC
Сообщение об ошибке. Label was not found, internal error
Ошибка MySQL. DMEC
Сообщение об ошибке. Not allowed to create jumps to yourself
Ошибка MySQL. DMEC
Сообщение об ошибке. Not allowed to jump to a label in a different subroutine
Ошибка MySQL. DMEC
Сообщение об ошибке. All primary keys defined, call setValue/getValue
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad number when defining a label
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad number when defining a subroutine
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal interpreter function in scan definition
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal register in interpreter function definition
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal state when calling getValue, probably not a read
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal state when calling interpreter routine
Ошибка MySQL. DMEC
Сообщение об ошибке. Parallelism can only be between 1 and 240
Ошибка MySQL. DMEC
Сообщение об ошибке. Calling execute (synchronous) when already prepared asynchronous transaction exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal to call setValue in this state
Ошибка MySQL. DMEC
Сообщение об ошибке. No callback from execute
Ошибка MySQL. DMEC
Сообщение об ошибке. Trigger name too long
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many triggers
Ошибка MySQL. DMEC
Сообщение об ошибке. Trigger not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Trigger with given name already exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported trigger type
Ошибка MySQL. DMEC
Сообщение об ошибке. Index name too long
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many indexes
Ошибка MySQL. DMEC
Сообщение об ошибке. Index not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal index/trigger create/drop/alter request
Ошибка MySQL. DMEC
Сообщение об ошибке. Trigger/index name invalid
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid table
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index type or index logging option
Ошибка MySQL. HA_ERR_FOUND_DUPP_UNIQUE
Сообщение об ошибке. Cannot create unique index, duplicate keys found
Ошибка MySQL. DMEC
Сообщение об ошибке. Failed to allocate space for index
Ошибка MySQL. DMEC
Сообщение об ошибке. Failed to create index table
Ошибка MySQL. DMEC
Сообщение об ошибке. Table not an index table
Ошибка MySQL. DMEC
Сообщение об ошибке. Hash index attributes must be specified in same order as table attributes
Ошибка MySQL. DMEC
Сообщение об ошибке. Must call Ndb::init() before this function
Ошибка MySQL. DMEC
Сообщение об ошибке. Tried to read too much - too many getValue calls
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot create unique index, duplicate attributes found in definition
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid set of range scan bounds
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid usage of blob attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. The method is not valid in current blob state
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid blob seek position
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index object, not retrieved via getIndex()
Ошибка MySQL. DMEC
Сообщение об ошибке. Table definition has undefined column
Ошибка MySQL. DMEC
Сообщение об ошибке. The blob method is incompatible with operation type or lock mode
Ошибка MySQL. DMEC
Сообщение об ошибке. Missing NULL ptr in end of keyData list
Ошибка MySQL. DMEC
Сообщение об ошибке. Key part len is to small for column
Ошибка MySQL. DMEC
Сообщение об ошибке. Supplied buffer to small
Ошибка MySQL. DMEC
Сообщение об ошибке. Malformed string
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistent key part length
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many keys specified for key bound in scanIndex
Ошибка MySQL. DMEC
Сообщение об ошибке. range_no not strictly increasing in ordered multi-range index scan
Ошибка MySQL. DMEC
Сообщение об ошибке. key_record in index scan is not an index ndbrecord
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot mix NdbRecAttr and NdbRecord methods in one operation
Ошибка MySQL. DMEC
Сообщение об ошибке. NULL NdbRecord pointer
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid range_no (must be < 4096)
Ошибка MySQL. DMEC
Сообщение об ошибке. The key_record and attribute_record in primary key operation do not belong to the same table
Ошибка MySQL. DMEC
Сообщение об ошибке. Blob handle for column not available
Ошибка MySQL. DMEC
Сообщение об ошибке. API version mismatch or wrong sizeof(NdbDictionary::RecordSpecification)
Ошибка MySQL. DMEC
Сообщение об ошибке. Missing column specification in NdbDictionary::RecordSpecification
Ошибка MySQL. DMEC
Сообщение об ошибке. Duplicate column specification in NdbDictionary::RecordSpecification
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbRecord for tuple access is not an index key NdbRecord
Ошибка MySQL. DMEC
Сообщение об ошибке. Error returned from application scanIndex() callback
Ошибка MySQL. DMEC
Сообщение об ошибке. Scan filter is too large, discarded
Ошибка MySQL. DMEC
Сообщение об ошибке. Column is NULL in Get/SetValueSpec structure
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid AbortOption
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid or unsupported OperationOptions structure
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid or unsupported ScanOptions structure
Ошибка MySQL. DMEC
Сообщение об ошибке. Incorrect combination of ScanOption flags, extraGetValues ptr and numExtraGetValues
Ошибка MySQL. DMEC
Сообщение об ошибке. Tuple Key Type not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Fragment Type not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Minimum Load Factor not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Maximum Load Factor not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Maximum Load Factor smaller than Minimum
Ошибка MySQL. DMEC
Сообщение об ошибке. K value must currently be set to 6
Ошибка MySQL. DMEC
Сообщение об ошибке. Memory Type not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid table name
Ошибка MySQL. DMEC
Сообщение об ошибке. Attribute Size not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Fixed array too large, maximum 64000 bytes
Ошибка MySQL. DMEC
Сообщение об ошибке. Attribute Type not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Storage Mode not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Null Attribute Type not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. Index only storage for non-key attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Storage Type of attribute not correct
Ошибка MySQL. DMEC
Сообщение об ошибке. No more key attributes allowed after defining variable length key attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Key attributes are not allowed to be NULL attributes
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many primary keys defined in table
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid attribute name or number
Ошибка MySQL. DMEC
Сообщение об ошибке. createAttribute called at erroneus place
Ошибка MySQL. DMEC
Сообщение об ошибке. Attempt to define distribution key when not prepared to
Ошибка MySQL. DMEC
Сообщение об ошибке. Distribution Key set on table but not defined on first attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Attempt to define distribution group when not prepared to
Ошибка MySQL. DMEC
Сообщение об ошибке. Distribution Group set on table but not defined on first attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Distribution Group with erroneus number of bits
Ошибка MySQL. DMEC
Сообщение об ошибке. Distribution key is only supported on part of primary key
Ошибка MySQL. DMEC
Сообщение об ошибке. Disk memory attributes not yet supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Variable stored attributes not yet supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Only one autoincrement column allowed per table. Having a table without primary key uses an autoincremented hidden key, i.e. a table without a primary key can not have an autoincremented column
Ошибка MySQL. DMEC
Сообщение об ошибке. Result or attribute record must be a base table ndbrecord, not an index ndbrecord
Ошибка MySQL. DMEC
Сообщение об ошибке. Not all keys read when using option SF_OrderBy
Ошибка MySQL. DMEC
Сообщение об ошибке. Scan defined but not prepared
Ошибка MySQL. DMEC
Сообщение об ошибке. Table with blobs does not support refresh
Ошибка MySQL. DMEC
Сообщение об ошибке. Status Error in NdbSchemaCon
Ошибка MySQL. DMEC
Сообщение об ошибке. Only one schema operation per schema transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. No schema operation defined before calling execute
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema transaction is already started
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema transaction not possible until upgrade complete
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema transaction is not started
Ошибка MySQL. DMEC
Сообщение об ошибке. Insert in hash table failed when getting table information from Ndb
Ошибка MySQL. DMEC
Сообщение об ошибке. GetValue not allowed in Update operation
Ошибка MySQL. DMEC
Сообщение об ошибке. GetValue not allowed in Insert operation
Ошибка MySQL. DMEC
Сообщение об ошибке. SetValue not allowed in Read operation
Ошибка MySQL. DMEC
Сообщение об ошибке. NULL value not allowed in primary key search
Ошибка MySQL. DMEC
Сообщение об ошибке. Missing getValue/setValue when calling execute
Ошибка MySQL. DMEC
Сообщение об ошибке. Missing operation request when calling execute
Ошибка MySQL. DMEC
Сообщение об ошибке. GetValue not allowed for NdbRecord defined operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Non SF_MultiRange scan cannot have more than one bound
Ошибка MySQL. DMEC
Сообщение об ошибке. User specified partition id not allowed for scan takeover operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Blobs not allowed in NdbRecord delete result record
Ошибка MySQL. DMEC
Сообщение об ошибке. Incorrect combination of OperationOptions optionsPresent, extraGet/SetValues ptr and numExtraGet/SetValues
Ошибка MySQL. DMEC
Сообщение об ошибке. Only one scan bound allowed for non-NdbRecord setBound() API
Ошибка MySQL. DMEC
Сообщение об ошибке. Can only call setBound/equal() for an NdbIndexScanOperation
Ошибка MySQL. DMEC
Сообщение об ошибке. Method not allowed for NdbRecord, use OperationOptions or ScanOptions structure instead
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal instruction in interpreted program
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad label in branch instruction
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many instructions in interpreted program
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbInterpretedCode::finalise() not called
Ошибка MySQL. DMEC
Сообщение об ошибке. Call to undefined subroutine
Ошибка MySQL. DMEC
Сообщение об ошибке. Call to undefined subroutine, internal error
Ошибка MySQL. DMEC
Сообщение об ошибке. setBound() called twice for same key
Ошибка MySQL. DMEC
Сообщение об ошибке. Pseudo columns not supported by NdbRecord
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbInterpretedCode is for different table
Ошибка MySQL. DMEC
Сообщение об ошибке. Attempt to set bound on non key column
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbScanFilter constructor taking NdbOperation is not supported for NdbRecord
Ошибка MySQL. DMEC
Сообщение об ошибке. Wrong API. Use NdbInterpretedCode for NdbRecord operations
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbInterpretedCode instruction requires that table is set
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbInterpretedCode not supported for operation type
Ошибка MySQL. DMEC
Сообщение об ошибке. Attempt to pass an Index column to createRecord. Use base table columns only
Ошибка MySQL. DMEC
Сообщение об ошибке. Unknown partition information type
Ошибка MySQL. DMEC
Сообщение об ошибке. Duplicate partitioning information supplied
Ошибка MySQL. DMEC
Сообщение об ошибке. Wrong partitionInfo type for table
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid or Unsupported PartitionInfo structure
Ошибка MySQL. DMEC
Сообщение об ошибке. Explicit partitioning info not allowed for table and operation
Ошибка MySQL. DMEC
Сообщение об ошибке. RecordSpecification has overlapping offsets
Ошибка MySQL. DMEC
Сообщение об ошибке. RecordSpecification has too many elements
Ошибка MySQL. DMEC
Сообщение об ошибке. getLockHandle only supported for primary key read with a lock
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot releaseLockHandle until operation executed
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbLockHandle already released
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbLockHandle does not belong to transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbLockHandle original operation not executed successfully
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbBlob can only be closed from Active state
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbBlob cannot be closed with pending operations
Ошибка MySQL. DMEC
Сообщение об ошибке. RecordSpecification has illegal value in column_flags
Ошибка MySQL. DMEC
Сообщение об ошибке. Column types must be identical when comparing two columns
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction is already started
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction is not started
Ошибка MySQL. DMEC
Сообщение об ошибке. You must call getNdbOperation before executeScan
Ошибка MySQL. DMEC
Сообщение об ошибке. There can only be ONE operation in a scan transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. takeOverScanOp, to take over a scanned row one must explicitly request keyinfo on readTuples call
Ошибка MySQL. DMEC
Сообщение об ошибке. You may only call readTuples() once for each operation
Ошибка MySQL. DMEC
Сообщение об ошибке. There may only be one operation in a scan transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. You can not takeOverScan unless you have used openScanExclusive
Ошибка MySQL. DMEC
Сообщение об ошибке. You must call nextScanResult before trying to takeOverScan
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many event have been defined
Ошибка MySQL. DMEC
Сообщение об ошибке. Event name is too long
Ошибка MySQL. DMEC
Сообщение об ошибке. Can't accept more subscribers
Ошибка MySQL. DMEC
Сообщение об ошибке. Event not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Creation of event failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Stopped event operation does not exist. Already stopped?
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX do not exist
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats for specified index do not exist
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats methods usage error
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats cannot allocate memory
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX partly missing or invalid
Ошибка MySQL. DMEC
Сообщение об ошибке. Mysqld: index stats request ignored due to recent error
Ошибка MySQL. DMEC
Сообщение об ошибке. Mysqld: index stats request aborted by stats thread
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats were deleted by another process
Ошибка MySQL. DMEC
Сообщение об ошибке. Attribute name reused in table definition
Ошибка MySQL. DMEC
Сообщение об ошибке. DDL is not supported with mixed data-node versions
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Given NODEGROUP doesn't exist in this cluster
Ошибка MySQL. DMEC
Сообщение об ошибке. Index created on temporary table must itself be temporary
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot create a temporary index on a non-temporary table
Ошибка MySQL. DMEC
Сообщение об ошибке. A temporary table or index must be specified as not logging
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Logfile group not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Object definition too big
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema feature requires data node upgrade
Ошибка MySQL. DMEC
Сообщение об ошибке. A disk table must not be specified as no logging
Ошибка MySQL. DMEC
Сообщение об ошибке. Too much attrinfo from application in tuple manager
Ошибка MySQL. DMEC
Сообщение об ошибке. Corrupt data received for insert/update
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many nullable/bitfields in table definition
Ошибка MySQL. DMEC
Сообщение об ошибке. Too long or too short default value
Ошибка MySQL. DMEC
Сообщение об ошибке. Fixed-size column offset exceeded max. Use VARCHAR or COLUMN_FORMAT DYNAMIC for memory-stored columns
Ошибка MySQL. DMEC
Сообщение об ошибке. Too much attrinfo (e.g. scan filter) for scan in tuple manager
Ошибка MySQL. DMEC
Сообщение об ошибке. 876
Ошибка MySQL. DMEC
Сообщение об ошибке. 877
Ошибка MySQL. DMEC
Сообщение об ошибке. 878
Ошибка MySQL. DMEC
Сообщение об ошибке. 879
Ошибка MySQL. DMEC
Сообщение об ошибке. Tried to read too much - too many getValue calls
Ошибка MySQL. DMEC
Сообщение об ошибке. Stack overflow in interpreter
Ошибка MySQL. DMEC
Сообщение об ошибке. Stack underflow in interpreter
Ошибка MySQL. DMEC
Сообщение об ошибке. More than 65535 instructions executed in interpreter
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported type in scan filter
Ошибка MySQL. DMEC
Сообщение об ошибке. Update attempt of primary key via ndbcluster internal api (if this occurs via the MySQL server it is a bug, please report)
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stat scan requested with wrong lock mode
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index for index stats update
Ошибка MySQL. DMEC
Сообщение об ошибке. Row operation defined after refreshTuple()
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid block name
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid error number. Should be >= 0.
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid trace number.
Ошибка MySQL. DMEC
Сообщение об ошибке. The specified node is not an API node.
Ошибка MySQL. DMEC
Сообщение об ошибке. Node shutdown in progress
Ошибка MySQL. DMEC
Сообщение об ошибке. Node shutdown would cause system crash
Ошибка MySQL. DMEC
Сообщение об ошибке. No contact with database nodes }
Ошибка MySQL. DMEC
Сообщение об ошибке. No contact with the process (dead ?).
Ошибка MySQL. DMEC
Сообщение об ошибке. Operation not allowed while nodes are starting or stopping.
Ошибка MySQL. DMEC
Сообщение об ошибке. Batch size for sub scan cannot be smaller than number of fragments.
Ошибка MySQL. DMEC
Сообщение об ошибке. Character operand was right truncated
Ошибка MySQL. DMEC
Сообщение об ошибке. Character Parameter was right truncated
Ошибка MySQL. DMEC
Сообщение об ошибке. Query definition too large.
Ошибка MySQL. DMEC
Сообщение об ошибке. Query has operation with empty projection.
Ошибка MySQL. DMEC
Сообщение об ошибке. Query defintion should have at least one operation.
Ошибка MySQL. DMEC
Сообщение об ошибке. Query is in illegal state for this operation.
Ошибка MySQL. DMEC
Сообщение об ошибке. A previous query operation failed, which you missed to catch.
Ошибка MySQL. DMEC
Сообщение об ошибке. Multiple 'parents' specified in linkedValues for this operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Query with multiple scans may not be sorted.
Ошибка MySQL. DMEC
Сообщение об ошибке. Numeric operand out of range
Ошибка MySQL. DMEC
Сообщение об ошибке. Can't use same operand value to specify different column values
Ошибка MySQL. DMEC
Сообщение об ошибке. Incompatible datatype specified in operand argument
Ошибка MySQL. DMEC
Сообщение об ошибке. Parameter value has an incompatible datatype
Ошибка MySQL. DMEC
Сообщение об ошибке. Required argument is NULL
Ошибка MySQL. DMEC
Сообщение об ошибке. Result row already defined for NdbQueryOperation.
Ошибка MySQL. DMEC
Сообщение об ошибке. Index scan order was already set in query definition.
Ошибка MySQL. DMEC
Сообщение об ошибке. Parallelism cannot be restricted for sorted scans.
Ошибка MySQL. DMEC
Сообщение об ошибке. All required 'key' values was not specified
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many 'key' or 'bound' values was specified
Ошибка MySQL. DMEC
Сообщение об ошибке. Unknown 'parent' specified in linkedValue
Ошибка MySQL. DMEC
Сообщение об ошибке. Specified 'index' does not belong to specified 'table'
Ошибка MySQL. DMEC
Сообщение об ошибке. Wrong type of index specified for this operation
Ошибка MySQL. DMEC
Сообщение об ошибке. This method cannot be invoked on this type of operation (lookup/scan/index scan).
Ошибка MySQL. DMEC
Сообщение об ошибке. Send to process or receive failed.
Ошибка MySQL. DMEC
Сообщение об ошибке. System shutdown in progress
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported multi node shutdown. Abort option required.
Ошибка MySQL. DMEC
Сообщение об ошибке. The process has wrong type. Expected a DB process.
Ошибка MySQL. HA_ERR_KEY_NOT_FOUND
Сообщение об ошибке. Tuple did not exist
Ошибка MySQL. HA_ERR_NO_REFERENCED_ROW
Сообщение об ошибке. Foreign key constraint violated: No parent row found
Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED
Сообщение об ошибке. Foreign key constraint violated: Referenced row exists
Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY
Сообщение об ошибке. Tuple already existed when attempting to insert
Ошибка MySQL. DMEC
Сообщение об ошибке. Illegal null attribute
Ошибка MySQL. DMEC
Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL
Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY
Сообщение об ошибке. Constraint violation e.g. duplicate value in unique index
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Too many fragments
Ошибка MySQL. DMEC
Сообщение об ошибке. Table not defined in local query handler
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. Table is being dropped
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Invalid schema version
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot use drop table for drop index
Ошибка MySQL. DMEC
Сообщение об ошибке. Too long frm data supplied
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid table or index to scan
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid table or index to scan
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscription not found in subscriber manager
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscription not unique in subscriber manager
Ошибка MySQL. DMEC
Сообщение об ошибке. Table in suscription not defined, probably dropped
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscription dropped, no new subscribers allowed
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscription already dropped
Ошибка MySQL. DMEC
Сообщение об ошибке. Partially connected API in NdbOperation::execute()
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of subscription records
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of table records in SUMA
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of MaxNoOfConcurrentSubOperations
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscription being defined... while trying to stop subscriber
Ошибка MySQL. DMEC
Сообщение об ошибке. No such subscriber
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of filegroup records
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of logbuffer memory(specify smaller undo_buffer_size or increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of file records
Ошибка MySQL. DMEC
Сообщение об ошибке. File system error, check if path, permissions etc
Ошибка MySQL. DMEC
Сообщение об ошибке. File read error
Ошибка MySQL. DMEC
Сообщение об ошибке. Currently there is a limit of one logfile group
Ошибка MySQL. DMEC
Сообщение об ошибке. Currently there is a 4G limit of one undo/data-file in 32-bit host
Ошибка MySQL. DMEC
Сообщение об ошибке. File too small
Ошибка MySQL. DMEC
Сообщение об ошибке. Insufficient disk page buffer memory. Increase DiskPageBufferMemory or reduce data file size.
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. Query table not defined
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. Query table is being dropped
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Сообщение об ошибке. Query table definition has changed
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - parent table is not table
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid parent table version
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - child table is not table
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid child table version
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid parent index version
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - child index is not index
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid child index version
Ошибка MySQL. DMEC
Сообщение об ошибке. Drop foreign key failed in NDB - invalid foreign key version
Ошибка MySQL. DMEC
Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found in TC
Ошибка MySQL. DMEC
Сообщение об ошибке. Build foreign key failed in NDB - invalid foreign key version
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Сообщение об ошибке. Invalid schema object version
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. Table is being dropped
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Сообщение об ошибке. Table not defined in transaction coordinator
Ошибка MySQL. DMEC
Сообщение об ошибке. Unknown table error in transaction coordinator
Ошибка MySQL. DMEC
Сообщение об ошибке. Column defined in event does not exist in table
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid table format
Ошибка MySQL. DMEC
Сообщение об ошибке. Attribute name too long
Ошибка MySQL. DMEC
Сообщение об ошибке. Table name too long
Ошибка MySQL. DMEC
Сообщение об ошибке. No more table metadata records (increase MaxNoOfTables)
Ошибка MySQL. DMEC
Сообщение об ошибке. No more attribute metadata records (increase MaxNoOfAttributes)
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. No such table existed
Ошибка MySQL. DMEC
Сообщение об ошибке. Internal: Get by table name not supported, use table id.
Ошибка MySQL. DMEC
Сообщение об ошибке. No more hashmap metadata records
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. No such table existed
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported array size
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Attribute array size too big
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Record too big
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Unsupported primary key length
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Nullable primary key not supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported alter table
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Unsupported character set in table or index
Ошибка MySQL. DMEC
Сообщение об ошибке. Character string is invalid for given character set
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Distribution key not supported for char attribute (use binary attribute)
Ошибка MySQL. IE
Сообщение об ошибке. Invalid file type
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of file records
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid file format
Ошибка MySQL. IE
Сообщение об ошибке. Invalid filegroup for file
Ошибка MySQL. IE
Сообщение об ошибке. Invalid filegroup version when creating file
Ошибка MySQL. HA_MISSING_CREATE_OPTION
Сообщение об ошибке. Invalid tablespace
Ошибка MySQL. DMEC
Сообщение об ошибке. Index on disk column is not supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Varsize bitfield not supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Tablespace has changed
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid tablespace version
Ошибка MySQL. DMEC
Сообщение об ошибке. File already exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Unable to drop table as backup is in progress
Ошибка MySQL. DMEC
Сообщение об ошибке. Unable to alter table as backup is in progress
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Invalid extent size
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of filegroup records
Ошибка MySQL. DMEC
Сообщение об ошибке. Cant drop file, no such file
Ошибка MySQL. DMEC
Сообщение об ошибке. Cant drop filegroup, no such filegroup
Ошибка MySQL. DMEC
Сообщение об ошибке. Cant drop filegroup, filegroup is used
Ошибка MySQL. DMEC
Сообщение об ошибке. Drop undofile not supported, drop logfile group instead
Ошибка MySQL. DMEC
Сообщение об ошибке. Cant drop file, file is used
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of string memory, please modify StringMemory config parameter
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid schema object for drop
Ошибка MySQL. DMEC
Сообщение об ошибке. Create file is not supported when Diskless=1
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Invalid undo buffer size
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Invalid hashmap
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Too many total bits in bitfields
Ошибка MySQL. DMEC
Сообщение об ошибке. Default value for primary key column not supported
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of schema transaction memory
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Non default partitioning without partitions
Ошибка MySQL. DMEC
Сообщение об ошибке. Unable to create table, out of data pages (increase DataMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported attribute type in index
Ошибка MySQL. DMEC
Сообщение об ошибке. Unsupported character set in table or index
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Сообщение об ошибке. Index is being dropped
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stat scan requested on index with unsupported key size
Ошибка MySQL. HA_ERR_TABLE_EXIST
Сообщение об ошибке. Index or table with given name already exists
Ошибка MySQL. HA_ERR_TABLE_EXIST
Сообщение об ошибке. Schema object with given name already exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Event name already exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup aborted by user request
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbScanFilter: Operator is not defined in NdbScanFilter::Group
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbScanFilter: Column is NULL
Ошибка MySQL. DMEC
Сообщение об ошибке. NdbScanFilter: Condition is out of bounds
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of resources
Ошибка MySQL. DMEC
Сообщение об ошибке. Can't accept more subscribers, out of space in pool
Ошибка MySQL. DMEC
Сообщение об ошибке. Can't accept more subscriptions, out of space in pool
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Out of extents, tablespace full
Ошибка MySQL. DMEC
Сообщение об ошибке. No datafile in tablespace
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)
Ошибка MySQL. DMEC
Сообщение об ошибке. Error -1 from get_page
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Out of page request records when allocating disk record
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Out of extent records when allocating disk record
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. 623
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. 624
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Сообщение об ошибке. Out of memory in Ndb Kernel, hash index part (increase DataMemory)
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Сообщение об ошибке. Table fragment hash index has reached maximum possible size
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many hash indexes (should not happen)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of event records
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Too many tables and attributes (increase MaxNoOfAttributes or MaxNoOfTables)
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Out of memory in Ndb Kernel, table data (increase DataMemory)
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Сообщение об ошибке. Out of memory in Ndb Kernel, ordered index data (increase DataMemory)
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Сообщение об ошибке. Too many ordered indexes (increase MaxNoOfOrderedIndexes)
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Сообщение об ошибке. Out of fragment records (increase MaxNoOfOrderedIndexes)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of attribute records (increase MaxNoOfAttributes)
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid ordered index tree node size
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of operation records in local data manager (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Send Buffers overloaded in NDB kernel
Ошибка MySQL. DMEC
Сообщение об ошибке. REDO log files overloaded (increase FragmentLogFileSize)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction markers in LQH, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. REDO log files overloaded (increase disk hardware)
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup failed: file already exists (use 'START BACKUP <backup id>')
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber manager busy with adding/removing a subscriber
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber manager busy with adding the subscription
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber manager has subscribers on this subscription
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber manager busy with adding/removing a table
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of undo space
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due out of operation records
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to out of LongMessageBuffer
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to out of query memory
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to out of row memory
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - no more object records
Ошибка MySQL. DMEC
Сообщение об ошибке. 217
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of LongMessageBuffer
Ошибка MySQL. DMEC
Сообщение об ошибке. 219
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many concurrently fired triggers, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of operation records in transaction coordinator (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many active scans, increase MaxNoOfConcurrentScans
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of frag location records in TC (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction markers databuffer in TC, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction records for complete phase (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction markers in TC, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. No space left on the device
Ошибка MySQL. DMEC
Сообщение об ошибке. Error with file permissions, please check file system
Ошибка MySQL. DMEC
Сообщение об ошибке. Error in reading files, please check file system
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of index operations in transaction coordinator (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction buffer memory in TC (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of scanfrag records in TC (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of attribute buffers in TC block, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of LongMessageBuffer
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Сообщение об ошибке. 414
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction buffers in LQH, increase LongSignalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of signal memory, increase LongSignalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many active scans
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of scan records in LQH, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many active scans
Ошибка MySQL. DMEC
Сообщение об ошибке. Busy during read of event table
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many schema transactions
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many schema operations
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid schema transaction state
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema object is busy with another schema transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Missing schema operation at takeover of schema transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of attrinfo records in tuple manager, increase LongSignalMemory
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of add fragment operation records
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, ordered index data (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Rowid already allocated
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, ordered scan operation (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. No free index stats op
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot prepare index stats update
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot execute index stats update
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, copy tuples (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of UNDO buffer memory (increase UNDO_BUFFER_SIZE)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, stored procedure record (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, tup scan operation (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of transaction memory in local data manager, acc scan operation (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Сообщение об ошибке. Temporary failure, distribution changed
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber manager busy with node recovery
Ошибка MySQL. DMEC
Сообщение об ошибке. Api node died, when SUB_START_REQ reached node
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to node failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Node where lock was held crashed, restart scan transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Send to NDB failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Send to ndbd node failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Request timed out in waiting for node failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Send to NDB failed
Ошибка MySQL. DMEC
Сообщение об ошибке. Cluster temporary unavailable
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction was committed but all read information was not received due to node crash
Ошибка MySQL. DMEC
Сообщение об ошибке. Simple/dirty read failed due to node failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Scan take over error, restart scan transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Scan take over error, restart scan transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema transaction aborted due to node-failure
Ошибка MySQL. DMEC
Сообщение об ошибке. REDO buffers overloaded (increase RedoBuffer)
Ошибка MySQL. DMEC
Сообщение об ошибке. IO overload error
Ошибка MySQL. DMEC
Сообщение об ошибке. Connect failure - out of connection objects (increase MaxNoOfConcurrentTransactions)
Ошибка MySQL. DMEC
Сообщение об ошибке. REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)
Ошибка MySQL. DMEC
Сообщение об ошибке. Index UNDO buffers overloaded (increase UndoIndexBuffer)
Ошибка MySQL. DMEC
Сообщение об ошибке. System busy with other schema operation
Ошибка MySQL. DMEC
Сообщение об ошибке. System busy with node restart, schema operations not allowed
Ошибка MySQL. DMEC
Сообщение об ошибке. Data UNDO buffers overloaded (increase UndoDataBuffer)
Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT
Сообщение об ошибке. Transaction had timed out when trying to commit it
Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT
Сообщение об ошибке. Time-out in NDB, probably caused by deadlock
Ошибка MySQL. DMEC
Сообщение об ошибке. Timeout/deadlock during index build
Ошибка MySQL. DMEC
Сообщение об ошибке. Time-out due to node shutdown not starting in time
Ошибка MySQL. DMEC
Сообщение об ошибке. Time-out due to node shutdown not completing in time
Ошибка MySQL. DMEC
Сообщение об ошибке. Read operation aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Сообщение об ошибке. Node failure handling not completed
Ошибка MySQL. DMEC
Сообщение об ошибке. Not ready for connection allocation yet
Ошибка MySQL. DMEC
Сообщение об ошибке. Request to non-master
Ошибка MySQL. DMEC
Сообщение об ошибке. Schema transaction aborted
Ошибка MySQL. DMEC
Сообщение об ошибке. Receive from NDB failed
Ошибка MySQL. HA_ERR_NO_CONNECTION
Сообщение об ошибке. Cluster Failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Request ndbd time-out, maybe due to high load or communication problems
Ошибка MySQL. DMEC
Сообщение об ошибке. Undefined error
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup issued to not master (reissue command to master)
Ошибка MySQL. DMEC
Сообщение об ошибке. Sequence failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup definition not implemented
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup already completed
Ошибка MySQL. DMEC
Сообщение об ошибке. 1323
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup log buffer full
Ошибка MySQL. DMEC
Сообщение об ошибке. File or scan error
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup aborted due to node failure
Ошибка MySQL. DMEC
Сообщение об ошибке. 1327
Ошибка MySQL. DMEC
Сообщение об ошибке. Backup undefined error
Ошибка MySQL. DMEC
Сообщение об ошибке. No replica to scan on this node (internal index stats error)
Ошибка MySQL. DMEC
Сообщение об ошибке. Subscriber node undefined in SubStartReq (config change?)
Ошибка MySQL. DMEC
Сообщение об ошибке. Filegroup already exists
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid filegroup
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid filegroup version
Ошибка MySQL. DMEC
Сообщение об ошибке. File no already inuse
Ошибка MySQL. DMEC
Сообщение об ошибке. File meta data error
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of memory
Ошибка MySQL. DMEC
Сообщение об ошибке. Filegroup not online
Ошибка MySQL. DMEC
Сообщение об ошибке. Undefined error
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to empty query tree
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid request
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to unknown query operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid tree node specification
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid tree parameter specification
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid pattern
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to query node too big
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to query node parameters too big
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to both tree and parameters contain interpreted program
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Key parameter bits mismatch
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Incorrect key parameter count
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to internal error
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to invalid node count
Ошибка MySQL. DMEC
Сообщение об ошибке. Query aborted due to index fragment not found
Ошибка MySQL. DMEC
Сообщение об ошибке. 202
Ошибка MySQL. DMEC
Сообщение об ошибке. 203
Ошибка MySQL. DMEC
Сообщение об ошибке. 207
Ошибка MySQL. DMEC
Сообщение об ошибке. 208
Ошибка MySQL. DMEC
Сообщение об ошибке. Communication problem, signal error
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid request
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - object already exists in TC
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - no more object records in TC
Ошибка MySQL. DMEC
Сообщение об ошибке. Create foreign key failed in NDB - invalid request to TC
Ошибка MySQL. DMEC
Сообщение об ошибке. 220
Ошибка MySQL. DMEC
Сообщение об ошибке. 230
Ошибка MySQL. DMEC
Сообщение об ошибке. 232
Ошибка MySQL. DMEC
Сообщение об ошибке. 238
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid data encountered during foreign key trigger execution
Ошибка MySQL. DMEC
Сообщение об ошибке. Simple Read transaction without any attributes to read
Ошибка MySQL. DMEC
Сообщение об ошибке. Update operation without any attributes to update
Ошибка MySQL. DMEC
Сообщение об ошибке. 276
Ошибка MySQL. DMEC
Сообщение об ошибке. 277
Ошибка MySQL. DMEC
Сообщение об ошибке. 278
Ошибка MySQL. DMEC
Сообщение об ошибке. Index corrupted
Ошибка MySQL. DMEC
Сообщение об ошибке. Corrupt key in TC, unable to xfrm
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistent index state in TC block
Ошибка MySQL. DMEC
Сообщение об ошибке. Unlocked operation has out of range index
Ошибка MySQL. DMEC
Сообщение об ошибке. Unlocked operation has invalid state
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid distribution key
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of fragment records in DIH
Ошибка MySQL. DMEC
Сообщение об ошибке. MEMORY ALLOCATION ERROR
Ошибка MySQL. DMEC
Сообщение об ошибке. Signal Definition Error
Ошибка MySQL. DMEC
Сообщение об ошибке. Internal Error in NdbApi
Ошибка MySQL. DMEC
Сообщение об ошибке. Internal Error in NdbApi
Ошибка MySQL. DMEC
Сообщение об ошибке. Simple Transaction and Not Start
Ошибка MySQL. DMEC
Сообщение об ошибке. Faulty operation type
Ошибка MySQL. DMEC
Сообщение об ошибке. Faulty primary key attribute length
Ошибка MySQL. DMEC
Сообщение об ошибке. Faulty length in ATTRINFO signal
Ошибка MySQL. DMEC
Сообщение об ошибке. Status Error in NdbConnection
Ошибка MySQL. DMEC
Сообщение об ошибке. Too many operations received
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad state handling unlock request
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid blob attributes or invalid blob parts table
Ошибка MySQL. DMEC
Сообщение об ошибке. Corrupted blob value
Ошибка MySQL. DMEC
Сообщение об ошибке. Error in blob head update forced rollback of transaction
Ошибка MySQL. DMEC
Сообщение об ошибке. No connection to ndb management server
Ошибка MySQL. DMEC
Сообщение об ошибке. Unknown blob error
Ошибка MySQL. DMEC
Сообщение об ошибке. No blob table in dict cache
Ошибка MySQL. DMEC
Сообщение об ошибке. Corrupted main table PK in blob operation
Ошибка MySQL. DMEC
Сообщение об ошибке. Cannot use the same object twice to create table
Ошибка MySQL. DMEC
Сообщение об ошибке. Trying to start two schema transactions
Ошибка MySQL. DMEC
Сообщение об ошибке. Only DBDICT and TRIX can send requests to TRIX
Ошибка MySQL. DMEC
Сообщение об ошибке. TRIX block is not available yet, probably due to node failure
Ошибка MySQL. DMEC
Сообщение об ошибке. Internal error at index create/build
Ошибка MySQL. DMEC
Сообщение об ошибке. Bad state at alter index
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistency detected at alter index
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistency detected at index usage
Ошибка MySQL. DMEC
Сообщение об ошибке. Transaction already aborted
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats samples data or memory cache is invalid
Ошибка MySQL. DMEC
Сообщение об ошибке. Index stats internal error
Ошибка MySQL. DMEC
Сообщение об ошибке. Mysqld: index stats thread not open for requests
Ошибка MySQL. DMEC
Сообщение об ошибке. Mysqld: index stats entry unexpectedly not found
Ошибка MySQL. DMEC
Сообщение об ошибке. Event not found
Ошибка MySQL. DMEC
Сообщение об ошибке. 632
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistency during table creation
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Primary Table in wrong state
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Сообщение об ошибке. Given fragmentType doesn't exist
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid schema transaction key from NDB API
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid schema transaction id from NDB API
Ошибка MySQL. DMEC
Сообщение об ошибке. Out of LongMessageBuffer in DICT
Ошибка MySQL. DMEC
Сообщение об ошибке. 809
Ошибка MySQL. DMEC
Сообщение об ошибке. 812
Ошибка MySQL. DMEC
Сообщение об ошибке. 833
Ошибка MySQL. DMEC
Сообщение об ошибке. 871
Ошибка MySQL. DMEC
Сообщение об ошибке. 882
Ошибка MySQL. DMEC
Сообщение об ошибке. 883
Ошибка MySQL. DMEC
Сообщение об ошибке. 887
Ошибка MySQL. DMEC
Сообщение об ошибке. 888
Ошибка MySQL. DMEC
Сообщение об ошибке. 890
Ошибка MySQL. DMEC
Сообщение об ошибке. Tuple corrupted - wrong checksum or column data in invalid format
Ошибка MySQL. DMEC
Сообщение об ошибке. Inconsistent ordered index. The index needs to be dropped and recreated
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index stats request
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index stats sys tables
Ошибка MySQL. DMEC
Сообщение об ошибке. Invalid index stats sys tables data
Ошибка MySQL. DMEC
Сообщение об ошибке. Function not implemented yet
Ошибка MySQL. DMEC
Сообщение об ошибке. Wrong fragment count for fully replicated table
Эта секция перечисляет все ошибки NDB
,
упорядоченные по коду ошибки NDB
.
Каждый листинг также включает тип ошибки
NDB
, соответствующую ошибку MySQL Server и
и текст сообщения об ошибке.
Ошибка MySQL. 0
Тип ошибки NDB. No error
Сообщение об ошибке. No error
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Temporary failure, distribution changed
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of operation records in local data manager (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Send Buffers overloaded in NDB kernel
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. REDO log files overloaded (increase FragmentLogFileSize)
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. REDO buffers overloaded (increase RedoBuffer)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction markers in LQH, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Read operation aborted due to node shutdown
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Too many fragments
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table not defined in local query handler
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table is being dropped
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid schema version
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Cannot use drop table for drop index
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Too long frm data supplied
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid table or index to scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid table or index to scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Table read-only
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. REDO log files overloaded (increase disk hardware)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Undefined error
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup issued to not master (reissue command to master)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. A backup is already running
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of resources
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Sequence failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup definition not implemented
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup not supported in diskless mode (change Diskless)
Ошибка MySQL. DMEC
Тип ошибки NDB. User defined error
Сообщение об ошибке. Backup aborted by user request
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup already completed
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 1323
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup log buffer full
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. File or scan error
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup aborted due to node failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 1327
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup during software upgrade not supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Backup undefined error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to allocate buffers (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to setup fs buffers (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to allocate tables (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to insert file header (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to insert table list (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to allocate table memory (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to allocate file record (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Backup failed to allocate attribute record (check configuration)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Backup failed: file already exists (use 'START BACKUP <backup id>')
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Subscriber manager busy with node recovery
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Subscription not found in subscriber manager
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Subscriber manager busy with adding/removing a subscriber
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Can't accept more subscribers, out of space in pool
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Subscriber manager busy with adding the subscription
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Subscriber manager has subscribers on this subscription
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Subscription not unique in subscriber manager
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Can't accept more subscriptions, out of space in pool
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table in suscription not defined, probably dropped
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Subscription dropped, no new subscribers allowed
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Subscription already dropped
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Subscriber manager busy with adding/removing a table
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Partially connected API in NdbOperation::execute()
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of subscription records
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of table records in SUMA
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of MaxNoOfConcurrentSubOperations
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Subscription being defined... while trying to stop subscriber
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. No such subscriber
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Api node died, when SUB_START_REQ reached node
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. No replica to scan on this node (internal index stats error)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Subscriber node undefined in SubStartReq (config change?)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of undo space
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Filegroup already exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of filegroup records
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of logbuffer memory(specify smaller undo_buffer_size or increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid filegroup
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid filegroup version
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. File no already inuse
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of file records
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. File system error, check if path,permissions etc
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. File meta data error
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Out of memory
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. File read error
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Filegroup not online
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Currently there is a limit of one logfile group
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Currently there is a 4G limit of one undo/data-file in 32-bit host
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. File too small
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Insufficient disk page buffer memory. Increase DiskPageBufferMemory or reduce data file size.
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. IO overload error
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of extents, tablespace full
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. No datafile in tablespace
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Error -1 from get_page
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of page request records when allocating disk record
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of extent records when allocating disk record
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Undefined error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Node already reserved
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Node already connected
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal temporary
Сообщение об ошибке. Node failure handling not completed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Node type mismatch
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal temporary
Сообщение об ошибке. Not ready for connection allocation yet
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Query aborted due out of operation records
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to empty query tree
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid request
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to unknown query operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid tree node specification
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid tree parameter specification
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Query aborted due to out of LongMessageBuffer
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid pattern
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Query aborted due to out of query memory
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to query node too big
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to query node parameters too big
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to both tree and parameters contain interpreted program
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Key parameter bits mismatch
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid tree parameter specification: Incorrect key parameter count
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to internal error
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Query aborted due to out of row memory
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Query aborted due to node failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to invalid node count
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Query aborted due to index fragment not found
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Query table not defined
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Query table is being dropped
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB. Schema error
Сообщение об ошибке. Query table definition has changed
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 202
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 203
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 207
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 208
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Communication problem, signal error
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB. Application error
Сообщение об ошибке. Create foreign key failed - parent key is primary key and on-update-cascade is not allowed
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Create foreign key failed in NDB - no more object records
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Create foreign key failed in NDB - invalid request
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - parent table is not table
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - invalid parent table version
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - child table is not table
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - invalid child table version
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB. Application error
Сообщение об ошибке. Create foreign key failed in NDB - parent index is not unique index
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - invalid parent index version
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - child index is not index
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create foreign key failed in NDB - invalid child index version
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Create foreign key failed in NDB - object already exists in TC
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Create foreign key failed in NDB - no more object records in TC
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Create foreign key failed in NDB - invalid request to TC
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB. Application error
Сообщение об ошибке. Create foreign key failed in NDB - No parent row found
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB. Application error
Сообщение об ошибке. Create foreign key failed - child table has Blob or Text column and on-delete-cascade is not allowed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Drop foreign key failed in NDB - invalid foreign key version
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Drop foreign key failed in NDB - foreign key not found in TC
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Build foreign key failed in NDB - foreign key not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Build foreign key failed in NDB - invalid foreign key version
Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED
Тип ошибки NDB. Application error
Сообщение об ошибке. Drop table not allowed in NDB - referenced by foreign key on another table
Ошибка MySQL. HA_ERR_DROP_INDEX_FK
Тип ошибки NDB. Application error
Сообщение об ошибке. Drop index not allowed in NDB - used as parent index of a foreign key
Ошибка MySQL. HA_ERR_DROP_INDEX_FK
Тип ошибки NDB. Application error
Сообщение об ошибке. Drop index not allowed in NDB - used as child index of a foreign key
Ошибка MySQL. HA_ERR_CANNOT_ADD_FOREIGN
Тип ошибки NDB. Application error
Сообщение об ошибке. Create foreign key failed in NDB - name contains invalid character (/)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. 217
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of LongMessageBuffer
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. 219
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 220
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many concurrently fired triggers, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 230
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 232
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of operation records in transaction coordinator (increase SharedGlobalMemory)
Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT
Тип ошибки NDB. Timeout expired
Сообщение об ошибке. Transaction had timed out when trying to commit it
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 238
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid data encountered during foreign key trigger execution
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid schema object version
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Zero concurrency in scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too high concurrency in scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many active scans, increase MaxNoOfConcurrentScans
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node where lock was held crashed, restart scan transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of frag location records in TC (increase SharedGlobalMemory)
Ошибка MySQL. HA_ERR_NO_REFERENCED_ROW
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Foreign key constraint violated: No parent row found
Ошибка MySQL. HA_ERR_ROW_IS_REFERENCED
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Foreign key constraint violated: Referenced row exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. DML count in transaction exceeds config parameter MaxDMLOperationsPerTransaction/MaxNoOfConcurrentOperations
Ошибка MySQL. HA_ERR_LOCK_WAIT_TIMEOUT
Тип ошибки NDB. Timeout expired
Сообщение об ошибке. Time-out in NDB, probably caused by deadlock
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No condition and attributes to read in scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Simple Read transaction without any attributes to read
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Update operation without any attributes to update
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction markers databuffer in TC, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction records for complete phase (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 276
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 277
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 278
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction markers in TC, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. HA_ERR_NO_CONNECTION
Тип ошибки NDB. Application error
Сообщение об ошибке. Operation not allowed due to cluster shutdown in progress
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. No space left on the device
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Error with file permissions, please check file system
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Error in reading files, please check file system
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table is being dropped
Ошибка MySQL. HA_ERR_TABLE_DEF_CHANGED
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table not defined in transaction coordinator
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unknown table error in transaction coordinator
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Index corrupted
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of index operations in transaction coordinator (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction buffer memory in TC (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Corrupt key in TC, unable to xfrm
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of scanfrag records in TC (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Inconsistent index state in TC block
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of attribute buffers in TC block, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Unlocked operation has out of range index
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Unlocked operation has invalid state
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid distribution key
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Operation not allowed or aborted due to single user mode
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Out of fragment records in DIH
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Undefined partition used in setPartitionId
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of LongMessageBuffer
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid no of nodes specified for new nodegroup
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid nodegroup id
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node already in nodegroup
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid nodegroup id, nodegroup already existing
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, no node in nodegroup is started
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid node(s) specified for new nodegroup, node ID invalid or undefined
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. MEMORY ALLOCATION ERROR
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Signal Definition Error
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Send to NDB failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Function not implemented
Сообщение об ошибке. Function not implemented yet
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attribute name or id not found in the table
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Internal Error in NdbApi
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. Connect failure - out of connection objects (increase MaxNoOfConcurrentTransactions)
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Send to ndbd node failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Unknown result error
Сообщение об ошибке. Receive from NDB failed
Ошибка MySQL. HA_ERR_NO_CONNECTION
Тип ошибки NDB. Unknown result error
Сообщение об ошибке. Cluster Failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Internal Error in NdbApi
Ошибка MySQL. DMEC
Тип ошибки NDB. Unknown result error
Сообщение об ошибке. Request ndbd time-out, maybe due to high load or communication problems
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Request timed out in waiting for node failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Node failure caused abort of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of Send Buffer space in NDB API
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Send to NDB failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Node shutdown
Сообщение об ошибке. Transaction aborted due to node shutdown
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Cluster temporary unavailable
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Status Error in NDB
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No connections to NDB available and connect failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Type in NdbTamper not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No schema connections to NDB available and connect failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Ndb Init in wrong state, destroy Ndb object and create a new
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many Ndb objects
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. All Not NULL attribute have not been defined
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Simple Transaction and Not Start
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Faulty operation type
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Faulty primary key attribute length
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Faulty length in ATTRINFO signal
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Status Error in NdbConnection
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Too many operations received
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Transaction is already completed
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Transaction was committed but all read information was not received due to node crash
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Operation was not defined correctly, probably missing a key
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Could not start transporter, configuration error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Parameter error in API call
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Simple/dirty read failed due to node failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Scan already complete
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot set name twice for an Ndb object
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot set name after Ndb object is initialised
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Free percent out of range. Allowed range is 1-99
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. 414
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Bad state handling unlock request
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Bad operation reference - double unlock
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction buffers in LQH, increase LongSignalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of signal memory, increase LongSignalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Status Error when defining an operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Variable Arrays not yet supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Set value on tuple key attribute is not allowed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Set value and Read/Delete Tuple is incompatible
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No Key attribute used to define tuple
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not allowed to equal key attribute twice
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Key size is limited to 4092 bytes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trying to read a non-stored attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Length parameter in equal/setValue is incorrect
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Ndb sent more info than the length he specified
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Inconsistency in list of NdbRecAttr-objects
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Ndb reports NULL value on Not NULL attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not all data of an attribute has been received
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not all attributes have been received
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. More data received than reported in TCKEYCONF message
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. More than 8052 bytes in setValue cannot be handled
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. It is not allowed to increment any other than unsigned ints
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Currently not allowed to increment NULL-able attributes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Maximum size of interpretative attributes are 64 bits
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trying to jump to a non-defined label
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Label was not found, internal error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not allowed to create jumps to yourself
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not allowed to jump to a label in a different subroutine
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. All primary keys defined, call setValue/getValue
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Bad number when defining a label
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Bad number when defining a subroutine
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal interpreter function in scan definition
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal register in interpreter function definition
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal state when calling getValue, probably not a read
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal state when calling interpreter routine
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Parallelism can only be between 1 and 240
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Calling execute (synchronous) when already prepared asynchronous transaction exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal to call setValue in this state
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No callback from execute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trigger name too long
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many triggers
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trigger not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trigger with given name already exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Unsupported trigger type
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index name too long
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many indexes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index not found
Ошибка MySQL. HA_ERR_TABLE_EXIST
Тип ошибки NDB. Schema object already exists
Сообщение об ошибке. Index or table with given name already exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal index/trigger create/drop/alter request
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Trigger/index name invalid
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid index type or index logging option
Ошибка MySQL. HA_ERR_FOUND_DUPP_UNIQUE
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot create unique index, duplicate keys found
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Failed to allocate space for index
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Failed to create index table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Table not an index table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Hash index attributes must be specified in same order as table attributes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Must call Ndb::init() before this function
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Tried to read too much - too many getValue calls
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot create unique index, duplicate attributes found in definition
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid set of range scan bounds
Ошибка MySQL. DMEC
Тип ошибки NDB. User defined error
Сообщение об ошибке. NdbScanFilter: Operator is not defined in NdbScanFilter::Group
Ошибка MySQL. DMEC
Тип ошибки NDB. User defined error
Сообщение об ошибке. NdbScanFilter: Column is NULL
Ошибка MySQL. DMEC
Тип ошибки NDB. User defined error
Сообщение об ошибке. NdbScanFilter: Condition is out of bounds
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid blob attributes or invalid blob parts table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid usage of blob attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. The method is not valid in current blob state
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid blob seek position
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Corrupted blob value
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Error in blob head update forced rollback of transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. No connection to ndb management server
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Unknown blob error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid index object, not retrieved via getIndex()
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Table definition has undefined column
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. No blob table in dict cache
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Corrupted main table PK in blob operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. The blob method is incompatible with operation type or lock mode
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Missing NULL ptr in end of keyData list
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Key part len is to small for column
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Supplied buffer to small
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Malformed string
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Inconsistent key part length
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many keys specified for key bound in scanIndex
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. range_no not strictly increasing in ordered multi-range index scan
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. key_record in index scan is not an index ndbrecord
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot mix NdbRecAttr and NdbRecord methods in one operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NULL NdbRecord pointer
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid range_no (must be < 4096)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. The key_record and attribute_record in primary key operation do not belong to the same table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Blob handle for column not available
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. API version mismatch or wrong sizeof(NdbDictionary::RecordSpecification)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Missing column specification in NdbDictionary::RecordSpecification
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Duplicate column specification in NdbDictionary::RecordSpecification
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbRecord for tuple access is not an index key NdbRecord
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Error returned from application scanIndex() callback
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Scan filter is too large, discarded
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Column is NULL in Get/SetValueSpec structure
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid AbortOption
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid or unsupported OperationOptions structure
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid or unsupported ScanOptions structure
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Incorrect combination of ScanOption flags, extraGetValues ptr and numExtraGetValues
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Tuple Key Type not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Fragment Type not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Minimum Load Factor not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Maximum Load Factor not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Maximum Load Factor smaller than Minimum
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. K value must currently be set to 6
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Memory Type not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid table name
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attribute Size not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Fixed array too large, maximum 64000 bytes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attribute Type not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Storage Mode not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Null Attribute Type not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index only storage for non-key attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Storage Type of attribute not correct
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No more key attributes allowed after defining variable length key attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Key attributes are not allowed to be NULL attributes
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many primary keys defined in table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid attribute name or number
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. createAttribute called at erroneus place
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Cannot use the same object twice to create table
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Trying to start two schema transactions
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attempt to define distribution key when not prepared to
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Distribution Key set on table but not defined on first attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attempt to define distribution group when not prepared to
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Distribution Group set on table but not defined on first attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Distribution Group with erroneus number of bits
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Distribution key is only supported on part of primary key
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Disk memory attributes not yet supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Variable stored attributes not yet supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Only one autoincrement column allowed per table. Having a table without primary key uses an autoincremented hidden key, i.e. a table without a primary key can not have an autoincremented column
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Result or attribute record must be a base table ndbrecord, not an index ndbrecord
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Not all keys read when using option SF_OrderBy
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Scan defined but not prepared
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Table with blobs does not support refresh
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Only DBDICT and TRIX can send requests to TRIX
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. TRIX block is not available yet, probably due to node failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Internal error at index create/build
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Bad state at alter index
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Inconsistency detected at alter index
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Inconsistency detected at index usage
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Transaction already aborted
Ошибка MySQL. DMEC
Тип ошибки NDB. Timeout expired
Сообщение об ошибке. Timeout/deadlock during index build
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Status Error in NdbSchemaCon
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Only one schema operation per schema transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No schema operation defined before calling execute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Schema transaction is already started
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Schema transaction not possible until upgrade complete
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Schema transaction is not started
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Insert in hash table failed when getting table information from Ndb
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. GetValue not allowed in Update operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. GetValue not allowed in Insert operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. SetValue not allowed in Read operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NULL value not allowed in primary key search
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Missing getValue/setValue when calling execute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Missing operation request when calling execute
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. GetValue not allowed for NdbRecord defined operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Non SF_MultiRange scan cannot have more than one bound
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. User specified partition id not allowed for scan takeover operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Blobs not allowed in NdbRecord delete result record
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Incorrect combination of OperationOptions optionsPresent, extraGet/SetValues ptr and numExtraGet/SetValues
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Only one scan bound allowed for non-NdbRecord setBound() API
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Can only call setBound/equal() for an NdbIndexScanOperation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Method not allowed for NdbRecord, use OperationOptions or ScanOptions structure instead
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Illegal instruction in interpreted program
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Bad label in branch instruction
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many instructions in interpreted program
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbInterpretedCode::finalise() not called
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Call to undefined subroutine
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Call to undefined subroutine, internal error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. setBound() called twice for same key
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Pseudo columns not supported by NdbRecord
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbInterpretedCode is for different table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attempt to set bound on non key column
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbScanFilter constructor taking NdbOperation is not supported for NdbRecord
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Wrong API. Use NdbInterpretedCode for NdbRecord operations
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbInterpretedCode instruction requires that table is set
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbInterpretedCode not supported for operation type
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attempt to pass an Index column to createRecord. Use base table columns only
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Unknown partition information type
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Duplicate partitioning information supplied
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Wrong partitionInfo type for table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid or Unsupported PartitionInfo structure
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Explicit partitioning info not allowed for table and operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. RecordSpecification has overlapping offsets
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. RecordSpecification has too many elements
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. getLockHandle only supported for primary key read with a lock
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot releaseLockHandle until operation executed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbLockHandle already released
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbLockHandle does not belong to transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbLockHandle original operation not executed successfully
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbBlob can only be closed from Active state
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. NdbBlob cannot be closed with pending operations
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. RecordSpecification has illegal value in column_flags
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Column types must be identical when comparing two columns
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Transaction is already started
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Transaction is not started
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. You must call getNdbOperation before executeScan
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. There can only be ONE operation in a scan transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. takeOverScanOp, to take over a scanned row one must explicitly request keyinfo on readTuples call
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. You may only call readTuples() once for each operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. There may only be one operation in a scan transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. You can not takeOverScan unless you have used openScanExclusive
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. You must call nextScanResult before trying to takeOverScan
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many event have been defined
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Event name is too long
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Can't accept more subscribers
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Event not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Creation of event failed
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Stopped event operation does not exist. Already stopped?
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Column defined in event does not exist in table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX do not exist
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats for specified index do not exist
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats methods usage error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats cannot allocate memory
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Index stats samples data or memory cache is invalid
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Index stats internal error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats sys tables NDB_INDEX_STAT_PREFIX partly missing or invalid
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Mysqld: index stats thread not open for requests
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Mysqld: index stats entry unexpectedly not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Mysqld: index stats request ignored due to recent error
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Mysqld: index stats request aborted by stats thread
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stats were deleted by another process
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Event not found
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many active scans
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of scan records in LQH, increase SharedGlobalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many active scans
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Scan take over error, restart scan transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Timeout expired
Сообщение об ошибке. Time-out due to node shutdown not starting in time
Ошибка MySQL. DMEC
Тип ошибки NDB. Timeout expired
Сообщение об ошибке. Time-out due to node shutdown not completing in time
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. 623
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. 624
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of memory in Ndb Kernel, hash index part (increase DataMemory)
Ошибка MySQL. HA_ERR_KEY_NOT_FOUND
Тип ошибки NDB. No data found
Сообщение об ошибке. Tuple did not exist
Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Tuple already existed when attempting to insert
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Scan take over error, restart scan transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 632
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Table fragment hash index has reached maximum possible size
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Too many hash indexes (should not happen)
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. Index UNDO buffers overloaded (increase UndoIndexBuffer)
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. System busy with other schema operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal temporary
Сообщение об ошибке. Request to non-master
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid table format
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Attribute name too long
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Table name too long
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Inconsistency during table creation
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. No more table metadata records (increase MaxNoOfTables)
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. No more attribute metadata records (increase MaxNoOfAttributes)
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. No such table existed
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Internal: Get by table name not supported, use table id.
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. System busy with node restart, schema operations not allowed
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. No more hashmap metadata records
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Attribute name reused in table definition
Ошибка MySQL. HA_ERR_TABLE_EXIST
Тип ошибки NDB. Schema object already exists
Сообщение об ошибке. Schema object with given name already exists
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. No such table existed
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported array size
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Attribute array size too big
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Record too big
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported primary key length
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Nullable primary key not supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported alter table
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported character set in table or index
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Character string is invalid for given character set
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Distribution key not supported for char attribute (use binary attribute)
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema object already exists
Сообщение об ошибке. Event name already exists
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of event records
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Busy during read of event table
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Internal error
Сообщение об ошибке. Primary Table in wrong state
Ошибка MySQL. IE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid file type
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of file records
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid file format
Ошибка MySQL. IE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid filegroup for file
Ошибка MySQL. IE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid filegroup version when creating file
Ошибка MySQL. HA_MISSING_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid tablespace
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Index on disk column is not supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Varsize bitfield not supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Tablespace has changed
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid tablespace version
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. File already exists,
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unable to drop table as backup is in progress
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unable to alter table as backup is in progress
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. DDL is not supported with mixed data-node versions
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid extent size
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of filegroup records
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Cant drop file, no such file
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Cant drop filegroup, no such filegroup
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Cant drop filegroup, filegroup is used
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Drop undofile not supported, drop logfile group instead
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Cant drop file, file is used
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Application error
Сообщение об ошибке. Given NODEGROUP doesn't exist in this cluster
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Internal error
Сообщение об ошибке. Given fragmentType doesn't exist
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of string memory, please modify StringMemory config parameter
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid schema object for drop
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Create file is not supported when Diskless=1
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index created on temporary table must itself be temporary
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Cannot create a temporary index on a non-temporary table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. A temporary table or index must be specified as not logging
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid undo buffer size
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many schema transactions
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid schema transaction key from NDB API
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid schema transaction id from NDB API
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Too many schema operations
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Invalid schema transaction state
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Schema object is busy with another schema transaction
Ошибка MySQL. DMEC
Тип ошибки NDB. Node Recovery error
Сообщение об ошибке. Schema transaction aborted due to node-failure
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal temporary
Сообщение об ошибке. Schema transaction aborted
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Missing schema operation at takeover of schema transaction
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Application error
Сообщение об ошибке. Logfile group not found
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Invalid hashmap
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Too many total bits in bitfields
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Default value for primary key column not supported
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Object definition too big
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Schema feature requires data node upgrade
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Out of LongMessageBuffer in DICT
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Out of schema transaction memory
Ошибка MySQL. DMEC
Тип ошибки NDB. Function not implemented
Сообщение об ошибке. Wrong fragment count for fully replicated table
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. A disk table must not be specified as no logging
Ошибка MySQL. HA_WRONG_CREATE_OPTION
Тип ошибки NDB. Schema error
Сообщение об ошибке. Non default partitioning without partitions
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of attrinfo records in tuple manager, increase LongSignalMemory
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 809
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 812
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too much attrinfo from application in tuple manager
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Too many tables and attributes (increase MaxNoOfAttributes or MaxNoOfTables)
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of memory in Ndb Kernel, table data (increase DataMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Corrupt data received for insert/update
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of add fragment operation records
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many nullable/bitfields in table definition
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 833
Ошибка MySQL. DMEC
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Illegal null attribute
Ошибка MySQL. DMEC
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Trying to set a NOT NULL attribute to NULL
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too long or too short default value
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Fixed-size column offset exceeded max.Use VARCHAR or COLUMN_FORMAT DYNAMIC for memory-stored columns
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 871
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, ordered index data (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too much attrinfo (e.g. scan filter) for scan in tuple manager
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. 876
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. 877
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. 878
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. 879
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Tried to read too much - too many getValue calls
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unable to create table, out of data pages (increase DataMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 882
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 883
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Stack overflow in interpreter
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Stack underflow in interpreter
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. More than 65535 instructions executed in interpreter
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 887
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 888
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Table fragment fixed data reference has reached maximum possible value (specify MAXROWS or increase no of partitions)
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. 890
Ошибка MySQL. DMEC
Тип ошибки NDB. Overload error
Сообщение об ошибке. Data UNDO buffers overloaded (increase UndoDataBuffer)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Unsupported type in scan filter
Ошибка MySQL. HA_ERR_FOUND_DUPP_KEY
Тип ошибки NDB. Constraint violation
Сообщение об ошибке. Constraint violation e.g. duplicate value in unique index
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Tuple corrupted - wrong checksum or column data in invalid format
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Update attempt of primary key via ndbcluster internal api (if this occurs via the MySQL server it is a bug, please report)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Rowid already allocated
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Inconsistent ordered index. The index needs to be dropped and recreated
Ошибка MySQL. HA_ERR_RECORD_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of memory in Ndb Kernel, ordered index data (increase DataMemory)
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Too many ordered indexes (increase MaxNoOfOrderedIndexes)
Ошибка MySQL. HA_ERR_INDEX_FILE_FULL
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of fragment records (increase MaxNoOfOrderedIndexes)
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Out of attribute records (increase MaxNoOfAttributes)
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported attribute type in index
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Unsupported character set in table or index
Ошибка MySQL. DMEC
Тип ошибки NDB. Insufficient space
Сообщение об ошибке. Invalid ordered index tree node size
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, ordered scan operation (increase SharedGlobalMemory)
Ошибка MySQL. HA_ERR_NO_SUCH_TABLE
Тип ошибки NDB. Schema error
Сообщение об ошибке. Index is being dropped
Ошибка MySQL. DMEC
Тип ошибки NDB. Schema error
Сообщение об ошибке. Index stat scan requested on index with unsupported key size
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index stat scan requested with wrong lock mode
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid index for index stats update
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid index stats request
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. No free index stats op
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid index stats sys tables
Ошибка MySQL. DMEC
Тип ошибки NDB. Internal error
Сообщение об ошибке. Invalid index stats sys tables data
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Cannot prepare index stats update
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Cannot execute index stats update
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Row operation defined after refreshTuple()
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, copy tuples (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of UNDO buffer memory (increase UNDO_BUFFER_SIZE)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, stored procedure record (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, tup scan operation (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Temporary Resource error
Сообщение об ошибке. Out of transaction memory in local data manager, acc scan operation (increase SharedGlobalMemory)
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid block name
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid error number. Should be >= 0.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Invalid trace number.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. The specified node is not an API node.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Node shutdown in progress
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Node shutdown would cause system crash
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No contact with database nodes }
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. No contact with the process (dead ?).
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Operation not allowed while nodes are starting or stopping.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Batch size for sub scan cannot be smaller than number of fragments.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Character operand was right truncated
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Character Parameter was right truncated
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Query definition too large.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Query has operation with empty projection.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Query defintion should have at least one operation.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Query is in illegal state for this operation.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. A previous query operation failed, which you missed to catch.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Multiple 'parents' specified in linkedValues for this operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Query with multiple scans may not be sorted.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Numeric operand out of range
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Can't use same operand value to specify different column values
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Incompatible datatype specified in operand argument
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Parameter value has an incompatible datatype
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Required argument is NULL
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Result row already defined for NdbQueryOperation.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Index scan order was already set in query definition.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Parallelism cannot be restricted for sorted scans.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. All required 'key' values was not specified
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Too many 'key' or 'bound' values was specified
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Unknown 'parent' specified in linkedValue
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Specified 'index' does not belong to specified 'table'
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Wrong type of index specified for this operation
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. This method cannot be invoked on this type of operation (lookup/scan/index scan).
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Send to process or receive failed.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. System shutdown in progress
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. Unsupported multi node shutdown. Abort option required.
Ошибка MySQL. DMEC
Тип ошибки NDB. Application error
Сообщение об ошибке. The process has wrong type. Expected a DB process.
В следующей таблице перечислены классификационные коды, используемые для
ошибок API NDB и их описаний. Они могут также быть найдены в файле
/storage/ndb/src/ndbapi/ndberror.cpp
(NDB 7.6 и ранее: файл
ndberror.c
).
Таблица 2.90.
Классификационный код | Статус ошибки | Описание |
---|---|---|
NE | Все нормально | Нет ошибки |
AE | Постоянная ошибка | Ошибка приложения |
CE | Постоянная ошибка | Configuration or application error |
ND | Постоянная ошибка | No data found |
CV | Постоянная ошибка | Constraint violation |
SE | Постоянная ошибка | Schema error |
OE | Постоянная ошибка | Schema object already exists |
UD | Постоянная ошибка | User defined error |
IS | Постоянная ошибка | Insufficient space |
TR | Временная ошибка | Temporary Resource error |
NR | Временная ошибка | Node Recovery error |
OL | Временная ошибка | Overload error |
TO | Временная ошибка | Тайм-аут кончился |
NS | Временная ошибка | Node shutdown |
IT | Временная ошибка | Internal temporary |
UR | Результат неизвестен | Unknown result error |
UE | Результат неизвестен | Unknown error code |
IE | Постоянная ошибка | Внутренняя ошибка |
NI | Постоянная ошибка | Function not implemented |
DMEC | Код ошибки MySQL по умолчанию | Used for NDB errors that are not otherwise mapped to MySQL error codes |
В NDB 7.6.4 и позже, можно также получить описания для
классификационных кодов из столбца
error_classification
таблицы
ndbinfo.error_messages
.
Эта секция обеспечивает примеры кода, иллюстрирующие, как выполнить некоторые основные задачи, используя API NDB.
Все эти примеры могут быть собраны и запущены как предусмотрено, и произвести типовой вывод, чтобы продемонстрировать их эффекты.
Для программы API NDB, чтобы соединиться с кластером,
у файла кластерной конфигурации должен быть по крайней мере один
раздел [api]
, который не назначен на узел SQL и
к этому можно получить доступ от хоста, где выполняется приложение API NDB.
Можно также использовать неназначенный раздел
[mysqld]
с этой целью, хотя мы рекомендуем,
чтобы вы использовали [mysqld] для узлов SQL и
[api]
для программ клиента NDB. См.
NDB Cluster Configuration Files и особенно
Defining SQL and Other API Nodes in an NDB Cluster.
Этот пример иллюстрирует использование синхронных транзакций в API NDB.
Это сначала создает базу данных
ndb_examples
и таблицу
api_simple
(если эти объекты еще не существуют) с использованием MySQL C API с узлом
SQL и выполняет ряд операций по исходным данным (вставка, обновление,
чтение и выбор) на этой таблице, используя API NDB.
Собранная программа берет два аргумента:
Строка подключения кластера NDB (см. NDB Cluster Connection Strings)
Правильный вывод из этой программы:
ATTR1ATTR2 010 1 1 212 Detected that deleted tuple doesn't exist! 414 5 5 616 7 7 818 9 9
Исходный код для этого примера может быть найден в
storage/ndb/ndbapi-examples/ndbapi_simple/ndbapi_simple.cpp
дерева исходных текстов NDB Cluster:
/* *ndbapi_simple.cpp: Using synchronous transactions in NDB API * *Correct output from this program is: * *ATTR1 ATTR2 *010 *1 1 *212 *Detected that deleted tuple doesn't exist! *414 *5 5 *616 *7 7 *818 *9 9 * */ #include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> // Used for cout #include <stdio.h> #include <iostream> static void run_application(MYSQL &, Ndb_cluster_connection &); #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } // ndb_init must be called first ndb_init(); // connect to mysql server and cluster and run application { char * mysqld_sock= argv[1]; const char *connection_string = argv[2]; // Object representing the cluster Ndb_cluster_connection cluster_connection(connection_string); // Connect to cluster management server (ndb_mgmd) if (cluster_connection.connect(4 /* retries */, 5 /* delay between retries */, 1 /* verbose */)) { std::cout << "Cluster management server was not ready within 30 secs.\n"; exit(-1); } // Optionally connect and wait for the storage nodes (ndbd's) if (cluster_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } // connect to mysql server MYSQL mysql; if (!mysql_init(&mysql)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql, "localhost", "root", "", "", 0, mysqld_sock, 0)) MYSQLERROR(mysql); // run the application code run_application(mysql, cluster_connection); } ndb_end(0); return 0; } static void create_table(MYSQL &); static void do_insert(Ndb &); static void do_update(Ndb &); static void do_delete(Ndb &); static void do_read(Ndb &); static void run_application(MYSQL &mysql, Ndb_cluster_connection &cluster_connection) { /******************************************** * Connect to database via mysql-c*ndb_examples ********************************************/ mysql_query(&mysql, "CREATE DATABASE ndb_examples"); if (mysql_query(&mysql, "USE ndb_examples") != 0) MYSQLERROR(mysql); create_table(mysql); /******************************************** * Connect to database via NDB API * ********************************************/ // Object representing the database Ndb myNdb( &cluster_connection, "ndb_examples" ); if (myNdb.init()) APIERROR(myNdb.getNdbError()); /* * Do different operations on database */ do_insert(myNdb); do_update(myNdb); do_delete(myNdb); do_read(myNdb); } /********************************************************* * Create a table named api_simple if it does not exist * *********************************************************/ static void create_table(MYSQL &mysql) { while (mysql_query(&mysql, "CREATE TABLE" "api_simple" "(ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY," " ATTR2 INT UNSIGNED NOT NULL)" "ENGINE=NDB")) { if (mysql_errno(&mysql) == ER_TABLE_EXISTS_ERROR) { std::cout << "NDB Cluster already has example table: api_simple. " << "Dropping it..." << std::endl; mysql_query(&mysql, "DROP TABLE api_simple"); } else MYSQLERROR(mysql); } } /************************************************************************** * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) * **************************************************************************/ static void do_insert(Ndb &myNdb) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_simple"); if (myTable == NULL) APIERROR(myDict->getNdbError()); for (int i = 0; i < 5; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i); myOperation->setValue("ATTR2", i); myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i+5); myOperation->setValue("ATTR2", i+5); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ static void do_update(Ndb &myNdb) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_simple"); if (myTable == NULL) APIERROR(myDict->getNdbError()); for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->updateTuple(); myOperation->equal( "ATTR1", i ); myOperation->setValue( "ATTR2", i+10); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } } /************************************************* * Delete one tuple (the one with primary key 3) * *************************************************/ static void do_delete(Ndb &myNdb) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_simple"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->deleteTuple(); myOperation->equal( "ATTR1", 3 ); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } /***************************** * Read and print all tuples * *****************************/ static void do_read(Ndb &myNdb) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_simple"); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->readTuple(NdbOperation::LM_Read); myOperation->equal("ATTR1", i); NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL); if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); if (myTransaction->getNdbError().classification == NdbError::NoDataFound) if (i == 3) std::cout << "Detected that deleted tuple doesn't exist!" << std::endl; else APIERROR(myTransaction->getNdbError()); if (i != 3) { printf(" %2d%2d\n", i, myRecAttr->u_32_value()); } myNdb.closeTransaction(myTransaction); } }
Этот пример демонстрирует синхронные транзакции и соединение с многократными кластерами в единственном приложении API NDB.
Исходный код для этой программы может быть найден в исходном дереве
кластера NDB в файле
storage/ndb/ndbapi-examples/ndbapi_simple_dual/main.cpp
.
Файл примера раньше называли
ndbapi_simple_dual.cpp
.
/* *ndbapi_simple_dual: Using synchronous transactions in NDB API * *Correct output from this program is: * *ATTR1 ATTR2 *010 *1 1 *212 *Detected that deleted tuple doesn't exist! *414 *5 5 *616 *7 7 *818 *9 9 *ATTR1 ATTR2 *010 *1 1 *212 *Detected that deleted tuple doesn't exist! *414 *5 5 *616 *7 7 *818 *9 9 * */ #ifdef _WIN32 #include <winsock2.h> #endif #include <mysql.h> #include <NdbApi.hpp> #include <stdlib.h> // Used for cout #include <stdio.h> #include <iostream> static void run_application(MYSQL &, Ndb_cluster_connection &, const char* table, const char* db); #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } int main(int argc, char** argv) { if (argc != 5) { std::cout << "Arguments are <socket mysqld1> <connect_string cluster 1> <socket mysqld2> <connect_string cluster 2>.\n"; exit(-1); } // ndb_init must be called first ndb_init(); { char * mysqld1_sock= argv[1]; const char *connectstring1 = argv[2]; char * mysqld2_sock = argv[3]; const char *connectstring2 = argv[4]; // Object representing the cluster 1 Ndb_cluster_connection cluster1_connection(connectstring1); MYSQL mysql1; // Object representing the cluster 2 Ndb_cluster_connection cluster2_connection(connectstring2); MYSQL mysql2; // connect to mysql server and cluster 1 and run application // Connect to cluster 1management server (ndb_mgmd) if (cluster1_connection.connect(4 /* retries */, 5 /* delay between retries */, 1 /* verbose */)) { std::cout << "Cluster 1 management server was not ready within 30 secs.\n"; exit(-1); } // Optionally connect and wait for the storage nodes (ndbd's) if (cluster1_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster 1 was not ready within 30 secs.\n"; exit(-1); } // connect to mysql server in cluster 1 if (!mysql_init(&mysql1)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql1, "localhost", "root", "", "", 0, mysqld1_sock, 0)) MYSQLERROR(mysql1); // connect to mysql server and cluster 2 and run application // Connect to cluster management server (ndb_mgmd) if (cluster2_connection.connect(4 /* retries */, 5 /* delay between retries */, 1 /* verbose */)) { std::cout << "Cluster 2 management server was not ready within 30 secs.\n"; exit(-1); } // Optionally connect and wait for the storage nodes (ndbd's) if (cluster2_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster 2 was not ready within 30 secs.\n"; exit(-1); } // connect to mysql server in cluster 2 if (!mysql_init(&mysql2)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql2, "localhost", "root", "", "", 0, mysqld2_sock, 0)) MYSQLERROR(mysql2); // run the application code run_application(mysql1, cluster1_connection, "api_simple_dual_1", "ndb_examples"); run_application(mysql2, cluster2_connection, "api_simple_dual_2", "ndb_examples"); } // Note: all connections must have been destroyed before calling ndb_end() ndb_end(0); return 0; } static void create_table(MYSQL &, const char* table); static void do_insert(Ndb &, const char* table); static void do_update(Ndb &, const char* table); static void do_delete(Ndb &, const char* table); static void do_read(Ndb &, const char* table); static void drop_table(MYSQL &,const char* table); static void run_application(MYSQL &mysql, Ndb_cluster_connection &cluster_connection, const char* table, const char* db) { /******************************************** * Connect to database via mysql-c* ********************************************/ char db_stmt[256]; sprintf(db_stmt, "CREATE DATABASE %s\n", db); mysql_query(&mysql, db_stmt); sprintf(db_stmt, "USE %s", db); if (mysql_query(&mysql, db_stmt) != 0) MYSQLERROR(mysql); create_table(mysql, table); /******************************************** * Connect to database via NdbApi * ********************************************/ // Object representing the database Ndb myNdb( &cluster_connection, db ); if (myNdb.init()) APIERROR(myNdb.getNdbError()); /* * Do different operations on database */ do_insert(myNdb, table); do_update(myNdb, table); do_delete(myNdb, table); do_read(myNdb, table); /* * Drop the table */ drop_table(mysql,table); } /********************************************************* * Create a table named by table if it does not exist * *********************************************************/ static void create_table(MYSQL &mysql, const char* table) { char create_stmt[256]; sprintf(create_stmt, "CREATE TABLE %s \ (ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY,\ ATTR2 INT UNSIGNED NOT NULL)\ ENGINE=NDB", table); if (mysql_query(&mysql, create_stmt)) MYSQLERROR(mysql); } /************************************************************************** * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) * **************************************************************************/ static void do_insert(Ndb &myNdb, const char* table) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable(table); if (myTable == NULL) APIERROR(myDict->getNdbError()); for (int i = 0; i < 5; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i); myOperation->setValue("ATTR2", i); myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i+5); myOperation->setValue("ATTR2", i+5); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ static void do_update(Ndb &myNdb, const char* table) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable(table); if (myTable == NULL) APIERROR(myDict->getNdbError()); for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->updateTuple(); myOperation->equal( "ATTR1", i ); myOperation->setValue( "ATTR2", i+10); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } } /************************************************* * Delete one tuple (the one with primary key 3) * *************************************************/ static void do_delete(Ndb &myNdb, const char* table) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable(table); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->deleteTuple(); myOperation->equal( "ATTR1", 3 ); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } /***************************** * Read and print all tuples * *****************************/ static void do_read(Ndb &myNdb, const char* table) { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable(table); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->readTuple(NdbOperation::LM_Read); myOperation->equal("ATTR1", i); NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL); if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::Commit) == -1) { if (i == 3) { std::cout << "Detected that deleted tuple doesn't exist!" << std::endl; } else { APIERROR(myTransaction->getNdbError()); } } if (i != 3) { printf(" %2d%2d\n", i, myRecAttr->u_32_value()); } myNdb.closeTransaction(myTransaction); } } /************************** * Drop table after usage * **************************/ static void drop_table(MYSQL &mysql, const char* table) { char drop_stmt[75]; sprintf(drop_stmt, "DROP TABLE %s", table); if (mysql_query(&mysql,drop_stmt)) MYSQLERROR(mysql); }
До NDB 8.0.1 эту программу нельзя было выполнить успешно несколько раз подряд во время той же самой сессии (Bug #27009386).
Эта программа демонстрирует ошибки из-за неправильного обращения и повторение неудавшихся транзакций, используя API NDB.
Исходный код для этого примера может быть найден в файле
storage/ndb/ndbapi-examples/ndbapi_retries/ndbapi_retries.cpp
в дереве исходных текстов NDB Cluster.
Есть много путей в программе, используя API NDB. В этом примере мы выполняем
две вставки в той же самой транзакции, используя
NdbTransaction::execute(NoCommit)
.
В приложениях API NDB есть два типа неудач, которые будут приняты во внимание:
Сбои транзакции: Если непостоянные, они могут быть обработаны, повторно выполнив транзакцию.
Ошибки приложения:
Они обозначаются APIERROR
,
они должны быть обработаны прикладным программистом.
// // ndbapi_retries.cpp: Error handling and transaction retries // //There are many ways to program using the NDB API.In this example //we execute two inserts in the same transaction using //NdbConnection::execute(NoCommit). // //Transaction failing is handled by re-executing the transaction //in case of non-permanent transaction errors. //Application errors (i.e. errors at points marked with APIERROR) //should be handled by the application programmer. #include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> // Used for cout #include <iostream> // Used for sleep (use your own version of sleep) #include <unistd.h> #define TIME_TO_SLEEP_BETWEEN_TRANSACTION_RETRIES 1 #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } // //APIERROR prints an NdbError object // #define APIERROR(error) \ { std::cout << "API ERROR: " << error.code << " " << error.message \ << std::endl \ << " " << "Status: " << error.status \ << ", Classification: " << error.classification << std::endl\ << " " << "File: " << __FILE__ \ << " (Line: " << __LINE__ << ")" << std::endl \ ; \ } // //TRANSERROR prints all error info regarding an NdbTransaction // #define TRANSERROR(ndbTransaction) \ { NdbError error = ndbTransaction->getNdbError(); \ std::cout << "TRANS ERROR: " << error.code << " " << error.message \ << std::endl \ << " " << "Status: " << error.status \ << ", Classification: " << error.classification << std::endl \ << " " << "File: " << __FILE__ \ << " (Line: " << __LINE__ << ")" << std::endl \ ; \ printTransactionError(ndbTransaction); \ } void printTransactionError(NdbTransaction *ndbTransaction) { const NdbOperation *ndbOp = NULL; int i=0; /**************************************************************** * Print NdbError object of every operations in the transaction * ****************************************************************/ while ((ndbOp = ndbTransaction->getNextCompletedOperation(ndbOp)) != NULL) { NdbError error = ndbOp->getNdbError(); std::cout << " OPERATION " << i+1 << ": " << error.code << " " << error.message << std::endl << " Status: " << error.status << ", Classification: " << error.classification << std::endl; i++; } } // //Example insert //@param myNdbNdb object representing NDB Cluster //@param myTransactionNdbTransaction used for transaction //@param myTableTable to insert into //@param errorNdbError object returned in case of errors //@return -1 in case of failures, 0 otherwise // int insert(int transactionId, NdbTransaction* myTransaction, const NdbDictionary::Table *myTable) { NdbOperation *myOperation; // For other operations myOperation = myTransaction->getNdbOperation(myTable); if (myOperation == NULL) return -1; if (myOperation->insertTuple() || myOperation->equal("ATTR1", transactionId) || myOperation->setValue("ATTR2", transactionId)) { APIERROR(myOperation->getNdbError()); exit(-1); } return myTransaction->execute(NdbTransaction::NoCommit); } // //Execute function which re-executes (tries 10 times) the transaction //if there are temporary errors (e.g. the NDB Cluster is overloaded). //@return -1 failure, 1 success // int executeInsertTransaction(int transactionId, Ndb* myNdb, const NdbDictionary::Table *myTable) { int result = 0; // No result yet int noOfRetriesLeft = 10; NdbTransaction *myTransaction; // For other transactions NdbError ndberror; while (noOfRetriesLeft > 0 && !result) { /********************************* * Start and execute transaction * *********************************/ myTransaction = myNdb->startTransaction(); if (myTransaction == NULL) { APIERROR(myNdb->getNdbError()); ndberror = myNdb->getNdbError(); result = -1;// Failure } else if (insert(transactionId, myTransaction, myTable) || insert(10000+transactionId, myTransaction, myTable) || myTransaction->execute(NdbTransaction::Commit)) { TRANSERROR(myTransaction); ndberror = myTransaction->getNdbError(); result = -1;// Failure } else { result = 1; // Success } /********************************** * If failure, then analyze error * **********************************/ if (result == -1) { switch (ndberror.status) { case NdbError::Success: break; case NdbError::TemporaryError: std::cout << "Retrying transaction..." << std::endl; sleep(TIME_TO_SLEEP_BETWEEN_TRANSACTION_RETRIES); --noOfRetriesLeft; result = 0; // No completed transaction yet break; case NdbError::UnknownResult: case NdbError::PermanentError: std::cout << "No retry of transaction..." << std::endl; result = -1;// Permanent failure break; } } /********************* * Close transaction * *********************/ if (myTransaction != NULL) { myNdb->closeTransaction(myTransaction); } } if (result != 1) exit(-1); return result; } /********************************************************* * Create a table named api_retries if it does not exist * *********************************************************/ static void create_table(MYSQL &mysql) { while(mysql_query(&mysql, "CREATE TABLE " "api_retries" "(ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY," " ATTR2 INT UNSIGNED NOT NULL)" "ENGINE=NDB")) { if (mysql_errno(&mysql) == ER_TABLE_EXISTS_ERROR) { std::cout << "NDB Cluster already has example table: api_scan. " << "Dropping it..." << std::endl; mysql_query(&mysql, "DROP TABLE api_retries"); } else MYSQLERROR(mysql); } } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } char * mysqld_sock= argv[1]; const char *connection_string = argv[2]; ndb_init(); Ndb_cluster_connection *cluster_connection= new Ndb_cluster_connection(connection_string); // Object representing the cluster int r= cluster_connection->connect(5 /* retries */, 3 /* delay between retries */, 1 /* verbose */); if (r > 0) { std::cout << "Cluster connect failed, possibly resolved with more retries.\n"; exit(-1); } else if (r < 0) { std::cout << "Cluster connect failed.\n"; exit(-1); } if (cluster_connection->wait_until_ready(30,30)) { std::cout << "Cluster was not ready within 30 secs." << std::endl; exit(-1); } // connect to mysql server MYSQL mysql; if (!mysql_init(&mysql)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql, "localhost", "root", "", "", 0, mysqld_sock, 0)) MYSQLERROR(mysql); /******************************************** * Connect to database via mysql-c* ********************************************/ mysql_query(&mysql, "CREATE DATABASE ndb_examples"); if (mysql_query(&mysql, "USE ndb_examples") != 0) MYSQLERROR(mysql); create_table(mysql); Ndb* myNdb= new Ndb(cluster_connection, "ndb_examples"); // Object representing the database if (myNdb->init() == -1) { APIERROR(myNdb->getNdbError()); exit(-1); } const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_retries"); if (myTable == NULL) { APIERROR(myDict->getNdbError()); return -1; } /************************************ * Execute some insert transactions * ************************************/ std::cout << "Ready to insert rows.You will see notices for temporary " "errors, permenant errors, and retries. \n"; for (int i = 10000; i < 20000; i++) { executeInsertTransaction(i, myNdb, myTable); } std::cout << "Done.\n"; delete myNdb; delete cluster_connection; ndb_end(0); return 0; }
Этот пример иллюстрирует, как использовать просмотр в NDB API.
Это показывает, как выполнить просмотр, как просмотреть для обновления и как
просмотреть для удаления, использовав классы
NdbScanFilter
и
NdbScanOperation
.
Исходный код для этого примера может найден в исходном дереве NDB Cluster
в файле
storage/ndb/ndbapi-examples/ndbapi_scan/ndbapi_scan.cpp
.
Этот пример использует следующие классы и методы:
Ndb
:
/* Copyright (c) 2005, 2017, 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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301USA */ /* * ndbapi_scan.cpp: * Illustrates how to use the scan api in the NDBAPI. * The example shows how to do scan, scan for update and scan for delete * using NdbScanFilter and NdbScanOperation * * Classes and methods used in this example: * *Ndb_cluster_connection * connect() * wait_until_ready() * *Ndb * init() * getDictionary() * startTransaction() * closeTransaction() * *NdbTransaction * getNdbScanOperation() * execute() * *NdbScanOperation * getValue() * readTuples() * nextResult() * deleteCurrentTuple() * updateCurrentTuple() * *const NdbDictionary::Dictionary * getTable() * *const NdbDictionary::Table * getColumn() * *const NdbDictionary::Column * getLength() * *NdbOperation * insertTuple() * equal() * setValue() * *NdbScanFilter * begin() * eq() * end() * */ #ifdef _WIN32 #include <winsock2.h> #endif #include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> // Used for cout #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <config.h> #ifdef HAVE_SYS_SELECT_H #include <sys/select.h> #endif /** * Helper sleep function */ static void milliSleep(int milliseconds) { struct timeval sleeptime; sleeptime.tv_sec = milliseconds / 1000; sleeptime.tv_usec = (milliseconds - (sleeptime.tv_sec * 1000)) * 1000000; select(0, 0, 0, 0, &sleeptime); } /** * Helper debugging macros */ #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } struct Car { /** * Note memset, so that entire char-fields are cleared * as all 20 bytes are significant (as type is char) */ Car() {memset(this, 0, sizeof(* this));} unsigned int reg_no; char brand[20]; char color[20]; }; /** * Function to drop table */ void drop_table(MYSQL &mysql) { if (mysql_query(&mysql, "DROP TABLE IF EXISTS api_scan")) MYSQLERROR(mysql); } /** * Function to create table */ void create_table(MYSQL &mysql) { while (mysql_query(&mysql, "CREATE TABLE" "api_scan" "(REG_NO INT UNSIGNED NOT NULL," " BRAND CHAR(20) NOT NULL," " COLOR CHAR(20) NOT NULL," " PRIMARY KEY USING HASH (REG_NO))" "ENGINE=NDB")) { if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR) MYSQLERROR(mysql); std::cout << "NDB Cluster already has example table: api_scan. " << "Dropping it..." << std::endl; drop_table(mysql); } } int populate(Ndb * myNdb) { int i; Car cars[15]; const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_scan"); if (myTable == NULL) APIERROR(myDict->getNdbError()); /** * Five blue mercedes */ for (i = 0; i < 5; i++) { cars[i].reg_no = i; sprintf(cars[i].brand, "Mercedes"); sprintf(cars[i].color, "Blue"); } /** * Five black bmw */ for (i = 5; i < 10; i++) { cars[i].reg_no = i; sprintf(cars[i].brand, "BMW"); sprintf(cars[i].color, "Black"); } /** * Five pink toyotas */ for (i = 10; i < 15; i++) { cars[i].reg_no = i; sprintf(cars[i].brand, "Toyota"); sprintf(cars[i].color, "Pink"); } NdbTransaction* myTrans = myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); for (i = 0; i < 15; i++) { NdbOperation* myNdbOperation = myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->insertTuple(); myNdbOperation->equal("REG_NO", cars[i].reg_no); myNdbOperation->setValue("BRAND", cars[i].brand); myNdbOperation->setValue("COLOR", cars[i].color); } int check = myTrans->execute(NdbTransaction::Commit); myTrans->close(); return check != -1; } int scan_delete(Ndb* myNdb, int column, const char * color) { // Scan all records exclusive and delete // them one by one intretryAttempt = 0; const intretryMax = 10; int deletedRows = 0; int check; NdbErrorerr; NdbTransaction* myTrans; NdbScanOperation* myScanOp; const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_scan"); if (myTable == NULL) APIERROR(myDict->getNdbError()); /** * Loop as long as : *retryMax not reached *failed operations due to TEMPORARY erros * * Exit loop; *retyrMax reached *Permanent error (return -1) */ while (true) { if (retryAttempt >= retryMax) { std::cout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << std::endl; return -1; } myTrans = myNdb->startTransaction(); if (myTrans == NULL) { const NdbError err = myNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { milliSleep(50); retryAttempt++; continue; } std::cout <<err.message << std::endl; return -1; } /** * Get a scan operation. */ myScanOp = myTrans->getNdbScanOperation(myTable); if (myScanOp == NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Define a result set for the scan. */ if (myScanOp->readTuples(NdbOperation::LM_Exclusive) != 0) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Use NdbScanFilter to define a search critera */ NdbScanFilter filter(myScanOp); if (filter.begin(NdbScanFilter::AND) < 0|| filter.cmp(NdbScanFilter::COND_EQ, column, color, 20) < 0 || filter.end() < 0) { std::cout <<myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Start scan(NoCommit since we are only reading at this stage); */ if (myTrans->execute(NdbTransaction::NoCommit) != 0) { err = myTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } std::cout << err.code << std::endl; std::cout << myTrans->getNdbError().code << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * start of loop: nextResult(true) means that "parallelism" number of * rows are fetched from NDB and cached in NDBAPI */ while ((check = myScanOp->nextResult(true)) == 0) { do { if (myScanOp->deleteCurrentTuple() != 0) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } eletedRows++; /** * nextResult(false) means that the records * cached in the NDBAPI are modified before * fetching more rows from NDB. */ } while((check = myScanOp->nextResult(false)) == 0); /** * NoCommit when all cached tuple have been marked for deletion */ if (check != -1) { check = myTrans->execute(NdbTransaction::NoCommit); } /** * Check for errors */ err = myTrans->getNdbError(); if (check == -1) { if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } } /** * End of loop */ } /** * Commit all prepared operations */ if (myTrans->execute(NdbTransaction::Commit) == -1) { if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } } std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return 0; } if (myTrans!=0) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); } return -1; } int scan_update(Ndb* myNdb, int update_column, const char * before_color, const char * after_color) { // Scan all records exclusive and update // them one by one intretryAttempt = 0; const intretryMax = 10; int updatedRows = 0; int check; NdbErrorerr; NdbTransaction* myTrans; NdbScanOperation* myScanOp; const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_scan"); if (myTable == NULL) APIERROR(myDict->getNdbError()); /** * Loop as long as : *retryMax not reached *failed operations due to TEMPORARY erros * * Exit loop; *retryMax reached *Permanent error (return -1) */ while (true) { if (retryAttempt >= retryMax) { std::cout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << std::endl; return -1; } myTrans = myNdb->startTransaction(); if (myTrans == NULL) { const NdbError err = myNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { milliSleep(50); retryAttempt++; continue; } std::cout <<err.message << std::endl; return -1; } /** * Get a scan operation. */ myScanOp = myTrans->getNdbScanOperation(myTable); if (myScanOp == NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Define a result set for the scan. */ if (myScanOp->readTuples(NdbOperation::LM_Exclusive) ) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Use NdbScanFilter to define a search critera */ NdbScanFilter filter(myScanOp); if (filter.begin(NdbScanFilter::AND) < 0|| filter.cmp(NdbScanFilter::COND_EQ, update_column, before_color, 20) <0|| filter.end() <0) { std::cout <<myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Start scan(NoCommit since we are only reading at this stage); */ if (myTrans->execute(NdbTransaction::NoCommit) != 0) { err = myTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } std::cout << myTrans->getNdbError().code << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * start of loop: nextResult(true) means that "parallelism" number of * rows are fetched from NDB and cached in NDBAPI */ while ((check = myScanOp->nextResult(true)) == 0) { do { /** * Get update operation */ NdbOperation * myUpdateOp = myScanOp->updateCurrentTuple(); if (myUpdateOp == 0) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } updatedRows++; /** * do the update */ myUpdateOp->setValue(update_column, after_color); /** * nextResult(false) means that the records * cached in the NDBAPI are modified before * fetching more rows from NDB. */ } while((check = myScanOp->nextResult(false)) == 0); /** * NoCommit when all cached tuple have been updated */ if (check != -1) { check = myTrans->execute(NdbTransaction::NoCommit); } /** * Check for errors */ err = myTrans->getNdbError(); if (check == -1) { if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } } /** * End of loop */ } /** * Commit all prepared operations */ if (myTrans->execute(NdbTransaction::Commit) == -1) { if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } } std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return 0; } if (myTrans!=0) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); } return -1; } int scan_print(Ndb * myNdb) { // Scan all records exclusive and update // them one by one intretryAttempt = 0; const intretryMax = 10; int fetchedRows = 0; int check; NdbErrorerr; NdbTransaction* myTrans; NdbScanOperation* myScanOp; /* Result of reading attribute value, three columns: REG_NO, BRAND, and COLOR */ NdbRecAttr *myRecAttr[3]; const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_scan"); if (myTable == NULL) APIERROR(myDict->getNdbError()); /** * Loop as long as : *retryMax not reached *failed operations due to TEMPORARY erros * * Exit loop; *retyrMax reached *Permanent error (return -1) */ while (true) { if (retryAttempt >= retryMax) { std::cout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << std::endl; return -1; } myTrans = myNdb->startTransaction(); if (myTrans == NULL) { const NdbError err = myNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { milliSleep(50); retryAttempt++; continue; } std::cout << err.message << std::endl; return -1; } /* * Define a scan operation. * NDBAPI. */ myScanOp = myTrans->getNdbScanOperation(myTable); if (myScanOp == NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Read without locks, without being placed in lock queue */ if (myScanOp->readTuples(NdbOperation::LM_CommittedRead) == -1) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Define storage for fetched attributes. * E.g., the resulting attributes of executing * myOp->getValue("REG_NO") is placed in myRecAttr[0]. * No data exists in myRecAttr until transaction has commited! */ myRecAttr[0] = myScanOp->getValue("REG_NO"); myRecAttr[1] = myScanOp->getValue("BRAND"); myRecAttr[2] = myScanOp->getValue("COLOR"); if (myRecAttr[0] ==NULL || myRecAttr[1] == NULL || myRecAttr[2]==NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Start scan (NoCommit since we are only reading at this stage); */ if (myTrans->execute(NdbTransaction::NoCommit) != 0) { err = myTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } std::cout << err.code << std::endl; std::cout << myTrans->getNdbError().code << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * start of loop: nextResult(true) means that "parallelism" number of * rows are fetched from NDB and cached in NDBAPI */ while ((check = myScanOp->nextResult(true)) == 0) { do { fetchedRows++; /** * printREG_NO unsigned int */ std::cout << myRecAttr[0]->u_32_value() << "\t"; /** * printBRAND character string */ std::cout << myRecAttr[1]->aRef() << "\t"; /** * printCOLOR character string */ std::cout << myRecAttr[2]->aRef() << std::endl; /** * nextResult(false) means that the records * cached in the NDBAPI are modified before * fetching more rows from NDB. */ } while((check = myScanOp->nextResult(false)) == 0); } myNdb->closeTransaction(myTrans); return 1; } return -1; } void mysql_connect_and_create(MYSQL & mysql, const char *socket) { bool ok; ok = mysql_real_connect(&mysql, "localhost", "root", "", "", 0, socket, 0); if (ok) { mysql_query(&mysql, "CREATE DATABASE ndb_examples"); ok = ! mysql_select_db(&mysql, "ndb_examples"); } if (ok) { create_table(mysql); } if (! ok) MYSQLERROR(mysql); } void ndb_run_scan(const char * connectstring) { /************************************************************** * Connect to ndb cluster * **************************************************************/ Ndb_cluster_connection cluster_connection(connectstring); if (cluster_connection.connect(4, 5, 1)) { std::cout << "Unable to connect to cluster within 30 secs." << std::endl; exit(-1); } // Optionally connect and wait for the storage nodes (ndbd's) if (cluster_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } Ndb myNdb(&cluster_connection,"ndb_examples"); if (myNdb.init(1024) == -1) { // Set max 1024parallel transactions APIERROR(myNdb.getNdbError()); exit(-1); } /******************************************* * Check table definition* *******************************************/ int column_color; { const NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *t= myDict->getTable("api_scan"); if (t == NULL) { std::cout << "Dictionary::getTable() failed."; exit(-1); } Car car; if (t->getColumn("COLOR")->getLength() != sizeof(car.color) || t->getColumn("BRAND")->getLength() != sizeof(car.brand)) { std::cout << "Wrong table definition" << std::endl; exit(-1); } column_color= t->getColumn("COLOR")->getColumnNo(); } if (populate(&myNdb) > 0) std::cout << "populate: Success!" << std::endl; if (scan_print(&myNdb) > 0) std::cout << "scan_print: Success!" << std::endl<< std::endl; std::cout << "Going to delete all pink cars!" << std::endl; { /** * Note! color needs to be of exact the same size as column defined */ Car tmp; sprintf(tmp.color, "Pink"); if (scan_delete(&myNdb, column_color, tmp.color) > 0) std::cout << "scan_delete: Success!" << std::endl<< std::endl; } if (scan_print(&myNdb) > 0) std::cout << "scan_print: Success!" << std::endl<< std::endl; { /** * Note! color1 & 2 need to be of exact the same size as column defined */ Car tmp1, tmp2; sprintf(tmp1.color, "Blue"); sprintf(tmp2.color, "Black"); std::cout << "Going to update all " << tmp1.color << " cars to " << tmp2.color << " cars!" << std::endl; if (scan_update(&myNdb, column_color, tmp1.color, tmp2.color) > 0) std::cout << "scan_update: Success!" << std::endl<< std::endl; } if (scan_print(&myNdb) > 0) std::cout << "scan_print: Success!" << std::endl<< std::endl; } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } char * mysqld_sock= argv[1]; const char *connectstring = argv[2]; MYSQL mysql; mysql_init(& mysql); mysql_connect_and_create(mysql, mysqld_sock); ndb_init(); ndb_run_scan(connectstring); ndb_end(0); mysql_close(&mysql); return 0; }
Эта программа иллюстрирует, как использовать вторичные индексы в API NDB.
Исходный код для этого примера может быть найден в дереве исходных текстов
NDB Cluster в файле
storage/ndb/ndbapi-examples/ndbapi_simple_index/main.cpp
.
Этот файл ранее называли
ndbapi_simple_index.cpp
.
Правильный вывод этой программы:
ATTR1 ATTR2 010 1 1 212 Detected that deleted tuple doesn't exist! 414 5 5 616 7 7 818 9 9
#include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> // Used for cout #include <stdio.h> #include <iostream> #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } char * mysqld_sock= argv[1]; const char *connection_string = argv[2]; ndb_init(); MYSQL mysql; /************************************************************** * Connect to mysql server and create table * **************************************************************/ { if (!mysql_init(&mysql)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql, "localhost", "root", "", "", 0, mysqld_sock, 0)) MYSQLERROR(mysql); mysql_query(&mysql, "CREATE DATABASE ndb_examples_1"); if (mysql_query(&mysql, "USE ndb_examples") != 0) MYSQLERROR(mysql); while (mysql_query(&mysql, "CREATE TABLE" "api_simple_index" "(ATTR1 INT UNSIGNED," " ATTR2 INT UNSIGNED NOT NULL," " PRIMARY KEY USING HASH (ATTR1)," " UNIQUE MYINDEXNAME USING HASH (ATTR2))" "ENGINE=NDB")) { if (mysql_errno(&mysql) == ER_TABLE_EXISTS_ERROR) { std::cout << "NDB Cluster already has example table: api_scan. " << "Dropping it..." << std::endl; mysql_query(&mysql, "DROP TABLE api_simple_index"); } else MYSQLERROR(mysql); } } /************************************************************** * Connect to ndb cluster * **************************************************************/ Ndb_cluster_connection *cluster_connection= new Ndb_cluster_connection(connection_string); // Object representing the cluster if (cluster_connection->connect(5,3,1)) { std::cout << "Connect to cluster management server failed.\n"; exit(-1); } if (cluster_connection->wait_until_ready(30,30)) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } Ndb* myNdb = new Ndb(cluster_connection, "ndb_examples"); // Object representing the database if (myNdb->init() == -1) { APIERROR(myNdb->getNdbError()); exit(-1); } const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_simple_index"); if (myTable == NULL) APIERROR(myDict->getNdbError()); const NdbDictionary::Index *myIndex= myDict->getIndex("MYINDEXNAME$unique","api_simple_index"); if (myIndex == NULL) APIERROR(myDict->getNdbError()); /************************************************************************** * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) * **************************************************************************/ for (int i = 0; i < 5; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i); myOperation->setValue("ATTR2", i); myOperation = myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i+5); myOperation->setValue("ATTR2", i+5); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /***************************************** * Read and print all tuples using index * *****************************************/ std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); NdbIndexOperation *myIndexOperation= myTransaction->getNdbIndexOperation(myIndex); if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError()); myIndexOperation->readTuple(NdbOperation::LM_Read); myIndexOperation->equal("ATTR2", i); NdbRecAttr *myRecAttr= myIndexOperation->getValue("ATTR1", NULL); if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit, NdbOperation::AbortOnError) != -1) printf(" %2d%2d\n", myRecAttr->u_32_value(), i); myNdb->closeTransaction(myTransaction); } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); NdbIndexOperation *myIndexOperation= myTransaction->getNdbIndexOperation(myIndex); if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError()); myIndexOperation->updateTuple(); myIndexOperation->equal("ATTR2", i); myIndexOperation->setValue("ATTR2", i+10); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /************************************************* * Delete one tuple (the one with primary key 3) * *************************************************/ { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); NdbIndexOperation *myIndexOperation= myTransaction->getNdbIndexOperation(myIndex); if (myIndexOperation == NULL) APIERROR(myTransaction->getNdbError()); myIndexOperation->deleteTuple(); myIndexOperation->equal( "ATTR2", 3 ); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /***************************** * Read and print all tuples * *****************************/ { std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->readTuple(NdbOperation::LM_Read); myOperation->equal("ATTR1", i); NdbRecAttr *myRecAttr= myOperation->getValue("ATTR2", NULL); if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit, NdbOperation::AbortOnError) == -1) if (i == 3) { std::cout << "Detected that deleted tuple doesn't exist!\n"; } else { APIERROR(myTransaction->getNdbError()); } if (i != 3) { printf(" %2d%2d\n", i, myRecAttr->u_32_value()); } myNdb->closeTransaction(myTransaction); } } delete myNdb; delete cluster_connection; ndb_end(0); return 0; }
Эта программа иллюстрирует, как использовать вторичные индексы в API NDB
при помощи интерфейса
NdbRecord
.
Исходный код для этого примера может быть найден в исходных текстах NDB
Cluster в файле
storage/ndb/ndbapi-examples/ndbapi_s_i_ndbrecord/main.cpp
.
Когда работает в кластере с двумя узлами, правильный вывод такой:
ATTR1 ATTR2 0 0 (frag=0) 1 1 (frag=1) 2 2 (frag=1) 3 3 (frag=0) 4 4 (frag=1) 5 5 (frag=1) 6 6 (frag=0) 7 7 (frag=0) 8 8 (frag=1) 9 9 (frag=0) ATTR1 ATTR2 010 1 1 212 Detected that deleted tuple doesn't exist! 414 5 5 616 7 7 818 9 9
// //ndbapi_simple_index_ndbrecord.cpp: Using secondary unique hash indexes //in NDB API, utilising the NdbRecord interface. // //Correct output from this program is (from a two-node cluster): // // ATTR1 ATTR2 // 0 0 (frag=0) // 1 1 (frag=1) // 2 2 (frag=1) // 3 3 (frag=0) // 4 4 (frag=1) // 5 5 (frag=1) // 6 6 (frag=0) // 7 7 (frag=0) // 8 8 (frag=1) // 9 9 (frag=0) // ATTR1 ATTR2 // 010 // 1 1 // 212 // Detected that deleted tuple doesn't exist! // 414 // 5 5 // 616 // 7 7 // 818 // 9 9 #include <mysql.h> #include <NdbApi.hpp> // Used for cout #include <stdio.h> #include <iostream> #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(1); } /* C struct representing layout of data from table * api_s_i_ndbrecord in memory * This can make it easier to work with rows in the application, * but is not necessary - NdbRecord can map columns to any * pattern of offsets. * In this program, the same row offsets are used for columns * specified as part of a key, and as part of an attribute or * result.This makes the example simpler, but is not essential. */ struct MyTableRow { unsigned int attr1; unsigned int attr2; }; int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(1); } char * mysqld_sock= argv[1]; const char *connection_string = argv[2]; ndb_init(); MYSQL mysql; /************************************************************** * Connect to mysql server and create table * **************************************************************/ { if (!mysql_init(&mysql)) { std::cout << "mysql_init failed\n"; exit(1); } if (!mysql_real_connect(&mysql, "localhost", "root", "", "", 0, mysqld_sock, 0)) MYSQLERROR(mysql); mysql_query(&mysql, "CREATE DATABASE ndb_examples"); if (mysql_query(&mysql, "USE ndb_examples") != 0) MYSQLERROR(mysql); mysql_query(&mysql, "DROP TABLE api_s_i_ndbrecord"); if (mysql_query(&mysql, "CREATE TABLE" "api_s_i_ndbrecord" "(ATTR1 INT UNSIGNED," " ATTR2 INT UNSIGNED NOT NULL," " PRIMARY KEY USING HASH (ATTR1)," " UNIQUE MYINDEXNAME USING HASH (ATTR2))" "ENGINE=NDB")) MYSQLERROR(mysql); } /************************************************************** * Connect to ndb cluster * **************************************************************/ Ndb_cluster_connection *cluster_connection= new Ndb_cluster_connection(connection_string); // Object representing the cluster if (cluster_connection->connect(5,3,1)) { std::cout << "Connect to cluster management server failed.\n"; exit(1); } if (cluster_connection->wait_until_ready(30,30)) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(1); } Ndb* myNdb = new Ndb(cluster_connection, "ndb_examples"); // Object representing the database if (myNdb->init() == -1) { APIERROR(myNdb->getNdbError()); exit(1); } NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_s_i_ndbrecord"); if (myTable == NULL) APIERROR(myDict->getNdbError()); const NdbDictionary::Index *myIndex= myDict->getIndex("MYINDEXNAME$unique","api_s_i_ndbrecord"); if (myIndex == NULL) APIERROR(myDict->getNdbError()); /* Create NdbRecord descriptors. */ const NdbDictionary::Column *col1= myTable->getColumn("ATTR1"); if (col1 == NULL) APIERROR(myDict->getNdbError()); const NdbDictionary::Column *col2= myTable->getColumn("ATTR2"); if (col2 == NULL) APIERROR(myDict->getNdbError()); /* NdbRecord for primary key lookup. */ NdbDictionary::RecordSpecification spec[2]; spec[0].column= col1; spec[0].offset= offsetof(MyTableRow, attr1); // So that it goes nicely into the struct spec[0].nullbit_byte_offset= 0; spec[0].nullbit_bit_in_byte= 0; const NdbRecord *pk_record= myDict->createRecord(myTable, spec, 1, sizeof(spec[0])); if (pk_record == NULL) APIERROR(myDict->getNdbError()); /* NdbRecord for all table attributes (insert/read). */ spec[0].column= col1; spec[0].offset= offsetof(MyTableRow, attr1); spec[0].nullbit_byte_offset= 0; spec[0].nullbit_bit_in_byte= 0; spec[1].column= col2; spec[1].offset= offsetof(MyTableRow, attr2); spec[1].nullbit_byte_offset= 0; spec[1].nullbit_bit_in_byte= 0; const NdbRecord *attr_record= myDict->createRecord(myTable, spec, 2, sizeof(spec[0])); if (attr_record == NULL) APIERROR(myDict->getNdbError()); /* NdbRecord for unique key lookup. */ spec[0].column= col2; spec[0].offset= offsetof(MyTableRow, attr2); spec[0].nullbit_byte_offset= 0; spec[0].nullbit_bit_in_byte= 0; const NdbRecord *key_record= myDict->createRecord(myIndex, spec, 1, sizeof(spec[0])); if (key_record == NULL) APIERROR(myDict->getNdbError()); MyTableRow row; /************************************************************************** * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) * **************************************************************************/ for (int i = 0; i < 5; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); /* We initialise the row data and pass to each insertTuple operation The data is copied in the call to insertTuple and so the original row object can be reused for the two operations. */ row.attr1= row.attr2= i; const NdbOperation *myOperation= myTransaction->insertTuple(attr_record, (const char*)&row); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); row.attr1= row.attr2= i+5; myOperation= myTransaction->insertTuple(attr_record, (const char*)&row); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /***************************************** * Read and print all tuples using index * *****************************************/ std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); /* The optional OperationOptions parameter to NdbRecord methods * can be used to specify extra reads of columns which are not in * the NdbRecord specification, which need to be stored somewhere * other than specified in the NdbRecord specification, or * which cannot be specified as part of an NdbRecord (pseudo columns) */ Uint32 frag; NdbOperation::GetValueSpec getSpec[1]; getSpec[0].column=NdbDictionary::Column::FRAGMENT; getSpec[0].appStorage=&frag; NdbOperation::OperationOptions options; options.optionsPresent = NdbOperation::OperationOptions::OO_GETVALUE; options.extraGetValues = &getSpec[0]; options.numExtraGetValues = 1; /* We're going to read using the secondary unique hash index * Set the value of its column */ row.attr2= i; MyTableRow resultRow; unsigned char mask[1]= {0x01}; // Only read ATTR1 into resultRow const NdbOperation *myOperation= myTransaction->readTuple(key_record, (const char*) &row, attr_record, (char*) &resultRow, NdbOperation::LM_Read, mask, &options, sizeof(NdbOperation::OperationOptions)); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit, NdbOperation::AbortOnError) != -1) { printf(" %2d%2d (frag=%u)\n", resultRow.attr1, i, frag); } myNdb->closeTransaction(myTransaction); } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); /* Specify key column to lookup in secondary index */ row.attr2= i; /* Specify new column value to set */ MyTableRow newRowData; newRowData.attr2= i+10; unsigned char mask[1]= {0x02}; // Only update ATTR2 const NdbOperation *myOperation= myTransaction->updateTuple(key_record, (const char*)&row, attr_record,(char*) &newRowData, mask); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /************************************************* * Delete one tuple (the one with unique key 3) * *************************************************/ { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); row.attr2= 3; const NdbOperation *myOperation= myTransaction->deleteTuple(key_record, (const char*) &row, attr_record); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb->closeTransaction(myTransaction); } /***************************** * Read and print all tuples * *****************************/ { std::cout << "ATTR1 ATTR2" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb->startTransaction(); if (myTransaction == NULL) APIERROR(myNdb->getNdbError()); row.attr1= i; /* Read using pk.Note the same row space is used as * key and result storage space */ const NdbOperation *myOperation= myTransaction->readTuple(pk_record, (const char*) &row, attr_record, (char*) &row); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit, NdbOperation::AbortOnError) == -1) if (i == 3) { std::cout << "Detected that deleted tuple doesn't exist!\n"; } else { APIERROR(myTransaction->getNdbError()); } if (i != 3) printf(" %2d%2d\n", row.attr1, row.attr2); myNdb->closeTransaction(myTransaction); } } delete myNdb; delete cluster_connection; ndb_end(0); return 0; }
Этот пример иллюстрирует основные отличия между API старого стиля
NdbRecAttr
и новым
NdbRecord
,
выполняя некоторые общие задачи в применении API NDB.
Исходный код может быть найден в файле
storage/ndb/ndbapi-examples/ndbapi_recattr_vs_record/main.cpp
дерева исходных текстов NDB Cluster.
#include <mysql.h> #include <NdbApi.hpp> // Used for cout #include <stdio.h> #include <iostream> // Do we use old-style (NdbRecAttr?) or new style (NdbRecord?) enum ApiType {api_attr, api_record}; static void run_application(MYSQL &, Ndb_cluster_connection &, ApiType); #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ \ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } int main(int argc, char** argv) { if (argc != 4) { std::cout << "Arguments are <socket mysqld> " << "<connect_string cluster> <attr|record>.\n"; exit(-1); } // ndb_init must be called first ndb_init(); // connect to mysql server and cluster and run application { char * mysqld_sock= argv[1]; const char *connection_string = argv[2]; ApiType accessType=api_attr; // Object representing the cluster Ndb_cluster_connection cluster_connection(connection_string); // Connect to cluster management server (ndb_mgmd) if (cluster_connection.connect(4 /* retries */, 5 /* delay between retries */, 1 /* verbose */)) { std::cout << "Management server not ready within 30 sec.\n"; exit(-1); } // Optionally connect and wait for the storage nodes (ndbd's) if (cluster_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster not ready within 30 sec.\n"; exit(-1); } // connect to mysql server MYSQL mysql; if (!mysql_init(&mysql)) { std::cout << "mysql_init failed\n"; exit(-1); } if (!mysql_real_connect(&mysql, "localhost", "root", "", "", 0, mysqld_sock, 0)) MYSQLERROR(mysql); if (0==strncmp("attr", argv[3], 4)) { accessType=api_attr; } else if (0==strncmp("record", argv[3], 6)) { accessType=api_record; } else { std::cout << "Bad access type argument : " << argv[3] << "\n"; exit(-1); } // run the application code run_application(mysql, cluster_connection, accessType); } ndb_end(0); return 0; } static void init_ndbrecord_info(Ndb &); static void create_table(MYSQL &); static void do_insert(Ndb &, ApiType); static void do_update(Ndb &, ApiType); static void do_delete(Ndb &, ApiType); static void do_read(Ndb &, ApiType); static void do_mixed_read(Ndb &); static void do_mixed_update(Ndb &); static void do_scan(Ndb &, ApiType); static void do_mixed_scan(Ndb &); static void do_indexScan(Ndb &, ApiType); static void do_mixed_indexScan(Ndb&); static void do_read_and_delete(Ndb &); static void do_scan_update(Ndb&, ApiType); static void do_scan_delete(Ndb&, ApiType); static void do_scan_lock_reread(Ndb&, ApiType); static void do_all_extras_read(Ndb &myNdb); static void do_secondary_indexScan(Ndb &myNdb, ApiType accessType); static void do_secondary_indexScanEqual(Ndb &myNdb, ApiType accessType); static void do_interpreted_update(Ndb &myNdb, ApiType accessType); static void do_interpreted_scan(Ndb &myNdb, ApiType accessType); static void do_read_using_default(Ndb &myNdb); /* This structure is used describe how we want data read using * NDBRecord to be placed into memory.This can make it easier * to work with data, but is not essential. */ struct RowData { int attr1; int attr2; int attr3; }; /* Handy struct for representing the data in * the secondary index */ struct IndexRow { unsigned int attr3; unsigned int attr2; }; static void run_application(MYSQL &mysql, Ndb_cluster_connection &cluster_connection, ApiType accessType) { /******************************************** * Connect to database via mysql-c* ********************************************/ mysql_query(&mysql, "CREATE DATABASE ndb_examples"); if (mysql_query(&mysql, "USE ndb_examples") != 0) MYSQLERROR(mysql); create_table(mysql); /******************************************** * Connect to database via NDB API * ********************************************/ // Object representing the database Ndb myNdb( &cluster_connection, "ndb_examples" ); if (myNdb.init()) APIERROR(myNdb.getNdbError()); init_ndbrecord_info(myNdb); /* * Do different operations on database */ do_insert(myNdb, accessType); do_update(myNdb, accessType); do_delete(myNdb, accessType); do_read(myNdb, accessType); do_mixed_read(myNdb); do_mixed_update(myNdb); do_read(myNdb, accessType); do_scan(myNdb, accessType); do_mixed_scan(myNdb); do_indexScan(myNdb, accessType); do_mixed_indexScan(myNdb); do_read_and_delete(myNdb); do_scan_update(myNdb, accessType); do_scan_delete(myNdb, accessType); do_scan_lock_reread(myNdb, accessType); do_all_extras_read(myNdb); do_secondary_indexScan(myNdb, accessType); do_secondary_indexScanEqual(myNdb, accessType); do_scan(myNdb, accessType); do_interpreted_update(myNdb, accessType); do_interpreted_scan(myNdb, accessType); do_read_using_default(myNdb); do_scan(myNdb, accessType); } /********************************************************* * Create a table named api_recattr_vs_record if it does not exist * *********************************************************/ static void create_table(MYSQL &mysql) { if (mysql_query(&mysql, "DROP TABLE IF EXISTS" "api_recattr_vs_record")) MYSQLERROR(mysql); if (mysql_query(&mysql, "CREATE TABLE" "api_recattr_vs_record" "(ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY," " ATTR2 INT UNSIGNED NOT NULL," " ATTR3 INT UNSIGNED NOT NULL)" "ENGINE=NDB")) MYSQLERROR(mysql); /* Add ordered secondary index on 2 attributes, in reverse order */ if (mysql_query(&mysql, "CREATE INDEX" "MYINDEXNAME" "ON api_recattr_vs_record" "(ATTR3, ATTR2)")) MYSQLERROR(mysql); } /* Clunky statics for shared NdbRecord stuff */ static const NdbDictionary::Column *pattr1Col; static const NdbDictionary::Column *pattr2Col; static const NdbDictionary::Column *pattr3Col; static const NdbRecord *pkeyColumnRecord; static const NdbRecord *pallColsRecord; static const NdbRecord *pkeyIndexRecord; static const NdbRecord *psecondaryIndexRecord; static int attr1ColNum; static int attr2ColNum; static int attr3ColNum; /************************************************************** * Initialise NdbRecord structures for table and index access * **************************************************************/ static void init_ndbrecord_info(Ndb &myNdb) { /* Here we create various NdbRecord structures for accessing * data using the tables and indexes on api_recattr_vs_record * We could use the default NdbRecord structures, but then * we wouldn't have the nice ability to read and write rows * to and from the RowData and IndexRow structs */ NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); NdbDictionary::RecordSpecification recordSpec[3]; if (myTable == NULL) APIERROR(myDict->getNdbError()); pattr1Col = myTable->getColumn("ATTR1"); if (pattr1Col == NULL) APIERROR(myDict->getNdbError()); pattr2Col = myTable->getColumn("ATTR2"); if (pattr2Col == NULL) APIERROR(myDict->getNdbError()); pattr3Col = myTable->getColumn("ATTR3"); if (pattr3Col == NULL) APIERROR(myDict->getNdbError()); attr1ColNum = pattr1Col->getColumnNo(); attr2ColNum = pattr2Col->getColumnNo(); attr3ColNum = pattr3Col->getColumnNo(); // ATTR 1 recordSpec[0].column = pattr1Col; recordSpec[0].offset = offsetof(RowData, attr1); recordSpec[0].nullbit_byte_offset = 0; // Not nullable recordSpec[0].nullbit_bit_in_byte = 0; // ATTR 2 recordSpec[1].column = pattr2Col; recordSpec[1].offset = offsetof(RowData, attr2); recordSpec[1].nullbit_byte_offset = 0; // Not nullable recordSpec[1].nullbit_bit_in_byte = 0; // ATTR 3 recordSpec[2].column = pattr3Col; recordSpec[2].offset = offsetof(RowData, attr3); recordSpec[2].nullbit_byte_offset = 0; // Not nullable recordSpec[2].nullbit_bit_in_byte = 0; /* Create table record with just the primary key column */ pkeyColumnRecord = myDict->createRecord(myTable, recordSpec, 1, sizeof(recordSpec[0])); if (pkeyColumnRecord == NULL) APIERROR(myDict->getNdbError()); /* Create table record with all the columns */ pallColsRecord = myDict->createRecord(myTable, recordSpec, 3, sizeof(recordSpec[0])); if (pallColsRecord == NULL) APIERROR(myDict->getNdbError()); /* Create NdbRecord for primary index access */ const NdbDictionary::Index *myPIndex= myDict->getIndex("PRIMARY", "api_recattr_vs_record"); if (myPIndex == NULL) APIERROR(myDict->getNdbError()); pkeyIndexRecord = myDict->createRecord(myPIndex, recordSpec, 1, sizeof(recordSpec[0])); if (pkeyIndexRecord == NULL) APIERROR(myDict->getNdbError()); /* Create Index NdbRecord for secondary index access * Note that we use the columns from the table to define the * index access record */ const NdbDictionary::Index *mySIndex= myDict->getIndex("MYINDEXNAME", "api_recattr_vs_record"); recordSpec[0].column= pattr3Col; recordSpec[0].offset= offsetof(IndexRow, attr3); recordSpec[0].nullbit_byte_offset=0; recordSpec[0].nullbit_bit_in_byte=0; recordSpec[1].column= pattr2Col; recordSpec[1].offset= offsetof(IndexRow, attr2); recordSpec[1].nullbit_byte_offset=0; recordSpec[1].nullbit_bit_in_byte=1; /* Create NdbRecord for accessing via secondary index */ psecondaryIndexRecord = myDict->createRecord(mySIndex, recordSpec, 2, sizeof(recordSpec[0])); if (psecondaryIndexRecord == NULL) APIERROR(myDict->getNdbError()); } /************************************************************************** * Using 5 transactions, insert 10 tuples in table: (0,0),(1,1),...,(9,9) * **************************************************************************/ static void do_insert(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_insert\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); for (int i = 0; i < 5; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); switch (accessType) { case api_attr : { NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i); myOperation->setValue("ATTR2", i); myOperation->setValue("ATTR3", i); myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->insertTuple(); myOperation->equal("ATTR1", i+5); myOperation->setValue("ATTR2", i+5); myOperation->setValue("ATTR3", i+5); break; } case api_record : { RowData row; row.attr1= row.attr2= row.attr3= i; const NdbOperation *pop1= myTransaction->insertTuple(pallColsRecord, (char *) &row); if (pop1 == NULL) APIERROR(myTransaction->getNdbError()); row.attr1= row.attr2= row.attr3= i+5; const NdbOperation *pop2= myTransaction->insertTuple(pallColsRecord, (char *) &row); if (pop2 == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ static void do_update(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_update\n"; for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); switch (accessType) { case api_attr : { NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->updateTuple(); myOperation->equal("ATTR1", i); myOperation->setValue("ATTR2", i+10); myOperation->setValue("ATTR3", i+20); break; } case api_record : { RowData row; row.attr1=i; row.attr2=i+10; row.attr3=i+20; /* Since we're using an NdbRecord with all columns in it to * specify the updated columns, we need to create a mask to * indicate that we are only updating attr2 and attr3. */ unsigned char attrMask=(1<<attr2ColNum) | (1<<attr3ColNum); const NdbOperation *pop = myTransaction->updateTuple(pkeyColumnRecord, (char*) &row, pallColsRecord, (char*) &row, &attrMask); if (pop==NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; }; /************************************************* * Delete one tuple (the one with primary key 3) * *************************************************/ static void do_delete(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_delete\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); switch (accessType) { case api_attr : { NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->deleteTuple(); myOperation->equal( "ATTR1", 3 ); break; } case api_record : { RowData keyInfo; keyInfo.attr1=3; const NdbOperation *pop= myTransaction->deleteTuple(pkeyColumnRecord, (char*) &keyInfo, pallColsRecord); if (pop==NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /***************************************************************** * Update the second attribute in half of the tuples (adding 10) * *****************************************************************/ static void do_mixed_update(Ndb &myNdb) { /* This method performs an update using a mix of NdbRecord * supplied attributes, and extra setvalues provided by * the OperationOptions structure. */ std::cout << "Running do_mixed_update (NdbRecord only)\n"; for (int i = 0; i < 10; i+=2) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); RowData row; row.attr1=i; row.attr2=i+30; /* Only attr2 is updated vian NDBRecord */ unsigned char attrMask= (1<<attr2ColNum); NdbOperation::SetValueSpec setvalspecs[1]; /* Value to set attr3 to */ Uint32 dataSource= i + 40; setvalspecs[0].column = pattr3Col; setvalspecs[0].value = &dataSource; NdbOperation::OperationOptions opts; opts.optionsPresent= NdbOperation::OperationOptions::OO_SETVALUE; opts.extraSetValues= &setvalspecs[0]; opts.numExtraSetValues= 1; // Define mixed operation in one call to NDBAPI const NdbOperation *pop = myTransaction->updateTuple(pkeyColumnRecord, (char*) &row, pallColsRecord, (char*) &row, &attrMask, &opts); if (pop==NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; } /********************************************* * Read and print all tuples using PK access * *********************************************/ static void do_read(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_read\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); RowData rowData; NdbRecAttr *myRecAttr; NdbRecAttr *myRecAttr2; switch (accessType) { case api_attr : { NdbOperation *myOperation= myTransaction->getNdbOperation(myTable); if (myOperation == NULL) APIERROR(myTransaction->getNdbError()); myOperation->readTuple(NdbOperation::LM_Read); myOperation->equal("ATTR1", i); myRecAttr= myOperation->getValue("ATTR2", NULL); if (myRecAttr == NULL) APIERROR(myTransaction->getNdbError()); myRecAttr2=myOperation->getValue("ATTR3", NULL); if (myRecAttr2 == NULL) APIERROR(myTransaction->getNdbError()); break; } case api_record : { rowData.attr1=i; const NdbOperation *pop= myTransaction->readTuple(pkeyColumnRecord, (char*) &rowData, pallColsRecord, // Read PK+ATTR2+ATTR3 (char*) &rowData); if (pop==NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); if (myTransaction->getNdbError().classification == NdbError::NoDataFound) if (i == 3) std::cout << "Deleted tuple does not exist." << std::endl; else APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { if (i != 3) { printf(" %2d%2d%2d\n", i, myRecAttr->u_32_value(), myRecAttr2->u_32_value()); } break; } case api_record : { if (i !=3) { printf(" %2d%2d%2d\n", i, rowData.attr2, rowData.attr3); } break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; } /***************************** * Read and print all tuples * *****************************/ static void do_mixed_read(Ndb &myNdb) { std::cout << "Running do_mixed_read (NdbRecord only)\n"; std::cout << "ATTR1 ATTR2 ATTR3 COMMIT_COUNT" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); RowData rowData; NdbRecAttr *myRecAttr3, *myRecAttrCC; /* Start with NdbRecord read of ATTR2, and then add * getValue NdbRecAttr read of ATTR3 and Commit count */ NdbOperation::GetValueSpec extraCols[2]; extraCols[0].column=pattr3Col; extraCols[0].appStorage=NULL; extraCols[0].recAttr=NULL; extraCols[1].column=NdbDictionary::Column::COMMIT_COUNT; extraCols[1].appStorage=NULL; extraCols[1].recAttr=NULL; NdbOperation::OperationOptions opts; opts.optionsPresent = NdbOperation::OperationOptions::OO_GETVALUE; opts.extraGetValues= &extraCols[0]; opts.numExtraGetValues= 2; /* We only read attr2 using the normal NdbRecord access */ unsigned char attrMask= (1<<attr2ColNum); // Set PK search criteria rowData.attr1= i; const NdbOperation *pop= myTransaction->readTuple(pkeyColumnRecord, (char*) &rowData, pallColsRecord, // Read all with mask (char*) &rowData, NdbOperation::LM_Read, &attrMask, // result_mask &opts); if (pop==NULL) APIERROR(myTransaction->getNdbError()); myRecAttr3= extraCols[0].recAttr; myRecAttrCC= extraCols[1].recAttr; if (myRecAttr3 == NULL) APIERROR(myTransaction->getNdbError()); if (myRecAttrCC == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::Commit ) == -1) APIERROR(myTransaction->getNdbError()); if (myTransaction->getNdbError().classification == NdbError::NoDataFound) if (i == 3) std::cout << "Deleted tuple does not exist." << std::endl; else APIERROR(myTransaction->getNdbError()); if (i !=3) { printf(" %2d%2d%2d%d\n", rowData.attr1, rowData.attr2, myRecAttr3->u_32_value(), myRecAttrCC->u_32_value()); } myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; } /******************************************** * Read and print all tuples via table scan * ********************************************/ static void do_scan(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_scan\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; switch (accessType) { case api_attr : { psop=myTransaction->getNdbScanOperation(myTable); if (psop == NULL) APIERROR(myTransaction->getNdbError()); if (psop->readTuples(NdbOperation::LM_Read) != 0) APIERROR (myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { /* Note that no row ptr is passed to the NdbRecord scan operation * The scan will fetch a batch and give the user a series of pointers * to rows in the batch in nextResult() below */ psop=myTransaction->scanTable(pallColsRecord,NdbOperation::LM_Read); if (psop == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { while (psop->nextResult(true) == 0) { printf(" %2d%2d%2d\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value()); } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int rc=0; /* Ask nextResult to update out ptr to point to the next * row from the scan */ while ((rc = psop->nextResult((const char**) &prowData, true, false)) == 0) { printf(" %2d%2d%2d\n", prowData->attr1, prowData->attr2, prowData->attr3); } if (rc != 1)APIERROR(myTransaction->getNdbError()); psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /*********************************************************** * Read and print all tuples via table scan and mixed read * ***********************************************************/ static void do_mixed_scan(Ndb &myNdb) { std::cout << "Running do_mixed_scan(NdbRecord only)\n"; std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr3; /* Set mask so that NdbRecord scan reads attr1 and attr2 only */ unsigned char attrMask=((1<<attr1ColNum) | (1<<attr2ColNum)); /* Define extra get value to get attr3 */ NdbOperation::GetValueSpec extraGets[1]; extraGets[0].column = pattr3Col; extraGets[0].appStorage= 0; extraGets[0].recAttr= 0; NdbScanOperation::ScanOptions options; options.optionsPresent= NdbScanOperation::ScanOptions::SO_GETVALUE; options.extraGetValues= &extraGets[0]; options.numExtraGetValues= 1; psop=myTransaction->scanTable(pallColsRecord, NdbOperation::LM_Read, &attrMask, &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* RecAttr for the extra get has been set by the operation definition */ recAttrAttr3 = extraGets[0].recAttr; if (recAttrAttr3 == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute( NdbTransaction::NoCommit ) != 0) APIERROR(myTransaction->getNdbError()); RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, false)) == 0) { printf(" %2d%2d%2d\n", prowData->attr1, prowData->attr2, recAttrAttr3->u_32_value()); } if (rc != 1)APIERROR(myTransaction->getNdbError()); psop->close(true); if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /************************************************************ * Read and print all tuples via primary ordered index scan * ************************************************************/ static void do_indexScan(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Index *myPIndex= myDict->getIndex("PRIMARY", "api_recattr_vs_record"); std::cout << "Running do_indexScan\n"; if (myPIndex == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbIndexScanOperation *psop; /* RecAttrs for NdbRecAttr Api */ NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; switch (accessType) { case api_attr : { psop=myTransaction->getNdbIndexScanOperation(myPIndex); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Multi read range is not supported for the NdbRecAttr scan * API, so we just read one range. */ Uint32 scanFlags= NdbScanOperation::SF_OrderBy | NdbScanOperation::SF_MultiRange | NdbScanOperation::SF_ReadRangeNo; if (psop->readTuples(NdbOperation::LM_Read, scanFlags, (Uint32) 0, // batch (Uint32) 0) != 0) // parallel APIERROR (myTransaction->getNdbError()); /* Add a bound * Tuples where ATTR1 >=2 and < 4 * 2,[3 deleted] */ Uint32 low=2; Uint32 high=4; if (psop->setBound("ATTR1", NdbIndexScanOperation::BoundLE, (char*)&low)) APIERROR(myTransaction->getNdbError()); if (psop->setBound("ATTR1", NdbIndexScanOperation::BoundGT, (char*)&high)) APIERROR(myTransaction->getNdbError()); if (psop->end_of_bound(0)) APIERROR(psop->getNdbError()); /* Second bound * Tuples where ATTR1 > 5 and <=9 * 6,7,8,9 */ low=5; high=9; if (psop->setBound("ATTR1", NdbIndexScanOperation::BoundLT, (char*)&low)) APIERROR(myTransaction->getNdbError()); if (psop->setBound("ATTR1", NdbIndexScanOperation::BoundGE, (char*)&high)) APIERROR(myTransaction->getNdbError()); if (psop->end_of_bound(1)) APIERROR(psop->getNdbError()); /* Read all columns */ recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { /* NdbRecord supports scanning multiple ranges using a * single index scan operation */ Uint32 scanFlags = NdbScanOperation::SF_OrderBy | NdbScanOperation::SF_MultiRange | NdbScanOperation::SF_ReadRangeNo; NdbScanOperation::ScanOptions options; options.optionsPresent=NdbScanOperation::ScanOptions::SO_SCANFLAGS; options.scan_flags=scanFlags; psop=myTransaction->scanIndex(pkeyIndexRecord, pallColsRecord, NdbOperation::LM_Read, NULL, // no mask; read all columns // in result record NULL, // bound defined later &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Add a bound * Tuples where ATTR1 >=2 and < 4 * 2,[3 deleted] */ Uint32 low=2; Uint32 high=4; NdbIndexScanOperation::IndexBound bound; bound.low_key=(char*)&low; bound.low_key_count=1; bound.low_inclusive=true; bound.high_key=(char*)&high; bound.high_key_count=1; bound.high_inclusive=false; bound.range_no=0; if (psop->setBound(pkeyIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); /* Second bound * Tuples where ATTR1 > 5 and <=9 * 6,7,8,9 */ low=5; high=9; bound.low_key=(char*)&low; bound.low_key_count=1; bound.low_inclusive=false; bound.high_key=(char*)&high; bound.high_key_count=1; bound.high_inclusive=true; bound.range_no=1; if (psop->setBound(pkeyIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::NoCommit ) != 0) APIERROR(myTransaction->getNdbError()); if (myTransaction->getNdbError().code != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { while (psop->nextResult(true) == 0) { printf(" %2d%2d%2dRange no : %2d\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value(), psop->get_range_no()); } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, false)) == 0) { // printf(" PTR : %d\n", (int) prowData); printf(" %2d%2d%2dRange no : %2d\n", prowData->attr1, prowData->attr2, prowData->attr3, psop->get_range_no()); } if (rc != 1)APIERROR(myTransaction->getNdbError()); psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /************************************************************************* * Read and print all tuples via index scan using mixed NdbRecord access * *************************************************************************/ static void do_mixed_indexScan(Ndb &myNdb) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Index *myPIndex= myDict->getIndex("PRIMARY", "api_recattr_vs_record"); std::cout << "Running do_mixed_indexScan\n"; if (myPIndex == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbIndexScanOperation *psop; NdbRecAttr *recAttrAttr3; Uint32 scanFlags = NdbScanOperation::SF_OrderBy | NdbScanOperation::SF_MultiRange | NdbScanOperation::SF_ReadRangeNo; /* We'll get Attr3 via ScanOptions */ unsigned char attrMask=((1<<attr1ColNum) | (1<<attr2ColNum)); NdbOperation::GetValueSpec extraGets[1]; extraGets[0].column= pattr3Col; extraGets[0].appStorage= NULL; extraGets[0].recAttr= NULL; NdbScanOperation::ScanOptions options; options.optionsPresent= NdbScanOperation::ScanOptions::SO_SCANFLAGS | NdbScanOperation::ScanOptions::SO_GETVALUE; options.scan_flags= scanFlags; options.extraGetValues= &extraGets[0]; options.numExtraGetValues= 1; psop=myTransaction->scanIndex(pkeyIndexRecord, pallColsRecord, NdbOperation::LM_Read, &attrMask, // mask NULL, // bound defined below &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Grab RecAttr now */ recAttrAttr3= extraGets[0].recAttr; /* Add a bound * ATTR1 >= 2, < 4 * 2,[3 deleted] */ Uint32 low=2; Uint32 high=4; NdbIndexScanOperation::IndexBound bound; bound.low_key=(char*)&low; bound.low_key_count=1; bound.low_inclusive=true; bound.high_key=(char*)&high; bound.high_key_count=1; bound.high_inclusive=false; bound.range_no=0; if (psop->setBound(pkeyIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); /* Second bound * ATTR1 > 5, <= 9 * 6,7,8,9 */ low=5; high=9; bound.low_key=(char*)&low; bound.low_key_count=1; bound.low_inclusive=false; bound.high_key=(char*)&high; bound.high_key_count=1; bound.high_inclusive=true; bound.range_no=1; if (psop->setBound(pkeyIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, false)) == 0) { printf(" %2d%2d%2dRange no : %2d\n", prowData->attr1, prowData->attr2, recAttrAttr3->u_32_value(), psop->get_range_no()); } if (rc != 1) APIERROR(myTransaction->getNdbError()); psop->close(true); if (myTransaction->execute(NdbTransaction::Commit) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /******************************************************** * Read + Delete one tuple (the one with primary key 8) * ********************************************************/ static void do_read_and_delete(Ndb &myNdb) { /* This procedure performs a single operation, single round * trip read and then delete of a tuple, specified by * primary key */ std::cout << "Running do_read_and_delete (NdbRecord only)\n"; NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); RowData row; row.attr1=8; row.attr2=0; // Don't care row.attr3=0; // Don't care /* We'll also read some extra columns while we're * reading + deleting */ NdbOperation::OperationOptions options; NdbOperation::GetValueSpec extraGets[2]; extraGets[0].column = pattr3Col; extraGets[0].appStorage = NULL; extraGets[0].recAttr = NULL; extraGets[1].column = NdbDictionary::Column::COMMIT_COUNT; extraGets[1].appStorage = NULL; extraGets[1].recAttr = NULL; options.optionsPresent= NdbOperation::OperationOptions::OO_GETVALUE; options.extraGetValues= &extraGets[0]; options.numExtraGetValues= 2; unsigned char attrMask = (1<<attr2ColNum); // Only read Col2 into row const NdbOperation *pop= myTransaction->deleteTuple(pkeyColumnRecord, // Spec of key used (char*) &row, // Key information pallColsRecord, // Spec of columns to read (char*) &row, // Row to read values into &attrMask, // Cols to read as part of delete &options, sizeof(NdbOperation::OperationOptions)); if (pop==NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3 COMMITS" << std::endl; printf(" %2d%2d%2d%2d\n", row.attr1, row.attr2, extraGets[0].recAttr->u_32_value(), extraGets[1].recAttr->u_32_value()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /* Some handy consts for scan control */ static const int GOT_ROW= 0; static const int NO_MORE_ROWS= 1; static const int NEED_TO_FETCH_ROWS= 2; /********************************************* * Read and update all tuples via table scan * *********************************************/ static void do_scan_update(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "Running do_scan_update\n"; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; switch (accessType) { case api_attr : { psop=myTransaction->getNdbScanOperation(myTable); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* When we want to operate on the tuples returned from a * scan, we need to request the tuple's keyinfo is * returned, with SF_KeyInfo */ if (psop->readTuples(NdbOperation::LM_Read, NdbScanOperation::SF_KeyInfo) != 0) APIERROR (myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { NdbScanOperation::ScanOptions options; options.optionsPresent= NdbScanOperation::ScanOptions::SO_SCANFLAGS; options.scan_flags= NdbScanOperation::SF_KeyInfo; psop=myTransaction->scanTable(pallColsRecord, NdbOperation::LM_Read, NULL, // mask - read all columns &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { int result= NEED_TO_FETCH_ROWS; Uint32 processed= 0; while (result == NEED_TO_FETCH_ROWS) { bool fetch=true; while ((result = psop->nextResult(fetch)) == GOT_ROW) { fetch= false; Uint32 col2Value=recAttrAttr2->u_32_value(); NdbOperation *op=psop->updateCurrentTuple(); if (op==NULL) APIERROR(myTransaction->getNdbError()); op->setValue("ATTR2", (10*col2Value)); processed++; } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { // Need to execute if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; } } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int result= NEED_TO_FETCH_ROWS; Uint32 processed=0; while (result == NEED_TO_FETCH_ROWS) { bool fetch= true; while ((result = psop->nextResult((const char**) &prowData, fetch, false)) == GOT_ROW) { fetch= false; /* Copy row into a stack variable */ RowData r= *prowData; /* Modify attr2 */ r.attr2*= 10; /* Update it */ const NdbOperation *op = psop->updateCurrentTuple(myTransaction, pallColsRecord, (char*) &r); if (op==NULL) APIERROR(myTransaction->getNdbError()); processed ++; } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { /* To get here, there are no more cached scan results, * and some row updates that we've not sent yet. * Send them before we try to get another batch, or finish. */ if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; } } psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /************************************************** * Read all and delete some tuples via table scan * **************************************************/ static void do_scan_delete(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "Running do_scan_delete\n"; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr1; /* Scan, retrieving first column. * Delete particular records, based on first column * Read third column as part of delete */ switch (accessType) { case api_attr : { psop=myTransaction->getNdbScanOperation(myTable); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Need KeyInfo when performing scanning delete */ if (psop->readTuples(NdbOperation::LM_Read, NdbScanOperation::SF_KeyInfo) != 0) APIERROR (myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); break; } case api_record : { NdbScanOperation::ScanOptions options; options.optionsPresent=NdbScanOperation::ScanOptions::SO_SCANFLAGS; /* Need KeyInfo when performing scanning delete */ options.scan_flags=NdbScanOperation::SF_KeyInfo; psop=myTransaction->scanTable(pkeyColumnRecord, NdbOperation::LM_Read, NULL, // mask &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::NoCommit ) != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { int result= NEED_TO_FETCH_ROWS; Uint32 processed=0; while (result == NEED_TO_FETCH_ROWS) { bool fetch=true; while ((result = psop->nextResult(fetch)) == GOT_ROW) { fetch= false; Uint32 col1Value=recAttrAttr1->u_32_value(); if (col1Value == 2) { /* Note : We cannot do a delete pre-read via * the NdbRecAttr interface. * We can only delete here. */ if (psop->deleteCurrentTuple()) APIERROR(myTransaction->getNdbError()); processed++; } } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { /* To get here, there are no more cached scan results, * and some row deletes that we've not sent yet. * Send them before we try to get another batch, or finish. */ if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; } } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int result= NEED_TO_FETCH_ROWS; Uint32 processed=0; while (result == NEED_TO_FETCH_ROWS) { bool fetch=true; const NdbOperation* theDeleteOp; RowData readRow; NdbRecAttr* attr3; NdbRecAttr* commitCount; while ((result = psop->nextResult((const char**) &prowData, fetch, false)) == GOT_ROW) { fetch = false; /* Copy latest row to a stack local */ RowData r; r= *prowData; if (r.attr1 == 2) { /* We're going to perform a read+delete on this * row.We'll read attr1 and attr2 vian NDBRecord * and Attr3 and the commit count via extra get values. */ NdbOperation::OperationOptions options; NdbOperation::GetValueSpec extraGets[2]; extraGets[0].column = pattr3Col; extraGets[0].appStorage = NULL; extraGets[0].recAttr = NULL; extraGets[1].column = NdbDictionary::Column::COMMIT_COUNT; extraGets[1].appStorage = NULL; extraGets[1].recAttr = NULL; options.optionsPresent= NdbOperation::OperationOptions::OO_GETVALUE; options.extraGetValues= &extraGets[0]; options.numExtraGetValues= 2; // Read cols 1 + 2 vian NDBRecord unsigned char attrMask = (1<<attr1ColNum) | (1<<attr2ColNum); theDeleteOp = psop->deleteCurrentTuple(myTransaction, pallColsRecord, (char*) &readRow, &attrMask, &options, sizeof(NdbOperation::OperationOptions)); if (theDeleteOp==NULL) APIERROR(myTransaction->getNdbError()); /* Store extra Get RecAttrs */ attr3= extraGets[0].recAttr; commitCount= extraGets[1].recAttr; processed ++; } } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { /* To get here, there are no more cached scan results, * and some row deletes that we've not sent yet. * Send them before we try to get another batch, or finish. */ if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; // Let's look at the data just read printf("Deleted data\n"); printf("ATTR1ATTR2ATTR3 COMMITS\n"); printf("%2d%2d%2d%2d\n", readRow.attr1, readRow.attr2, attr3->u_32_value(), commitCount->u_32_value()); } } psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /*********************************************************** * Read all tuples via scan, reread one with lock takeover * ***********************************************************/ static void do_scan_lock_reread(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "Running do_scan_lock_reread\n"; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr1; switch (accessType) { case api_attr : { psop=myTransaction->getNdbScanOperation(myTable); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Need KeyInfo for lock takeover */ if (psop->readTuples(NdbOperation::LM_Read, NdbScanOperation::SF_KeyInfo) != 0) APIERROR (myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); break; } case api_record : { NdbScanOperation::ScanOptions options; options.optionsPresent= NdbScanOperation::ScanOptions::SO_SCANFLAGS; /* Need KeyInfo for lock takeover */ options.scan_flags= NdbScanOperation::SF_KeyInfo; psop=myTransaction->scanTable(pkeyColumnRecord, NdbOperation::LM_Read, NULL, // mask &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { int result= NEED_TO_FETCH_ROWS; Uint32 processed=0; NdbRecAttr *attr1, *attr2, *attr3, *commitCount; while (result == NEED_TO_FETCH_ROWS) { bool fetch=true; while ((result = psop->nextResult(fetch)) == GOT_ROW) { fetch= false; Uint32 col1Value=recAttrAttr1->u_32_value(); if (col1Value == 9) { /* Let's read the rest of the info for it with * a separate operation */ NdbOperation *op= psop->lockCurrentTuple(); if (op==NULL) APIERROR(myTransaction->getNdbError()); attr1=op->getValue("ATTR1"); attr2=op->getValue("ATTR2"); attr3=op->getValue("ATTR3"); commitCount=op->getValue(NdbDictionary::Column::COMMIT_COUNT); processed++; } } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { // Need to execute if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; // Let's look at the whole row... printf("Locked and re-read data:\n"); printf("ATTR1ATTR2ATTR3 COMMITS\n"); printf("%2d%2d%2d%2d\n", attr1->u_32_value(), attr2->u_32_value(), attr3->u_32_value(), commitCount->u_32_value()); } } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int result= NEED_TO_FETCH_ROWS; Uint32 processed=0; RowData rereadData; NdbRecAttr *attr3, *commitCount; while (result == NEED_TO_FETCH_ROWS) { bool fetch=true; while ((result = psop->nextResult((const char**) &prowData, fetch, false)) == GOT_ROW) { fetch = false; /* Copy row to stack local */ RowData r; r=*prowData; if (r.attr1 == 9) { /* Perform extra read of this row via lockCurrentTuple * Read all columns using NdbRecord for attr1 + attr2, * and extra get values for attr3 and the commit count */ NdbOperation::OperationOptions options; NdbOperation::GetValueSpec extraGets[2]; extraGets[0].column = pattr3Col; extraGets[0].appStorage = NULL; extraGets[0].recAttr = NULL; extraGets[1].column = NdbDictionary::Column::COMMIT_COUNT; extraGets[1].appStorage = NULL; extraGets[1].recAttr = NULL; options.optionsPresent=NdbOperation::OperationOptions::OO_GETVALUE; options.extraGetValues=&extraGets[0]; options.numExtraGetValues=2; // Read cols 1 + 2 vian NDBRecord unsigned char attrMask = (1<<attr1ColNum) | (1<<attr2ColNum); const NdbOperation *lockOp = psop->lockCurrentTuple(myTransaction, pallColsRecord, (char *) &rereadData, &attrMask, &options, sizeof(NdbOperation::OperationOptions)); if (lockOp == NULL) APIERROR(myTransaction->getNdbError()); attr3= extraGets[0].recAttr; commitCount= extraGets[1].recAttr; processed++; } } if (result < 0) APIERROR(myTransaction->getNdbError()); if (processed !=0) { // Need to execute if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); processed=0; // Let's look at the whole row... printf("Locked and re-read data:\n"); printf("ATTR1 ATTR2 ATTR3 COMMITS\n"); printf("%2d%2d%2d%2d\n", rereadData.attr1, rereadData.attr2, attr3->u_32_value(), commitCount->u_32_value()); } } psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /*************************************************************** * Read all tuples via primary key, using only extra getValues * ***************************************************************/ static void do_all_extras_read(Ndb &myNdb) { std::cout << "Running do_all_extras_read(NdbRecord only)\n"; std::cout << "ATTR1 ATTR2 ATTR3 COMMIT_COUNT" << std::endl; for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); RowData rowData; NdbRecAttr *myRecAttr1, *myRecAttr2, *myRecAttr3, *myRecAttrCC; /* We read nothing vian NDBRecord, and everything via * 'extra' reads */ NdbOperation::GetValueSpec extraCols[4]; extraCols[0].column=pattr1Col; extraCols[0].appStorage=NULL; extraCols[0].recAttr=NULL; extraCols[1].column=pattr2Col; extraCols[1].appStorage=NULL; extraCols[1].recAttr=NULL; extraCols[2].column=pattr3Col; extraCols[2].appStorage=NULL; extraCols[2].recAttr=NULL; extraCols[3].column=NdbDictionary::Column::COMMIT_COUNT; extraCols[3].appStorage=NULL; extraCols[3].recAttr=NULL; NdbOperation::OperationOptions opts; opts.optionsPresent = NdbOperation::OperationOptions::OO_GETVALUE; opts.extraGetValues=&extraCols[0]; opts.numExtraGetValues=4; unsigned char attrMask= 0; // No row results required. // Set PK search criteria rowData.attr1= i; const NdbOperation *pop= myTransaction->readTuple(pkeyColumnRecord, (char*) &rowData, pkeyColumnRecord, NULL, // null result row NdbOperation::LM_Read, &attrMask, &opts); if (pop==NULL) APIERROR(myTransaction->getNdbError()); myRecAttr1=extraCols[0].recAttr; myRecAttr2=extraCols[1].recAttr; myRecAttr3=extraCols[2].recAttr; myRecAttrCC=extraCols[3].recAttr; if (myRecAttr1 == NULL) APIERROR(myTransaction->getNdbError()); if (myRecAttr2 == NULL) APIERROR(myTransaction->getNdbError()); if (myRecAttr3 == NULL) APIERROR(myTransaction->getNdbError()); if (myRecAttrCC == NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); bool deleted= (myTransaction->getNdbError().classification == NdbError::NoDataFound); if (deleted) printf("Detected that deleted tuple %d doesn't exist!\n", i); else { printf(" %2d%2d%2d%d\n", myRecAttr1->u_32_value(), myRecAttr2->u_32_value(), myRecAttr3->u_32_value(), myRecAttrCC->u_32_value()); } myNdb.closeTransaction(myTransaction); } std::cout << "-------\n"; } /****************************************************************** * Read and print some tuples via bounded scan of secondary index * ******************************************************************/ static void do_secondary_indexScan(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Index *mySIndex= myDict->getIndex("MYINDEXNAME", "api_recattr_vs_record"); std::cout << "Running do_secondary_indexScan\n"; std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbIndexScanOperation *psop; NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; Uint32 scanFlags = NdbScanOperation::SF_OrderBy | NdbScanOperation::SF_Descending | NdbScanOperation::SF_MultiRange | NdbScanOperation::SF_ReadRangeNo; switch (accessType) { case api_attr : { psop=myTransaction->getNdbIndexScanOperation(mySIndex); if (psop == NULL) APIERROR(myTransaction->getNdbError()); if (psop->readTuples(NdbOperation::LM_Read, scanFlags, (Uint32) 0, // batch (Uint32) 0) != 0) // parallel APIERROR (myTransaction->getNdbError()); /* Bounds : * > ATTR3=6 * < ATTR3=42 */ Uint32 low=6; Uint32 high=42; if (psop->setBound("ATTR3", NdbIndexScanOperation::BoundLT, (char*)&low)) APIERROR(psop->getNdbError()); if (psop->setBound("ATTR3", NdbIndexScanOperation::BoundGT, (char*)&high)) APIERROR(psop->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { NdbScanOperation::ScanOptions options; options.optionsPresent=NdbScanOperation::ScanOptions::SO_SCANFLAGS; options.scan_flags=scanFlags; psop=myTransaction->scanIndex(psecondaryIndexRecord, pallColsRecord, NdbOperation::LM_Read, NULL, // mask NULL, // bound &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Bounds : * > ATTR3=6 * < ATTR3=42 */ Uint32 low=6; Uint32 high=42; NdbIndexScanOperation::IndexBound bound; bound.low_key=(char*)&low; bound.low_key_count=1; bound.low_inclusive=false; bound.high_key=(char*)&high; bound.high_key_count=1; bound.high_inclusive=false; bound.range_no=0; if (psop->setBound(psecondaryIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::NoCommit ) != 0) APIERROR(myTransaction->getNdbError()); // Check rc anyway if (myTransaction->getNdbError().status != NdbError::Success) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { while (psop->nextResult(true) == 0) { printf(" %2d%2d%2dRange no : %2d\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value(), psop->get_range_no()); } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, false)) == 0) { // printf(" PTR : %d\n", (int) prowData); printf(" %2d%2d%2dRange no : %2d\n", prowData->attr1, prowData->attr2, prowData->attr3, psop->get_range_no()); } if (rc != 1)APIERROR(myTransaction->getNdbError()); psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /*********************************************************************** * Index scan to read tuples from secondary index using equality bound * ***********************************************************************/ static void do_secondary_indexScanEqual(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Index *mySIndex= myDict->getIndex("MYINDEXNAME", "api_recattr_vs_record"); std::cout << "Running do_secondary_indexScanEqual\n"; std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbIndexScanOperation *psop; NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; Uint32 scanFlags = NdbScanOperation::SF_OrderBy; Uint32 attr3Eq= 44; switch (accessType) { case api_attr : { psop=myTransaction->getNdbIndexScanOperation(mySIndex); if (psop == NULL) APIERROR(myTransaction->getNdbError()); if (psop->readTuples(NdbOperation::LM_Read, scanFlags, (Uint32) 0, // batch (Uint32) 0) != 0) // parallel APIERROR (myTransaction->getNdbError()); if (psop->setBound("ATTR3", NdbIndexScanOperation::BoundEQ, (char*)&attr3Eq)) APIERROR(myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { NdbScanOperation::ScanOptions options; options.optionsPresent= NdbScanOperation::ScanOptions::SO_SCANFLAGS; options.scan_flags=scanFlags; psop=myTransaction->scanIndex(psecondaryIndexRecord, pallColsRecord, // Read all table rows back NdbOperation::LM_Read, NULL, // mask NULL, // bound specified below &options, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); /* Set equality bound via two inclusive bounds */ NdbIndexScanOperation::IndexBound bound; bound.low_key= (char*)&attr3Eq; bound.low_key_count= 1; bound.low_inclusive= true; bound.high_key= (char*)&attr3Eq; bound.high_key_count= 1; bound.high_inclusive= true; bound.range_no= 0; if (psop->setBound(psecondaryIndexRecord, bound)) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); // Check rc anyway if (myTransaction->getNdbError().status != NdbError::Success) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { int res; while ((res= psop->nextResult(true)) == GOT_ROW) { printf(" %2d%2d%2d\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value()); } if (res != NO_MORE_ROWS) APIERROR(psop->getNdbError()); psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, // fetch false)) // forceSend == GOT_ROW) { printf(" %2d%2d%2d\n", prowData->attr1, prowData->attr2, prowData->attr3); } if (rc != NO_MORE_ROWS) APIERROR(myTransaction->getNdbError()); psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /********************** * Interpreted update * **********************/ static void do_interpreted_update(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); const NdbDictionary::Index *myPIndex= myDict->getIndex("PRIMARY", "api_recattr_vs_record"); std::cout << "Running do_interpreted_update\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); if (myPIndex == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; NdbRecAttr *recAttrAttr11; NdbRecAttr *recAttrAttr12; NdbRecAttr *recAttrAttr13; RowData rowData; RowData rowData2; /* Register aliases */ const Uint32 R1=1, R2=2, R3=3, R4=4, R5=5, R6=6; switch (accessType) { case api_attr : { NdbOperation *pop; pop=myTransaction->getNdbOperation(myTable); if (pop == NULL) APIERROR(myTransaction->getNdbError()); if (pop->interpretedUpdateTuple()) APIERROR (pop->getNdbError()); /* Interpreted update on row where ATTR1 == 4 */ if (pop->equal("ATTR1", 4) != 0) APIERROR (pop->getNdbError()); /* First, read the values of all attributes in the normal way */ recAttrAttr1=pop->getValue("ATTR1"); recAttrAttr2=pop->getValue("ATTR2"); recAttrAttr3=pop->getValue("ATTR3"); /* Now define interpreted program which will run after the * values have been read * This program is rather tortuous and doesn't achieve much other * than demonstrating control flow, register and some column operations */ // R5= 3 if (pop->load_const_u32(R5, 3) != 0) APIERROR (pop->getNdbError()); // R1= *ATTR1; R2= *ATTR2; R3= *ATTR3 if (pop->read_attr("ATTR1", R1) != 0) APIERROR (pop->getNdbError()); if (pop->read_attr("ATTR2", R2) != 0) APIERROR (pop->getNdbError()); if (pop->read_attr("ATTR3", R3) != 0) APIERROR (pop->getNdbError()); // R3= R3-R5 if (pop->sub_reg(R3, R5, R3) != 0) APIERROR (pop->getNdbError()); // R2= R1+R2 if (pop->add_reg(R1, R2, R2) != 0) APIERROR (pop->getNdbError()); // *ATTR2= R2 if (pop->write_attr("ATTR2", R2) != 0) APIERROR (pop->getNdbError()); // *ATTR3= R3 if (pop->write_attr("ATTR3", R3) != 0) APIERROR (pop->getNdbError()); // *ATTR3 = *ATTR3 - 30 if (pop->subValue("ATTR3", (Uint32)30) != 0) APIERROR (pop->getNdbError()); Uint32 comparisonValue= 10; // if *ATTR3 > comparisonValue, goto Label 0 if (pop->branch_col_lt(pattr3Col->getColumnNo(), &comparisonValue, sizeof(Uint32), false, 0) != 0) APIERROR (pop->getNdbError()); // assert(false) // Fail the operation with error 627 if we get here. if (pop->interpret_exit_nok(627) != 0) APIERROR (pop->getNdbError()); // Label 0 if (pop->def_label(0) != 0) APIERROR (pop->getNdbError()); Uint32 comparisonValue2= 344; // if *ATTR2 == comparisonValue, goto Label 1 if (pop->branch_col_eq(pattr2Col->getColumnNo(), &comparisonValue2, sizeof(Uint32), false, 1) != 0) APIERROR (pop->getNdbError()); // assert(false) // Fail the operation with error 628 if we get here if (pop->interpret_exit_nok(628) != 0) APIERROR (pop->getNdbError()); // Label 1 if (pop->def_label(1) != 1) APIERROR (pop->getNdbError()); // Optional infinite loop // if (pop->branch_label(0) != 0) // APIERROR (pop->getNdbError()); // R1 = 10 if (pop->load_const_u32(R1, 10) != 0) APIERROR (pop->getNdbError()); // R3 = 2 if (pop->load_const_u32(R3, 2) != 0) APIERROR (pop->getNdbError()); // Now call subroutine 0 if (pop->call_sub(0) != 0) APIERROR (pop->getNdbError()); // *ATTR2= R2 if (pop->write_attr("ATTR2", R2) != 0) APIERROR (pop->getNdbError()); // Return ok, we'll move onto an update. if (pop->interpret_exit_ok() != 0) APIERROR (pop->getNdbError()); /* Define a final read of the columns after the update */ recAttrAttr11= pop->getValue("ATTR1"); recAttrAttr12= pop->getValue("ATTR2"); recAttrAttr13= pop->getValue("ATTR3"); // Define any subroutines called by the 'main' program Subroutine 0 if (pop->def_subroutine(0) != 0) APIERROR (pop->getNdbError()); // R4= 1 if (pop->load_const_u32(R4, 1) != 0) APIERROR (pop->getNdbError()); // Label 2 if (pop->def_label(2) != 2) APIERROR (pop->getNdbError()); // R3= R3-R4 if (pop->sub_reg(R3, R4, R3) != 0) APIERROR (pop->getNdbError()); // R2= R2 + R1 if (pop->add_reg(R2, R1, R2) != 0) APIERROR (pop->getNdbError()); // Optional infinite loop // if (pop->branch_label(2) != 0) // APIERROR (pop->getNdbError()); // Loop, subtracting 1 from R4 until R4 < 1 if (pop->branch_ge(R4, R3, 2) != 0) APIERROR (pop->getNdbError()); // Jump to label 3 if (pop->branch_label(3) != 0) APIERROR (pop->getNdbError()); // assert(false) // Fail operation with error 629 if (pop->interpret_exit_nok(629) != 0) APIERROR (pop->getNdbError()); // Label 3 if (pop->def_label(3) != 3) APIERROR (pop->getNdbError()); // Nested subroutine call to sub 2 if (pop->call_sub(2) != 0) APIERROR (pop->getNdbError()); // Return from subroutine 0 if (pop->ret_sub() !=0) APIERROR (pop->getNdbError()); // Subroutine 1 if (pop->def_subroutine(1) != 1) APIERROR (pop->getNdbError()); // R6= R1+R2 if (pop->add_reg(R1, R2, R6) != 0) APIERROR (pop->getNdbError()); // Return from subrouine 1 if (pop->ret_sub() !=0) APIERROR (pop->getNdbError()); // Subroutine 2 if (pop->def_subroutine(2) != 2) APIERROR (pop->getNdbError()); // Call backward to subroutine 1 if (pop->call_sub(1) != 0) APIERROR (pop->getNdbError()); // Return from subroutine 2 if (pop->ret_sub() !=0) APIERROR (pop->getNdbError()); break; } case api_record : { const NdbOperation *pop; rowData.attr1= 4; /* NdbRecord does not support an updateTuple pre-read or post-read, so * we use separate operations for these. * Note that this assumes that a operations are executed in * the order they are defined by NDBAPI, which is not guaranteed.To * ensure execution order, the application should perform a NoCommit * execute between operations. */ const NdbOperation *op0= myTransaction->readTuple(pkeyColumnRecord, (char*) &rowData, pallColsRecord, (char*) &rowData); if (op0 == NULL) APIERROR (myTransaction->getNdbError()); /* Allocate some space to define an Interpreted program */ const Uint32 numWords= 64; Uint32 space[numWords]; NdbInterpretedCode stackCode(myTable, &space[0], numWords); NdbInterpretedCode *code= &stackCode; /* Similar program as above, with tortuous control flow and little * purpose.Note that for NdbInterpretedCode, some instruction * arguments are in different orders */ // R5= 3 if (code->load_const_u32(R5, 3) != 0) APIERROR(code->getNdbError()); // R1= *ATTR1; R2= *ATTR2; R3= *ATTR3 if (code->read_attr(R1, pattr1Col) != 0) APIERROR (code->getNdbError()); if (code->read_attr(R2, pattr2Col) != 0) APIERROR (code->getNdbError()); if (code->read_attr(R3, pattr3Col) != 0) APIERROR (code->getNdbError()); // R3= R3-R5 if (code->sub_reg(R3, R3, R5) != 0) APIERROR (code->getNdbError()); // R2= R1+R2 if (code->add_reg(R2, R1, R2) != 0) APIERROR (code->getNdbError()); // *ATTR2= R2 if (code->write_attr(pattr2Col, R2) != 0) APIERROR (code->getNdbError()); // *ATTR3= R3 if (code->write_attr(pattr3Col, R3) != 0) APIERROR (code->getNdbError()); // *ATTR3 = *ATTR3 - 30 if (code->sub_val(pattr3Col->getColumnNo(), (Uint32)30) != 0) APIERROR (code->getNdbError()); Uint32 comparisonValue= 10; // if comparisonValue < *ATTR3, goto Label 0 if (code->branch_col_lt(&comparisonValue, sizeof(Uint32), pattr3Col->getColumnNo(), 0) != 0) APIERROR (code->getNdbError()); // assert(false) // Fail operation with error 627 if (code->interpret_exit_nok(627) != 0) APIERROR (code->getNdbError()); // Label 0 if (code->def_label(0) != 0) APIERROR (code->getNdbError()); Uint32 comparisonValue2= 344; // if *ATTR2 == comparisonValue, goto Label 1 if (code->branch_col_eq(&comparisonValue2, sizeof(Uint32), pattr2Col->getColumnNo(), 1) != 0) APIERROR (code->getNdbError()); // assert(false) // Fail operation with error 628 if (code->interpret_exit_nok(628) != 0) APIERROR (code->getNdbError()); // Label 1 if (code->def_label(1) != 0) APIERROR (code->getNdbError()); // R1= 10 if (code->load_const_u32(R1, 10) != 0) APIERROR (code->getNdbError()); // R3= 2 if (code->load_const_u32(R3, 2) != 0) APIERROR (code->getNdbError()); // Call subroutine 0 to effect // R2 = R2 + (R1*R3) if (code->call_sub(0) != 0) APIERROR (code->getNdbError()); // *ATTR2= R2 if (code->write_attr(pattr2Col, R2) != 0) APIERROR (code->getNdbError()); // Return ok if (code->interpret_exit_ok() != 0) APIERROR (code->getNdbError()); // Subroutine 0 if (code->def_sub(0) != 0) APIERROR (code->getNdbError()); // R4= 1 if (code->load_const_u32(R4, 1) != 0) APIERROR (code->getNdbError()); // Label 2 if (code->def_label(2) != 0) APIERROR (code->getNdbError()); // R3= R3-R4 if (code->sub_reg(R3, R3, R4) != 0) APIERROR (code->getNdbError()); // R2= R2+R1 if (code->add_reg(R2, R2, R1) != 0) APIERROR (code->getNdbError()); // Loop, subtracting 1 from R4 until R4>1 if (code->branch_ge(R3, R4, 2) != 0) APIERROR (code->getNdbError()); // Jump to label 3 if (code->branch_label(3) != 0) APIERROR (code->getNdbError()); // Fail operation with error 629 if (code->interpret_exit_nok(629) != 0) APIERROR (code->getNdbError()); // Label 3 if (code->def_label(3) != 0) APIERROR (code->getNdbError()); // Call sub 2 if (code->call_sub(2) != 0) APIERROR (code->getNdbError()); // Return from sub 0 if (code->ret_sub() != 0) APIERROR (code->getNdbError()); // Subroutine 1 if (code->def_sub(1) != 0) APIERROR (code->getNdbError()); // R6= R1+R2 if (code->add_reg(R6, R1, R2) != 0) APIERROR (code->getNdbError()); // Return from subroutine 1 if (code->ret_sub() !=0) APIERROR (code->getNdbError()); // Subroutine 2 if (code->def_sub(2) != 0) APIERROR (code->getNdbError()); // Call backward to subroutine 1 if (code->call_sub(1) != 0) APIERROR (code->getNdbError()); // Return from subroutine 2 if (code->ret_sub() !=0) APIERROR (code->getNdbError()); /* Finalise code object * This step is essential for NdbInterpretedCode objects * and must be done before they can be used. */ if (code->finalise() !=0) APIERROR (code->getNdbError()); /* Time to define the update operation to use the * InterpretedCode object.The same finalised object * could be used with multiple operations or even multiple threads */ NdbOperation::OperationOptions oo; oo.optionsPresent= NdbOperation::OperationOptions::OO_INTERPRETED; oo.interpretedCode= code; unsigned char mask= 0; pop= myTransaction->updateTuple(pkeyColumnRecord, (char*) &rowData, pallColsRecord, (char*) &rowData, (const unsigned char *) &mask, // mask - update nothing &oo, sizeof(NdbOperation::OperationOptions)); if (pop == NULL) APIERROR (myTransaction->getNdbError()); // NoCommit execute so we can read the 'after' data. if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); /* Second read op as we can't currently do a 'read after * 'interpreted code' read as part of NdbRecord. * We are assuming that the order of op definition == order * of execution on a single row, which is not guaranteed. */ const NdbOperation *pop2= myTransaction->readTuple(pkeyColumnRecord, (char*) &rowData, pallColsRecord, (char*) &rowData2); if (pop2 == NULL) APIERROR (myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); // Check return code if (myTransaction->getNdbError().status != NdbError::Success) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { printf(" %2d%2d%2dBefore\n" " %2d%2d%2dAfter\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value(), recAttrAttr11->u_32_value(), recAttrAttr12->u_32_value(), recAttrAttr13->u_32_value()); break; } case api_record : { printf(" %2d%2d%2dBefore\n" " %2d%2d%2dAfter\n", rowData.attr1, rowData.attr2, rowData.attr3, rowData2.attr1, rowData2.attr2, rowData2.attr3); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::Commit) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /****************************************************** * Read and print selected rows with interpreted code * ******************************************************/ static void do_interpreted_scan(Ndb &myNdb, ApiType accessType) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); std::cout << "Running do_interpreted_scan\n"; if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; NdbTransaction *myTransaction=myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); NdbScanOperation *psop; NdbRecAttr *recAttrAttr1; NdbRecAttr *recAttrAttr2; NdbRecAttr *recAttrAttr3; /* Create some space on the stack for the program */ const Uint32 numWords= 64; Uint32 space[numWords]; NdbInterpretedCode stackCode(myTable, &space[0], numWords); NdbInterpretedCode *code= &stackCode; /* RecAttr and NdbRecord scans both use NdbInterpretedCode * Let's define a small scan filter of sorts */ Uint32 comparisonValue= 10; // Return rows where 10 > ATTR3 (ATTR3 <10) if (code->branch_col_gt(&comparisonValue, sizeof(Uint32), pattr3Col->getColumnNo(), 0) != 0) APIERROR (myTransaction->getNdbError()); /* If we get here then we don't return this row */ if (code->interpret_exit_nok() != 0) APIERROR (myTransaction->getNdbError()); /* Label 0 */ if (code->def_label(0) != 0) APIERROR (myTransaction->getNdbError()); /* Return this row */ if (code->interpret_exit_ok() != 0) APIERROR (myTransaction->getNdbError()); /* Finalise the Interpreted Program */ if (code->finalise() != 0) APIERROR (myTransaction->getNdbError()); switch (accessType) { case api_attr : { psop=myTransaction->getNdbScanOperation(myTable); if (psop == NULL) APIERROR(myTransaction->getNdbError()); if (psop->readTuples(NdbOperation::LM_Read) != 0) APIERROR (myTransaction->getNdbError()); if (psop->setInterpretedCode(code) != 0) APIERROR (myTransaction->getNdbError()); recAttrAttr1=psop->getValue("ATTR1"); recAttrAttr2=psop->getValue("ATTR2"); recAttrAttr3=psop->getValue("ATTR3"); break; } case api_record : { NdbScanOperation::ScanOptions so; so.optionsPresent = NdbScanOperation::ScanOptions::SO_INTERPRETED; so.interpretedCode= code; psop=myTransaction->scanTable(pallColsRecord, NdbOperation::LM_Read, NULL, // mask &so, sizeof(NdbScanOperation::ScanOptions)); if (psop == NULL) APIERROR(myTransaction->getNdbError()); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute(NdbTransaction::NoCommit) != 0) APIERROR(myTransaction->getNdbError()); switch (accessType) { case api_attr : { while (psop->nextResult(true) == 0) { printf(" %2d%2d%2d\n", recAttrAttr1->u_32_value(), recAttrAttr2->u_32_value(), recAttrAttr3->u_32_value()); } psop->close(); break; } case api_record : { RowData *prowData; // Ptr to point to our data int rc=0; while ((rc = psop->nextResult((const char**) &prowData, true, false)) == GOT_ROW) { printf(" %2d%2d%2d\n", prowData->attr1, prowData->attr2, prowData->attr3); } if (rc != NO_MORE_ROWS)APIERROR(myTransaction->getNdbError()); psop->close(true); break; } default : { std::cout << "Bad branch : " << accessType << "\n"; exit(-1); } } if (myTransaction->execute( NdbTransaction::Commit ) !=0) APIERROR(myTransaction->getNdbError()); myNdb.closeTransaction(myTransaction); std::cout << "-------\n"; } /****************************************************** * Read some data using the default NdbRecord objects * ******************************************************/ static void do_read_using_default(Ndb &myNdb) { NdbDictionary::Dictionary* myDict= myNdb.getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_recattr_vs_record"); const NdbRecord* tableRec= myTable->getDefaultRecord(); if (myTable == NULL) APIERROR(myDict->getNdbError()); std::cout << "Running do_read_using_default_record (NdbRecord only)\n"; std::cout << "ATTR1 ATTR2 ATTR3" << std::endl; /* Allocate some space for the rows to be read into */ char* buffer= (char*)malloc(NdbDictionary::getRecordRowLength(tableRec)); if (buffer== NULL) { printf("Allocation failed\n"); exit(-1); } for (int i = 0; i < 10; i++) { NdbTransaction *myTransaction= myNdb.startTransaction(); if (myTransaction == NULL) APIERROR(myNdb.getNdbError()); char* attr1= NdbDictionary::getValuePtr(tableRec, buffer, attr1ColNum); *((unsigned int*)attr1)= i; const NdbOperation *pop= myTransaction->readTuple(tableRec, buffer, tableRec, // Read everything buffer); if (pop==NULL) APIERROR(myTransaction->getNdbError()); if (myTransaction->execute(NdbTransaction::Commit) == -1) APIERROR(myTransaction->getNdbError()); NdbError err= myTransaction->getNdbError(); if (err.code != 0) { if (err.classification == NdbError::NoDataFound) std::cout << "Tuple " << i << " does not exist." << std::endl; else APIERROR(myTransaction->getNdbError()); } else { printf(" %2d%2d%2d\n", i, *((unsigned int*) NdbDictionary::getValuePtr(tableRec, buffer, attr2ColNum)), *((unsigned int*) NdbDictionary::getValuePtr(tableRec, buffer, attr3ColNum))); } myNdb.closeTransaction(myTransaction); } free(buffer); std::cout << "-------\n"; }
Этот пример демонстрирует обработку событий API NDB.
Исходный код для этой программы может быть найден в дереве
исходных текстов NDB Cluster в файле
storage/ndb/ndbapi-examples/ndbapi_event/ndbapi_event.cpp
.
#include <NdbApi.hpp> // Used for cout #include <stdio.h> #include <iostream> #include <unistd.h> #ifdef VM_TRACE #include <my_global.h> #endif #ifndef assert #include <assert.h> #endif /** * Assume that there is a table which is being updated by * another process (e.g. flexBench -l 0 -stdtables). * We want to monitor what happens with column values. * * Or using the mysql client: * * shell> mysql -u root * mysql> create database ndb_examples; * mysql> use ndb_examples; * mysql> create table t0 * (c0 int, c1 int, c2 char(4), c3 char(4), c4 text, * primary key(c0, c2)) engine ndb charset latin1; * * In another window start ndbapi_event, wait until properly started insert into t0 values (1, 2, 'a', 'b', null); insert into t0 values (3, 4, 'c', 'd', null); update t0 set c3 = 'e' where c0 = 1 and c2 = 'a'; -- use pk update t0 set c3 = 'f'; -- use scan update t0 set c3 = 'F'; -- use scan update to 'same' update t0 set c2 = 'g' where c0 = 1; -- update pk part update t0 set c2 = 'G' where c0 = 1; -- update pk part to 'same' update t0 set c0 = 5, c2 = 'H' where c0 = 3; -- update full PK delete from t0; insert ...; update ...; -- see events w/ same pk merged (if -m option) delete ...; insert ...; -- there are 5 combinations ID IU DI UD UU update ...; update ...; -- text requires -m flag set @a = repeat('a',256); -- inline size set @b = repeat('b',2000); -- part size set @c = repeat('c',2000*30); -- 30 parts -- update the text field using combinations of @a, @b, @c ... * you should see the data popping up in the example window * */ #define APIERROR(error) \ { std::cout << "Error in " << __FILE__ << ", line:" << __LINE__ << ", code:" \ << error.code << ", msg: " << error.message << "." << std::endl; \ exit(-1); } int myCreateEvent(Ndb* myNdb, const char *eventName, const char *eventTableName, const char **eventColumnName, const int noEventColumnName, bool merge_events); int main(int argc, char** argv) { if (argc < 3) { std::cout << "Arguments are <connect_string cluster> <timeout> [m(merge events)|d(debug)].\n"; exit(-1); } const char *connection_string = argv[1]; int timeout = atoi(argv[2]); ndb_init(); bool merge_events = argc > 3 && strchr(argv[3], 'm') != 0; #ifdef VM_TRACE bool dbug = argc > 3 && strchr(argv[3], 'd') != 0; if (dbug) DBUG_PUSH("d:t:"); if (dbug) putenv("API_SIGNAL_LOG=-"); #endif Ndb_cluster_connection *cluster_connection= new Ndb_cluster_connection(connection_string); // Object representing the cluster int r= cluster_connection->connect(5 /* retries */, 3 /* delay between retries */, 1 /* verbose */); if (r > 0) { std::cout << "Cluster connect failed, possibly resolved with more retries.\n"; exit(-1); } else if (r < 0) { std::cout << "Cluster connect failed.\n"; exit(-1); } if (cluster_connection->wait_until_ready(30,30)) { std::cout << "Cluster was not ready within 30 secs." << std::endl; exit(-1); } Ndb* myNdb= new Ndb(cluster_connection, "ndb_examples"); // Object representing the database if (myNdb->init() == -1) APIERROR(myNdb->getNdbError()); const char *eventName= "CHNG_IN_t0"; const char *eventTableName= "t0"; const int noEventColumnName= 5; const char *eventColumnName[noEventColumnName]= {"c0", "c1", "c2", "c3", "c4"}; // Create events myCreateEvent(myNdb, eventName, eventTableName, eventColumnName, noEventColumnName, merge_events); // Normal values and blobs are unfortunately handled differently.. typedef union {NdbRecAttr* ra; NdbBlob* bh;} RA_BH; int i, j, k, l; j = 0; while (j < timeout) { // Start "transaction" for handling events NdbEventOperation* op; printf("create EventOperation\n"); if ((op = myNdb->createEventOperation(eventName)) == NULL) APIERROR(myNdb->getNdbError()); op->mergeEvents(merge_events); printf("get values\n"); RA_BH recAttr[noEventColumnName]; RA_BH recAttrPre[noEventColumnName]; // primary keys should always be a part of the result for (i = 0; i < noEventColumnName; i++) { if (i < 4) { recAttr[i].ra= op->getValue(eventColumnName[i]); recAttrPre[i].ra = op->getPreValue(eventColumnName[i]); } else if (merge_events) { recAttr[i].bh= op->getBlobHandle(eventColumnName[i]); recAttrPre[i].bh = op->getPreBlobHandle(eventColumnName[i]); } } // set up the callbacks printf("execute\n"); // This starts changes to "start flowing" if (op->execute()) APIERROR(op->getNdbError()); NdbEventOperation* the_op = op; i= 0; while (i < timeout) { // printf("now waiting for event...\n"); int r = myNdb->pollEvents(1000); // wait for event or 1000 ms if (r > 0) { // printf("got data! %d\n", r); while ((op= myNdb->nextEvent())) { assert(the_op == op); i++; switch (op->getEventType()) { case NdbDictionary::Event::TE_INSERT: printf("%u INSERT", i); break; case NdbDictionary::Event::TE_DELETE: printf("%u DELETE", i); break; case NdbDictionary::Event::TE_UPDATE: printf("%u UPDATE", i); break; default: abort(); // should not happen } printf(" gci=%d\n", (int)op->getGCI()); for (k = 0; k <= 1; k++) { printf(k == 0 ? "post: " : "pre : "); for (l = 0; l < noEventColumnName; l++) { if (l < 4) { NdbRecAttr* ra = k == 0 ? recAttr[l].ra : recAttrPre[l].ra; if (ra->isNULL() >= 0) { // we have a value if (ra->isNULL() == 0) { // we have a non-null value if (l < 2) printf("%-5u", ra->u_32_value()); else printf("%-5.4s", ra->aRef()); } else printf("%-5s", "NULL"); } else printf("%-5s", "-"); // no value } else if (merge_events) { int isNull; NdbBlob* bh = k == 0 ? recAttr[l].bh : recAttrPre[l].bh; bh->getDefined(isNull); if (isNull >= 0) { // we have a value if (! isNull) { // we have a non-null value Uint64 length = 0; bh->getLength(length); // read into buffer unsigned char* buf = new unsigned char [length]; memset(buf, 'X', length); Uint32 n = length; bh->readData(buf, n); // n is in/out assert(n == length); // pretty-print bool first = true; Uint32 i = 0; while (i < n) { unsigned char c = buf[i++]; Uint32 m = 1; while (i < n && buf[i] == c) i++, m++; if (! first) printf("+"); printf("%u%c", m, c); first = false; } printf("[%u]", n); delete [] buf; } else printf("%-5s", "NULL"); } else printf("%-5s", "-"); // no value } } printf("\n"); } } } // else printf("timed out (%i)\n", timeout); } // don't want to listen to events anymore if (myNdb->dropEventOperation(the_op)) APIERROR(myNdb->getNdbError()); the_op = 0; j++; } { NdbDictionary::Dictionary *myDict = myNdb->getDictionary(); if (!myDict) APIERROR(myNdb->getNdbError()); // remove event from database if (myDict->dropEvent(eventName)) APIERROR(myDict->getNdbError()); } delete myNdb; delete cluster_connection; ndb_end(0); return 0; } int myCreateEvent(Ndb* myNdb, const char *eventName, const char *eventTableName, const char **eventColumnNames, const int noEventColumnNames, bool merge_events) { NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); if (!myDict) APIERROR(myNdb->getNdbError()); const NdbDictionary::Table *table= myDict->getTable(eventTableName); if (!table) APIERROR(myDict->getNdbError()); NdbDictionary::Event myEvent(eventName, *table); myEvent.addTableEvent(NdbDictionary::Event::TE_ALL); //myEvent.addTableEvent(NdbDictionary::Event::TE_INSERT); //myEvent.addTableEvent(NdbDictionary::Event::TE_UPDATE); //myEvent.addTableEvent(NdbDictionary::Event::TE_DELETE); myEvent.addEventColumns(noEventColumnNames, eventColumnNames); myEvent.mergeEvents(merge_events); // Add event to database if (myDict->createEvent(myEvent) == 0) myEvent.print(); else if (myDict->getNdbError().classification == NdbError::SchemaObjectExists) { printf("Event creation failed, event exists\n"); printf("dropping Event...\n"); if (myDict->dropEvent(eventName)) APIERROR(myDict->getNdbError()); // try again // Add event to database if ( myDict->createEvent(myEvent)) APIERROR(myDict->getNdbError()); } else APIERROR(myDict->getNdbError()); return 0; }
Этот пример иллюстрирует манипуляцию столбцом
BLOB
в NDB
API.
Это демонстрирует, как выполнить вставку, чтение и обновление, используя
действующие буфера значений, а также методы чтения и записи.
Исходный код может быть найден в файле
storage/ndb/ndbapi-examples/ndbapi_blob/ndbapi_blob.cpp
в дереве исходных текстов NDB Cluster.
В то время как тип данных MySQL, используемый в примере, на самом деле
TEXT
, те же самые принципы применяются.
/* ndbapi_blob.cpp: Illustrates the manipulation of BLOB (actually TEXT in this example). Shows insert, read, and update, using both inline value buffer and read/write methods. */ #ifdef _WIN32 #include <winsock2.h> #endif #include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> #include <stdlib.h> #include <string.h> /* Used for cout. */ #include <iostream> #include <stdio.h> #include <ctype.h> /** * Helper debugging macros */ #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } /* Quote taken from Project Gutenberg. */ const char *text_quote= "Just at this moment, somehow or other, they began to run.\n" "\n" "Alice never could quite make out, in thinking it over\n" "afterwards, how it was that they began:all she remembers is,\n" "that they were running hand in hand, and the Queen went so fast\n" "that it was all she could do to keep up with her:and still the\n" "Queen kept crying 'Faster! Faster!' but Alice felt she COULD NOT\n" "go faster, though she had not breath left to say so.\n" "\n" "The most curious part of the thing was, that the trees and the\n" "other things round them never changed their places at all:\n" "however fast they went, they never seemed to pass anything.'I\n" "wonder if all the things move along with us?' thought poor\n" "puzzled Alice.And the Queen seemed to guess her thoughts, for\n" "she cried, 'Faster!Don't try to talk!'\n" "\n" "Not that Alice had any idea of doing THAT.She felt as if she\n" "would never be able to talk again, she was getting so much out of\n" "breath:and still the Queen cried 'Faster! Faster!' and dragged\n" "her along.'Are we nearly there?'Alice managed to pant out at\n last.\n" "\n" "'Nearly there!' the Queen repeated.'Why, we passed it ten\n" "minutes ago!Faster!'And they ran on for a time in silence,\n" "with the wind whistling in Alice's ears, and almost blowing her\n" "hair off her head, she fancied.\n" "\n" "'Now!Now!' cried the Queen.'Faster!Faster!'And they\n" "went so fast that at last they seemed to skim through the air,\n" "hardly touching the ground with their feet, till suddenly, just\n" "as Alice was getting quite exhausted, they stopped, and she found\n" "herself sitting on the ground, breathless and giddy.\n" "\n" "The Queen propped her up against a tree, and said kindly, 'You\n" "may rest a little now.'\n" "\n" "Alice looked round her in great surprise.'Why, I do believe\n" "we've been under this tree the whole time!Everything's just as\n" "it was!'\n" "\n" "'Of course it is,' said the Queen, 'what would you have it?'\n" "\n" "'Well, in OUR country,' said Alice, still panting a little,\n" "'you'd generally get to somewhere else--if you ran very fast\n" "for a long time, as we've been doing.'\n" "\n" "'A slow sort of country!' said the Queen.'Now, HERE, you see,\n" "it takes all the running YOU can do, to keep in the same place.\n" "If you want to get somewhere else, you must run at least twice as\n" "fast as that!'\n" "\n" "'I'd rather not try, please!' said Alice.'I'm quite content\n" "to stay here--only I AM so hot and thirsty!'\n" "\n" " -- Lewis Carroll, 'Through the Looking-Glass'."; /* Function to drop table. */ void drop_table(MYSQL &mysql) { if (mysql_query(&mysql, "DROP TABLE api_blob")) MYSQLERROR(mysql); } /* Functions to create table. */ int try_create_table(MYSQL &mysql) { return mysql_query(&mysql, "CREATE TABLE" "api_blob" "(my_id INT UNSIGNED NOT NULL," " my_text TEXT NOT NULL," " PRIMARY KEY USING HASH (my_id))" "ENGINE=NDB"); } void create_table(MYSQL &mysql) { if (try_create_table(mysql)) { if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR) MYSQLERROR(mysql); std::cout << "NDB Cluster already has example table: api_blob. " << "Dropping it..." << std::endl; /****************** * Recreate table * ******************/ drop_table(mysql); if (try_create_table(mysql)) MYSQLERROR(mysql); } } int populate(Ndb *myNdb) { const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myNdbOperation= myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->insertTuple(); myNdbOperation->equal("my_id", 1); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); myBlobHandle->setValue(text_quote, strlen(text_quote)); int check= myTrans->execute(NdbTransaction::Commit); myTrans->close(); return check != -1; } int update_key(Ndb *myNdb) { /* Uppercase all characters in TEXT field, using primary key operation. Use piece-wise read/write to avoid loading entire data into memory at once. */ const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myNdbOperation= myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->updateTuple(); myNdbOperation->equal("my_id", 1); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); /* Execute NoCommit to make the blob handle active. */ if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); Uint64 length= 0; if (-1 == myBlobHandle->getLength(length)) APIERROR(myBlobHandle->getNdbError()); /* A real application should use a much larger chunk size for efficiency, preferably much larger than the part size, which defaults to 2000. 64000 might be a good value. */ #define CHUNK_SIZE 100 int chunk; char buffer[CHUNK_SIZE]; for (chunk= (length-1)/CHUNK_SIZE; chunk >=0; chunk--) { Uint64 pos= chunk*CHUNK_SIZE; Uint32 chunk_length= CHUNK_SIZE; if (pos + chunk_length > length) chunk_length= length - pos; /* Read from the end back, to illustrate seeking. */ if (-1 == myBlobHandle->setPos(pos)) APIERROR(myBlobHandle->getNdbError()); if (-1 == myBlobHandle->readData(buffer, chunk_length)) APIERROR(myBlobHandle->getNdbError()); int res= myTrans->execute(NdbTransaction::NoCommit); if (-1 == res) APIERROR(myTrans->getNdbError()); /* Uppercase everything. */ for (Uint64 j= 0; j < chunk_length; j++) buffer[j]= toupper(buffer[j]); if (-1 == myBlobHandle->setPos(pos)) APIERROR(myBlobHandle->getNdbError()); if (-1 == myBlobHandle->writeData(buffer, chunk_length)) APIERROR(myBlobHandle->getNdbError()); /* Commit on the final update. */ if (-1 == myTrans->execute(chunk ? NdbTransaction::NoCommit : NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); } myNdb->closeTransaction(myTrans); return 1; } int update_scan(Ndb *myNdb) { /* Lowercase all characters in TEXT field, using a scan with updateCurrentTuple(). */ char buffer[10000]; const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbScanOperation *myScanOp= myTrans->getNdbScanOperation(myTable); if (myScanOp == NULL) APIERROR(myTrans->getNdbError()); myScanOp->readTuples(NdbOperation::LM_Exclusive); NdbBlob *myBlobHandle= myScanOp->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myScanOp->getNdbError()); if (myBlobHandle->getValue(buffer, sizeof(buffer))) APIERROR(myBlobHandle->getNdbError()); /* Start the scan. */ if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); int res; for (;;) { res= myScanOp-> nextResult(true); if (res==1) break; // Scan done. else if (res) APIERROR(myScanOp->getNdbError()); Uint64 length= 0; if (myBlobHandle->getLength(length) == -1) APIERROR(myBlobHandle->getNdbError()); /* Lowercase everything. */ for (Uint64 j= 0; j < length; j++) buffer[j]= tolower(buffer[j]); NdbOperation *myUpdateOp= myScanOp->updateCurrentTuple(); if (myUpdateOp == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle2= myUpdateOp->getBlobHandle("my_text"); if (myBlobHandle2 == NULL) APIERROR(myUpdateOp->getNdbError()); if (myBlobHandle2->setValue(buffer, length)) APIERROR(myBlobHandle2->getNdbError()); if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); } if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } struct ActiveHookData {char buffer[10000]; Uint32 readLength;}; int myFetchHook(NdbBlob* myBlobHandle, void* arg) { ActiveHookData *ahd= (ActiveHookData *)arg; ahd->readLength= sizeof(ahd->buffer) - 1; return myBlobHandle->readData(ahd->buffer, ahd->readLength); } int fetch_key(Ndb *myNdb) { /* Fetch and show the blob field, using setActiveHook(). */ const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myNdbOperation= myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->readTuple(); myNdbOperation->equal("my_id", 1); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); struct ActiveHookData ahd; if (myBlobHandle->setActiveHook(myFetchHook, &ahd) == -1) APIERROR(myBlobHandle->getNdbError()); /* Execute Commit, but calling our callback set up in setActiveHook() before actually committing. */ if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); /* Our fetch callback will have been called during the execute(). */ ahd.buffer[ahd.readLength]= '\0'; std::cout << "Fetched data:" << std::endl << ahd.buffer << std::endl; return 1; } int update2_key(Ndb *myNdb) { char buffer[10000]; /* Simple setValue() update. */ const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myNdbOperation= myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->updateTuple(); myNdbOperation->equal("my_id", 1); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); memset(buffer, ' ', sizeof(buffer)); if (myBlobHandle->setValue(buffer, sizeof(buffer)) == -1) APIERROR(myBlobHandle->getNdbError()); if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } int delete_key(Ndb *myNdb) { /* Deletion of blob row. */ const NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob"); if (myTable == NULL) APIERROR(myDict->getNdbError()); NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbOperation *myNdbOperation= myTrans->getNdbOperation(myTable); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); myNdbOperation->deleteTuple(); myNdbOperation->equal("my_id", 1); if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } void mysql_connect_and_create(const char *socket) { MYSQL mysql; bool ok; mysql_init(&mysql); ok = mysql_real_connect(&mysql, "localhost", "root", "", "", 0, socket, 0); if (ok) { mysql_query(&mysql, "CREATE DATABASE ndb_examples"); ok = ! mysql_select_db(&mysql, "ndb_examples"); } if (ok) { create_table(mysql); } mysql_close(&mysql); if (! ok) MYSQLERROR(mysql); } void ndb_run_blob_operations(const char *connectstring) { /* Connect to ndb cluster. */ Ndb_cluster_connection cluster_connection(connectstring); if (cluster_connection.connect(4, 5, 1)) { std::cout << "Unable to connect to cluster within 30 secs." << std::endl; exit(-1); } /* Optionally connect and wait for the storage nodes (ndbd's). */ if (cluster_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } Ndb myNdb(&cluster_connection,"ndb_examples"); if (myNdb.init(1024) == -1) { // Set max 1024 parallel transactions APIERROR(myNdb.getNdbError()); exit(-1); } if (populate(&myNdb) > 0) std::cout << "populate: Success!" << std::endl; if (update_key(&myNdb) > 0) std::cout << "update_key: Success!" << std::endl; if (update_scan(&myNdb) > 0) std::cout << "update_scan: Success!" << std::endl; if (fetch_key(&myNdb) > 0) std::cout << "fetch_key: Success!" << std::endl; if (update2_key(&myNdb) > 0) std::cout << "update2_key: Success!" << std::endl; if (delete_key(&myNdb) > 0) std::cout << "delete_key: Success!" << std::endl; } int main(int argc, char**argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } char *mysqld_sock= argv[1]; const char *connectstring = argv[2]; mysql_connect_and_create(mysqld_sock); ndb_init(); ndb_run_blob_operations(connectstring); ndb_end(0); return 0; }
Этот пример иллюстрирует манипуляцию столбцом
BLOB
в NDB API через интерфейс
NdbRecord
.
Это демонстрирует, как выполнить вставку, чтение и обновление, используя
действующие буфера значений, а также методы чтения и записи. Это может быть
найдено в файле
storage/ndb/ndbapi-examples/ndbapi_blob_ndbrecord/main.cpp
дерева исходных текстов NDB Cluster.
В то время как тип данных MySQL, используемый в примере, на самом деле
TEXT
, те же самые принципы применяются.
/* ndbapi_blob_ndbrecord Illustrates the manipulation of BLOB (actually TEXT in this example). This example uses the NdbRecord style way of accessing tuples. Shows insert, read, and update, using both inline value buffer and read/write methods. */ #ifdef _WIN32 #include <winsock2.h> #endif #include <mysql.h> #include <mysqld_error.h> #include <NdbApi.hpp> /* Used for cout. */ #include <iostream> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <stddef.h> #include <string.h> /** * Helper debugging macros */ #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__ \ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define MYSQLERROR(mysql) { \ PRINT_ERROR(mysql_errno(&mysql),mysql_error(&mysql)); \ exit(-1); } #define APIERROR(error) { \ PRINT_ERROR(error.code,error.message); \ exit(-1); } /* Quote taken from Project Gutenberg. */ const char *text_quote= "Just at this moment, somehow or other, they began to run.\n" "\n" "Alice never could quite make out, in thinking it over\n" "afterwards, how it was that they began:all she remembers is,\n" "that they were running hand in hand, and the Queen went so fast\n" "that it was all she could do to keep up with her:and still the\n" "Queen kept crying 'Faster! Faster!' but Alice felt she COULD NOT\n" "go faster, though she had not breath left to say so.\n" "\n" "The most curious part of the thing was, that the trees and the\n" "other things round them never changed their places at all:\n" "however fast they went, they never seemed to pass anything.'I\n" "wonder if all the things move along with us?' thought poor\n" "puzzled Alice.And the Queen seemed to guess her thoughts, for\n" "she cried, 'Faster!Don't try to talk!'\n" "\n" "Not that Alice had any idea of doing THAT.She felt as if she\n" "would never be able to talk again, she was getting so much out of\n" "breath:and still the Queen cried 'Faster! Faster!' and dragged\n" "her along.'Are we nearly there?'Alice managed to pant out at\n last.\n" "\n" "'Nearly there!' the Queen repeated.'Why, we passed it ten\n" "minutes ago!Faster!'And they ran on for a time in silence,\n" "with the wind whistling in Alice's ears, and almost blowing her\n" "hair off her head, she fancied.\n" "\n" "'Now!Now!' cried the Queen.'Faster!Faster!'And they\n" "went so fast that at last they seemed to skim through the air,\n" "hardly touching the ground with their feet, till suddenly, just\n" "as Alice was getting quite exhausted, they stopped, and she found\n" "herself sitting on the ground, breathless and giddy.\n" "\n" "The Queen propped her up against a tree, and said kindly, 'You\n" "may rest a little now.'\n" "\n" "Alice looked round her in great surprise.'Why, I do believe\n" "we've been under this tree the whole time!Everything's just as\n" "it was!'\n" "\n" "'Of course it is,' said the Queen, 'what would you have it?'\n" "\n" "'Well, in OUR country,' said Alice, still panting a little,\n" "'you'd generally get to somewhere else--if you ran very fast\n" "for a long time, as we've been doing.'\n" "\n" "'A slow sort of country!' said the Queen.'Now, HERE, you see,\n" "it takes all the running YOU can do, to keep in the same place.\n" "If you want to get somewhere else, you must run at least twice as\n" "fast as that!'\n" "\n" "'I'd rather not try, please!' said Alice.'I'm quite content\n" "to stay here--only I AM so hot and thirsty!'\n" "\n" " -- Lewis Carroll, 'Through the Looking-Glass'."; /* NdbRecord objects. */ const NdbRecord *key_record;// For specifying table key const NdbRecord *blob_record; // For accessing blob const NdbRecord *full_record; // All columns, for insert /* C struct representing the row layout */ struct MyRow { unsigned int myId; /* Pointer to Blob handle for operations on the blob column * Space must be left for it in the row, but a pointer to the * blob handle can also be obtained via calls to * NdbOperation::getBlobHandle() */ NdbBlob* myText; }; static void setup_records(Ndb *myNdb) { NdbDictionary::RecordSpecification spec[2]; NdbDictionary::Dictionary *myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_blob_ndbrecord"); if (myTable == NULL) APIERROR(myDict->getNdbError()); const NdbDictionary::Column *col1= myTable->getColumn("my_id"); if (col1 == NULL) APIERROR(myDict->getNdbError()); const NdbDictionary::Column *col2= myTable->getColumn("my_text"); if (col2 == NULL) APIERROR(myDict->getNdbError()); spec[0].column= col1; spec[0].offset= offsetof(MyRow, myId); spec[0].nullbit_byte_offset= 0; spec[0].nullbit_bit_in_byte= 0; spec[1].column= col2; spec[1].offset= offsetof(MyRow, myText); spec[1].nullbit_byte_offset= 0; spec[1].nullbit_bit_in_byte= 0; key_record= myDict->createRecord(myTable, &spec[0], 1, sizeof(spec[0])); if (key_record == NULL) APIERROR(myDict->getNdbError()); blob_record= myDict->createRecord(myTable, &spec[1], 1, sizeof(spec[0])); if (blob_record == NULL) APIERROR(myDict->getNdbError()); full_record= myDict->createRecord(myTable, &spec[0], 2, sizeof(spec[0])); if (full_record == NULL) APIERROR(myDict->getNdbError()); } /* Function to drop table. */ void drop_table(MYSQL &mysql) { if (mysql_query(&mysql, "DROP TABLE api_blob_ndbrecord")) MYSQLERROR(mysql); } /* Functions to create table. */ int try_create_table(MYSQL &mysql) { return mysql_query(&mysql, "CREATE TABLE" "api_blob_ndbrecord" "(my_id INT UNSIGNED NOT NULL," " my_text TEXT NOT NULL," " PRIMARY KEY USING HASH (my_id))" "ENGINE=NDB"); } void create_table(MYSQL &mysql) { if (try_create_table(mysql)) { if (mysql_errno(&mysql) != ER_TABLE_EXISTS_ERROR) MYSQLERROR(mysql); std::cout << "NDB Cluster already has example table: api_blob_ndbrecord. " << "Dropping it..." << std::endl; /****************** * Recreate table * ******************/ drop_table(mysql); if (try_create_table(mysql)) MYSQLERROR(mysql); } } int populate(Ndb *myNdb) { MyRow row; NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); row.myId= 1; const NdbOperation *myNdbOperation= myTrans->insertTuple(full_record, (const char*) &row); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); myBlobHandle->setValue(text_quote, strlen(text_quote)); int check= myTrans->execute(NdbTransaction::Commit); myTrans->close(); return check != -1; } int update_key(Ndb *myNdb) { MyRow row; /* Uppercase all characters in TEXT field, using primary key operation. Use piece-wise read/write to avoid loading entire data into memory at once. */ NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); row.myId= 1; const NdbOperation *myNdbOperation= myTrans->updateTuple(key_record, (const char*) &row, blob_record, (const char*) &row); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); /* Execute NoCommit to make the blob handle active so * that we can determine the actual Blob length */ if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); Uint64 length= 0; if (-1 == myBlobHandle->getLength(length)) APIERROR(myBlobHandle->getNdbError()); /* A real application should use a much larger chunk size for efficiency, preferably much larger than the part size, which defaults to 2000. 64000 might be a good value. */ #define CHUNK_SIZE 100 int chunk; char buffer[CHUNK_SIZE]; for (chunk= (length-1)/CHUNK_SIZE; chunk >=0; chunk--) { Uint64 pos= chunk*CHUNK_SIZE; Uint32 chunk_length= CHUNK_SIZE; if (pos + chunk_length > length) chunk_length= length - pos; /* Read from the end back, to illustrate seeking. */ if (-1 == myBlobHandle->setPos(pos)) APIERROR(myBlobHandle->getNdbError()); if (-1 == myBlobHandle->readData(buffer, chunk_length)) APIERROR(myBlobHandle->getNdbError()); int res= myTrans->execute(NdbTransaction::NoCommit); if (-1 == res) APIERROR(myTrans->getNdbError()); /* Uppercase everything. */ for (Uint64 j= 0; j < chunk_length; j++) buffer[j]= toupper(buffer[j]); if (-1 == myBlobHandle->setPos(pos)) APIERROR(myBlobHandle->getNdbError()); if (-1 == myBlobHandle->writeData(buffer, chunk_length)) APIERROR(myBlobHandle->getNdbError()); /* Commit on the final update. */ if (-1 == myTrans->execute(chunk ? NdbTransaction::NoCommit : NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); } myNdb->closeTransaction(myTrans); return 1; } int update_scan(Ndb *myNdb) { /* Lowercase all characters in TEXT field, using a scan with updateCurrentTuple(). */ char buffer[10000]; NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); NdbScanOperation *myScanOp= myTrans->scanTable(blob_record, NdbOperation::LM_Exclusive); if (myScanOp == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle= myScanOp->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myScanOp->getNdbError()); if (myBlobHandle->getValue(buffer, sizeof(buffer))) APIERROR(myBlobHandle->getNdbError()); /* Start the scan. */ if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); const MyRow *out_row; int res; for (;;) { res= myScanOp-> nextResult((const char**)&out_row, true, false); if (res==1) break; // Scan done. else if (res) APIERROR(myScanOp->getNdbError()); Uint64 length= 0; if (myBlobHandle->getLength(length) == -1) APIERROR(myBlobHandle->getNdbError()); /* Lowercase everything. */ for (Uint64 j= 0; j < length; j++) buffer[j]= tolower(buffer[j]); /* 'Take over' the row locks from the scan to a separate * operation for updating the tuple */ const NdbOperation *myUpdateOp= myScanOp->updateCurrentTuple(myTrans, blob_record, (const char*)out_row); if (myUpdateOp == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle2= myUpdateOp->getBlobHandle("my_text"); if (myBlobHandle2 == NULL) APIERROR(myUpdateOp->getNdbError()); if (myBlobHandle2->setValue(buffer, length)) APIERROR(myBlobHandle2->getNdbError()); if (-1 == myTrans->execute(NdbTransaction::NoCommit)) APIERROR(myTrans->getNdbError()); } if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } struct ActiveHookData {char buffer[10000]; Uint32 readLength;}; int myFetchHook(NdbBlob* myBlobHandle, void* arg) { ActiveHookData *ahd= (ActiveHookData *)arg; ahd->readLength= sizeof(ahd->buffer) - 1; return myBlobHandle->readData(ahd->buffer, ahd->readLength); } int fetch_key(Ndb *myNdb) { /* Fetch a blob without specifying how many bytes * to read up front, in one execution using * the 'ActiveHook' mechanism. * The supplied ActiveHook procedure is called when * the Blob handle becomes 'active'.At that point * the length of the Blob can be obtained, and buffering * arranged, and the data read requested. */ /* Separate rows used to specify key and hold result */ MyRow key_row; MyRow out_row; /* Fetch and show the blob field, using setActiveHook(). */ NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); key_row.myId= 1; out_row.myText= NULL; const NdbOperation *myNdbOperation= myTrans->readTuple(key_record, (const char*) &key_row, blob_record, (char*) &out_row); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); /* This time, we'll get the blob handle from the row, because * we can.Alternatively, we could use the normal mechanism * of calling getBlobHandle(). */ NdbBlob *myBlobHandle= out_row.myText; if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); struct ActiveHookData ahd; if (myBlobHandle->setActiveHook(myFetchHook, &ahd) == -1) APIERROR(myBlobHandle->getNdbError()); /* Execute Commit, but calling our callback set up in setActiveHook() before actually committing. */ if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); /* Our fetch callback will have been called during the execute(). */ ahd.buffer[ahd.readLength]= '\0'; std::cout << "Fetched data:" << std::endl << ahd.buffer << std::endl; return 1; } int update2_key(Ndb *myNdb) { char buffer[10000]; MyRow row; /* Simple setValue() update specified before the * Blob handle is made active */ NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); row.myId= 1; const NdbOperation *myNdbOperation= myTrans->updateTuple(key_record, (const char*)&row, blob_record, (char*) &row); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); NdbBlob *myBlobHandle= myNdbOperation->getBlobHandle("my_text"); if (myBlobHandle == NULL) APIERROR(myNdbOperation->getNdbError()); memset(buffer, ' ', sizeof(buffer)); if (myBlobHandle->setValue(buffer, sizeof(buffer)) == -1) APIERROR(myBlobHandle->getNdbError()); if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } int delete_key(Ndb *myNdb) { MyRow row; /* Deletion of row containing blob via primary key. */ NdbTransaction *myTrans= myNdb->startTransaction(); if (myTrans == NULL) APIERROR(myNdb->getNdbError()); row.myId= 1; const NdbOperation *myNdbOperation= myTrans->deleteTuple(key_record, (const char*)&row, full_record); if (myNdbOperation == NULL) APIERROR(myTrans->getNdbError()); if (-1 == myTrans->execute(NdbTransaction::Commit)) APIERROR(myTrans->getNdbError()); myNdb->closeTransaction(myTrans); return 1; } void mysql_connect_and_create(const char *socket) { MYSQL mysql; bool ok; mysql_init(&mysql); ok = mysql_real_connect(&mysql, "localhost", "root", "", "", 0, socket, 0); if (ok) { mysql_query(&mysql, "CREATE DATABASE ndb_examples"); ok = ! mysql_select_db(&mysql, "ndb_examples"); } if (ok) { create_table(mysql); } mysql_close(&mysql); if (! ok) MYSQLERROR(mysql); } void ndb_run_ndbrecord_blob_operations(const char * connectstring) { /* Connect to ndb cluster. */ Ndb_cluster_connection cluster_connection(connectstring); if (cluster_connection.connect(4, 5, 1)) { std::cout << "Unable to connect to cluster within 30 secs." << std::endl; exit(-1); } /* Optionally connect and wait for the storage nodes (ndbd's). */ if (cluster_connection.wait_until_ready(30,0) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } Ndb myNdb(&cluster_connection,"ndb_examples"); if (myNdb.init(1024) == -1) { // Set max 1024 parallel transactions APIERROR(myNdb.getNdbError()); exit(-1); } setup_records(&myNdb); if (populate(&myNdb) > 0) std::cout << "populate: Success!" << std::endl; if (update_key(&myNdb) > 0) std::cout << "update_key: Success!" << std::endl; if (update_scan(&myNdb) > 0) std::cout << "update_scan: Success!" << std::endl; if (fetch_key(&myNdb) > 0) std::cout << "fetch_key: Success!" << std::endl; if (update2_key(&myNdb) > 0) std::cout << "update2_key: Success!" << std::endl; if (delete_key(&myNdb) > 0) std::cout << "delete_key: Success!" << std::endl; } int main(int argc, char**argv) { if (argc != 3) { std::cout << "Arguments are <socket mysqld> <connect_string cluster>.\n"; exit(-1); } char *mysqld_sock= argv[1]; const char *connectstring = argv[2]; mysql_connect_and_create(mysqld_sock); ndb_init(); ndb_run_ndbrecord_blob_operations(connectstring); ndb_end(0); return 0; }
Эта программа вставки данных столбцов
CHAR
,
VARCHAR
и
BINARY
в таблицу, строя
объекты aRef
, используя местные функции.
Затем это читает колонки назад и извлекает данные из них,
используя локальные функции.
Этот пример предполагает, что таблица
api_array_simple
создана следующим образом:
CREATE TABLE api_array_simple (ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY, ATTR2 CHAR(20) NOT NULL, ATTR3 VARCHAR(20) NOT NULL, ATTR4 VARCHAR(500) NOT NULL, ATTR5 BINARY(20) NOT NULL, ATTR6 VARBINARY(20) NOT NULL, ATTR7 VARBINARY(500) NOT NULL) ENGINE NDB CHARSET latin1;
Эта программа использует много утилит, которые могут быть найдены в
storage/ndb/ndbapi-examples/common/
. См.
раздел 2.5.14.
Файл примера может быть найден в
ndbapi_array_simple/ndbapi_array_simple.cpp
в NDB 7.3.8, NDB 7.4.3 или позже в каталоге
storage/ndb/ndbapi-examples
(Bug #70550, Bug #17592990).
#include <NdbApi.hpp> #include <iostream> #include <vector> #include <cstdlib> #include <cstring> /* See раздел 2.5.14, for listings of these utilities. */ #include "../common/error_handling.hpp" #include "../common/ndb_util.hpp" #include "../common/util.hpp" using namespace std; /* structure to help in insertion */ struct RowData { /* id */ int attr1; /* CHAR(20)- fixed length, no additional length bytes */ char attr2[20]; /* VARCHAR(20) - requires one additional length byte (length < 256 ) */ char attr3[1 + 20]; /* VARCHAR(500) - requires two additional length bytes (length > 256 ) */ char attr4[2 + 500]; /* BINARY(20) - fixed length, requires no additional length byte */ char attr5[20]; /* VARBINARY(20) - requires one additional length byte (length < 256 ) */ char attr6[1 + 20]; /* VARBINARY(20) - requires one additional length byte (length > 256 ) */ char attr7[2 + 500]; }; /* extracts the length and the start byte of the data stored */ static int get_byte_array(const NdbRecAttr* attr, const char*& first_byte, size_t& bytes) { const NdbDictionary::Column::ArrayType array_type = attr->getColumn()->getArrayType(); const size_t attr_bytes = attr->get_size_in_bytes(); const char* aRef = attr->aRef(); string result; switch (array_type) { case NdbDictionary::Column::ArrayTypeFixed: /* No prefix length is stored in aRef. Data starts from aRef's first byte data might be padded with blank or null bytes to fill the whole column */ first_byte = aRef; bytes = attr_bytes; return 0; case NdbDictionary::Column::ArrayTypeShortVar: /* First byte of aRef has the length of data stored Data starts from second byte of aRef */ first_byte = aRef + 1; bytes = (size_t)(aRef[0]); return 0; case NdbDictionary::Column::ArrayTypeMediumVar: /* First two bytes of aRef has the length of data stored Data starts from third byte of aRef */ first_byte = aRef + 2; bytes = (size_t)(aRef[1]) * 256 + (size_t)(aRef[0]); return 0; default: first_byte = NULL; bytes = 0; return -1; } } /* Extracts the string from given NdbRecAttr Uses get_byte_array internally */ static int get_string(const NdbRecAttr* attr, string& str) { size_t attr_bytes; const char* data_start_ptr = NULL; /* get stored length and data using get_byte_array */ if (get_byte_array(attr, data_start_ptr, attr_bytes) == 0) { /* we have length of the string and start location */ str= string(data_start_ptr, attr_bytes); if (attr->getType() == NdbDictionary::Column::Char) { /* Fixed Char : remove blank spaces at the end */ size_t endpos = str.find_last_not_of(" "); if (string::npos != endpos) { str = str.substr(0, endpos+1); } } } return 0; } // Do a cleanup of all inserted tuples static void do_cleanup(Ndb& ndb) { const NdbDictionary::Dictionary* dict = ndb.getDictionary(); const NdbDictionary::Table *table = dict->getTable("api_array_simple"); if (table == nullptr) APIERROR(dict->getNdbError()); NdbTransaction *transaction= ndb.startTransaction(); if (transaction == nullptr) APIERROR(ndb.getNdbError()); for (int i = 0; i <= 20; i++) { NdbOperation* myOperation = transaction->getNdbOperation(table); if (myOperation == nullptr) APIERROR(transaction->getNdbError()); myOperation->deleteTuple(); myOperation->equal("ATTR1", i); } if (transaction->execute(NdbTransaction::Commit) != 0) { APIERROR(transaction->getNdbError()); } ndb.closeTransaction(transaction); } /******************************************************* * Use one transaction and insert 21 rows in one batch * *******************************************************/ static void do_insert(Ndb& ndb) { const NdbDictionary::Dictionary* dict = ndb.getDictionary(); const NdbDictionary::Table *table = dict->getTable("api_array_simple"); if (table == NULL) APIERROR(dict->getNdbError()); NdbTransaction *transaction= ndb.startTransaction(); if (transaction == NULL) APIERROR(ndb.getNdbError()); /* Create and initialize sample data */ const string meter = 50 * string("''''-,,,,|"); const string space = 20 * string(" "); unsigned char binary_meter[500]; for (unsigned i = 0; i < 500; i++) { binary_meter[i] = (unsigned char)(i % 256); } vector<NdbOperation*> operations; for (int i = 0; i <= 20; i++) { RowData data; NdbOperation* myOperation = transaction->getNdbOperation(table); if (myOperation == NULL) APIERROR(transaction->getNdbError()); data.attr1 = i; // Fill CHAR(20) with 'i' chars from meter strncpy (data.attr2, meter.c_str(), i); // Pad it with space up to 20 chars strncpy (data.attr2 + i, space.c_str(), 20 - i); // Fill VARCHAR(20) with 'i' chars from meter. First byte is // reserved for length field. No padding is needed. strncpy (data.attr3 + 1, meter.c_str(), i); // Set the length byte data.attr3[0] = (char)i; // Fill VARCHAR(500) with 20*i chars from meter. First two bytes // are reserved for length field. No padding is needed. strncpy (data.attr4 + 2, meter.c_str(), 20*i); // Set the length bytes data.attr4[0] = (char)(20*i % 256); data.attr4[1] = (char)(20*i / 256); // Fill BINARY(20) with 'i' bytes from binary_meter. memcpy(data.attr5, binary_meter, i); // Pad with 0 up to 20 bytes. memset(data.attr5 + i, 0, 20 - i); // Fill VARBINARY(20) with 'i' bytes from binary_meter. First byte // is reserved for length field. No padding is needed. memcpy(data.attr6 + 1, binary_meter, i); // Set the length byte data.attr6[0] = (char)i; // Fill VARBINARY(500) with 'i' bytes from binary_meter. First two // bytes are reserved for length filed. No padding is needed. memcpy(data.attr7 + 2, binary_meter, 20*i); // Set the length bytes data.attr7[0] = (char)(20*i % 256); data.attr7[1] = (char)(20*i / 256); myOperation->insertTuple(); myOperation->equal("ATTR1", data.attr1); myOperation->setValue("ATTR2", data.attr2); myOperation->setValue("ATTR3", data.attr3); myOperation->setValue("ATTR4", data.attr4); myOperation->setValue("ATTR5", data.attr5); myOperation->setValue("ATTR6", data.attr6); myOperation->setValue("ATTR7", data.attr7); operations.push_back(myOperation); } // Now execute all operations in one batch, and check for errors. if (transaction->execute( NdbTransaction::Commit ) != 0) { for (size_t i = 0; i < operations.size(); i++) { const NdbError err= operations[i]->getNdbError(); if (err.code != NdbError::Success) { cout << "Error inserting Row : " << i << endl; PRINT_ERROR(err.code, err.message); } } APIERROR(transaction->getNdbError()); } ndb.closeTransaction(transaction); } /* Reads the row with id = 17 Retrieves an prints value of the [VAR]CHAR/BINARY */ static void do_read(Ndb& ndb) { const NdbDictionary::Dictionary* dict= ndb.getDictionary(); const NdbDictionary::Table* table= dict->getTable("api_array_simple"); if (table == NULL) APIERROR(dict->getNdbError()); NdbTransaction *transaction= ndb.startTransaction(); if (transaction == NULL) APIERROR(ndb.getNdbError()); NdbOperation *operation= transaction->getNdbOperation(table); if (operation == NULL) APIERROR(transaction->getNdbError()); /* create and execute a read operation */ operation->readTuple(NdbOperation::LM_Read); operation->equal("ATTR1", 17); vector<NdbRecAttr*> attr; const int column_count= table->getNoOfColumns(); attr.reserve(column_count); attr.push_back(nullptr); for (int i= 1; i < column_count; i++) { attr.push_back(operation->getValue(i, NULL)); if (attr[i] == NULL) APIERROR(transaction->getNdbError()); } if (transaction->execute( NdbTransaction::Commit ) == -1) APIERROR(transaction->getNdbError()); /* print the fetched data */ cout << "Row ID : 17\n"; for (int i= 1; i < column_count; i++) { if (attr[i] != NULL) { NdbDictionary::Column::Type column_type = attr[i]->getType(); cout << "Column id: " << i << ", name: " << attr[i]->getColumn()->getName() << ", size: " << attr[i]->get_size_in_bytes() << ", type: " << column_type_to_string(attr[i]->getType()); switch (column_type) { case NdbDictionary::Column::Char: case NdbDictionary::Column::Varchar: case NdbDictionary::Column::Longvarchar: { /* for char columns the actual string is printed */ string str; get_string(attr[i], str); cout << ", stored string length: " << str.length() << ", value: " << str << endl; } break; case NdbDictionary::Column::Binary: case NdbDictionary::Column::Varbinary: case NdbDictionary::Column::Longvarbinary: { /* for binary columns the sum of all stored bytes is printed */ const char* first; size_t count; get_byte_array(attr[i], first, count); int sum = 0; for (const char* byte = first; byte < first + count; byte++) { sum += (int)(*byte); } cout << ", stored bytes length: " << count << ", sum of byte array: " << sum << endl; } break; default: cout << ", column type \"" << column_type_to_string(attr[i]->getType()) << "\" not covered by this example" << endl; break; } } } ndb.closeTransaction(transaction); } static void run_application(Ndb_cluster_connection &cluster_connection, const char* database_name) { /******************************************** * Connect to database via NdbApi * ********************************************/ // Object representing the database Ndb ndb( &cluster_connection, database_name); if (ndb.init()) APIERROR(ndb.getNdbError()); /* * Do different operations on database */ do_insert(ndb); do_read(ndb); do_cleanup(ndb); } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <connect_string cluster> <database_name>.\n"; exit(-1); } /* ndb_init must be called first */ ndb_init(); { /* connect to cluster */ const char *connectstring = argv[1]; Ndb_cluster_connection cluster_connection(connectstring); if (cluster_connection.connect(30 /* retries */, 1 /* delay between retries */, 0 /* verbose */)) { std::cout << "Cluster management server was not ready within 30 secs.\n"; exit(-1); } /* Connect and wait for the storage nodes */ if (cluster_connection.wait_until_ready(30,10) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } /* run the application code */ const char* dbname = argv[2]; run_application(cluster_connection, dbname); } ndb_end(0); return 0; }
До NDB 8.0.1 эту программу нельзя было запустить успешно несколько раз подряд во время той же самой сессии (Bug #27009386).
Эта программа вставляет столбцы
CHAR
,
VARCHAR
и
BINARY
в таблицу, строя
объекты aRef, используя адаптеры множества типа, определенного в
in common/array_adapter.hpp
(см.
раздел 2.5.14).
Затем она читает колонки назад и извлекает данные, снова
используя адаптеры множества.
Пример использует таблицу:
CREATE TABLE api_array_using_adapter ( ATTR1 INT UNSIGNED NOT NULL PRIMARY KEY, ATTR2 CHAR(20) NOT NULL, ATTR3 VARCHAR(20) NOT NULL, ATTR4 VARCHAR(500) NOT NULL, ATTR5 BINARY(20) NOT NULL, ATTR6 VARBINARY(20) NOT NULL, ATTR7 VARBINARY(500) NOT NULL) ENGINE NDB CHARSET latin1;
Файл примера может быть найден в
ndbapi_array_using_adapter/ndbapi_array_using_adapter.cpp
в NDB 7.3.8, NDB 7.4.3 или позже в каталоге
storage/ndb/ndbapi-examples
(Bug #70550, Bug #17592990).
#include <NdbApi.hpp> #include <iostream> #include <vector> #include <cstdlib> #include <cstring> using namespace std; /* See раздел 2.5.14, for listings of these utilities. */ #include "../common/error_handling.hpp" #include "../common/array_adapter.hpp" #include "../common/ndb_util.hpp" #include "../common/util.hpp" // Do a cleanup of all inserted rows static void do_cleanup(Ndb& ndb) { const NdbDictionary::Dictionary* dict = ndb.getDictionary(); const NdbDictionary::Table *table = dict->getTable("api_array_using_adapter"); if (table == nullptr) APIERROR(dict->getNdbError()); NdbTransaction *transaction= ndb.startTransaction(); if (transaction == nullptr) APIERROR(ndb.getNdbError()); // Delete all 21 rows using a single transaction for (int i = 0; i <= 20; i++) { NdbOperation* myOperation = transaction->getNdbOperation(table); if (myOperation == nullptr) APIERROR(transaction->getNdbError()); myOperation->deleteTuple(); myOperation->equal("ATTR1", i); } if (transaction->execute(NdbTransaction::Commit) != 0) { APIERROR(transaction->getNdbError()); } ndb.closeTransaction(transaction); } // Use one transaction and insert 21 rows in one batch. static void do_insert(Ndb& ndb) { const NdbDictionary::Dictionary* dict = ndb.getDictionary(); const NdbDictionary::Table *table = dict->getTable("api_array_using_adapter"); if (table == NULL) { APIERROR(dict->getNdbError()); } // Get a column object for each CHAR/VARCHAR/BINARY/VARBINARY column // to insert into. const NdbDictionary::Column *column2 = table->getColumn("ATTR2"); if (column2 == NULL) { APIERROR(dict->getNdbError()); } const NdbDictionary::Column *column3 = table->getColumn("ATTR3"); if (column3 == NULL) { APIERROR(dict->getNdbError()); } const NdbDictionary::Column *column4 = table->getColumn("ATTR4"); if (column4 == NULL) { APIERROR(dict->getNdbError()); } const NdbDictionary::Column *column5 = table->getColumn("ATTR5"); if (column5 == NULL) { APIERROR(dict->getNdbError()); } const NdbDictionary::Column *column6 = table->getColumn("ATTR6"); if (column6 == NULL) { APIERROR(dict->getNdbError()); } const NdbDictionary::Column *column7 = table->getColumn("ATTR7"); if (column7 == NULL) { APIERROR(dict->getNdbError()); } // Create a read/write attribute adapter to be used for all // CHAR/VARCHAR/BINARY/VARBINARY columns. ReadWriteArrayAdapter attr_adapter; // Create and initialize sample data. const string meter = 50 * string("''''-,,,,|"); unsigned char binary_meter[500]; for (unsigned i = 0; i < 500; i++) { binary_meter[i] = (unsigned char)(i % 256); } NdbTransaction *transaction= ndb.startTransaction(); if (transaction == NULL) APIERROR(ndb.getNdbError()); // Create 21 operations and put a reference to them in a vector to // be able to find failing operations. vector<NdbOperation*> operations; for (int i = 0; i <= 20; i++) { NdbOperation* operation = transaction->getNdbOperation(table); if (operation == NULL) APIERROR(transaction->getNdbError()); operation->insertTuple(); operation->equal("ATTR1", i); /* use ReadWrite Adapter to convert string to aRefs */ ReadWriteArrayAdapter::ErrorType error; char *attr2_aRef; attr2_aRef= attr_adapter.make_aRef(column2, meter.substr(0,i), error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "make_aRef failed for ATTR2"); operation->setValue("ATTR2", attr2_aRef); char *attr3_aRef; attr3_aRef= attr_adapter.make_aRef(column3, meter.substr(0,i), error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "make_aRef failed for ATTR3"); operation->setValue("ATTR3", attr3_aRef); char *attr4_aRef; attr4_aRef= attr_adapter.make_aRef(column4, meter.substr(0,20*i), error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "make_aRef failed for ATTR4"); operation->setValue("ATTR4", attr4_aRef); char* attr5_aRef; char* attr5_first; attr_adapter.allocate_in_bytes(column5, attr5_aRef, attr5_first,i,error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "allocate_in_bytes failed for ATTR5"); memcpy(attr5_first, binary_meter, i); operation->setValue("ATTR5", attr5_aRef); char* attr6_aRef; char* attr6_first; attr_adapter.allocate_in_bytes(column6, attr6_aRef, attr6_first,i,error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "allocate_in_bytes failed for ATTR6"); memcpy(attr6_first, binary_meter, i); operation->setValue("ATTR6", attr6_aRef); char* attr7_aRef; char* attr7_first; attr_adapter.allocate_in_bytes(column7, attr7_aRef, attr7_first, 20*i, error); PRINT_IF_NOT_EQUAL(error, ReadWriteArrayAdapter::Success, "allocate_in_bytes failed for ATTR7"); memcpy(attr7_first, binary_meter, 20*i); operation->setValue("ATTR7", attr7_aRef); operations.push_back(operation); } // Now execute all operations in one batch, and check for errors. if (transaction->execute( NdbTransaction::Commit ) != 0) { for (size_t i = 0; i < operations.size(); i++) { const NdbError err= operations[i]->getNdbError(); if (err.code != NdbError::Success) { cout << "Error inserting Row : " << i << endl; PRINT_ERROR(err.code, err.message); } } APIERROR(transaction->getNdbError()); } ndb.closeTransaction(transaction); } /* Reads the row with id = 17 Retrieves an prints value of the [VAR]CHAR/BINARY using array_adapter */ static void do_read(Ndb& ndb) { const NdbDictionary::Dictionary* dict= ndb.getDictionary(); const NdbDictionary::Table* table= dict->getTable("api_array_using_adapter"); if (table == NULL) APIERROR(dict->getNdbError()); NdbTransaction *transaction= ndb.startTransaction(); if (transaction == NULL) APIERROR(ndb.getNdbError()); NdbOperation *operation= transaction->getNdbOperation(table); if (operation == NULL) APIERROR(transaction->getNdbError()); operation->readTuple(NdbOperation::LM_Read); operation->equal("ATTR1", 17); vector<NdbRecAttr*> attr; const int column_count= table->getNoOfColumns(); attr.reserve(column_count); attr.push_back(nullptr); for (int i= 1; i < column_count; i++) { attr.push_back(operation->getValue(i, NULL)); if (attr[i] == NULL) APIERROR(transaction->getNdbError()); } if (transaction->execute( NdbTransaction::Commit ) == -1) APIERROR(transaction->getNdbError()); /* Now use an array adapter to read the data from columns */ const ReadOnlyArrayAdapter attr_adapter; ReadOnlyArrayAdapter::ErrorType error; /* print the fetched data */ cout << "Row ID : 17\n"; for (int i= 1; i < column_count; i++) { if (attr[i] != NULL) { NdbDictionary::Column::Type column_type = attr[i]->getType(); cout << "Column id: " << i << ", name: " << attr[i]->getColumn()->getName() << ", size: " << attr[i]->get_size_in_bytes() << ", type: " << column_type_to_string(attr[i]->getType()); if (attr_adapter.is_binary_array_type(column_type)) { /* if column is [VAR]BINARY, get the byte array and print their sum */ const char* data_ptr; size_t data_length; attr_adapter.get_byte_array(attr[i], data_ptr, data_length, error); if (error == ReadOnlyArrayAdapter::Success) { int sum = 0; for (size_t j = 0; j < data_length; j++) sum += (int)(data_ptr[j]); cout << ", stored bytes length: " << data_length << ", sum of byte array: " << sum << endl; } else cout << ", error fetching value." << endl; } else { /* if the column is [VAR]CHAR, retrieve the string and print */ std::string value= attr_adapter.get_string(attr[i], error); if (error == ReadOnlyArrayAdapter::Success) { cout << ", stored string length: " << value.length() << ", value: " << value << endl; } else cout << ", error fetching value." << endl; } } } ndb.closeTransaction(transaction); } static void run_application(Ndb_cluster_connection &cluster_connection, const char* database_name) { /******************************************** * Connect to database via NdbApi * ********************************************/ // Object representing the database Ndb ndb( &cluster_connection, database_name); if (ndb.init()) APIERROR(ndb.getNdbError()); /* * Do different operations on database */ do_insert(ndb); do_read(ndb); do_cleanup(ndb); } int main(int argc, char** argv) { if (argc != 3) { std::cout << "Arguments are <connect_string cluster> <database_name>.\n"; exit(-1); } /* ndb_init must be called first */ ndb_init(); { /* connect to cluster */ const char *connectstring = argv[1]; Ndb_cluster_connection cluster_connection(connectstring); if (cluster_connection.connect(30 /* retries */, 1 /* delay between retries */, 0 /* verbose */)) { std::cout << "Cluster management server was not ready within 30 secs.\n"; exit(-1); } /* Connect and wait for the storage nodes */ if (cluster_connection.wait_until_ready(30,10) < 0) { std::cout << "Cluster was not ready within 30 secs.\n"; exit(-1); } /* run the application code */ const char* dbname = argv[2]; run_application(cluster_connection, dbname); } ndb_end(0); return 0; }
До NDB 8.0.1 эту программу нельзя было успешно выполнить несколько раз подряд во время той же самой сессии (Bug #27009386).
Файл timestamp2.cpp
обеспечивает пример работы в приложениях API NDB с
новыми временными типами данных MySQL,
поддерживающие доли секунды, которые были осуществлены в
MySQL 5.6, NDB 7.3 и NDB 7.4.
Для получения дополнительной информации о типах данных MySQL в NDB API см. раздел 2.1.3.2.
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <NdbApi.hpp> #include <string> #include <unistd.h> //no binlog value #define NDB_ANYVALUE_FOR_NOLOGGING 0x8000007f using namespace std; int setTimestamp(NdbOperation* op, const NdbDictionary::Column* col, unsigned int value) { if (col->getType() == NDB_TYPE_TIMESTAMP) { /* Set as 32-bit int in host layout */ return op->setValue(col->getName(), value); } else if (col->getType() == NDB_TYPE_TIMESTAMP2) { /* Set as 64 bit big-endian value */ // assert(col->getPrecision() == 0); Uint64 ts = 0; unsigned char* bytes = (unsigned char*) &ts; bytes[0] = value >> 24 & 0xff; bytes[1] = value >> 16 & 0xff; bytes[2] = value >>8 & 0xff; bytes[3] = value & 0xff; return op->setValue(col->getName(), ts); } else { cout << "Bad type for column " << col->getType() << std::endl; exit(1); } } unsigned int readTimestamp(NdbRecAttr* recAttr) { if (recAttr->getType() == NDB_TYPE_TIMESTAMP) { /* Timestamp is in native 32 bit layout */ return recAttr->u_32_value(); } else if (recAttr->getType() == NDB_TYPE_TIMESTAMP2) { /* Timestamp is in big-endian layout */ // assert(recAttr->getColumn()->getPrecision() == 0); Uint64 ts2 = recAttr->u_64_value(); const unsigned char* bytes = (const unsigned char*) &ts2; const unsigned int ts = (Uint64(bytes[0]) << 24) + (Uint64(bytes[1]) << 16) + (Uint64(bytes[2]) <<8) + (Uint64(bytes[3])); return ts; } else { cout << "Error with timestamp column type : " << recAttr->getType() << endl; exit(1); } } void insert(string connectString) { Ndb_cluster_connection *cluster_connection = new Ndb_cluster_connection(connectString.c_str()); if (cluster_connection->connect(5,5,1)) { cout << "Cannot connect to Cluster using connectstring: " << connectString << endl; exit(1); } if (cluster_connection->wait_until_ready(30,0) < 0) { cout << "Cluster was not ready within 30 seconds" << endl; } Ndb *myNdb = new Ndb(cluster_connection, "myndb_user_data"); if (myNdb->init(1024) == -1) { cout << "Error: Cannot initialize NDB object" << endl; exit(-1); } const NdbDictionary::Dictionary *dict = myNdb->getDictionary(); if (dict == NULL) { cout << "Error: Cannot fetch NndDictionary" << endl; exit(0); } const NdbDictionary::Table *timestampTable = dict->getTable("TIMESTAMP_TEST"); if (timestampTable == NULL) { cout << "Error: Cannot fetch MYNDB table" << endl; exit(0); } NdbTransaction *trans = myNdb->startTransaction(); if (trans == NULL) { cout << "Error: Cannot start new transaction" << endl; exit(1); } NdbOperation *myOperation = trans->getNdbOperation(timestampTable); if (myOperation == NULL) { cout << "Error: Cannot get new operation" << endl; exit(1); } myOperation->insertTuple(); Uint64 value; myNdb->getAutoIncrementValue(timestampTable, value, (Uint32)32); myOperation->setValue("KEY_COL", value); time_t timestamp= time(NULL); setTimestamp(myOperation, timestampTable->getColumn("createTimestamp"), timestamp); setTimestamp(myOperation, timestampTable->getColumn("modifyTimestamp"), timestamp); //disable binlogging myOperation->setAnyValue(NDB_ANYVALUE_FOR_NOLOGGING); if (trans->execute(NdbTransaction::Commit) != 0) { cout << "Error: " << trans->getNdbError().message << endl; exit(1); } myNdb->closeTransaction(trans); delete myNdb; delete cluster_connection; } void fetch_from_database(string connectString) { Ndb_cluster_connection *cluster_connection = new Ndb_cluster_connection(connectString.c_str()); if (cluster_connection->connect(5,5,1)) { cout << "Cannot connect to Cluster using connectstring: " << connectString << endl; exit(1); } if (cluster_connection->wait_until_ready(30,0) < 0) { cout << "Cluster was not ready within 30 seconds" << endl; } Ndb *myNdb = new Ndb(cluster_connection, "myndb_user_data"); if (myNdb->init(1024) == -1) { cout << "Error: Cannot initialize NDB object" << endl; exit(-1); } const NdbDictionary::Dictionary *dict = myNdb->getDictionary(); if (dict == NULL) { cout << "Error: Cannot fetch NndDictionary" << endl; exit(0); } const NdbDictionary::Table *timestampTable = dict->getTable("TIMESTAMP_TEST"); if (timestampTable == NULL) { cout << "Error: Cannot fetch MYNDB table" << endl; exit(0); } NdbTransaction *trans = myNdb->startTransaction(); if (trans == NULL) { cout << "Error: Cannot start new transaction" << endl; exit(1); } NdbScanOperation *myOperation = trans->getNdbScanOperation(timestampTable); if (myOperation == NULL) { cout << "Error: Cannot get new operation" << endl; exit(1); } if (myOperation->readTuples(NdbOperation::LM_Exclusive) == -1) { cout << "Error: " << trans->getNdbError().message << endl; exit(0); } NdbRecAttr *recAttrs[3]; recAttrs[0] = myOperation->getValue("KEY_COL"); recAttrs[1] = myOperation->getValue("createTimestamp"); recAttrs[2] = myOperation->getValue("modifyTimestamp"); if (recAttrs[0] == NULL || recAttrs[1] == NULL || recAttrs[2] == NULL) { cout << "Error: " << trans->getNdbError().message << endl; exit(0); } if (trans->execute(NdbTransaction::NoCommit) != 0) { cout << "Error: " << trans->getNdbError().message << endl; exit(1); } int check; while ((check = myOperation->nextResult(true)) == 0) { do { cout << recAttrs[0]->u_32_value() << "\t"; cout << readTimestamp(recAttrs[1]) << "\t"; cout << readTimestamp(recAttrs[2]) << std::endl; } while ((check = myOperation->nextResult(false)) == 0); } myNdb->closeTransaction(trans); delete myNdb; delete cluster_connection; } int main(int argc, char **argv) { cout << "Timestamp test application!!!!" << endl; // fetch parameters string connectString; if (argc < 2) { cout<<"Please provide connect string for PLDB"<<endl; exit(1); } connectString = argv[1]; ndb_init(); insert(connectString); fetch_from_database(connectString); ndb_end(0); return EXIT_SUCCESS; }
В NDB 7.3.8, NDB 7.4.3 и позже в дереве исходных текстов NDB Cluster
каталог storage/ndb/ndbapi-examples/common
содержит четыре заголовочных файла с утилитами для использования в
примере программы NDB API (Bug #70550, Bug #17592990). Их имена:
array_adapter.hpp
:
Содержит сервисные классы для преобразования между последовательностями стиля
C++ или массивами байтов и форматом, используемым NDB внутренне для типов
VARCHAR
,
CHAR
и
VARBINARY
.
error_handling.hpp
: Содержит функции обработки ошибок.
ndb_util.hpp
: Определяет функцию
column_type_to_string()
, которая обрабатывает
типы столбцов NDB
.
util.hpp
:
Предоставляет метод для создания последовательностей произвольной длины.
Далее приведены исходные тексты для этих файлов.
#ifndef ARRAY_ADAPTER_HPP #define ARRAY_ADAPTER_HPP #include <algorithm> #include <assert.h> /* Utility classes to convert between C++ strings/byte arrays and the internal format used for [VAR]CHAR/BINARY types. Base class that can be used for read operations. The column type is taken from the NdbRecAttr object, so only one object is needed to convert from different [VAR]CHAR/BINARY types. No additional memory is allocated. */ class ReadOnlyArrayAdapter { public: ReadOnlyArrayAdapter() {} enum ErrorType {Success, InvalidColumnType, InvalidArrayType, InvalidNullColumn, InvalidNullAttribute, InvalidNullaRef, BytesOutOfRange, UnknownError}; /* Return a C++ string from the aRef() value of attr. This value will use the column and column type from attr. The advantage is for reading; the same ArrayAdapter can be used for multiple columns. The disadvantage is; passing an attribute not of [VAR]CHAR/BINARY type will result in a traditional exit(-1) */ std::string get_string(const NdbRecAttr* attr, ErrorType& error) const; /* Calculate the first_byte and number of bytes in aRef for attr */ void get_byte_array(const NdbRecAttr* attr, const char*& first_byte, size_t& bytes, ErrorType& error) const; /* Check if a column is of type [VAR]BINARY */ bool is_binary_array_type(const NdbDictionary::Column::Type t) const; /* Check if a column is of type [VAR]BINARY or [VAR]CHAR */ bool is_array_type(const NdbDictionary::Column::Type t) const; private: /* Disable copy constructor */ ReadOnlyArrayAdapter(const ReadOnlyArrayAdapter& a) {} }; /* Extension to ReadOnlyArrayAdapter to be used together with insert/write/update operations. Memory is allocated for each call to make_aRef or allocate_in_bytes. The memory allocated will be deallocated by the destructor. To save memory, the scope of an instance of this class should not be longer than the life time of the transaction. On the other hand, it must be long enough for the usage of all references created */ class ReadWriteArrayAdapter : public ReadOnlyArrayAdapter { public: ReadWriteArrayAdapter() {} /* Destructor, the only place where memory is deallocated */ ~ReadWriteArrayAdapter(); /* Create a binary representation of the string 's' and return a pointer to it. This pointer can later be used as argument to for example setValue */ char* make_aRef(const NdbDictionary::Column* column, std::string s, ErrorType& error); /* Allocate a number of bytes suitable for this column type. aRef can later be used as argument to for example setValue. first_byte is the first byte to store data to. bytes is the number of bytes to allocate */ void allocate_in_bytes(const NdbDictionary::Column* column, char*& aRef, char*& first_byte, size_t bytes, ErrorType& error); private: /* Disable copy constructor */ ReadWriteArrayAdapter(const ReadWriteArrayAdapter& a) : ReadOnlyArrayAdapter() {} /* Record of allocated char arrays to delete by the destructor */ std::vector<char*> aRef_created; }; inline ReadWriteArrayAdapter::~ReadWriteArrayAdapter() { for (std::vector<char*>::iterator i = aRef_created.begin(); i != aRef_created.end(); ++i) { delete [] *i; } } char* ReadWriteArrayAdapter::make_aRef(const NdbDictionary::Column* column, std::string input, ErrorType& error) { char* new_ref; char* data_start; /* Allocate bytes and push them into the aRef_created vector. After this operation, new_ref has a complete aRef to use in insertion and data_start has ptr from which data is to be written. The new_aref returned is padded completely with blank spaces. */ allocate_in_bytes(column, new_ref, data_start, input.length(), error); if (error != Success) { return NULL; } /* Copy the input string into aRef's data pointer without affecting remaining blank spaces at end. */ strncpy(data_start, input.c_str(), input.length()); return new_ref; } void ReadWriteArrayAdapter::allocate_in_bytes(const NdbDictionary::Column* column, char*& aRef, char*& first_byte, size_t bytes, ErrorType& error) { bool is_binary; char zero_char; NdbDictionary::Column::ArrayType array_type; size_t max_length; /* unless there is going to be any problem */ error = Success; if (column == NULL) { error = InvalidNullColumn; aRef = NULL; first_byte = NULL; return; } if (!is_array_type(column->getType())) { error = InvalidColumnType; aRef = NULL; first_byte = NULL; return; } is_binary = is_binary_array_type(column->getType()); zero_char = (is_binary ? 0 : ' '); array_type = column->getArrayType(); max_length = column->getLength(); if (bytes > max_length) { error = BytesOutOfRange; aRef = NULL; first_byte = NULL; return; } switch (array_type) { case NdbDictionary::Column::ArrayTypeFixed: /* no need to store length bytes */ aRef = new char[max_length]; first_byte = aRef; /* pad the complete string with blank space (or) null bytes */ for (size_t i=0; i < max_length; i++) { aRef[i] = zero_char; } break; case NdbDictionary::Column::ArrayTypeShortVar: /* byte length stored over first byte. no padding required */ aRef = new char[1 + bytes]; first_byte = aRef + 1; aRef[0] = (char)bytes; break; case NdbDictionary::Column::ArrayTypeMediumVar: /* byte length stored over first two bytes. no padding required */ aRef = new char[2 + bytes]; first_byte = aRef + 2; aRef[0] = (char)(bytes % 256); aRef[1] = (char)(bytes / 256); break; } aRef_created.push_back(aRef); } std::string ReadOnlyArrayAdapter::get_string(const NdbRecAttr* attr, ErrorType& error) const { size_t attr_bytes= 0; const char* data_ptr= NULL; std::string result= ""; /* get the beginning of data and its size.. */ get_byte_array(attr, data_ptr, attr_bytes, error); if (error != Success) { return result; } /* ..and copy thevalue into result */ result = string(data_ptr, attr_bytes); /* special treatment for FixedArrayType to eliminate padding characters */ if (attr->getColumn()->getArrayType() == NdbDictionary::Column::ArrayTypeFixed) { char padding_char = ' '; std::size_t last = result.find_last_not_of(padding_char); result = result.substr(0, last+1); } return result; } void ReadOnlyArrayAdapter::get_byte_array(const NdbRecAttr* attr, const char*& data_ptr, size_t& bytes, ErrorType& error) const { /* unless there is a problem */ error= Success; if (attr == NULL) { error = InvalidNullAttribute; return; } if (!is_array_type(attr->getType())) { error = InvalidColumnType; return; } const NdbDictionary::Column::ArrayType array_type = attr->getColumn()->getArrayType(); const size_t attr_bytes = attr->get_size_in_bytes(); const char* aRef = attr->aRef(); if (aRef == NULL) { error= InvalidNullaRef; return; } switch (array_type) { case NdbDictionary::Column::ArrayTypeFixed: /* no length bytes stored with aRef */ data_ptr = aRef; bytes = attr_bytes; break; case NdbDictionary::Column::ArrayTypeShortVar: /* first byte of aRef has length of the data */ data_ptr = aRef + 1; bytes = (size_t)(aRef[0]); break; case NdbDictionary::Column::ArrayTypeMediumVar: /* first two bytes of aRef has length of the data */ data_ptr = aRef + 2; bytes = (size_t)(aRef[1]) * 256 + (size_t)(aRef[0]); break; default: /* should never reach here */ data_ptr = NULL; bytes = 0; error = InvalidArrayType; break; } } bool ReadOnlyArrayAdapter::is_binary_array_type(const NdbDictionary::Column::Type t) const { bool is_binary; switch (t) { case NdbDictionary::Column::Binary: case NdbDictionary::Column::Varbinary: case NdbDictionary::Column::Longvarbinary: is_binary = true; break; default: is_binary = false; } return is_binary; } bool ReadOnlyArrayAdapter::is_array_type(const NdbDictionary::Column::Type t) const { bool is_array; switch (t) { case NdbDictionary::Column::Binary: case NdbDictionary::Column::Varbinary: case NdbDictionary::Column::Longvarbinary: case NdbDictionary::Column::Char: case NdbDictionary::Column::Varchar: case NdbDictionary::Column::Longvarchar: is_array = true; break; default: is_array = false; } return is_array; } #endif // #ifndef ARRAY_ADAPTER_HPP
#ifndef ERROR_HANDLING_HPP #define ERROR_HANDLING_HPP template <typename T> inline static void print_if_not_equal(T got, T expected, const char* msg, const char* file, int line) { std::cout << "Got value " << got << " instead of expected value " << expected << " in " << file << ":" << line; } #define PRINT_IF_NOT_EQUAL(got, expected, msg) {\ if (got != expected) {\ print_if_not_equal(got, expected, msg, __FILE__, __LINE__); \ exit(-1); \ } \ } #define PRINT_ERROR(code,msg) \ std::cout << "Error in " << __FILE__ << ", line: " << __LINE__\ << ", code: " << code \ << ", msg: " << msg << "." << std::endl #define APIERROR(error) {\ PRINT_ERROR(error.code,error.message); \ exit(-1); } #endif
#ifndef NDB_UTIL_HPP #define NDB_UTIL_HPP #include <NdbApi.hpp> #include <string> #include <sstream> static const std::string column_type_to_string(NdbDictionary::Column::Type type) { switch (type) { case NdbDictionary::Column::Undefined: return "Undefined"; case NdbDictionary::Column::Tinyint: return "Tinyint"; case NdbDictionary::Column::Tinyunsigned: return "Tinyunsigned"; case NdbDictionary::Column::Smallint: return "Smallint"; case NdbDictionary::Column::Smallunsigned: return "Smallunsigned"; case NdbDictionary::Column::Mediumint: return "Mediumint"; case NdbDictionary::Column::Mediumunsigned: return "Mediumunsigned"; case NdbDictionary::Column::Int: return "Int"; case NdbDictionary::Column::Unsigned: return "Unsigned"; case NdbDictionary::Column::Bigint: return "Bigint"; case NdbDictionary::Column::Bigunsigned: return "Bigunsigned"; case NdbDictionary::Column::Float: return "Float"; case NdbDictionary::Column::Double: return "Double"; case NdbDictionary::Column::Olddecimal: return "Olddecimal"; case NdbDictionary::Column::Olddecimalunsigned: return "Olddecimalunsigned"; case NdbDictionary::Column::Decimal: return "Decimal"; case NdbDictionary::Column::Decimalunsigned: return "Decimalunsigned"; case NdbDictionary::Column::Char: return "Char"; case NdbDictionary::Column::Varchar: return "Varchar"; case NdbDictionary::Column::Binary: return "Binary"; case NdbDictionary::Column::Varbinary: return "Varbinary"; case NdbDictionary::Column::Datetime: return "Datetime"; case NdbDictionary::Column::Date: return "Date"; case NdbDictionary::Column::Blob: return "Blob"; case NdbDictionary::Column::Text: return "Text"; case NdbDictionary::Column::Bit: return "Bit"; case NdbDictionary::Column::Longvarchar: return "Longvarchar"; case NdbDictionary::Column::Longvarbinary: return "Longvarbinary"; case NdbDictionary::Column::Time: return "Time"; case NdbDictionary::Column::Year: return "Year"; case NdbDictionary::Column::Timestamp: return "Timestamp"; case NdbDictionary::Column::Time2: return "Time2"; case NdbDictionary::Column::Datetime2: return "Datetime2"; case NdbDictionary::Column::Timestamp2: return "Timestamp2"; default: { std::string str; std::stringstream s(str); s << "Unknown type: " << type; return s.str(); } } } #endif
#include <string> /* Return a string containing 'n' copies of the string 's'. */ static std::string operator * (unsigned n, const std::string& s) { std::string result; result.reserve(n * s.length()); for (unsigned i = 0; i < n; i++) { result.append(s); } return result; } #endif // #ifndef UTIL_HPP